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



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

  • 相关阅读:
    Interop.SQLDMO组件无法连接SQL2008
    关于数据连接配置connectionStrings的写法
    SQL锁表语句 (转摘)
    从思想到命运
    CIO:2013年OA选型六步走(摘)
    JS SCRIPT Confirm
    Silverlight 2 RTW中ToolTipService.ToolTip不继承父节点的DataContext的问题
    在Silverlight里实现类似WPF的UniformGrid
    尝试通过HttpWebRequest向TAOBAO批量发布商品及上传图片
    简单探照灯遮照效果的几个Silverlight程序(Silverlight 2.0)
  • 原文地址:https://www.cnblogs.com/ikari/p/9147280.html
Copyright © 2020-2023  润新知