在burp目录下新建类BurpExtender.java,必须是在burp目录下。其他目录旧版BurpSuite认不出来。
代码如下:
import burp.*;
import com.self.burp.ui.UIMain;
import javax.swing.*;
import java.awt.*;
import java.io.PrintWriter;
import java.util.List;
// implements 继承IBurpExtender类, ITab类, IHttpListener类
public class BurpExtender implements IBurpExtender, ITab, IHttpListener {
private IBurpExtenderCallbacks callbacks;
private IExtensionHelpers helpers;
// 采用PrintWriter标准输出,打印log信息
private PrintWriter stdout;
private JPanel jPanelMain;
// 创建BurpUIMain对象才能实现对UI内容修改
BurpUIMain burpUIMain = new UIMain();
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks iBurpExtenderCallbacks) {
// 插件入口类IBurpExtender,所有插件都必须实现该接口,该接口下面只有如上一个方法,并只会在启动插件的时候调用一次。因此常在该方法内执行一些初始化操作,如定义插件名称、初始化UI、注册全局变量、注册监听器等
this.callbacks = iBurpExtenderCallbacks;
// 设置插件名字
callbacks.setExtensionName("RequestUrlPrint");
// 采用helpers分析数据包
this.helpers = callbacks.getHelpers();
// 激活插件时,显示的内容
this.stdout = new PrintWriter(callbacks.getStdout(), true);
this.stdout.println("Loading successfully ...");
// 用于注册Proxy监听器,监听Proxy模块正在处理的请求和响应的通知
// callbacks.registerProxyListener(this);
// 用于注册HTTP监听器,监听所有模块(Proxy、Repeater等模块)正在处理的请求和响应的通知
callbacks.registerHttpListener(this);
// 初始化UI组件,获取到 UI 中主界面变量,注册到BurpSuite
jPanelMain = burpUIMain.getRoot();
callbacks.customizeUiComponent(jPanelMain);
// 添加自定义的Tab页面
callbacks.addSuiteTab(this);
}
@Override
public void processHttpMessage(int i, boolean b, IHttpRequestResponse iHttpRequestResponse) {
// processHttpMessage(),i表示是从哪个工具获取到的请求,b表示当前是请求包还是响应包,iHttpRequestResponse表示获取到的请求包或响应包
if (i==callbacks.TOOL_PROXY || i==callbacks.TOOL_REPEATER || i==callbacks.TOOL_INTRUDER) {
// 判断是请求包or响应包
if (b) {
// helpers.analyzeRequest()方法分析获取请求包信息
IRequestInfo iRequestInfo = helpers.analyzeRequest(iHttpRequestResponse);
// iHttpRequestResponse.getRequest() 获取请求信息,格式 byte[]
// iHttpRequestResponse.getHttpService().getPort() 获取请求端口
// iHttpRequestResponse.getHttpService().getHost() 获取请求Host地址
// iHttpRequestResponse.getHttpService().getProtocol() 获取请求协议http或者https
// iHttpRequestResponse.setHighlight 设置请求高亮显示
// iHttpRequestResponse.setComment() 设置proxy中备注信息
// iHttpReueqstResponse.setRequest() 请求修改后,设置新的请求发送
// iRequestInfo.getUrl() 获取完整请求URL
// iRequestInfo.getHeaders() 获取请求头,格式 List<String>
// iReuqestInfo.getMethod() 获取请求方法:Post、GET等
// iRequestInfo.getParameters() 获取参数,格式 List<IParameter>
// 获取请求主体
IRequestInfo iRequestInfo = this.helpers.analyzeRequest(iHttpRequestResponse);
byte[] bytes = iHttpRequestResponse.getRequest();
String reqbody = this.helpers.bytesToString(bytes).substring(iRequestInfo.getBodyOffset()).trim();
String reqUrl = iRequestInfo.getUrl().toString();
String request = new String(iHttpRequestResponse.getRequest());
List<String> headers = iRequestInfo.getHeaders();
byte[] body = request.substring(iRequestInfo.getBodyOffset()).getBytes();
// 添加请求头
headers.add("reqtest:abcd1234");
// 使用helpers.buildHttpMessage(Headers,)设置新的请求包,返回格式 byte[]
byte[] newreq = helpers.buildHttpMessage(headers, body);
// 设置新的请求包,并发送
iHttpRequestResponse.setRequest(newreq);
} else {
// iHttpReueqstResponse.setResponse() 设置修改后的响应包
// iHttpReueqstResponse.getResponse() 获取响应包信息,格式 byte[]
// iResponseInfo.getStatusCode() 获取响应码
// iResponseInfo.getHeaders() 获取响应头,格式 List<String>
IResponseInfo iResponseInfo = helpers.analyzeResponse(iHttpRequestResponse.getResponse());
List<String> headers = iResponseInfo.getHeaders();
String resp = new String(iHttpRequestResponse.getResponse());
byte[] body = resp.substring(iResponseInfo.getBodyOffset()).getBytes();
// 添加响应头
headers.add("resp:test");
// 使用helpers.buildHttpMessage()设置新的响应包,返回格式 byte[]
byte[] newresp = helpers.buildHttpMessage(headers, body);
// 设置新的响应包,并发送
iHttpRequestResponse.setResponse(newresp);
}
}
// 使用stdout.println()打印日志
stdout.println(
(b ? "HTTP request to " : "HTTP response from ") + iHttpRequestResponse.getHttpService() + "[" + callbacks.getToolName(i) + "]"
);
}
@Override
public String getTabCaption() {
// 设置自定义Tab名称
return "BurpGui";
}
@Override
public Component getUiComponent() {
return jPanelMain;
}
}
使用 Idea IDE 的Swing UI设计器,新建一个GUI窗体,就可以方便设计GUI页面了
UIMain.java代码如下:
import com.self.burp.BurpExtender;
import javax.swing.*;
import java.awt.*;
public class UIMain {
private JPanel root;
public UIMain() {
//下面可以添加各类监听器
**....此处省略....**
}
// 通过函数返回JPanel
public JPanel getRoot() {
return root;
}
}
下面可以根据自己需求利用BurpSuite Legacy扩展接口编写BurpSuite插件了