BurpSuit 插件编写----简单参数加解密(编解码)
1.前言
在做WEB渗透和APP的测试的时候,会碰到参数被加密情况,有些需要即时加解密,即在截断的时候动态修改参数,然后放过传送到服务器查看返回信息。因此有了这篇。
2.准备
a)java开发知识
b)熟悉burpsuit API
c)熟悉编译工具(eclipse)和打包(jar)
3.动手
a)首先保存burpsuit的API接口文件到本地
b)新建JAVA工程,并把刚导出的burpsuit API接口文件导入到工程
c)新建 BurpExtender 类,写我们的代码。具体代码如下:
package burp;
import burp.*;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.net.URL;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
public class BurpExtender implements IBurpExtender,IHttpListener
{
//
// implement IBurpExtender
//
private PrintWriter stdout;
IExtensionHelpers helper;
//Base64编码对象
final Base64.Encoder encoder = Base64.getEncoder();
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)
{
// set our extension name
callbacks.setExtensionName("Hello world extension");
//重定向输出
this.stdout = new PrintWriter(callbacks.getStdout(), true);
//注册IHttpListener
callbacks.registerHttpListener(this);
//新建一个Helpers对象
this.helper = callbacks.getHelpers();
}
@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
//判断(toolFlag)请求是从哪来窗口(如:Repeater,Proxy等)来的。判断(messageIsRequest)是请求还是响应 true为请求 false为响应
if (toolFlag == IBurpExtenderCallbacks.TOOL_REPEATER && messageIsRequest) {
String method = this.helper.analyzeRequest(messageInfo).getMethod();
//this.stdout.println(method);
String url = helper.analyzeRequest(messageInfo).getUrl().toString();
//stdout.println(url);
List<IParameter> paramList = helper.analyzeRequest(messageInfo).getParameters();
byte[] new_Request = messageInfo.getRequest();
for(IParameter param :paramList )
{
if (param.getType() == 0) {
//打印参数
stdout.println("name:"+param.getName());
stdout.println("value:"+param.getValue());
String key = param.getName();
String value = param.getValue();
//对pwd字段进行base64编码
if (key.equals("pwd")) {
String new_value = null;
try {
new_value = encoder.encodeToString(value.getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
IParameter newPara= helper.buildParameter(key, new_value, param.getType()); //构造新的参数
new_Request = helper.updateParameter(new_Request, newPara); //构造新的请求包
}
}
messageInfo.setRequest(new_Request);//设置最终新的请求包
}
//打印更新后的参数
for(IParameter para : helper.analyzeRequest(messageInfo).getParameters()){
stdout.println(para.getValue());
}
/*
IParameternewPara= helpers.buildParameter(key, aesvalue, para.getType()); //构造新的参数
new_Request = helpers.updateParameter(new_Request, newPara); //构造新的请求包
messageInfo.setRequest(new_Request);//设置最终新的请求包
*/
}
}
public static void main(String[] args) {
}
}
.
注:要在类中加入main函数,由于某些未知原因之前没有加入main函数导入jar的时候一直报错
d)编写好代码后打包jar
e)选好要打包的工程和要保存的位置点击完成,jar包就打包好了
f)最后把打包好的jar包导入burpsuit
4.测试
a)抓一个登录包,放到"Repeater"中,此时我们的插件已经添加到burpsuit中。
b)开启wireShark进行抓包,然后点击 “go”,这里在wireShark中查看我们刚发出去的包,如下图所示,密码字段已被加密
5.总结
1.编写插件时最让我困扰的是我想在发包之前,参数要怎么经过我写的代码并由我处理之后再向服务器进行请求,这里主要是“IHttpListener”这个类,burp里的任何一个工具发起的HTTP请求或收到HTTP响应都会通知此类(监听器),所以可以通过实现此类在发包之前先对请求参数、cookie和头部做处理后再发包。这样就可以达到我们的效果了。
2.其中设置并更新参数这一块也困挠了我一会,之后发现通过下面代码可以实现参数的设置和更新,详细用法参考上面代码。
IParameternewPara= helpers.buildParameter(key, aesvalue, para.getType()); //构造新的参数
new_Request = helpers.updateParameter(new_Request, newPara); //构造新的请求包
messageInfo.setRequest(new_Request);//设置最终新的请求包
3.开始是用的IDEA打包jar导入burpsuit老是会报错,不知原由,所以后来改用eclipse,如果你看到这篇文章并且解决了这个问题,还望指点一二,在评论区留个言,多谢。
注:其中 “BurpExtender.java”类为我自己写的类,导出API文件中是不包含此类的
这里用的是base64对参数进行编码,可以把算法替换成你想要算法(RSA,AES,DES等)
6.参考
BurpSuite插件开发指南之 API 上篇
BurpSuite插件开发指南之 API 下篇
BurpSuite插件开发指南之Java篇
BurpSuite插件开发指南之 Python 篇
BurpSuite插件开发Tips:请求响应参数的AES加解密