小迪安全v2023学习笔记(八十六讲)—— FridaHOOK证书提取SSL双向校验绕过
文章目录
- 前记
- APP攻防——第八十六天
- 资产收集篇&Frida&HOOK&Xposed&证书提取&单向双向绕过&检测抓包
- APP - 综合分析-Mobexler&MobSF识别
- APP - 综合分析-HOOK&Frida
- HOOK&Frida介绍
- Frida安装及使用
- APP - 某社交-双向证书绕过&Frida&HOOK
- 绕过手段介绍
- 案例演示
- frida+r0capture+WireShark
- frida+HOOK-JS+BurpSuite(推荐)
- burp导入证书
- APP - 某游戏-单向证书绕过&XP框架&Frida
前记
- 今天是学习小迪安全的第八十六天,本来昨天应该更新笔记的,但是这个模拟器老是让我的电脑死机,而且有些东西莫名其妙的报错,改来改去花费了不少时间
- 本节课内容主要围绕Frida绕过SSL证书双向检验,其他也没什么东西
- 主要是理解这种绕过的思路,然后学会使用frida去绕过这种检验即可
- 所需要用到的资源已放至下方链接,需要自取:
- https://pan.baidu.com/s/1j9KqDpiY9hUur36s8jvVAQ
- 提取码:xxxd
APP攻防——第八十六天
资产收集篇&Frida&HOOK&Xposed&证书提取&单向双向绕过&检测抓包
APP - 综合分析-Mobexler&MobSF识别
-
在安卓逆向当中,我们主要会用到两款工具:
-
MobSF:移动安全框架 (MobSF) 是 Android、iOS 和 Windows Mobile 中移动应用程序的安全研究平台。MobSF 可用于各种用例,例如移动应用程序安全、渗透测试、恶意软件分析和隐私分析。静态分析器支持流行的移动应用程序二进制文件,如 APK、IPA、APPX 和源代码。同时,动态分析器支持 Android 和 iOS 应用程序,并提供了一个用于交互式仪表测试、运行时数据和网络流量分析的平台。
-
AppInfoScanner:一款适用于以HW行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具,可以帮助渗透测试工程师、攻击队成员、红队成员快速收集到移动端或者静态WEB站点中关键的资产信息并提供基本的信息输出,如:Title、Domain、CDN、指纹信息、状态信息等。
-
-
两款工具各有优劣,MobSF主要是针对APP的一款分析工具,同时支持动静态分析,但是本地搭建比较复杂;而AppInfoScanner主要是一款快速分析的工具,只支持静态分析,但是使用比较方便
-
我们主要还是使用MobSF去进行APP分析,如果搭建比较困难,可以选择使用Mobexler这款虚拟机,他里面集成了MobSF和一些其他的APP逆向工具
APP - 综合分析-HOOK&Frida
HOOK&Frida介绍
- 要了解今天这节课的核心,我们需要搞懂什么是HOOK,以及什么是Frida,他们有什么用
- 首先什么是HOOK,直译过来就是钩子,说简单一点就是“在APP的代码执行到关键位置时,由调试器临时更改内存指令导致CPU抛出异常,操作系统把异常传给调试器,此时调试器就可以插入我们自己的代码指令,执行完之后再进行原本的流程”
- 而Frida就是一款好用的跨平台HOOK工具,他可以通过
ptrace/zygote
注入将JS引擎塞进目标进程,执行我们自己的代码 - 我们今天的课程就需要使用到Frida去动态插入代码绕过SSL证书检测,它有三个核心组件:
frida-server
:推送到Android端的小马,负责注入frida-tools
:PC端CLI(包括frida-ps
、frida-trace
、frida-ls-devices
)JS API
:Java.use
、Interceptor.attach
、NativeFunction
、Memory
读写
Frida安装及使用
- 我们要使用
frida
去调试,需要在安卓模拟器端和PC端都装上这个东西 - 首先在本机安装
frida
:
pip install frida
pip install frida-tools
-
然后我们在github上去找到对应版本的frida-server,注意这里一定要和我们安装的版本相对应
-
我们可以通过如下命令去看模拟器的系统位数:
getprop ro.product.cpu.abi
-
这里用的是夜神模拟器,所以还是安装终端或者用
adb
输入命令查看:
-
这里是x86的,那我们就下载x86的就行,然后将他放到安卓模拟器上:
.\nox_adb.exe push .\frida-server-16.1.7-android-x86 /data/local/frida-x86
-
然后我们直接用adb启动即可:
-
没有任何报错就说明
frida-server
启动成功了 -
接着我们再看一看PC端能否正常连接即可,首先输入以下命令开启流量转发:
.\nox_adb.exe forward tcp:27042 tcp:27042
- 然后再输入以下命令验证是否连接成功:
frida-ps -U
frida-ps -R
- 如果成功输出模拟器上面的软件包信息,就说明成功启动
frida
,接下来我们就可以使用frida
了
APP - 某社交-双向证书绕过&Frida&HOOK
绕过手段介绍
-
本节课我们主要的目的是在如何绕过双向SSL证书验证,因为有的软件可能为了防止抓包,会采取双向证书校验来确定双方都是合法的身份
-
小迪演示的那个案例好像是注册不了了,然后用某音也很容易闪退,所以这里就只用探探演示了,理解思路即可,首先我们直接WIFI抓包看看是否有反代理机制:
-
这里它会显示网络错误,并且啥也抓不到,说明可能是WIFI代理不行,那我们再尝试用软件代理:
-
还是显示网络错误,但是抓到了一些东西,虽然并不是我们想要的,那我们猜测是它采用了SSL证书校验,于是我们使用昨天讲的XP框架尝试绕过:
-
这时抓到了很多包,说明就是SSL证书校验的问题,但是他仍然显示网络错误,软件并不能正常运行,所以我们猜测他使用了双向的证书校验
-
我们为了绕过这个限制,主要有三种方式:
- frida+r0capture+WireShark:这个是一个安卓端通杀绕过方案,唯一的缺点就是只能导入到WireShark中查看流量包
- frida+HOOK-JS+BrupSuite:这个只针对于一些检测不是很严的双向验证,但是这是更为推荐的绕过手段
- 导入证书:这个基本也属于通杀的绕过方案,但是利用难度比较大,适合能够进行反编译、并且包含证书文件的APP
-
那下面我们就通过一个简单的案例来演示这三种绕过手段
案例演示
frida+r0capture+WireShark
- 下载地址:https://github.com/r0ysue/r0capture,下载好之后放到本地,然后我们先启动
frida-server
:
.\nox_adb.exe shell
su root
cd /data/local
./frida-x86
- 接着再转发端口流量:
.\nox_adb.exe forward tcp:27042 tcp:27042
- 然后执行命令开启抓包,将捕获到的流量保存到
.pacp
文件中:
python r0capture.py -U -f com.tencent.gamehelper.smoba -p tencent.pcap
-
这里的
com.tencent.gamehelper.smoba
是需要捕获流量包的软件包包名,这个怎么查看呢 -
我们可以通过夜神模拟器自带的
amaze
文件管理器查看,也可以通过APK
资源提取这个软件查看,比如这里我们抓取的应用是探探:
-
他的包名为
com.p1.mobile.putong
,所以我们在PC端运行刚才的命令开启抓包,注意这里一定要把代理关掉!!!:
-
可以看到这里能够成功访问,没有报网络错误,然后当前文件夹下就会出现
tencent.pcap
包,只需要用WireShark打开查看即可:
-
但是使用WireShark来看网络包,对于我们还是太吃力了,所以我们更推荐使用下面一种方法
frida+HOOK-JS+BurpSuite(推荐)
- 这是我们更为推荐的一种抓包方式,因为他能够将数据包导入到BP中,便于我们进行渗透
- 但是他并不是通杀方案,有的APP可能检测深度和检测手段比较强,或者走的一些其他协议,仍可能导致抓包失败
- 我们使用这个手段前,需要下载HOOK-JS文件:https://github.com/apkunpacker/FridaScripts
- 然后我们就按照上一个方法,启动
frida-server
,通过如下命令使用HOOK-JS文件,这里记得先将代理打开!!!:
frida -U -f <APP包名> -l <HOOK-JS文件>
-
如果这里你和我一样,出现了如下报错:
-
解决方法就是将
SSLUnpinning.js
中的前41行代码更改为:
console.warn(Process.arch, "environment Detected")
/*
On higher version of android , there may be issue that android reject runtime registered classes
and throw error that writable dex are not allowed. We can try to set different permission for those file.
*/
Java.performNow(function () { const DexClassLoader = Java.use("dalvik.system.DexClassLoader"); DexClassLoader.$init.implementation = function (dexPath, optimizedDirectory, libraryPath, parent) { const JFile = Java.use('java.io.File'); if (dexPath.includes("/data/data/") && dexPath.includes("frida") && dexPath.includes("dex")) { console.warn(`[*] Making ${dexPath} readonly`) JFile.$new(dexPath).setReadOnly() this.$init(dexPath, optimizedDirectory, libraryPath, parent); } this.$init(dexPath, optimizedDirectory, libraryPath, parent); };
}) let do_dlopen = null;
let call_ctor = null;
let LibraryName = "libflutter.so";
const moduleName = Process.pointerSize === 4 ? "linker" : "linker64";
let reg = Process.arch == "arm" ? "r0" : "x0";
let Arch = Process.arch;
Process.getModuleByName(moduleName) .enumerateSymbols() .forEach(function (sym) { if (sym.name.indexOf('do_dlopen') !== -1) { do_dlopen = sym.address; } else if (sym.name.indexOf('call_constructor') !== -1) { call_ctor = sym.address; } })
Interceptor.attach(do_dlopen, function () { let pathPtr; if (Process.pointerSize === 4) { // 32 位(ARM / x86) pathPtr = this.context.esp.add(4).readPointer(); } else { // 64 位 pathPtr = Process.arch === 'x64' // x86-64 ? this.context.rdi : this.context.x0; // ARM64 } const Lib = pathPtr.readCString(); if (Lib && Lib.indexOf(LibraryName) !== -1) { Interceptor.attach(call_ctor, function () { Hook(LibraryName); }) }
})
- 然后再次运行上述命令即可抓到包
burp导入证书
-
这个适用于APP能够被反编译,并且能够找到证书文件的情况
-
比如探探这个软件,我们先通过APK资源提取器将apk文件提取下载下来:
-
然后放到PC端本地,通过上传到MobSF去分析,他会帮我们反编译,但是我这里没有反编译成功
-
或者这里推荐一个在线网站:https://www.decompiler.com/,编译完成后就可以直接看了:
-
一般是找
assert
或者res
这种目录:
-
一般找的证书文件呢,大致后缀为:
p12
、cer
、crt
、der
、cert
、pem
等等,那这里也可以直接搜这些关键字看有没有
-
这里就只找到了这一个,然后我们可以尝试将他下载下来导入到BP中:
-
选择证书文件并输入密码,这里一般需要输入密码的才是真证书,至于密码去哪里找,我们就需要用到逆向的知识了
-
去反编译软件找到对应代码,慢慢找密码,但是现代的软件一般都加壳了,所以emmm,拿到源码的概率比较小
-
拿到密码之后就导入到BP中,然后就可以直接抓包了,不需要再额外配置了
APP - 某游戏-单向证书绕过&XP框架&Frida
- 单向SSL证书验证上节课已经讲过了,这里就不再重复演示了,只不过这节课我们并不需要用到XP框架,直接用我们上述的方法即可绕过
- 我已经不想折腾了,上面的内容,不知道是我模拟器有问题,还是电脑太烂了,重启电脑无数次,所以你们有时间就下去自己复现吧