Burpsuite插件开发之RSA加解密

burpsuite是一款非常好用的抓包工具,我自己也是重度用户,所以就上手了burpsuite的插件接口开发,本文主要记录了一个解密请求包,插入payload,再加密的插件开发过程,插件应用场景主要是用于通过分析apk的实现。这里做探讨的目的只是方便安全测试人员的个人学习,或大家渗透测试使用。

详细的代码见github代码,在文档中数据首先是以rsa方式加密des的key得到encryptKey,然后使用des的key加密数据包得到data,再组装成一个JSON格式串,这是加密过程,当然解密过程就是逆向的。插件应用场景主要是用于通过分析apk的实现,或者泄露的密钥,获取其加解密算法,在解密后的数据包中插入payload,发现注入问题等。

如下则是加密后的数据包:

  1. c={ 
  2.  
  3.  "data":"21BhviedgtbwK6rdlK7vzltqxOLxUmU2g5qaO5LWPYTha5fXslmL6jrMkFnJBwpZPZMNl5foxTUHw2Mae++zkWwtzWkKXI9WJ/CJqxO9uORT5I6iUmIG7bBcgnHpmlSNKfFwBvnr9vj3v5ByvW2s2/pL9rSaeD+/8XsX01NA96mC4g5pVBeU5IY9F4tdxH9yobXfN6GzEVhLeiEd30xzMA\u003d\u003d", 
  4.  
  5.  "encryptKey":"bjWZgigAW/ZaAA55v7Yi9AGt2qsP7BfZZISu70qc/xVUVfh5L/Mw/mMbzxkcZ6uXb1vvgXvF7hHYwjsVzvEkRK0rIfIwkcYzn160fvQ/8+F8YBMDLzTEhf8r0KjOLlJV+HgOsS4QG/G9lOU5mnupfrVA9sf54b3OvXHU0TQVG7U\u003d" 
  6.  
  7.  } 

从数据库包能看到大的数据是一个json格式,里面有data,和encryptKey值,encryptKey就是使用RSA加密des 的key得到的,RSA的工作方式和pem文件可通过界面设置,再接着用这个key采用des方式解密data中的内容。操作界面如下:

2、InsertPoint 接口

InsertPoint顾名思义就是注入点,就是payload插入的地方,比如request中的cookie,参数等位置。为了对一些burpsuite不支持的参数格式进行支持就必须实现该接口,可以用在Active Scanner和Intruder中.

2.1 基础开发知识

最好的方式就是在原有插件的基础上修改,这样能省很多精力,当然如果要一步一步来的话,步骤如下:

(1)包含burp的接口文件

(2)创建一个包名为burp,在里面创建BurpExtender类,实现IBurpExtender接口,这个BurpExtender类是所有接口的心脏,注意这里涉及到名字都不能改动,burp插件就这么规定的。

(3)实现唯一的接口函数

  1. public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) { 
  2.  
  3.         this. callbackscallbacks = callbacks ; 
  4.  
  5.        } 

通过callbacks获取核心基础库能力,像日志,请求,返回值修改等。

(4)日志接口

  1. PrintWriter stdout = new PrintWriter(callbacks.getStdout(), true); 
  2.  
  3. PrintWriter stderr = new PrintWriter(callbacks.getStderr(), true); 
  4.  
  5. //输出到插件的output 
  6.  
  7. stdout.println("Hello output"); 
  8.  
  9. // 输出到alerts tab 
  10.  
  11. callbacks.issueAlert("Hello alerts"); 
  12.  
  13. //打印调用栈 
  14.  
  15. e.printStackTrace(stderr) 

有了这些日志接口就能比较好的调试代码了,如果要很好的跟踪请求的,可以在BApp Store中添加”Custom Logger”这个插件,能够记录所有的请求和返回信息。

2.2 getInsertionPoints

下面我们就来讲讲如何实现一个InsertionPoints接口。第一步继承IScannerInsertionPointProvider接口,实现getInsertionPoints()方法,同时通过callbacks.registerScannerInsertionPointProvider(this)方法注册成为insertion point provider。下面我们就来看看getInsertionPoints()的实现。

  1.  @Override  
  2.  public List<IScannerInsertionPoint> getInsertionPoints (IHttpRequestResponse baseRequestResponse) { // 生成insertPoints数组   
  3.  List<IScannerInsertionPoint> insertionPoints = new ArrayList<IScannerInsertionPoint>(); // 获取请求参数  
  4.  IRequestInfo requestInfo = helpers.analyzeRequest(baseRequestResponse.getRequest());   
  5.  List<IParameter> requestParams = requestInfo.getParameters(); 
  6.  
  7.     for (IParameter parameter : requestParams) { 
  8.         String value = parameter.getValue(); 
  9.         value = helpers.urlDecode(value).trim(); 
  10.         EncryptBean encryptBean = new EncryptBean(); 
  11.         if (parameter.getName().trim().equals("c")){//参数中含有c参数表示要加密的内容 
  12.             encryptBean = JSON.parseObject(value, EncryptBean.class); 
  13.             stdout.println("private key: " + key.privateKey + " public key " + key.publicKey); 
  14.             try { 
  15.                 value = decryptRSAAndDES(key, encryptBean); 
  16.                 stdout.println("after decrypted:Will scan  data at parameter " + parameter + " with value decrypted " + value); 
  17.             } catch (Exception e) { 
  18.                 e.printStackTrace(stderr); 
  19.             } 
  20.             if (value.isEmpty()) continue; 
  21.  
  22.             try { 
  23.                 String basename = parameter.getName(); 
  24.                 //insertionPoints.add(new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value)); 
  25.                 JSONObject jsonObj = JSON.parseObject(value); 
  26.                 String basevalue = ""
  27.                 for(Map.Entry<String, Object> entry: jsonObj.entrySet()){ 
  28.                     basename = entry.getKey(); 
  29.                     basevalue = entry.getValue().toString();                     
  30.                     //在这里传入总的value值以便在InsertionPoint进行分解,构造加密后的request请求,构造InsertionPoint时传入的value为总的value值 
  31.                     insertionPoints.add(0,new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value)); 
  32.                     stdout.println("in for:Will scan AES encrypted data at parameter " + basename + " with value " + value); 
  33.                 } 
  34.             } catch(Exception e) { 
  35.             } 
  36.         } 
  37.     } 
  38.     return insertionPoints; 

这一段代码的大体意思就是通过helper.analyzeRequest方法获取所有请求信息,遍历其中的参数信息,当发现参数名等于”c”时就会调用解密过程,这块的代码需要根据参数格式自定义解析参数过程。调用解密的过程大体就是先解析JSON格式,然后解密,得到解密数据的内容后调用

  1. `new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value)` 

 实例化一个注入点。一般情况下basename和value是一一对应的,如param1=phoneNum,但是这里我们basename传入param1,value值则是解密后的值如

  1. `{"userid":"51ba27cb-514d-3d86-0000-2f7515a40613","task_id":"1450147269","param1":"000000000000000","m":"https"}`, 

这么传递是为了方便实例化插入点。接着我们看下InsertionPoint的参数构造。

2.3 InsertionPoint

  1. InsertionPoint(BurpExtender newParent, byte[] baseRequest, String basename,  
  2.                 String basevalue) {  
  3.     this.parent = newParentthis.baseRequest = baseRequest; this.baseName = basename;   
  4.     //this.baseValue = basevalue;  
  5.      this.value = basevaluethis.baseValue = JSON.parseObject(basevalue).getString(basename); 

在InsertionPoint的代码中有一个很重要的接口就是buildRequest,这个函数就是用来添加payload。

  1. @Override 
  2. public byte[] buildRequest(byte[] payload) 
  3.     String payloadPlain = parent.helpers.bytesToString(payload); 
  4.     String payloadEncrypted = ""
  5.     String tmpAESKey = "0123456789abcdef"
  6.     parent.stdout.println("payloadPlain:" + payloadPlain); 
  7.     parent.callbacks.issueAlert("payloadPlain:" + payloadPlain); 
  8.     try { 
  9.         Map<String,String> map = JSON.parseObject(this.value, new TypeReference<Map<String, String>>(){}.getType()); 
  10.         map.put(this.baseName, getBaseValue() + payloadPlain ); 
  11.         String allPayloadPlain = JSON.toJSONString(map); 
  12.         payloadEncrypted = parent.encryptRSAAndDES(allPayloadPlain, tmpAESKey, parent.key); 
  13.     } catch(Exception e) { 
  14.         parent.callbacks.issueAlert(e.toString()); 
  15.     } 
  16.     parent.stdout.println("Inserting " + payloadPlain + " [" + payloadEncrypted + "] in parameter " + baseName); 
  17.     // TODO: Only URL parameters, must change to support POST parameters, cookies, etc. 
  18.     //"c" 解密数据格式包一致 
  19.     return parent.helpers.updateParameter(baseRequest, parent.helpers.buildParameter("c", payloadEncrypted, IParameter.PARAM_BODY)); 

这段代码就是获取payload,然后嵌入到解密后的请求包,然后将请求加密,最后调用updateParameter更新参数信息。在这里要注意parent.helpers.buildParameter(“c”, payloadEncrypted, IParameter.PARAM_BODY) c是body中的请求参数,和我们的数据格式对应,IParameter.PARAM_BODY这个参数则表明是Body中的请求参数,如果是URl中的则是PARAM_URL

2.4 接口关系

知道了上述接口的作用,感觉还糊里糊涂的。那就是这些接口是怎么串起来的,数据包是如何流动的,下面我们来看下active scanning的流程。

ActiveScanner引擎从InsertionPoints Provider获取Insertion Points,然后调用BuildRequest发送Request,Requst再经过HttpListener的处理到达webServer。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/142353.html<

(0)
管理的头像管理
上一篇2025-03-09 04:57
下一篇 2025-03-09 04:58

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注