背景
公司新人对某快餐app进行安全评估,发现关键接口无法获取https流量,已在测试机将burpsuite的证书安装成系统证书,无法捕获app的https数据包,使用justtrustme也无法捕获,应该是做了证书绑定或者其他验证操作。使用frida hook app ssl pinning 相关方法,成功捕获https流量,这个过程对新人有帮助,就详细的记录下来。
环境
- 系统 win10
- python 3.8.0
- java 13
- 夜神模拟器 android版本7.1.2
- burp 2021.8
- node 14.15.3
安装frida
1、安装frida
pip install frida frida-tools Pyro4
npm.cmd install [email protected] #这个生成frida-conpile.cmd.burpsuite中需要填写frida compile path
frida-compile,就在当前目录下的node_modules.bin目录里
我这里在 D:\SecurityTools\android\frida 目录下安装frida-compile,frida-compile path 为:D:\SecurityTools\android\frida\node_modules\.bin\frida-compile.cmd
说明:编译 frida-compile 10 生成brida.js,存在编译错误的问题,frida-compose的作者截至今天(2022/1/25)暂时还没有修复,frida brida的作者建议使用低版本的,并且在界面上增加了一个Use old version of frida-compose 选择框
打开开发者模式
在设置-关于平板电脑-版本号处多次点击 打开开发者模式
在开发者模式中打开usb调试
安装frida-server
使用夜神nox_adb.exe,连接夜神模拟器
nox_adb.exe connect 127.0.0.1:62001
- 需要注意,此处adb.exe使用的是夜神自带的adb,不要使用谷歌官方的adb,否者可导致冲突
查看夜神模拟器的cpu架构
我们需要frida server x86最新版本,下载地址: https://github.com/frida/frida/releases
为了方便,这里将 frida-server-*
修改成frida-server
将frida-server安装到模拟器(此处只是临时安装,运行的目录为tmp目录,设备重启后需要重新安装,这么做的目的是每次都可以强迫使用最新的frida-server):
adb.exe push E:\pentest\app\frida-server /data/local/tmp/frida-server
push成功以后,进入adb shell,运行frida-server
也可以:
adb.exe push E:\pentest\app\frida-server /data/local/tmp/frida-server
adb shell "chmod 755 /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
如果没回显信息或者返回以下信息都说明已经运行中,这个shell不能关闭,否则frida就关了。
这里需要重新打开一个shell,通过转发端口,方便frida客户端进行监听
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
输入frida-ps -U
,查看是否安装成功
安装成功,frida客户端可以正常获取模拟器进程信息
burpsuite安装frida brida
需要修改以下内容
设置brida
Python binary path: 就填入python3的路径(使用brida0.4就可以支持py3)
Pyro host: 默认
Pyro port: 默认
frida-compile: (frida-compile的二进制文件的路径)之前npm安装的包,里面有frida-compile.cmd .使用everything搜索frida 然后填入.
Frida JS files folder: 包含带有所有Frida和Brida钩子和导出文件的Frida工具JavaScript文件的文件夹的路径。
创建默认的js 文件
配置完成,点击Start Server
如果配置没问题,在日志框中会显示
点击Spawn application,没有红色字就说明成功 并且模拟器(手机)也可以看到这个app被唤起
这里遇到了问题:
这个是frida-compose的问题,这里根据官方的建议,暂时没有更改成功,这里使用了[email protected],可以成功hook,配置信息也需要启用Use old version of frida-compile(<10)
验证
我们这里拿某快餐APP来举例:
配置信息如下:
首次运行,点击compile & spawn
模拟器中app成功运行。
- 这个错误是由于app使用自定义证书进行通信。
快餐APP ssl pinning 分析
adb logcat分析:
这里使用了HOOKUI|AnyAppHook逆向神器,通过分析输出的日志,发现app核心代码应该是:com.yum.相关代码
发现部分ssl证书相关硬编码。
将burpsuite的证书添加到系统证书里,大部分ssl数据包可以成功捕获,但是对于登录等信息,仍然报错:网络请求出错,请重试!
将apk中提取的证书,添加到burpsuite,但是也捕获不到验证码请求的数据包
通过检索代码,发现网络请求出错,仅出现在:com.yum.android.superkfc.services.HomeManager这个数据包当中
通过分析,发现对于重要接口,调用 OkHttpSignUtils.isUrlSSLList,来判断当前url是否使用ssl校验。
isUrlSSLList方法位于:package com.yum.utils.okhttp.OkHttpSignUtils
hook
isUrlSSLList方法在正常业务下,返回的是true,此处需要hook,将返回的值设置成false
burpsuite成功捕获短信验证码的数据包