##扩展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中设置写好的生成脚本。

模糊测试得到的结果只是存在渗透的可能,下一步需要通过手注或者借助工具脚本进行验证。 第二篇补交