移动安全-Burpy自动化加解密APP报文
文章目录前言Burpy实战演示环境插件简介RPC脚本Burpy效果手动加解密自动加解密总结前言我在前面一篇博文 移动安全-Brida加解密数据 中介绍了如何使用 Brida 插件对 APP 报文进行自动化加解密,Brida 美中不足的是对报文进行加解密的时候需要手动点击,除非通过新增自定义的 BurpSuite 插件来搭配 Brida,才能实现 repeater 模块中的报文自动化加解密。后来发现
前言
我在前面一篇博文 移动安全-Brida加解密数据 中介绍了如何使用 Brida 插件对 APP 报文进行自动化加解密,Brida 美中不足的是对报文进行加解密的时候需要手动点击,除非通过新增自定义的 BurpSuite 插件来搭配 Brida,才能实现 repeater 模块中的报文自动化加解密。
后来发现 m0nst3r(个人博客) 大佬在 Github 上开源了一个用于自动化加解密数据的插件 Github:Burpy,其插件简介可参加大佬在 FreeBuf 发布的文章:Burpy:连接你的BurpSuite和Python。本文在此对该 BurpSuite 插件进行学习记录一下,所演示的 APP 跟前面 Brida 插件那篇博文演示的 APP 一致,以此更能直观对比二者的优缺点。
Burpy实战
演示环境
不废话, 本文演示的 APK 和服务端测试环境的搭建方法参见先前博文:移动安全-Brida加解密数据 ,还是熟悉的客户端页面:
服务端搭建成功:
插件简介
安装导入插件:
插件的主页面如下:
RPC脚本
之前已经分析过该 APP 加解密的逻辑了,此处直接给出上述 burpy.py 脚本:
import frida
class Burpy:
def __init__(self):
device = self._get_android_usb_device()
pid = device.spawn("com.ese.http")
self.abcd = device.attach(pid)
device.resume(pid)
self.rpc = self.load_rpc()
def _get_android_usb_device(self):
for x in frida.get_device_manager().enumerate_devices():
if "Local Socket" in x.name:
return x
def load_rpc(self):
with open("D:\Code\Frida\Brida\Burpy\hook.js") as f:
my_script = self.abcd.create_script(f.read())
my_script.load()
return my_script.exports
def encrypt(self, header, body):
if body.startswith("{"):
body=eval(body)
print(body)
password = body["password"]
username = body["username"]
password = self.rpc.enc(password)
username = self.rpc.enc(username)
body["password"] = password
body["username"] = username
body = str(body).replace("\'","\"")
else:
body= self.rpc.enc(body)
return header, body
def decrypt(self, header, body):
if body.startswith("{"):
body=eval(body)
password = body["password"]
username = body["username"]
password = self.rpc.dec(password)
username = self.rpc.dec(username)
body["password"] = password
body["username"] = username
body = str(body).replace("\'","\"")
else:
body= self.rpc.dec(body)
return header, body
此处注意上述脚本第 12 行值的获取方式:
其中调用的 JS 脚本文件hook.js的代码如下:
rpc.exports = {
dec: function(data) {
var res = null
Java.perform(function(){
var instance = null;
var key = "9876543210123456";
var my_enc = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
instance = my_enc.decrypt(key,data);
res = instance
});
return res
},
enc: function(data) {
var res = null
Java.perform(function(){
var instance = null
var key = "9876543210123456"
var my_dec = Java.use("com.ese.http.encrypt.AesEncryptionBase64")
instance = my_dec.encrypt(key,data)
res = instance
})
return res
},
}
Burpy效果
手动加解密
1、运行模拟器的 Frida Server 并转发 27042、27043 端口后,运行 Burpy:

2、点击目标 APP 的登录按钮发送登录请求,密文数据如下:
3、在 Request 的 body 右键选择并点击 Burpy decrypt 按钮,进行报文解密:
效果如下:
4、修改 password 的值(改为正确密码 654321 )后右键选择并点击 Burpy encrypt 按钮,自动进行修改后的请求体加密:

效果如下:
5、篡改并加密后进行重放:
同样右键勾选 Burpy decrypt 按钮解密响应体,发现登录成功:
自动加解密
以上演示你可能会吐槽:Burpy 右键选择功能按钮进行数据加解密,这跟 Brida 的效果不就一模一样么?别急,下面来看看 Burpy 插件的牛逼之处——自动化加解密。
1、勾选 Burpy 提供的自动化加解密的按钮:
2、返回到 Repeater 模块,对未加密的数据直接重放,发现重放成功且自动解密:
来看看密码正确后登录成功的:
总结
Burpy 有多香相信你也感受到了吧~ 然而Burpy 的作用还不仅仅局限于 APP 报文的加解密,还可用于前端 JS 加解密(待学习),读者可参见大佬们的博文:
- 用BurpSuit的Burpy插件搞定WEB端中的JS加密算法;
- m0nst3r 大佬本人的文章:高效处理H5站点流量加解密 。
更多推荐




所有评论(0)