##扩展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 ,并且必须提供一个默认的构造器。此接口实现了以下方法:
1#python 2def registerExtenderCallbacks(self, callbacks):
此方法将在扩展加载后被调用,它注册了一个 IBurpExtenderCallbacks 接口的实例, IBurpExtenderCallbacks 接口提供了许多在开发插件过程中常用的一些操作。
下面Burp模糊测试用到的例子:
1def registerExtenderCallbacks(self, callbacks): 2 self._callbacks = callbacks 3 self._helpers = callbacks.getHelpers() 4 5 callbacks.registerIntruderPayloadGeneratorFactory(self) 6 7 return
###Burp-工具集成菜单插件
可以在此插件的基础上修改为任何你想要执行的命令或程序 并指定不同的参数,可以请求原始数据配合SQLMAP等进行更高级的功能。
1import os 2import sys 3import json 4import thread 5import traceback 6 7# 导入 burp 相关接口 8from burp import IBurpExtender 9from burp import IContextMenuFactory 10 11# 导入 Java 相关库 12from javax.swing import JMenu 13from javax.swing import JMenuItem 14 15reload(sys) 16sys.setdefaultencoding('utf-8') 17 18 19class BurpExtender(IBurpExtender, IContextMenuFactory): 20 21 def registerExtenderCallbacks(self, callbacks): 22 23 self.messages = [] 24 self.menusConf = {} 25 26 self.callbacks = callbacks 27 self.helpers = callbacks.getHelpers() 28 29 self.callbacks.issueAlert('toolKits is ready ...') 30 self.callbacks.setExtensionName('toolKits') 31 self.callbacks.registerContextMenuFactory(self) 32 33 def loadMenus(self): 34 self.menus = [] 35 self.mainMenu = JMenu("toolKits") 36 self.menus.append(self.mainMenu) 37 38 try: 39 with open('toolKits/toolKits.conf') as fp: 40 self.menusConf = json.loads(fp.read()) 41 except: 42 self.mainMenu.add(JMenuItem(u'加载配置出错!')) 43 else: 44 for tool in self.menusConf: 45 # 遍历配置,创建子菜单项,并添加事件绑定 46 menu = JMenuItem(tool['name'], 47 None, 48 actionPerformed=lambda x: self.eventHandler(x)) 49 self.mainMenu.add(menu) 50 51 def createMenuItems(self, invocation): 52 53 # 将加载的过程放在 createMenuItems 接口方法中 54 # 可以在不重新加载该插件的情况下,动态加载配置 55 self.loadMenus() 56 57 self.messages = invocation.getSelectedMessages() 58 59 # 只在指定的 Burp 标签的右键菜单显示 60 # ctx = invocation.getInvocationContext() 61 # if not ctx in [0, 1, 2, 3, 4, 5, 6]: 62 # return None 63 64 return self.menus if self.menus else None 65 66 def eventHandler(self, x): 67 ''' 68 通过获取当前点击的子菜单的 text 属性,确定当前需要执行的 command 69 启动线程执行命令 70 ''' 71 72 try: 73 menuName = x.getSource().text 74 for tool in self.menusConf: 75 if tool['name'] == menuName: 76 commands = [tool['command'].replace( 77 '{#}', val) for val in self.getValue(tool['param'])] 78 [thread.start_new_thread(self.execCommand, (command,)) 79 for command in commands] 80 except: 81 print traceback.print_exc() 82 83 def getHost(self, message): 84 return message.getHttpService().getHost() 85 86 # 获取 Url 注意此处若通过 meesage.getRequest() 是获取不到的 87 def getUrl(self, meesage): 88 return str(self.helpers.analyzeRequest(meesage).getUrl()) 89 90 # 通过配置中的 参数值 分别获取不同值 91 def getValue(self, paramType): 92 if paramType == 'host': 93 return set([self.getHost(message) for message in self.messages]) 94 elif paramType == 'url': 95 return set([self.getUrl(message) for message in self.messages]) 96 97 # 执行命令处理方法 98 def execCommand(self, command): 99 try: 100 print '[I] 正在执行命令: {command}, 请稍后...'.format(command=command) 101 res = '---------- 命令 {command} 执行结果: ---------- {res}'.format( 102 command=command, res=os.popen(command).read()) 103 print res 104 except: 105 print traceback.print_exc()
例如依赖nmap、sqlmap进行SQLi测试,配置文件内置了nmap、SQLmap命令。
1#!javascript 2[{ 3 "name": "Nmap 扫描端口", 4 "param": "host", 5 "command": "nmap -T4 {#}" 6}, 7{ 8 "name": "SQLMap 检查注入", 9 "param": "url", 10 "command": "python /opt/sqlmap/sqlmap.py -u {#} --dbs" 11}]
之后的例子将通过纯python脚本进行简单的sql、xss模糊测试。
###Burp模糊测试 先写一个简单的模糊测试工具,功能包括:
- 用一个单引号进行SQL注入测试。
- 跨站脚本攻击测试。
- 随机选取一个攻击载荷并随机重复上面的两个步骤。
测试应用一个单引号进行SQL注入。 测试应用<script>alert('ATK!');</script>进行XSS攻击。
1def mutate_payload(self,original_payload): 2 3 # pick a simple mutator or even call an external script 4 # like Radamsa does 5 picker = random.randint(1,3) 6 7 # select a random offset in the payload to mutate 8 offset = random.randint(0,len(original_payload)-1) 9 payload = original_payload[:offset] 10 11 # random offset insert a SQL injection attempt 12 if picker == 1: 13 payload += "'" 14 15 # jam an XSS attempt in 16 if picker == 2: 17 payload += "<script>alert('ATK!');</script>"; 18 19 # repeat a chunk of the original payload a random number 20 if picker == 3: 21 22 chunk_length = random.randint(len(payload[offset:]),len(payload)-1) 23 repeater = random.randint(1,10) 24 25 for i in range(repeater): 26 payload += original_payload[offset:offset+chunk_length] 27 28 # add the remaining bits of the payload 29 payload += original_payload[offset:] 30 31 return payload
首先配置模糊测试器。 
然后将编写好的扩展工具添加到Burp中。

出现上述报错。查看发现是因为路径含有中文未被解析,重新修改路径名。 
导入成功!成功后效果如图。 
访问web中使用的渗透测试网站。在搜索栏中搜索test内容。 
将proxy中收到的内容发送到intruder。 
界面中高亮的部分显示每一个请求的参数。这是Burp识别出可以进行模糊测试的地方。可以选择不同的载荷范围进行测试,也可以选择全部载荷进行测试。在payloads中设置写好的生成脚本。

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