Yakit针对流量加密APP的Frida rpc解决方案
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
1. 基础知识
1.1. 案例APP
我们使用网上找到一个登录加密的app,作为我们的案例。该app功能非常简单。
输入用户名密码后点击登录,后端数据报文如下:
参数和响应报文均使用AES进行加密。
1.2. Yakit热加载脚本输出log
2. python rpc接口准备
关于如何分析app,写rpc脚本在此不再详细讲解。写好的代码如下:
python脚本
import frida import json from flask import Flask, jsonify, request def message(message, data): if message['type'] == 'send': print(f"[*] {message['payload']}") else: print(message) session = frida.get_usb_device().attach("eseBrida") with open("1.js") as f: jsCode = f.read() script = session.create_script(jsCode) script.on("message",message) script.load() app = Flask(__name__) @app.route('/encrypt', methods=['GET']) def decrypt_class(): plaintext = request.args.get('plaintext') print("1111",plaintext) plaintext = plaintext.replace(" ","+") print("222",plaintext) res = script.exports.invokemethoden(plaintext) print(res) return res @app.route('/decrypt', methods=['GET']) def encrypt_class(): encrypttext = request.args.get('encrypttxt') print("1111",encrypttext) encrypttext = encrypttext.replace(" ","+") print("222",encrypttext) res = script.exports.invokemethodde(encrypttext) return res if __name__ == "__main__": app.run(port=5001) js代码 function fridamethod01(cleartext){ var result = null; var key = "9876543210123456" Java.perform(function(){ let AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64"); result = AesEncryptionBase64.encrypt(key,cleartext) }); return result; } function fridamethod02(encrypted){ var result = null; var key = "9876543210123456" // public native String method02(String str); Java.perform(function(){ let AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64"); result = AesEncryptionBase64.decrypt(key,encrypted) }); return result; } rpc.exports = { invokemethoden: fridamethod01, invokemethodde: fridamethod02, }
3. Yakit热加载脚本编写
Yakit的热加载脚本要在两个功能点处编写
- MITM界面热加载脚本编写
- Fuzzer界面热加载脚本编写
3.1. MlTM界面热加载脚本编写
3.1.1. 热加载脚本的原理
MITM界面提供了热加载脚本的模板,我们可以直接在Yakit的MIMT界面查看
热加载脚本的原理
类似于Frida的Hook,既在整个请求的生命周期内(从发起请求到响应请求到将整个请求存入数据库)中的不同位置提供接口允许我们对请求进行修改。
在MITM界面我们只需要对流量进行解密展示,无需加密。
因此我们此时选择Hook的时机是在服务器响应后,存入数据库前对请求body和响应body进行解密展示。这样既不影响通信,也能做到将报文解密后的结果展示到MITM中。
但是这样操作带来了一个小问题,就是数据库文件中不会对密文进行存储,但是对测试是没有影响的。
根据上文的描述,在yakit将报文存入数据库前进行Hook,提供的接口和定义如下:
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录