Burpsuit插件开发之RSA加解密_burp插件安装
haoteby 2025-09-08 20:47 28 浏览
burpsuit是一款非常好用的抓包工具,我自己也是重度用户,所以就上手了burpsuit的插件接口开发,本文主要记录了一个解密请求包,插入payload,再加密的插件开发过程,插件应用场景主要是用于通过分析apk的实现。这里做探讨的目的只是方便安全测试人员的个人学习,或大家渗透测试使用。
详细的代码见github代码,在文档中数据首先是以rsa方式加密des的key得到encryptKey,然后使用des的key加密数据包得到data,再组装成一个JSON格式串,这是加密过程,当然解密过程就是逆向的。插件应用场景主要是用于通过分析apk的实现,或者泄露的密钥,获取其加解密算法,在解密后的数据包中插入payload,发现注入问题等。
如下则是加密后的数据包:
c={
"data":"21BhviedgtbwK6rdlK7vzltqxOLxUmU2g5qaO5LWPYTha5fXslmL6jrMkFnJBwpZPZMNl5foxTUHw2Mae++zkWwtzWkKXI9WJ/CJqxO9uORT5I6iUmIG7bBcgnHpmlSNKfFwBvnr9vj3v5ByvW2s2/pL9rSaeD+/8XsX01NA96mC4g5pVBeU5IY9F4tdxH9yobXfN6GzEVhLeiEd30xzMA\u003d\u003d",
"encryptKey":"bjWZgigAW/ZaAA55v7Yi9AGt2qsP7BfZZISu70qc/xVUVfh5L/Mw/mMbzxkcZ6uXb1vvgXvF7hHYwjsVzvEkRK0rIfIwkcYzn160fvQ/8+F8YBMDLzTEhf8r0KjOLlJV+HgOsS4QG/G9lOU5mnupfrVA9sf54b3OvXHU0TQVG7U\u003d"
}
从数据库包能看到大的数据是一个json格式,里面有data,和encryptKey值,encryptKey就是使用RSA加密des 的key得到的,RSA的工作方式和pem文件可通过界面设置,再接着用这个key采用des方式解密data中的内容。操作界面如下:
burp_rsa
2,InsertPoint 接口
InsertPoint顾名思义就是注入点,就是payload插入的地方,比如request中的cookie,参数等位置。为了对一些burpsuit不支持的参数格式进行支持就必须实现该接口,可以用在Active Scanner和Intruder中.
2.1 基础开发知识
最好的方式就是在原有插件的基础上修改,这样能省很多精力,当然如果要一步一步来的话,步骤如下:
(1)包含burp的接口文件
(2)创建一个包名为burp,在里面创建BurpExtender类,实现IBurpExtender接口,这个BurpExtender类是所有接口的心脏,注意这里涉及到名字都不能改动,burp插件就这么规定的。
(3)实现唯一的接口函数
public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) {
this. callbacks = callbacks ;
}
通过callbacks获取核心基础库能力,像日志,请求,返回值修改等。
(4)日志接口
PrintWriter stdout = new PrintWriter(callbacks.getStdout(), true);
PrintWriter stderr = new PrintWriter(callbacks.getStderr(), true);
//输出到插件的output
stdout.println("Hello output");
// 输出到alerts tab
callbacks.issueAlert("Hello alerts");
//打印调用栈
e.printStackTrace(stderr)
有了这些日志接口就能比较好的调试代码了,如果要很好的跟踪请求的,可以在BApp Store中添加”Custom Logger”这个插件,能够记录所有的请求和返回信息。
2.2 getInsertionPoints
下面我们就来讲讲如何实现一个InsertionPoints
接口。第一步继承
接口,实现getInsertionPoints()方法,同时通过
IScannerInsertionPointProvider
方法注册成为insertion point provider。下面我们就来看看
callbacks.registerScannerInsertionPointProvider(this)getInsertionPoints()
的实现。
12345678910111213141516171819202122232425262728293031323334353637383940 | @OverridepublicList<IScannerInsertionPoint>getInsertionPoints(IHttpRequestResponse baseRequestResponse){// 生成insertPoints数组 List<IScannerInsertionPoint>insertionPoints=newArrayList<IScannerInsertionPoint>();// 获取请求参数IRequestInfo requestInfo=helpers.analyzeRequest(baseRequestResponse.getRequest());List<IParameter>requestParams=requestInfo.getParameters();for(IParameter parameter:requestParams){Stringvalue=parameter.getValue();value=helpers.urlDecode(value).trim();EncryptBean encryptBean=newEncryptBean();if(parameter.getName().trim().equals("c")){//参数中含有c参数表示要加密的内容encryptBean=JSON.parseObject(value,EncryptBean.class);stdout.println("private key: "+key.privateKey+" public key "+key.publicKey);try{value=decryptRSAAndDES(key,encryptBean);stdout.println("after decrypted:Will scan data at parameter "+parameter+" with value decrypted "+value);}catch(Exceptione){e.printStackTrace(stderr);}if(value.isEmpty())continue;try{Stringbasename=parameter.getName();//insertionPoints.add(new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value));JSONObject jsonObj=JSON.parseObject(value);Stringbasevalue="";for(Map.Entry<String,Object>entry:jsonObj.entrySet()){basename=entry.getKey();basevalue=entry.getValue().toString();//在这里传入总的value值以便在InsertionPoint进行分解,构造加密后的request请求,构造InsertionPoint时传入的value为总的value值insertionPoints.add(0,newInsertionPoint(this,baseRequestResponse.getRequest(),basename,value));stdout.println("in for:Will scan AES encrypted data at parameter "+basename+" with value "+value);}}catch(Exceptione){}}}returninsertionPoints;} |
这一段代码的大体意思就是通过helper.analyzeRequest方法获取所有请求信息,遍历其中的参数信息,当发现参数名等于”c”时就会调用解密过程,这块的代码需要根据参数格式自定义解析参数过程。调用解密的过程大体就是先解析JSON格式,然后解密,得到解密数据的内容后调用
12 | `newInsertionPoint(this,baseRequestResponse.getRequest(),basename,value)` |
实例化一个注入点。一般情况下basename和value是一一对应的,如param1=phoneNum,但是这里我们basename传入param1,value值则是解密后的值如
12 | `{"userid":"51ba27cb-514d-3d86-0000-2f7515a40613","task_id":"1450147269","param1":"000000000000000","m":"https"}`, |
这么传递是为了方便实例化插入点。接着我们看下InsertionPoint的参数构造。
2.3 InsertionPoint
1234567 | InsertionPoint(BurpExtender newParent,byte[]baseRequest,Stringbasename,Stringbasevalue){this.parent=newParent;this.baseRequest=baseRequest;this.baseName=basename;//this.baseValue = basevalue;this.value=basevalue;this.baseValue=JSON.parseObject(basevalue).getString(basename);} |
在InsertionPoint的代码中有一个很重要的接口就是buildRequest,这个函数就是用来添加payload。
12345678910111213141516171819202122 | @Overridepublicbyte[]buildRequest(byte[]payload){StringpayloadPlain=parent.helpers.bytesToString(payload);StringpayloadEncrypted="";StringtmpAESKey="0123456789abcdef";parent.stdout.println("payloadPlain:"+payloadPlain);parent.callbacks.issueAlert("payloadPlain:"+payloadPlain);try{Map<String,String>map=JSON.parseObject(this.value,newTypeReference<Map<String,String>>(){}.getType());map.put(this.baseName,getBaseValue()+payloadPlain);StringallPayloadPlain=JSON.toJSONString(map);payloadEncrypted=parent.encryptRSAAndDES(allPayloadPlain,tmpAESKey,parent.key);}catch(Exceptione){parent.callbacks.issueAlert(e.toString());}parent.stdout.println("Inserting "+payloadPlain+" ["+payloadEncrypted+"] in parameter "+baseName);// TODO: Only URL parameters, must change to support POST parameters, cookies, etc.//"c" 解密数据格式包一致returnparent.helpers.updateParameter(baseRequest,parent.helpers.buildParameter("c",payloadEncrypted,IParameter.PARAM_BODY));} |
这段代码就是获取payload,然后嵌入到解密后的请求包,然后将请求加密,最后调用updateParameter更新参数信息。在这里要注意
c是body中的请求参数,和我们的数据格式对应,
parent.helpers.buildParameter("c", payloadEncrypted, IParameter.PARAM_BODY)IParameter.PARAM_BODY
这个参数则表明是Body中的请求参数,如果是URl中的则是PARAM_URL
2.4 接口关系
知道了上述接口的作用,感觉还糊里糊涂的。那就是这些接口是怎么串起来的,数据包是如何流动的,下面我们来看下active scanning的流程。
burp-active-scan
ActiveScanner引擎从InsertionPoints Provider获取Insertion Points,然后调用BuildRequest发送Request,Requst再经过HttpListener的处理到达webServer。
参考文献:
http://drops.wooyun.org/papers/3962
http://2015.zeronights.ru/assets/files/42-Elkin-Bulatenko.pdf
https://github.com/lgrangeia/aesburp
如果您需要了解更多内容,可以
加入QQ群:486207500
相关推荐
- 如何随时清理浏览器缓存_清理浏览器缓存怎么弄
-
想随时清理浏览器缓存吗?Cookieformac版是Macos上一款浏览器缓存清理工具,所有的浏览器Cookie,本地存储数据,HTML5数据库,FlashCookie,Silverlight,...
- Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器
-
介绍如何使用在VMLogin中文版设置Luminati代理。首先下载VMLogin中文版反指纹浏览器(https://cn.vmlogin.com)对于刚接触Luminati动态ip的朋友,是不是不懂...
- mac清除工具分享,解除您在安全方面的后顾之忧
-
想要永久的安全的处理掉重要数据,删除是之一,使用今天小编分享的mac清除工具,为您的操作再增一层“保护”,小伙伴慎用哟,一旦使用就不可以恢复咯,来吧一起看看吧~mac清除工具分享,解除您在安全方面的后...
- 取代cookie的网站追踪技术:”帆布指纹识别”
-
【前言】一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Co...
- 辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒
-
近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...
- 浏览器指纹是什么?浏览器指纹包括哪些信息
-
本文关键词:浏览器指纹、指纹浏览器、浏览器指纹信息、指纹浏览器原理什么是浏览器指纹?浏览器指纹是指浏览器的各种信息,当我们访问其他网站时,即使是在匿名的模式下,这些信息也可以帮助网站识别我们的身份。...
- 那些通用清除软件不曾注意的秘密_清理不常用的应用软件
-
系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...
- 「网络安全宣传周」这些安全上网小知识你要知道!
-
小布说:互联网改变了人们的衣食住行,但与之伴生的网络安全威胁也不容忽视。近些年来,风靡全球的勒索病毒、时有发生的电信诈骗、防不胜防的个人信息泄露时时刻刻都威胁着我们的生活。9月18日-24日是第四届...
- TypeScript 终极初学者指南_typescript 进阶
-
在过去的几年里TypeScript变得越来越流行,现在许多工作都要求开发人员了解TypeScript...
- jQuery知识一览_jquery的认识和使用
-
一、概览jQuery官网:https://jquery.com/jQuery是一个高效、轻量并且功能丰富的js库。核心在于查询query。...
- 我的第一个Electron应用_electronmy
-
hello,好久不见,最近笔者花了几天时间入门Electron,然后做了一个非常简单的应用,本文就来给各位分享一下过程,Electron大佬请随意~笔者开源了一个Web思维导图,虽然借助showSav...
- HTML5 之拖放(Drag 和 Drop)_html拖放api
-
简介拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在HTML5中,拖放是标准的一部分,任何元素都能够拖放。先点击一个小例子:在用户开始拖动<p>元素时执行JavaScrip...
- 如何用JavaScript判断输入值是数字还是字母?
-
在日常开发中,我们有时候需要判断用户输入的是数字还是字母。本文将介绍如何用JavaScript实现这一功能。检查输入值是否是数字或字母...
- 图形编辑器开发:快捷键的管理_图形编辑工具
-
大家好,我是前端西瓜哥。...
- 浏览器原生剪贴板:原来它能这样读取用户截图!
-
当我们使用GitHub时,会发现Ctrl+V就能直接读取用户剪贴板图片进行粘贴,那么它是如何工作的?安全性如何?...