自定义加解密算法让Burp支持APP RPC加解密报文重放

admin 2024年12月18日21:47:20评论8 views字数 3631阅读12分6秒阅读模式
很久没更新文章最近一年"横扫"大多数的YH APP的众测虽然和投入不成正比但过程积累了不少经验......
文章使用的插件地址:
https://github.com/mr-m0nst3r/Burpy
工作原理Frida 动态注入:Burpy 通过 Frida 将目标应用的进程附加上,允许在应用运行时动态地修改操控行为。
  • 加解密操作:rpc.js 脚本定义了加密和解密的具体方法,它通过调用目标应用中的加密/解密类来实现加解密。
  • Burpy 通过调用 rpc.js 中的加解密方法,将数据传给应用内部的加密或解密函数,获取处理后的结果。
  • 数据处理:Burpy 会调用 rpc.js 提供的加密或解密接口,传递数据并返回加密后的密文或解密后的明文。
  • 简单来说,Burpy 是一个 Python 脚本,用于通过 Frida 与应用进行交互,调用 rpc.js 中的加解密方法,实现对应用数据的加密和解密处理。
自定义加解密算法让Burp支持APP RPC加解密报文重放
脱壳和防代理检测的方法 之前文章有详细说明 这里不再赘述。抓取报文请求和返回报文分别为密文传输。
自定义加解密算法让Burp支持APP RPC加解密报文重放
通过HOOK找到了请求明文方法 
com.app.utils.postServer
自定义加解密算法让Burp支持APP RPC加解密报文重放

反编译dex文件定位com.app.utils类的方法:postServer方法发起HTTP POST请求 当请求体str2非空且请求地址str不以AppConstant.HOST开头时 对数据加密并转为十六进制 否则使用明文 实际Hook 输出明文可能因为str满足明文逻辑或加密方法未执行    自定义加解密算法让Burp支持APP RPC加解密报文重放

EncrypDecrypUtils 是加密核心 控制了请求数据的安全性 直接跳到该方法的声明
自定义加解密算法让Burp支持APP RPC加解密报文重放
跳到了该声明类com.util.EncrypDecrypUtils可以看到加密和解密方法的实现。
自定义加解密算法让Burp支持APP RPC加解密报文重放
hook打印下加密和解密方法 加密方法返回为byte[]字节数组(result)需要转换为小写的十六进制(HEX)为什么要这么转?上图抓包的请求和返回报文从肉眼来看就是小写的hex格式。解密方法返回同样为byte[](result) 转换为 UTF-8 编码的字符串输出。
自定义加解密算法让Burp支持APP RPC加解密报文重放
自定义加解密算法让Burp支持APP RPC加解密报文重放
编写HOOK.js脚本如下Java.perform(function () {varEncrypDecrypUtils = Java.use('com.util.EncrypDecrypUtils');EncrypDecrypUtils.encrypt.overload('java.lang.String').implementation = function (str) {console.log('明文数据: ' + str);  var result = this.encrypt(str);  if (result != null) {var resultByteArray = result;  var hexString = byteArrayToHex(resultByteArray);  console.log('加密后的数据 (HEX, 小写): ' + hexString);        } else {console.log('加密结果为 null');        }return result;      }functionbyteArrayToHex(byteArray) {var hexString = '';for (var i = 0; i < byteArray.length; i++) {var hex = (byteArray[i] & 0xFF).toString(16);  if (hex.length === 1) {                hex = '0' + hex;              }            hexString += hex;        }return hexString.toLowerCase();      }});Java.perform(function () {varEncrypDecrypUtils = Java.use('com.util.EncrypDecrypUtils');EncrypDecrypUtils.decrypt.overload('java.lang.String').implementation = function (str) {console.log('密文数据: ' + str);  var result = this.decrypt(str);  if (result != null) {var resultByteArray = Java.array('byte', result);  var resultUtf8String = Java.use('java.lang.String').$new(resultByteArray);  console.log("解密后的明文数据: " + resultUtf8String);        } else {console.log("解密结果为空");        }return result;      };});
打印如下:
frida -U-f xxxx -l hook.js
自定义加解密算法让Burp支持APP RPC加解密报文重放
接下来把脚本转换为rpc格式使用python远程调用加解密
# 调用加密函数并打印结果res = script.exports_sync.encrypt('{"jgRnId":"190e315b","mobile":"13666666666","mobileCheckCode":"1111","preRegisterDataCode":"","sm_fingerprintId":"BS7cjKGn05SfJinFYjV6yiypRToB0pRcTsqqlADTCkxgvajdJ0LcC9A98ke1CROkxllub1Nmt6tzJ0cYY3+jRZQ=="}')print(res)# 调用解密函数并打印结果res = script.exports_sync.decrypt('14b31ec575f1b35cba59948ee16052cde96cc400eb53c84f75e7174cee1958d19930')print(res)
自定义加解密算法让Burp支持APP RPC加解密报文重放
编写burpy脚本如何取参数?直接调用rpc.js加解密方法即可
# -*- coding: UTF-8 -*-import fridaimport jsonimport reimport timeclassBurpy:def__init__(self):        self.apicode = ""        self.key = ""        self.package = "xxxxx"        self.json = 'C:\Users\小白\Desktop\APPrpc\fy\rpc.js'        self.device = frida.get_usb_device()        self.process = self.device.attach(self.package)    def load_rpc(self):        with open(self.json, encoding='utf-8'as f:            script = self.process.create_script(f.read())            script.load()return script.exports    def encrypt(self, header, body):        api = self.load_rpc()try:            encrypted_data = api.encrypt(body)            body = encrypted_data        except Exception as e:            print(f"无法找到encrypt方法: {str(e)}")            body = bodyreturn header, body    def decrypt(self, header, body):        api = self.load_rpc()try:            decrypted_data = api.decrypt(body)            body = decrypted_data        except Exception as e:            print(f"无法找到decrypt方法: {str(e)}")            body = bodyreturn header, body
确保手机服务端运行frida  使用burpy插件 填入burpy.py脚本路径选择自动加解密模块
自定义加解密算法让Burp支持APP RPC加解密报文重放
点击APP任意功能 可以看到报文被自动的加解密
自定义加解密算法让Burp支持APP RPC加解密报文重放
结合Burp和Frida脚本中的Burpy 可以解密加密报文并以明文形式重放请求
自定义加解密算法让Burp支持APP RPC加解密报文重放
发送 Intruder进行枚举测试 也是可以的。
自定义加解密算法让Burp支持APP RPC加解密报文重放

声明:

本文仅作为学习笔记 记录与分享,严禁用于非法用途,所举案例相关敏感已打码略去,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系!

原文始发于微信公众号(小白安全记录):自定义加解密算法让Burp支持APP RPC加解密报文重放

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月18日21:47:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   自定义加解密算法让Burp支持APP RPC加解密报文重放https://cn-sec.com/archives/3524210.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息