在上篇工具| Burp Suite API学习思路文章中,斗哥介绍了BurpSuite扩展开发的一些准备工作与利用IHttpListener接口监听模块接收返回包,接下来斗哥会根据几个API来实现具体的功能需求,来开发个解码器,因面向接口开发扩展性较强,所以大家可以根据代码进行修改添加。
0x00 Burp Suite扩展需求说明
在web测试过程中,使用repeater调试接口是很常见的一个使用方式。现在很多接口都是返回包含unicode明文的json数据。
0x01 实现流程
当我收到一个网站返回的数据,在burp接收到数据,根据对应接口进行分析,获取要解码的位置,进行解码,重构。
0x02 接口方法说明
public interface IBurpExtender所有的扩展必须实现此接口。 实现的类名必须为“BurpExtender”。在 burp 包中,必须申明为 public ,并且必须提供一个默认的构造器。
public interface IHttpListener扩展可以实现此接口。通过调用 IBurpExtenderCallbacks.registerHttpListener() 注册一个 HTTP 监听器。Burp 里的任何一个工具发起 HTTP 请求或收到 HTTP 响应都会通知此监听器。扩展可以得到这些交互的数据,进行分析和修改。
public interface IBurpExtenderCallbacks此接口中实现的方法和字段在插件开发过程中会经常使用到。 Burp Suite 利用此接口向扩展中传递了许多回调方法,这些回调方法可被用于在 Burp 中执行多个操作。当扩展被加载后,Burp 会调用 registerExtenderCallbacks() 方法,并传递一个 IBurpExtenderCallbacks 的实例。扩展插件可以通过这个实例调用很多扩展 Burp 功能必需的方法。如:设置扩展插件的属性,操作 HTTP 请求和响应以及启动其他扫描功能等等。
0x03 实现说明
新建项目:
创建包:
导入BurpAPI创建:
编写BurpExtender类:
//BurpExtender
package burp;
import java.io.PrintWriter;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BurpExtender implements IBurpExtender,IHttpListener{
private IBurpExtenderCallbacks _callbacks;
private IExtensionHelpers _helpers;
private PrintWriter stdout;
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
this._callbacks = callbacks;
callbacks.registerHttpListener(this);
this._helpers = callbacks.getHelpers();
stdout = new PrintWriter(callbacks.getStdout(), true);
}
@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
if (toolFlag == 4 || toolFlag == 64) {
if (!messageIsRequest) { e
byte[] mess = messageInfo.getResponse();
IResponseInfo analylyResponse = this._helpers.analyzeResponse(mess);
List<String> helpers = analylyResponse.getHeaders();
int b_body_length = mess.length-analylyResponse.getBodyOffset();
byte[] bresponse_body =new byte[b_body_length] ;
System.arraycopy(mess, analylyResponse.getBodyOffset(), bresponse_body, 0 , b_body_length);
String response_body = new String(bresponse_body);
String newbody = this.unicdeInfo(response_body);
}
}
}
public String unicdeInfo(String str){
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");//\p{XDigit}十六进制数字:[0-9a-fA-F]
Matcher matcher = pattern.matcher(str);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
str = str.replace(matcher.group(1), ch + "");
}
return str;
}
}
0x04 分段代码说明
已下是接收返回包,分解返回包,从返回包取出要进行解码的部分的操作。
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
if (toolFlag == 4 || toolFlag == 64) { //只接收Proxy repeater模块的数据
if (!messageIsRequest) { //只操作Response包
byte[] mess = messageInfo.getResponse();//得到Response字节数组
IResponseInfo analylyResponse = this._helpers.analyzeResponse(mess);
//分解Response
List<String> helpers = analylyResponse.getHeaders();//头部
int b_body_length = mess.length-analylyResponse.getBodyOffset();//整个Response长度减body偏移量,得到要解码的部分
byte[] bresponse_body =new byte[b_body_length] ;
System.arraycopy(mess, analylyResponse.getBodyOffset(), bresponse_body, 0 , b_body_length);
//数组间复制
String response_body = new String(bresponse_body);
String newbody = this.unicdeInfo(response_body);
//传入解码代码
}
}
}
向下面的代码传入一串字符串进行解码,return解码结果,unicode解码的代码可以替换成任意加解密算法。
public String unicdeInfo(String str){
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");//\p{XDigit}十六进制数字:[0-9a-fA-F]
Matcher matcher = pattern.matcher(str);
//正则操作
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
str = str.replace(matcher.group(1), ch + "");
}
return str;
}
解码成功:
小小总结
本篇先开发个解码器,希望萌新们能根据工具开发的套路和上篇的API使用组合创造无限可能,下期斗哥会结合Node.js带来基于js的加密器,期待后续的篇章与大家一起分享burp suite的API学习之路。