前言

我在前面一篇博文 移动安全-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 加解密(待学习),读者可参见大佬们的博文:

  1. 用BurpSuit的Burpy插件搞定WEB端中的JS加密算法
  2. m0nst3r 大佬本人的文章:高效处理H5站点流量加解密
Logo

一站式 AI 云服务平台

更多推荐