扩展Burp代理
环境
- java环境运行Burpsuite
- Burpsuite
- Jython -java编写的python解释器
BurpSuite 插件扩展开发所支持的编程语言有 Java 和 Python,Python 开发的插件需要java编写的解释器Jpython。
SDK:
- 开发文档: BurpSuite 插件开发文档在线地址: BurpSuite Extension Dev Doc或者可以在 BurpSuite 程序的 “Extender” 标签下的 “APIs” 子标签里找到。
- SDK 包: 目前,BurpSuite 官网已经不再提供 SDK 包文件的下载,可以从 BurpSuite 程序中导出。导出 SDK 包文件操作步骤: Extender — APIs - Save interface files
- Jpython
首先,将Burpsuite指向Jython解释器,在Extender标签option下,Python环境部分选择Jython JAR文件路径。
IBurpExtender 接口
public interface IBurpExtender
所有的扩展必须实现此接口,实现的类名必须为“BurpExtender”。在 burp 包中,必须申明为 public ,并且必须提供一个默认的构造器。此接口实现了以下方法:
#python
def registerExtenderCallbacks(self, callbacks):
此方法将在扩展加载后被调用,它注册了一个 IBurpExtenderCallbacks 接口的实例, IBurpExtenderCallbacks 接口提供了许多在开发插件过程中常用的一些操作。
下面Burp模糊测试用到的例子:
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.registerIntruderPayloadGeneratorFactory(self)
return
Burp-工具集成菜单插件
可以在此插件的基础上修改为任何你想要执行的命令或程序 并指定不同的参数,可以请求原始数据配合SQLMAP等进行更高级的功能。
import os
import sys
import json
import thread
import traceback
# 导入 burp 相关接口
from burp import IBurpExtender
from burp import IContextMenuFactory
# 导入 Java 相关库
from javax.swing import JMenu
from javax.swing import JMenuItem
reload(sys)
sys.setdefaultencoding('utf-8')
class BurpExtender(IBurpExtender, IContextMenuFactory):
def registerExtenderCallbacks(self, callbacks):
self.messages = []
self.menusConf = {}
self.callbacks = callbacks
self.helpers = callbacks.getHelpers()
self.callbacks.issueAlert('toolKits is ready ...')
self.callbacks.setExtensionName('toolKits')
self.callbacks.registerContextMenuFactory(self)
def loadMenus(self):
self.menus = []
self.mainMenu = JMenu("toolKits")
self.menus.append(self.mainMenu)
try:
with open('toolKits/toolKits.conf') as fp:
self.menusConf = json.loads(fp.read())
except:
self.mainMenu.add(JMenuItem(u'加载配置出错!'))
else:
for tool in self.menusConf:
# 遍历配置,创建子菜单项,并添加事件绑定
menu = JMenuItem(tool['name'],
None,
actionPerformed=lambda x: self.eventHandler(x))
self.mainMenu.add(menu)
def createMenuItems(self, invocation):
# 将加载的过程放在 createMenuItems 接口方法中
# 可以在不重新加载该插件的情况下,动态加载配置
self.loadMenus()
self.messages = invocation.getSelectedMessages()
# 只在指定的 Burp 标签的右键菜单显示
# ctx = invocation.getInvocationContext()
# if not ctx in [0, 1, 2, 3, 4, 5, 6]:
# return None
return self.menus if self.menus else None
def eventHandler(self, x):
'''
通过获取当前点击的子菜单的 text 属性,确定当前需要执行的 command
启动线程执行命令
'''
try:
menuName = x.getSource().text
for tool in self.menusConf:
if tool['name'] == menuName:
commands = [tool['command'].replace(
'{#}', val) for val in self.getValue(tool['param'])]
[thread.start_new_thread(self.execCommand, (command,))
for command in commands]
except:
print traceback.print_exc()
def getHost(self, message):
return message.getHttpService().getHost()
# 获取 Url 注意此处若通过 meesage.getRequest() 是获取不到的
def getUrl(self, meesage):
return str(self.helpers.analyzeRequest(meesage).getUrl())
# 通过配置中的 参数值 分别获取不同值
def getValue(self, paramType):
if paramType == 'host':
return set([self.getHost(message) for message in self.messages])
elif paramType == 'url':
return set([self.getUrl(message) for message in self.messages])
# 执行命令处理方法
def execCommand(self, command):
try:
print '[I] 正在执行命令: {command}, 请稍后...'.format(command=command)
res = '---------- 命令 {command} 执行结果: ---------- {res}'.format(
command=command, res=os.popen(command).read())
print res
except:
print traceback.print_exc()
例如依赖nmap、sqlmap进行SQLi测试,配置文件内置了nmap、SQLmap命令。
#!javascript
[{
"name": "Nmap 扫描端口",
"param": "host",
"command": "nmap -T4 {#}"
},
{
"name": "SQLMap 检查注入",
"param": "url",
"command": "python /opt/sqlmap/sqlmap.py -u {#} --dbs"
}]
之后的例子将通过纯python脚本进行简单的sql、xss模糊测试。
Burp模糊测试
先写一个简单的模糊测试工具,功能包括:
- 用一个单引号进行SQL注入测试。
- 跨站脚本攻击测试。
- 随机选取一个攻击载荷并随机重复上面的两个步骤。
测试应用一个单引号进行SQL注入。
测试应用<script>alert('ATK!');</script>
进行XSS攻击。
def mutate_payload(self,original_payload):
# pick a simple mutator or even call an external script
# like Radamsa does
picker = random.randint(1,3)
# select a random offset in the payload to mutate
offset = random.randint(0,len(original_payload)-1)
payload = original_payload[:offset]
# random offset insert a SQL injection attempt
if picker == 1:
payload += "'"
# jam an XSS attempt in
if picker == 2:
payload += "<script>alert('ATK!');</script>";
# repeat a chunk of the original payload a random number
if picker == 3:
chunk_length = random.randint(len(payload[offset:]),len(payload)-1)
repeater = random.randint(1,10)
for i in range(repeater):
payload += original_payload[offset:offset+chunk_length]
# add the remaining bits of the payload
payload += original_payload[offset:]
return payload
首先配置模糊测试器。
然后将编写好的扩展工具添加到Burp中。
出现上述报错。查看发现是因为路径含有中文未被解析,重新修改路径名。
导入成功!成功后效果如图。
访问web中使用的渗透测试网站。在搜索栏中搜索test内容。
将proxy中收到的内容发送到intruder。
界面中高亮的部分显示每一个请求的参数。这是Burp识别出可以进行模糊测试的地方。可以选择不同的载荷范围进行测试,也可以选择全部载荷进行测试。在payloads中设置写好的生成脚本。
模糊测试得到的结果只是存在渗透的可能,下一步需要通过手注或者借助工具脚本进行验证。
第二篇补交