说明
burpsuite是做攻防渗透的一个常用工具,可以用来拦截http请求做修改、重放、替换、爆破、扫描等各种操作。在hackinglab上做某道练习题的时候,使用了burpsuite的intruder与MACRO等功能,现在针对题解做个记录。
准备工作
首先访问该题目的网址:http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/index.php,该练习站点需要登陆才可以使用,图方便可直接使用qq账号登陆。
通过页面观察我们发现首页有submit登陆按钮,有获取手机验证码的链接,当点击验证码图片时验证码会发生改变,我们找到了三个可以尝试利用的请求,可以分别做拦截查看具体的请求和结果。
首先拦截首页请求
通过该请求拦截,我们发现有隐藏信息,那就是手机验证码的取值范围是从100~999之间,那这个范围是可以直接做个字典来爆破出来的,我们可以生成一个字典文件pwd.txt。接下来我们拦截一下验证码更新的请求。
通过burpsuite我们发现,该请求返回的是一个图片二进制流,该图片是一个全数字的验证码。接下来再看一下登陆的请求。
我们随意输入错误的图片验证码和手机验证码,重新发送该请求,可以看到显示的结果是验证码失效,请重新获取验证码。这个时候如果我们重新发送一下图片验证码的获取请求,然后在发送一下数据提交请求,则显示“user_code or mobi_code error”。
现在来看的话,图片验证码应该是一次性的,既当每次登陆请求到达后台验证逻辑时,之前的图片验证码就会过期。如果想利用暴破手段来强行登陆的话,每次访问登陆请求之前需要先访问一下获取图片验证码的请求。
我们点击一下获取手机验证码链接,就显示了手机验证码已发送,除此之外没有其他有用的信息。而且通过之前登陆页首页的访问我们知道,手机验证码是在一个已知的有限集合中,那就说明手机验证码是可以爆破出来的。现在只要让图片验证码准确识别出来就可以进行intruder了。
破解图片验证码
破解图片验证码就需要做图片的字符识别,答主对这方面不是太懂,索性下载了一个开源的tesseract ocr。从网上找个windows版本的软件,然后下载安装即可。
安装完成之后需要配置环境变量,一方面是在PATH中加入tesseract ocr安装后所在目录,另一块是加入一个名为TESSDATA_PREFIX的环境变量,值为所在安装目录中的tessdata目录。安装完成之后可以在dos终端输入 tesseract -v,显示版本号则安装正确。
现在我们需要伪造一个请求,在该请求的后台我们调用上面提到的更新验证码的请求,将图片验证码存储到本地,然后调用tesseract识别该图片验证码,并将识别的验证码显示到页面上。答主正好部署了dvwa环境,现借助该环境编写一个user_code.php文件,提供http://192.168.10.150/dvwa/user_code.php 请求。访问该请求时,响应包回复 user_code=1256 格式的内容,其中1256是通过tesseract识别出来的。
<?phpheader('content-type:application/json;charset=utf-8');$url ='http://lab1.xseclab.com//vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php';$result ="error";$ch= curl_init();$timeout =20;curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_COOKIE, "PHPSESSID=975db232b65e274a92798918807e4676");curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);$img_content= curl_exec($ch);curl_close($ch);$fp = @fopen('../user_code/user_code.png', 'w+');fwrite($fp, $img_content);fclose($fp);unset($img_content, $url);/* *generate mobile number*/$number=0;$countname ='./counter.txt';if (file_exists($countname)) { $fp = @fopen($countname, "r"); $number= fgets($fp, 10); fclose($fp); $number= $number+1;} else { $number=100;}$fp = @fopen($countname, "w+");fwrite($fp, ''.$number);fclose($fp);/* * E:software_installtesseract_ocrTesseract-OCR * E:software_installvmwarephpstudy_proWWWuser_codeuser_code.png * E:software_installvmwarephpstudy_proWWWuser_codeuser_code */$content="user_code=";system('E:software_installtesseract_ocrTesseract-OCRtesseract.exe E:software_installvmwarephpstudy_proWWWuser_codeuser_code.png E:software_installvmwarephpstudy_proWWWuser_codeuser_code', $retval);$fp = @fopen('../user_code/user_code.txt', 'r');$code_content= fread($fp, 4);fclose($fp);$content .= $code_content.";"."mobi_code=".$number.';';echo $content;?>
我们在编写的php程序中,多做了一些工作,一方面调用tesseract识别图片验证码,另一方面我们实现了一个从100~999的计数器功能,同图片验证码一起返回到页面中。
好了,接下来就是burpsuite需要做的事情了,我们可以将http://192.168.10.150/dvwa/user_code.php与之前提交数据的请求http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/index.php合成一个macro。
配置burpsuite
在burpsuite中,选择Project options,找到Macros,点击Add。在弹框中选择我们需要一起发送的两个请求,点击ok确认。
在弹框中,我们可以看到两个请求,第一个请求是我们自己搭建的获取图片验证码和手机验证码的请求req1,第二个请求是登陆的请求req2。req2是我们需要爆破的的请求,不过req2在每次爆破发送之前都需要发送一次req1,而且req2报文中需要提交的包体里面的user_code字段和mobi_code字段需要从req1中获取。
我们选中req1,点击 Configure item,在弹框中点击Add按钮,输入我们打算替换的内容的key值user_code,然后在下面的req1的响应报文中选择user_code之后的数字即可,然后点击OK,返回上一级弹框在选择Add,按照同样的方法加入mobi_code,再选择OK。
我们选中req2,点击 Configure item,在弹框中的Parameter handing框找到user_code的地方,选择第一项,然后点击OK,找到mobi_code的地方,也选择第一项,然后点击OK。
两个请求均配置好了,这时候点击ok,Macros就配置好了。随后在Session Handing Rules中,点击Add,选择Run a post-request macro(我们需要在intruder中进行爆破,爆破时需要设置一个positions点,所以得选择Run a post-request macro)。在弹框中,选中Macro的名字(此处是Macro 21),然后点击确定即可,后面的暂时用不到。
然后切换到scope 菜单项,配置tools scope(我们只要选择了intruder模块就行)。在URL scope中可以进行请求过滤,既可以设置我们的Macro用在哪些请求中。
现在Macro设置完成,我们可以使用intruder模块进行爆破手机验证码了。这时候可以在Macro中找到Macro 21选择Edit,然后在弹框中的req2下方的包体中右击发送至intruder模块。
点击右侧的clear清楚掉所有的positions,这里我们随便选择了一个无关紧要的positions点,主要是想在接下来做循环重放使用。
在Attack type中可以选择 Sniper、Battering ram、Pitchfork和Cluster bomb四种,其中单参数点的话需要选择sniper,按照字典顺序依次爆破;Battering ram可以两个positions也可以一个,如果一个的话效果跟Sniper一致,两个的话,每个请求从字典中依次选择一个不同的,等同于每个人使用了一半的字典;Pitchfork的话必须设置两个positions,因为需要设置两个payload字典集合,按照顺序每个position使用一个,如果两个字典的个数不一致,以最小的字典的个数为准,每次请求时position分别从各自的字典中依次选取一个值;Cluster bomb也是需要设置两个positions,其中positions的值的选取是两个字典的交叉集合,可能性更多。
此处我们选择sniper,然后切换到payloads页面,在Payload Sets中使用简单列表,然后在Payload options中加载提前生成的字典文件pwd.txt,该字典条数是900条,其实没有什么实际意义,就是为了单纯的循环。
暴力破解之前,需要先对intruder进行一下设置,因为请求的顺序性,不能多线程执行任务。
然后点击Start attack进行暴力破解,在破解过程中,我们发现post请求中的user_code已经被替换成了真是的图片验证码,mobi_code是从100开始进行累加的。因为tesseract oci在图片识别上存在一定错误率,答主爆破了两回才拿到了最后的结果。
暂无评论内容