Burp Suite是什么?

Burp Suite是一款Web应用程序渗透测试工具,可以帮助用户发现和利用Web应用程序中的漏洞,提高渗透测试的效率和精度。

Web应用程序最常用的传输数据的协议就是HTTP/HTTPS,所以我们将从HTTP协议的数据格式开始介绍。

HTTP/HTTPS协议内容简要划分

Burp中最为核心的对象就是HTTP数据包,我们的所有操作、各种API接口都是围绕HTTP数据包展开的。下图对HTTP数据包进行划分:

数据映射表:

插件能对HTTP数据包做的操作无非“增删查改”四种,下面这段代码对常用操作均进行了演示。

https://github.com/bit4woo/burp-api-drops/blob/master/src/burp/Lession5.java

请求包:

  • header获取删除新增修改

  • body获取修改

  • parameter获取删除新增修改

  • 发送一个新的请求

响应包:

  • header获取删除新增修改

  • body获取修改

httpService:

  • host获取修改
  • port获取修改
  • protocol获取修改

插件的调用原理介绍

以下全文将以Java语言的视角展开,

  1. 插件的总入口是BurpExtender类,该类是必须得实现IBurpExtender接口;

  2. 当实现IBurpExtender接口后,会要求重写registerExtenderCallbacks()方法,而该函数的作用就是注册回调,当自己的写的插件需要哪些API支持的时候,都需要在该函数中进行注册,这样burp在执行的时候,会读取自己写的插件代码是否有回调注册,如果有就进行执行相应代码。

基本逻辑流程如下:

BurpExtender类————> registerExtenderCallbacks()方法 ————> 调用Callbacks.registerXxx接口名称(this) ————> 去执行注册接口的方法

Burp Suite的API的简要划分

Burp Suite 提供了丰富的插件接口,可以让开发者编写自定义插件,扩展 Burp Suite 的功能。 最新版本的APIs还是挺多的,想要高效的编写出插件,还是得了解你的需求,根据需求去匹配使用相关接口,下面我列举一些常用的 Burp Suite 插件接口类:

  • IBurpExtender 接口:该接口用于定义 Burp Suite 插件的入口点,即插件的主类。在该接口的 registerExtenderCallbacks 方法中,开发者可以注册其他插件接口类和事件监听器。

  • IExtensionStateListener 接口:该接口用于定义插件状态的变化监听器。开发者可以通过实现该接口,监视插件的启动、停止和卸载等事件,并在这些事件发生时执行自定义的操作。

  • IHttpListener 接口:该接口用于定义 HTTP 拦截器。通过实现该接口,开发者可以在 Burp Suite 中拦截 HTTP 请求和响应,并实现自定义的处理逻辑,例如修改请求或响应、分析参数等。

  • IScannerCheck 接口:该接口用于定义漏洞扫描器。通过实现该接口,开发者可以编写自定义的漏洞检测逻辑,并将其集成到 Burp Suite 的漏洞扫描器中,从而提高漏洞检测的效率和精度。

  • IIntruderPayloadGenerator 接口:该接口用于定义 Intruder 负载生成器。通过实现该接口,开发者可以编写自定义的负载生成逻辑,并将其集成到 Burp Suite 的 Intruder 工具中,用于进行爆破和暴力破解等攻击。

  • IContextMenuFactory 接口:该接口用于定义右键菜单工厂。通过实现该接口,开发者可以向 Burp Suite 的右键菜单中添加自定义的菜单项,并实现菜单项的点击事件。

  • IMessageEditorTabFactory 接口:该接口用于定义消息编辑器选项卡工厂。通过实现该接口,开发者可以向 Burp Suite 的消息编辑器中添加自定义的选项卡,并实现选项卡的内容显示和编辑功能。

开发流程简介

大体步骤如下:

  • 创建项目、导入jar包

    开发插件有些规定需要记住,目录名必须设置成burp目录,类名即文件名必须是BurpExtender。

    导入burp的接口jar包有多种方式,我下面以maven的方式举例:
<dependencies>
<!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api -->
<dependency>
<groupId>net.portswigger.burp.extender</groupId>
<artifactId>burp-extender-api</artifactId>
<version>1.7.22</version>
</dependency>
</dependencies>
  • 开发功能模块
  • 编译打包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

打开终端,输入打包jar包命令:

mvn clean install
  • Burp Suite导入刚编译好的jar包进行测试、使用。

案例1 —— 对HTTP\HTTPS数据流处理

如果想要实现对HTTP\HTTPS数据的操作,那么就需要了解IHttpListener接口中的processHttpMessage方法

Burp的IHttpListener接口用于扩展Burp Suite的HTTP拦截器,通过实现该接口可以在HTTP请求和响应被拦截时执行一些自定义的操作。

IHttpListener接口中的processHttpMessage方法用于处理拦截到的HTTP请求和响应,其方法签名如下:

void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo);

其中:

  • toolFlag 参数表示触发拦截的工具,可以是 Burp Suite 中的 Proxy、Scanner、Spider 等工具;
  • messageIsRequest 参数表示拦截到的消息是请求还是响应;
    • 当 messageIsRequest 参数为 true 时,表示拦截的是请求内容
    • 当 messageIsRequest 参数为 false 时,表示拦截的是响应内容
  • messageInfo 参数表示拦截到的HTTP请求/响应的详细信息,包括请求/响应头、请求/响应体、请求/响应的地址、协议版本等等。

在实现IHttpListener接口时,通常会在processHttpMessage方法中编写自定义的处理逻辑,比如对请求/响应进行修改、分析请求/响应的参数等,从而实现自定义的HTTP拦截功能。

总之,通过实现IHttpListener接口,并在其中实现processHttpMessage方法,可以为Burp Suite的HTTP拦截器添加自定义的处理逻辑,从而提高渗透测试的效率和精度。

下面主要讲解一个通过对HTTP\HTTPS数据流的拦截、处理,在head添加 X-forwarded-for 一个请求头,伪造客户端IP测试的案例。

可以配合在线工具,进行测试:

https://uutool.cn/mock/

主要用来模拟服务端收到请求后,查看请求内容。

code:

package burp;

import burp.IBurpExtender;
import burp.IBurpExtenderCallbacks;
import burp.IExtensionHelpers; import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.List; public class BurpExtender implements IBurpExtender, IHttpListener, IExtensionStateListener {
private IExtensionHelpers helpers;
private IBurpExtenderCallbacks callbacks;
private PrintWriter stdout;
private PrintWriter stderr; @Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks iBurpExtenderCallbacks) {
this.callbacks = iBurpExtenderCallbacks;
//设置插件名字
callbacks.setExtensionName("Demo1");
this.helpers = callbacks.getHelpers(); // 一定要注册监听器,不然下面的函数无法生效
callbacks.registerHttpListener(this);
callbacks.registerExtensionStateListener(this); this.stdout = new PrintWriter(callbacks.getStdout(), true);
this.stderr = new PrintWriter(callbacks.getStderr(), true); // 打印信息在UI控制台页面 Output and Errors
stdout.println("Hello Demo1 Extender !");
stderr.println("Error Info Show.");
} @Override
public void processHttpMessage(int i, boolean b, IHttpRequestResponse iHttpRequestResponse) {
//设置http监听模块为Burpsuiteproxy模块
if (i == IBurpExtenderCallbacks.TOOL_PROXY) { if (b) { //对请求包进行处理 //获取协议 端口 和主机名
IHttpService service = iHttpRequestResponse.getHttpService();
stdout.println("=============***============= Protocol host port :" + service.getProtocol() + " " + service.getHost() + " " + service.getPort()); //对消息体进行解析,messageInfo是整个HTTP请求和响应消息体的总和,各种HTTP相关信息的获取都来自于它,HTTP流量的修改都是围绕它进行的。
IRequestInfo analyzeRequest = helpers.analyzeRequest(iHttpRequestResponse); // 获取参数
List<IParameter> parameList = analyzeRequest.getParameters();
//获取参数 、遍历参数
for (IParameter para : parameList) {
//获取参数
String key = para.getName();
//获取参数值(value)
String value = para.getValue();
int type = para.getType();
stdout.println("parameters key value type :" + key + " " + value + " " + type);
} // 更新拦截处理后的数据 +
IRequestInfo analyIRequestInfo = helpers.analyzeRequest(iHttpRequestResponse);
//获取整个请求数据内容
String request = null;
try {
request = new String(iHttpRequestResponse.getRequest(), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} //通过上面的analyIRequestInfo得到请求数据包体(body)的起始偏移
int bodyOffset = analyIRequestInfo.getBodyOffset(); //通过起始偏移点得到请求数据包体(body)的内容
byte[] body = null;
try {
body = request.substring(bodyOffset).getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} //通过上面的analyIRequestInfo得到请求数据的请求头列表
List<String> headers = analyIRequestInfo.getHeaders();//获取http请求头的信息 //生成X-Forwarded-For请求头 包括请求头的key(X-Forwarded-For)及随机生成的IP
String xForwardFor = "X-Forwarded-For: " + RandomIP.getRandomIP(); //新增header头, 添加x-forwarded-for请求头,伪造客户端IP测试
headers.add(xForwardFor);
headers.add("Test-Head: I am a test data!!!"); //遍历请求头
for (String header : headers) {
stdout.println("header : " + header);
} //重新构造了请求数据
byte[] newRequest = helpers.buildHttpMessage(headers, body); //打印出重新构造的请求数据测试
stdout.println(helpers.analyzeRequest(newRequest).getHeaders()); //重新构造的新请求数据, 因为里面已经包含有我们添加的X-Forward-For
iHttpRequestResponse.setRequest(newRequest); } else {//对响应包进行处理
// Response
IResponseInfo analyzeResponse = helpers.analyzeResponse(iHttpRequestResponse.getResponse());
//获取响应码信息
short statusCode = analyzeResponse.getStatusCode();
stdout.println("status= " + statusCode); //获取响应头信息
List<String> headers = analyzeResponse.getHeaders();
for (String header : headers) {
stdout.println("header:" + header);
} // 获取响应信息
String resp = new String(iHttpRequestResponse.getResponse());
int bodyOffset = analyzeResponse.getBodyOffset();
String body = resp.substring(bodyOffset);
stdout.println("response body=" + body);
}
}
} // 用于注册插件状态监听,在卸载插件时会执行
public void extensionUnloaded() {
String fileName = "D:\\testData\\example.txt";
String fileContent = "The Demo1 extension removed!"; try {
FileWriter fileWriter = new FileWriter(fileName);
fileWriter.write(fileContent);
fileWriter.close();
System.out.println("Successfully wrote to the file.");
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}

案例2 —— 高亮、新标签界面

高亮非常简单:

iHttpRequestResponse.setHighlight("red");
iHttpRequestResponse.setHighlight("yellow");
iHttpRequestResponse.setHighlight("blue");
// ...

新标签界面:

如果想要实现在请求和响应界面加一个新标签页来展示自定义信息,那么就需要了解IMessageEditorTab接口setMessage方法

Burp的IMessageEditorTab接口是用于扩展 Burp Suite 的请求/响应编辑器的一种方式,通过实现该接口可以向编辑器中添加自定义的标签页,实现自定义的请求/响应内容编辑功能。

IMessageEditorTab 接口中的setMessage方法用于设置当前编辑器中显示的请求/响应内容。该方法的签名如下:

void setMessage(byte[] message, boolean isRequest);

其中:

  • message 参数表示要设置的请求/响应内容的字节数组;
  • isRequest 参数表示设置的内容是请求还是响应,
    • 当 isRequest 参数为 true 时,表示设置的是请求内容
    • 当 isRequest 参数为 false 时,表示设置的是响应内容

在实现 IMessageEditorTab 接口时,通常会在自定义的标签页中添加一个编辑器组件(如 TextArea),并在 setMessage 方法中将请求/响应内容设置到该组件中,从而在标签页中显示请求/响应内容。同时,还可以在自定义的标签页中添加一些其他的组件,比如按钮、复选框等,实现一些自定义的功能,如发送请求、解析响应等。

总之,通过实现 IMessageEditorTab 接口,并在其中实现 setMessage 方法,可以为 Burp Suite 的请求/响应编辑器添加自定义的标签页及编辑功能,从而提高渗透测试的效率和精度。

插件的断点调试

  1. 通过命令打开Burp Suite;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar [You path]\burpsuite_community.jar
  1. 在代码里面打上断点;

  2. 配置一个Remote JVM Debug

  1. 加载上插件,开始调试。

UI界面

感觉UI这块内容不少,我后期单独写一篇新博客吧。可以点赞支持我加速。

Reference

Burp Suite Extension Development Guide的更多相关文章

  1. Burp Suite Extension tools

    1.Setting up the envrionment for burp Extensions   before we can write extensions we need to ensure ...

  2. Burp Suite使用介绍

    Burp Suite使用介绍(一)  22人收藏 收藏 2014/05/01 19:54 | 小乐天 | 工具收集 | 占个座先 Getting Started Burp Suite 是用于攻击web ...

  3. Burp Suite之Intruder模块(四)

    Burp Suite之Intruder模块(三) Intruder介绍: Burp intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击.它可以用来自动执行所有类型的任务您的测试过程 ...

  4. Burp Suite使用介绍总结

    Burp Suite使用介绍(一) 小乐天 · 2014/05/01 19:54 Getting Started Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些 ...

  5. Burp Suite初探

    Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程. 一.安装部署 需要配置java环境,首先安装java,然后配置 ...

  6. Burp Suite安装&环境配置&启动&浏览器设置代理

    一.简述 Burp Suite是一款使用Java编写的,用于Web安全审计与扫描套件.它集成了诸多实用的小工具以完成http请求的转发/修改/扫描等,同时这些小工具之间还可以 互相协作,在BurpSu ...

  7. 基于实战的Burp Suite插件使用Tips

    基于实战的Burp Suite插件使用技巧 本篇文章首发于奇安信攻防社区 目录 基于实战的Burp Suite插件使用技巧 免责声明: 0×00前言 0×01专业版激活 0×02插件的环境安装 0×0 ...

  8. Burp Suite新手指南

    Burp Suite想必大家都用过,但是大家未必知道它的所有功能.因此,本文的主要目的就是尽量深入介绍各种功能.BurpSuite有以下这些功能: 截获代理– 让你审查修改浏览器和目标应用间的流量. ...

  9. Burp Suite使用详解一

    本文由阿德马翻译自国外网站,请尊重劳动成果,转载注明出处 Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫描web应用程序漏洞,以暴力破解 ...

  10. Burp Suite 使用教程(上传突破利器)

    Burp Suite是一个免费的网站攻击工具. 它包括proxy.spider.intruder.repeater四项功能.该程序使用Java写成,需要 JRE 1.4 以上版本 下载该程序的源代码, ...

随机推荐

  1. 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题

    三.假设你希望以1/2的概率输出0与 1.你可以自由使用一个输出0或1的过程 BIASED-RANDOM.它以某概率 p 输出1,概率 1-p 输出0,其中 0<p<1 ,但是 p 的值未 ...

  3. 如何在.net6webapi中配置Jwt实现鉴权验证

    JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...

  4. 2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。

    2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j. ...

  5. SpringBoot定义优雅全局统一Restful API 响应框架六

    闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展. 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 ...

  6. C/S架构和B/S架构两种数字孪生技术路线的区别是什么?

    山海鲸创造了一种CS和BS热切换的编辑模式,即CSaaS架构,可以在安装软件之后一键从软件的CS状态切换为一个BS服务器,让私有化部署变得十分轻松.具体效果可以参照下面的视频: (https://ww ...

  7. substrate 编译出错unresolved import `sp_runtime::testing` failed to resolve: could not find `GenesisConfig` in `system`

    error[E0432]: unresolved import `sp_runtime::testing` --> /Users/suyinrong/bitcoin-proj/substrate ...

  8. 基于瑞芯微camera文章汇总pdf分享给大家

    前面一段时间基于瑞芯微3568平台编写了camera系列文章, 一共12篇,目前更新完毕. <瑞芯微文章合集> camera系列文章编写前后一共花费2个月时间, 期间查阅了很多资料,做了很 ...

  9. 【Oracle】使用PL/SQL实现冒泡排序

    [Oracle]使用PL/SQL实现冒泡排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础 存储包内容如下 规范: create or ...

  10. Collection 接口及其常用方法

    Collection 接口的特点 Collection接口没有直接实现类,提供了更具体的子接口(如Set和List)的实现.Collection实现类(通常通过其中一个子接口间接实现Collectio ...