freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Yakit针对流量加密APP的Frida rpc解决方案
2024-09-29 17:24:44
所属地 北京

1. 基础知识

1.1. 案例APP

我们使用网上找到一个登录加密的app,作为我们的案例。该app功能非常简单。

1727601620_66f91bd45c1d57ea82f82.png!small?1727601621238

输入用户名密码后点击登录,后端数据报文如下:

1727601625_66f91bd9dea95cdd1aac8.png!small?1727601628138

参数和响应报文均使用AES进行加密。

1.2. Yakit热加载脚本输出log

1727601630_66f91bde9210a567791aa.png!small?1727601631824

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界面查看

1727601642_66f91beaabec234a10259.png!small?1727601643943

热加载脚本的原理

类似于Frida的Hook,既在整个请求的生命周期内(从发起请求到响应请求到将整个请求存入数据库)中的不同位置提供接口允许我们对请求进行修改。

在MITM界面我们只需要对流量进行解密展示,无需加密。

因此我们此时选择Hook的时机是在服务器响应后,存入数据库前对请求body和响应body进行解密展示。这样既不影响通信,也能做到将报文解密后的结果展示到MITM中。

但是这样操作带来了一个小问题,就是数据库文件中不会对密文进行存储,但是对测试是没有影响的。

根据上文的描述,在yakit将报文存入数据库前进行Hook,提供的接口和定义如下:

# Frida # 数据加解密 # yakit
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录