Burp Suite —— 验证码识别、切换IP
公众号:白帽子左一
验证码识别
https://github.com/yaseng/pentest/blob/master/misc/burp_captcha_crack.py
实例演示
拿一个后台系统来做演示

载入拓展
- 先引入 jython-standalone 包以及相关模块

- 加载拓展 burp_captcha_crack.py
配置参数
抓取验证码的请求头、url 写入脚本
设置 Intruder
- 这种场景下的暴力破解,需要自动化填入用户名、密码、验证码三个字段。对于前两个来说,一般是两个字典的迭代组合,后一个验证码不加入迭代计算。先标记用户名+密码,验证码两个变量,并且使用 Pitchfork 模式 。

- 此时 payload1 为
§admin&password=admin232323§ - 类型自定义迭代器(Custom interator)
- payload1_1 加载用户名字典
- payload1_2 为空,分隔符 &password= ,并且去掉 URL 自动编码选项
- payload1_3 加载密码字典
- payload 2 类型 Extension-Generated
选择对应的拓展
attack

切换IP
前言
上部分给 Burp Suite 添加验证码识别技能点,对于现代化的渗透测试神器来说,自动化切换 ip 也是必备技能,可以通过动态设置 HTTP 代理来完善此功能。
快速开发
原理分析
对于 HTTP 代理,HTTP 客户端向代理发送请求报文,代理服务器需要正确地处理请求和连接(例如正确处理 Connection: keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。
图片来源:《HTTP 权威指南》
原理较为简单,具体看数据包对比
正常访问
http 流
-
GET / HTTP/1.1 -
Host: myip.ipip.net -
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:69.0) Gecko/20100101 Firefox/69.0 -
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 -
Accept-Encoding: gzip, deflate -
Connection: keep-alive -
Upgrade-Insecure-Requests: 1 -
Cache-Control: max-age=0 -
HTTP/1.1 200 OK -
Date: Mon, 01 Apr 2020 16:58:35 GMT -
Content-Type: text/plain; charset=utf-8 -
Content-Length: 67 -
Connection: keep-alive -
...... IP...113.*.*.* .................. ...... ...... ......
代理访问
HTTP 代理 180.143.244.66:18637
http 流
-
GET http://myip.ipip.net/ HTTP/1.1 -
Host: myip.ipip.net -
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:69.0) Gecko/20100101 Firefox/69.0 -
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 -
Accept-Encoding: gzip, deflate -
Connection: keep-alive -
Upgrade-Insecure-Requests: 1 -
Cache-Control: max-age=0 -
HTTP/1.1 200 OK -
Date: Mon, 01 Apr 2020 17:18:45 GMT -
Content-Type: text/plain; charset=utf-8 -
Content-Length: 69 -
Connection: close -
...... IP...180.143.244.66 .................. ...... ...... ......
可以看到正常访问和代理访问在数据层就是请求路径和目标不同。使用代理就是把数据带上目标信息先发送到代理服务器,要在 Burp Suite 中实现代理功能,动态修改请求目标和请求 header 即可 。
代码编写
参考官方文档,修改 HTTP 请求,需要在脚本中实例化 IHttpListener 类并重写 processHttpMessage 方法。
-
HTTP_PROXY={ -
'ip':'14.118.163.95', -
'port':19048 -
} -
class BurpExtender(IBurpExtender, IHttpListener): -
def registerExtenderCallbacks(self, callbacks): -
self._callbacks = callbacks -
self._helpers = callbacks.getHelpers() -
callbacks.setExtensionName("IP switch") -
callbacks.registerHttpListener(self) -
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo): -
# 只处理请求 -
if not messageIsRequest: -
return -
httpService = messageInfo.getHttpService() -
# 修改请求目标为代理中转 -
messageInfo.setHttpService( -
self.helpers.buildHttpService( -
HTTP_PROXY['ip'], -
HTTP_PROXY['port'], True -
) -
) -
requestInfo = self.helpers.analyzeRequest(messageInfo) -
new_headers = requestInfo.headers -
# 修改 http 头 -
req_head = new_headers[0] -
new_headers[0] = re.sub('\/'," http://myip.ipip.net/",req_head) -
body = messageInfo.request[requestInfo.getBodyOffset():len(messageInfo.request)] -
messageInfo.request = self.helpers.buildHttpMessage( -
new_headers, -
body)
对接平台
接入代理平台或者 aws
实战演示
-
继续使用上面的后台做演示

-
正常访问

-
开启拓展
