BurpSuite扩展插件使用分享

#前言 

在我们使用渗透测试工具渗透测试时,经常会遇到目标站点需要先完成身份认证才能进行深度扫描的情况。这就会给喜欢使用各种渗透工具的同学带来一些麻烦:

  • 有些工具并不支持“身份认证”功能

  • 在需要同时使用多个工具时,逐个修改配置文件,枯燥而低效

  • 目标站点使用了多因素认证时,又要浪费时间改进原有的认证方式

  • … …

那么有没有其他更加简单和高效的方法呢?我想到了Burp Suite的Proxy 和Plugin功能。本文为对本次尝试的记录和总结:

# 准备工作

Burp Suit扩展插件可以让用户通过编写第三方代码来自定义Burp Suite的功能。支持使用Java、Python和Ruby这3种语言来编写。如果使用后两种语言,需要安装配置Jython和JRuby环境。

本次我们将使用Python来编写扩展,所以需要安装Jython。下载地址:

https://www.jython.org/download.html

如图所示,下载Jython Standalone版本。

打开Burp Suite,在Extender功能下,有4个标签:Extensions、BApp Store、APIs和Options。

Extensions:可以添加或移除本地磁盘上保存的扩展文件。

BApp Store:可以在线下载并安装一些常用的扩展插件。

APIs:开发扩展所用到的官方API的文档。

Options: 可以配置Jython和JRuby的执行文件路径,在上方的Settings下面可以配置是否在BurpSuite启动时自动加载扩展和是否自动更新扩展。

另外 API 文档中,官方提供了在线的版本

https://portswigger.net/burp/extender/api/

还有一些简短的 Demo 程序可以用来参考

https://portswigger.net/burp/extender/

#插件编写

本次插件编写的目标为:

  • 编写BurpSuite的Plugin 并植入事先准备好的Cookie值,访问需要登录才能访问的功能

  • 通过 Plugin 排除一些不希望扫描访问的功能(比如重置密码或者退出登录等等)

  • 使 BurpSuite 的HTTP代理功能,同时代理多个漏洞扫描器的流量

#!/usr/bin/env python

# -*- coding: utf-8 -*-


from burp import IBurpExtender

from burp import IProxyListener

#引用Burp接口包

#IBurpExtender,基本每个扩展都需引用此接口

#IProxyListener:代理监听模块


CONFIG = {

"PROTOCOL": "http",

"HOST": "192.168.56.101",

"PORT": 80,

"EXCLUDE_FILES": ("/setup.php", "/vulnerabilities/csrf/", "/security.php", "/logout.php",),

"COOKIE_HEADER_PREFIX": "Cookie:",

"COOKIE_VALUE": "Cookie: PHPSESSID=XXXXXXXXXXXXXXXXXXXXXXXXXX; security=low",

}

#自定义定义字典,其中包括目标Web应用的协议,主机,端口、cookie、扫描例外路径


class BurpExtender(IBurpExtender, IProxyListener):


def registerExtenderCallbacks(self, callbacks):

callbacks.setExtensionName("Scan_Helper_DVWA")

self.helpers = callbacks.getHelpers()

callbacks.registerProxyListener(self)


def processProxyMessage(self, messageIsRequest, message):

if messageIsRequest:

messageInfo = message.getMessageInfo()

requestByte = messageInfo.getRequest()

requestInfo = self.helpers.analyzeRequest(messageInfo)


urlInfo = requestInfo.getUrl()

if urlInfo.getProtocol() != CONFIG["PROTOCOL"] or urlInfo.getHost() != CONFIG["HOST"] or urlInfo.getPort() != CONFIG["PORT"]:

message.setInterceptAction(message.ACTION_FOLLOW_RULES)

#与CONFIG中的字典进行对比,如与字典中的协议、host、端口不同,则不做进一步处理

else:

if urlInfo.getFile().split("?")[0] in CONFIG["EXCLUDE_FILES"]:

message.setInterceptAction(message.ACTION_DROP)

#与CONFIG中的字典进行对比,如与字典中的扫描例外相同,则丢弃

else:

headers = requestInfo.getHeaders()

new_headers = list()

for header in headers:

if header.startswith(CONFIG["COOKIE_HEADER_PREFIX"]):

header = CONFIG["COOKIE_VALUE"]

new_headers.append(header)


bodyOffset = requestInfo.getBodyOffset()

data = requestByte[bodyOffset:]


newHttpMessage = self.helpers.buildHttpMessage(new_headers, data)

messageInfo.setRequest(newHttpMessage)

#替换请求中的cookie等字段,组成新的请求

message.setInterceptAction(message.ACTION_FOLLOW_RULES)

#效果演示

1. Arachni 无代理扫描靶机

Arachni 扫描器中,填上目标应用的地址,正常情况下因为没有登录,所以很多功能访问不到。

arachni.bat --report-save-path=192.168.56.101.afr http://192.168.56.101

arachni_reporter.bat 192.168.56.101.afr --reporter=html:outfile=192.168.56.101.html.zip

所以扫描的结果很少

2. Arachni 通过BurpSuite 的plugin和proxy扫描靶机

使用BurpSuite 加载刚刚写好的扩展, Arachni 中填写 BurpSuite 的代理地址之后,再来扫描。

arachni.bat--report-save-path=192.168.56.101.afr --http-proxy=127.0.0.1:8080 http://192.168.56.101

rachni_reporter.bat 192.168.56.101.afr --reporter=html:outfile=192.168.56.101.html.zip

因为可以访问需要认证的功能了,扫描出的结果多了许多。

3.使用其他工具 通过BurpSuite的plugin和proxy扫描靶机

之后又使用几款其他的工具进行测试,效果还算理想,本次测试结束。

结语

本次 编写的 Burp 扩展实例,力图实现简单,还有优化的空间,比如可以把 CONFIG 配置字典,拆分到一个配置文件中,或者从外部 Redis Server 动态获取配置信息等。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章