1.前言

在做WEB渗透和APP的测试的时候,会碰到参数被加密情况,有些需要即时加解密,即在截断的时候动态修改参数,然后放过传送到服务器查看返回信息。因此有了这篇。

2.准备

a)java开发知识
b)熟悉burpsuit API
c)熟悉编译工具(eclipse)和打包(jar)

3.动手

a)首先保存burpsuit的API接口文件到本地

3.png
4.png

b)新建JAVA工程,并把刚导出的burpsuit API接口文件导入到工程

5.png

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

6.png
7.png

e)选好要打包的工程和要保存的位置点击完成,jar包就打包好了

8.png

f)最后把打包好的jar包导入burpsuit

9.png

4.测试

a)抓一个登录包,放到"Repeater"中,此时我们的插件已经添加到burpsuit中。

1.png

b)开启wireShark进行抓包,然后点击 “go”,这里在wireShark中查看我们刚发出去的包,如下图所示,密码字段已被加密

2.png

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加解密