渗透测试自动化是白帽子和各家公司一直在解决的一个课题,BurpSuit是渗透测试中必不可少的渗透神器,基于BurpSuit插件二次开发,完善丰富其功能,联动各类其他工具达到渗透测试自动化能够有效减少人工的参与和大大提高漏洞检出率。本文将分为6个章节详细介绍如何基于BurpSuit 插件开发打造自动化渗透测试之路。
1、架构设置与目录
第一章:proxy二次转发
第二章:SQL注入与XSS
第三章:任意文件读取LFI、SSRF、目录扫描DIrScan、任意url跳转、命令注入
第四章:逻辑漏洞平行越权、未授权访问、敏感信息泄露
第五章:联动其他各类扫描器AWVS、APPSCAN、XRAY
第六章:应急响应样例之编写特定的漏洞扫描样例
环境准备BurpSuit 开启两个窗口 分别是8080端口和9090端口
Jpython 下载standalone版本https://repo1.maven.org/maven2/org/python/jython-standalone/2.7.2/jython-standalone-2.7.2.jar,注意Burp的两个窗口中均要使用相同的Jython版本
扩展处导入
本地安装python2.7环境,package包地址
C:Python27Libsite-packages,如果不同,记得在插件中更改地址
开发环境:pycharm
扫描方式:PassiveScan,Burp一共支持三种扫描方式,分别是重写processHttpMessage、PassiveScan和ActiveScan,综合比较PassiveScan效率较高,对CPU的占用较小及不会重复扫描数据包。
参考文档:
https://portswigger.net/burp/extender/api/burp/IExtensionHelpers.html
https://github.com/PortSwigger/burp-extender-api/
第一章:BurpSuit插件之proxy二次转发
一、目的
实现:
1、实现流量的二次转发到9090用于后续测试
2、过滤不在测试范围的目标
3、过滤各类静态资源如jss、css、jpg等
4、转发流量到xray和appscan
5、增加xxf等header头(可能绕防护设备)
6、保存所有url
二、架构图
3、实现原理
3.1、通过baseRequestResponse拆解数据包获取请求包和数据包信息
3.2、读取host.txt,判断当前数据包是否在测试范围内,host.txt放置在同目录下,里面写入要测试的一级域名信息如baidu.com taobao.com
3.3、增加各类xxf头,这里是采用dns解析出要测试的域名的ip加入,也可自定义其他字段或生成内网ip地址
3.4、定义blackdomain,内放置测试范围内的静态域名资源,如report.meituan.com实际上仅用于采集数据,无有效请求。
3.5、定义blackfile,内放置各类静态资源,定义不转发各类静态资源如jpg js css等。
3.6、转发流量至burp 9090 和xray和appscan
4、核心代码
def doPassiveScan(self, baseRequestResponse):
Request = baseRequestResponse.getRequest()
Response = baseRequestResponse.getResponse()
analyzedRequest, reqHeaders, reqBodys, reqMethod, reqParameters = self.get_request_info(Request)
ResHeaders, ResBodys, ResStatusCode, resLength = self.get_response_info(Response)
httpService = baseRequestResponse.getHttpService()
host, port, protocol, ishttps, = self.get_server_info(httpService)
heaers = {
}
scan_target = []
targetHost = []
f = open('host.txt','rb')
for line in f.readlines():
targetHost.append(line.decode("utf-8").strip())
host1 = ".".join(host.split('.')[1:])
host2 = ".".join(host.split('.')[2:])
#print targetHost
blackdomain = [ 'img.meituan.net', 'img.meituan.net', 'p1.meituan.net', 'report.meituan.com']
blackFile = ['js', 'css', 'jpg', 'png', 'gif', 'ico', 'woff2', 'timestamp', 'ttf', 'mp4', 'svg', 'woff']
if (host.split('.')[-1].isdigit() or (host1 in targetHost ) or (host2 in targetHost))and host not in blackdomain:
newReqUrl = self.get_request_url(protocol, reqHeaders,host,port)
newHeaders = reqHeaders[2:]
for header in newHeaders: