安卓测试之利用frida 绕过 某快餐 ssl pinning

背景

公司新人对某快餐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

image

  • 需要注意,此处adb.exe使用的是夜神自带的adb,不要使用谷歌官方的adb,否者可导致冲突
    image

查看夜神模拟器的cpu架构
image

我们需要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

image

push成功以后,进入adb shell,运行frida-server
image

也可以:

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

image

输入frida-ps -U ,查看是否安装成功
image

安装成功,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来举例:
image

配置信息如下:

首次运行,点击compile & spawn

模拟器中app成功运行。

  • 这个错误是由于app使用自定义证书进行通信。

快餐APP ssl pinning 分析

adb logcat分析:

这里使用了HOOKUI|AnyAppHook逆向神器,通过分析输出的日志,发现app核心代码应该是:com.yum.相关代码

发现部分ssl证书相关硬编码。

image

将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成功捕获短信验证码的数据包

参考

1 Like

写的很详细 辛苦师傅

简简单单分享一下,供大家参考

学习了,跟着大佬学习就是不一样