Burp Suite API学习思路(二)

在上篇工具| 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学习之路。

本文分享自微信公众号 - 漏斗社区(newdooneSec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术】程序在内存中如何分配的?

好多初学者可能对程序在内存中如何布局都有疑问,在我们和用户的沟通过程中也发现有好多同学问相关的问题。这里转一个文章,讲得很不错的,大家可以看一下。 栈主要用来存...

24060
来自专栏吴伟祥

队列 LinkedBlockingQueue 原

    java.util.concurrent包下的新类。LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现。

10820
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十四天 多线程-多线程&线程安全【悟空教程】

进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

15250
来自专栏芋道源码1024

Java初中级面试题(2)

63870
来自专栏沈唁志

PHP中通过json格式定义字面量对象

28320
来自专栏林德熙的博客

win10 UWP 序列化 BinaryXML序列化

将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新...

11120
来自专栏养码场

再刷一波起来!Java后端开发面经大集锦2.0,刷完顺利拿下Offer!

昨天场主献上Java后端开发面经大集锦1.0,反响特别好!还有程序员“指控”场主:为啥不早点推送??并送上了一个意味深长的微笑

15520
来自专栏BinarySec

NETBIOS主机名编码算法

最近在看SMB协议,在自己构造数据包的时候发现了一个问题。 经过查阅资料发现NETBIOS对主机名的编码方式如下: 1.将字符补齐到16字节,不够的用空格补 ...

45680
来自专栏我是攻城师

理解Java里面的代理模式

代理模式是23种设计模式中非常经典的一种模式,在日常生活中到处充满了代理模式的痕迹,常见的比如火车代售点买票,各种公共服务大厅,以及各种网上购物平台其实都可以看...

45010
来自专栏码代码的陈同学

深入JVM内幕

众所周知,Java字节码运行在JRE(Java Runtime Environment)中,JVM又是JRE中最重要的部分,主要用于分析和执行字节码。虽然不深入...

25670

扫码关注云+社区

领取腾讯云代金券