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. GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝

    摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新.在直播间场景里,虚拟人和数字人可用于直播主播.智能客服.营销推广等.接入GPT的虚拟人像是加了超强b ...

  2. 关于Pod中进程在节点中的研究

    最近研究OpenShift virtulization, 各种Pod对KVM进程的封装,引发了Pod中进程到底在Node中是什么表现形势的好奇,因为对基础知识的不扎实,还是希望找个环境能仔细看看,建立 ...

  3. 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务.线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高.Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 ...

  4. .NET的基元类型包括哪些?Unmanaged和Blittable类型又是什么?

    在讨论.NET的类型系统的时候,我们经常提到"基元类型(Primitive Type)"的概念,我发现很多人并没有真正理解基元类型就究竟包含哪些(比如很多人觉得字符串是基元类型). ...

  5. Redis系列16:聊聊布隆过滤器(原理篇)

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  6. rust cargo build一直出现 Blocking waiting for file lock on package cache

    如果确定没有多个程序占用,可以删除rm -rf ~/.cargo/.package-cache,然后再执行

  7. CMake个人理解和使用

    前言 CMake是一个构建工具,通过它可以很容易创建跨平台的项目.通常使用它构建项目要分两步,通过源代码生成工程文件,通过工程文件构建目标产物(可能是动态库,静态库,也可能是可执行程序).使用CMak ...

  8. DevOps|中式土味OKR与绩效考核落地与实践

    昨天一个小伙伴和我讨论了一下OKR和绩效管理,所以这次想简单明了地说下在中国怎么做比较合适,很多高大上的理论无法落地也是空中楼阁. 首先说一些,我个人的理解 道德品质和能力素质决定了一个人的职位行为 ...

  9. Hexo博客Next主题建立标签云hexo-tag-cloud及效果展示

    hexo-tag-cloud插件介绍 hexo-tag-cloud插件是作者写的一个Hexo博客的标签云插件,旨在直观的展示标签的种类,美观大方且非常优雅. 插件地址: 插件的GitHub地址 插件说 ...

  10. Composer 镜像原理 (3) —— 完结篇

    相关文章 Composer 镜像原理 (1) -- 初识 Composer Composer 镜像原理 (2) -- composer.json Composer 镜像原理 (3) -- 完结篇 上一 ...