先理解一下什么是 双向认证 https://cloud.tencent.com/developer/article/1699532

image.png

所以用fiddler抓包是肯定不行的,用r0capture试试吧

请求,图中已经圈出了 Host、Path 和 FormData

image.png

返回

image.png

下一步就是要dump出客户端中的证书,也是用r0capture

image.png

根据提示,先打开存储权限

image.png

然后启动Spawm模式,运行命令:

1
python r0capture.py -U -f com.yuanrenxue.match2022 -v

报错: process not found

image.png

怀疑是 Frida 15.1.28 的不支持 Spawm模式,换个稳定版本:12.8.0

折腾了好一会儿,才在虚拟环境装好了,这里记录一下

由于无法用pip直接安装,所以需要去pypi下载对应的安装包

image.png

然后cd到对应目录下,执行命令:python setup.py install

还需要安装旧版本的 firda-tools,pip install frida-tools==5.0.0

image.png

这样就装好了,把对应版本的frida-server-12.8.0推送到模拟器,然后启动,接口转发,再次运行 spawm命令

image.png

这次没有报错了,到 /sdcard/Download 下看看,成功拿到证书,每一份都可用

image.png

运行命令导出证书

1
adb pull /sdcard/Download/com.yuanrenxue.match2022258BA6B5A4.p12 yuanrenxue.match2022.p12

然后就是使用 OpenSSL 来提取 key 和 cert,需要先安装:pip install pyopenssl

提取脚本如下:

1
2
3
4
5
6
7
8
from OpenSSL import crypto

cert_data = open("yuanrenxue.match2022.p12", "rb").read()
p12 = crypto.load_pkcs12(buffer=cert_data, passphrase=b"r0ysue")
with open("client.key", "wb") as f:
f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))
with open("client.cert", "wb") as f:
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))

那么要如何使用 .key.cert 这两个文件呢?查询requests文档,可以找到答案:

image.png

再根据之前抓包获取的主机和路径,可以构造请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests

url = "https://180.76.60.244:18443/api/app5"

total_nums = []
for page in range(1, 101):
formdata = {"page": page}
resp = requests.post(
url, data=formdata, verify=False, cert=("client.cert", "client.key")
)
data = resp.json()["data"]
print(data)
total_nums.extend([int(d["value"]) for d in data])

print("总和为", sum(total_nums))

通关!✨✨✨

image.png

参考资料: