# BurpSuite 扩展开发[1]-API与HelloWold

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2014-11-20T07:08:00Z
Canonical: https://wepostx.com/topics/640

> 乌云历史资料归档
>
> **原始作者：** 园长
> **原始编号：** superkieran-wooyundrops:406
> **原始发布时间：** 2014-11-20 15:08
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 简介

BurpSuite神器这些年非常的受大家欢迎，在国庆期间解了下Burp相关开发并写了这篇笔记。希望和大家分享一下JavaSwing和Burp插件相关开发。第一节仅简单的了解下API相关，后面会带着大家利用Netbeans开发我们自己的扩展以及各种有趣的小工具。

# 0x01 怎么学？

第一个问题是我们应该怎么去写自己的Burp扩展？我们可以找一些现有的扩展学习下，或者参阅官方文档或者手册，其次才是google一下是否有相关的教程、文章进行学习。
google搜索：burp suite api，找到官方的API相关说明。

- http://portswigger.net/burp/extender/

- http://blog.portswigger.net/2012/12/draft-new-extensibility-api.html

![原文图片](/media/2016/06/f058f45f2102678f8febc860f05f35ed)

You can:

- 执行和修改 HTTP 请求和响应

- 访问运行时的数据，比如：代理日志、目标站map和扫描问题

- 启动自己的action，如扫描和网站爬行

- 自定义扫描检测和注册扫描问题

- 提供自定义Intruder payloads和payload处理

- 查询和更新Suite-wide的目标作用域

- 查询和更新session处理cookie jar

- 实现自定义session处理action

- 添加自定义的标签(tabs)和上下文菜单项到Burp 用户界面

- 可使用自己的界面添加Burp的HTTP消息编辑器

- 自定义Burp的HTTP消息编辑器处理Burp不支持的数据格式

- 获取headers, parameters, cookies分析HTTP请求和响应

- 读取或修改Burp配置设置

- 保存或恢复Burp状态

# 0x02 学习API

API下载地址：http://portswigger.net/burp/extender/api/burp_extender_api.zip
下载API后新建Eclipse项目导入API文件：

![原文图片](/media/2016/06/d802feae3415c3dadd4301d5aff3b557)

不急于动手写代码，先看下官方的Demo：

![原文图片](/media/2016/06/65c22047e8566d99a47c1130df73b523)

下载第一个HelloWorld解压它并复制BurpExtender.java到我们的项目当中：

![原文图片](/media/2016/06/e66b5bdea589b1089c7335ea36ef0874)

BurpExtender.java：

![原文图片](/media/2016/06/a9610d8da638d25dbae96fb824d59625)

BurpExtender.java实现了IBurpExtender接口，而IBurpExtender仅定义了一个方法：registerExtenderCallbacks(注册扩展回调方法)：

```text
#!java public interface IBurpExtender{ /** * 这个方法将在扩展加载的时候.他将会注册一个 *<code>IBurpExtenderCallbacks</code> 接口实例,可通过扩展 * 实现各种调用 [email protected] *<code>IBurpExtenderCallbacks</code>对象. */ void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks); }
```
在确认代码无任何错误后选中项目并导出为jar,建议安装一个打jar包的插件:Build Fat Jar这样你就可以非常方便的把整个项目打成一个jar包了.

![原文图片](/media/2016/06/6f24b2b42c31e4fadeeb2481b274d96c)

如果你和我一样从来都没有使用过BurpSuite，那么不妨先打开它把玩几分钟。在extender(扩展)标签当中看到了Burp的插件加载界面。

![原文图片](/media/2016/06/cc69a5d16a841f6c5ed0a559ca9d0c63)

Add我们刚打好的jar包，加载到Burp扩展中去。

![原文图片](/media/2016/06/8ee98806034d6d6402e049ebb53367f8)

这个时候可以看到我们的插件已经成功运行了，在LoadBurpExtension中的output标签已经看到了Hello output(stdout.println("Hello output");)
Errors标签也输出了Hello errors()stderr.println("Hello errors");
对应的错误信息(throw new RuntimeException("Hello exceptions");)。
插件名(callbacks.setExtensionName("Hello world extension");)，
以及提醒面板的信息Hello alerts(callbacks.issueAlert("Hello alerts");)。

![原文图片](/media/2016/06/4fb8673011ecee2d6f4cc2e5a8e538d3)

获取到Burp混淆后的扩展加载类(自定义类加载器)：

![原文图片](/media/2016/06/629203610702940fc8e4f0a14a81f518)

如你所想，java加载外部扩展利用了URLClassLoader load外部的jar(对这感兴趣的朋友可以看下p2j上的相关文章:http://p2j.cn/?s=URLClassLoader&submit=Search)。
第一个HelloWorld很容易就搞定了，第二个Event listeners的Demo。所谓事件监听即你可以通过Burp的IBurpExtenderCallbacks去注册自己的监听方法。Demo只提供了四种事件(包含HTTP监听、代理、Scanner、状态监听)，所有的未列举的事件直接用Eclipse的快捷键提示就出来了：

![原文图片](/media/2016/06/fe67ddc9a0357f6b4529e984c481718c)

比如想要添加一个IScopeChangeListener很简单，让当前类实现IScopeChangeListener接口，注册ScopeChange事件(callbacks.registerScopeChangeListener(this);)重写其scopeChanged方法即可。

![原文图片](/media/2016/06/3c2a7ccdbca0cbb3839318d86942af4f)

设置本地浏览器代理后再次访问任意网站后回到扩展标签，选中我们的扩展程序可以看到监听中的请求已输出。

![原文图片](/media/2016/06/99f335358deab29f2e421c23553f535f)

# 0x03 HelloWorld

在编写扩展的时候一定要注意，你的包里面务必包含一个BurpExtender类可以有多个类实现IBurpExtender。 创建自己的Panel并加到Burp主窗体，AppPanel是我自己写的一个应用面板。我们可以通过实现ITab 重写getTabCaption和getUiComponent方法(当然实现IBurpExtender接口是必须的)将我们自己的ui嵌套到Burp当中。getTabCaption即获取获取标题，getUiComponent获取组件这里需要给Burp返回你封装的组件对象。
我们可以先写好JPanel再嵌入到Burp当中，这里提供了一个简单的ApplicationPanel小Demo:http://p2j.cn/?p=1512

```text
#!java package burp; import java.awt.Component; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class BurpExtender implements IBurpExtender, ITab { private JPanel jPanel1; @Override public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) { //设置扩展名 callbacks.setExtensionName("应用中心"); //创建我们的窗体 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //我们的主窗体 jPanel1 = new AppPanel(); //自定义我们的组件 callbacks.customizeUiComponent(jPanel1); //添加标签到Burp主窗体 callbacks.addSuiteTab(BurpExtender.this); } }); } @Override public String getTabCaption() { return "应用中心"; } @Override public Component getUiComponent() { return jPanel1; } }
```
效果图：

![原文图片](/media/2016/06/33dfe5c2b8ba57f91eff9d0a7abbea04)

## Replies
