20155117王震宇网络对抗-(1)

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



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

posted @ 2018-06-06 21:17  20155117王震宇  阅读(252)  评论(0编辑  收藏  举报