Frida绕过SSL Pinning (证书绑定)抓包;Frida注入;app无法抓包问题解决。
概念介绍:
SSL Pinning (证书绑定) 是什么意思?
通常,当应用程序(App、小程序等)通过 HTTPS 连接到服务器时,它会信任操作系统预装的根证书颁发机构(CA)列表。这意味着,只要服务器返回的证书是由这些受信任的 CA 之一签发的,应用程序就会认为连接是安全的。
然而,SSL Pinning 是一种增强安全性的机制。开发者在应用程序中硬编码了其服务器的特定证书(或其公钥哈希值)。当应用程序尝试建立 HTTPS 连接时,它不仅会检查服务器证书是否由受信任的 CA 签发,还会额外验证该证书是否与应用程序内部硬编码的证书完全匹配。
为什么会有 SSL Pinning?
SSL Pinning 的主要目的是为了防止中间人攻击 (Man-in-the-Middle, MITM)。 像代理工具Burp Suite ,在拦截 HTTPS 流量时,会使用自己的 CA 证书来对流量进行解密和再加密。如果没有安装 Burp 的 CA 证书,手机会提示证书错误;即使安装了,由于应用程序只信任它自己“绑定”的证书,而不会信任 Burp 的证书,所以连接仍然会失败,从而阻止用代理工具抓取流量。
简单来说,SSL Pinning 就是 App 对它要连接的服务器的证书“认准了死理”,非这个证书不可,其他 CA 签发的它都不认,哪怕系统层面是信任的。
Frida 绕过 SSL Pinning 是什么意思?
Frida 是一个动态代码注入工具包。它允许你在运行时向应用程序的进程中注入 JavaScript 代码。这意味着你可以在应用程序运行的时候,修改它的行为、截获它的函数调用、甚至修改函数的返回值。
Frida 绕过 SSL Pinning 的核心思想就是:在应用程序执行 SSL 证书验证的关键代码点,通过注入 Frida 脚本来修改或跳过这个验证逻辑。这样,即使 App 原本会因为证书不匹配而拒绝连接,Frida 也能“欺骗”它,让它认为验证通过,从而允许 Burp 等代理工具正常拦截和解密 HTTPS 流量。
简单来说,Frida 就像一个“特工”,潜入到 App 内部,在 App 检查证书的时候,给它一个“假指令”,让它忽略证书不匹配的错误,从而让 Burp 的代理证书能够通过验证。
怎么做?(Frida 绕过 SSL Pinning 的大致步骤)
前提条件:
-
已 Root 的 Android 设备或越狱的 iOS 设备: Frida Server 需要在设备上运行,通常需要 Root/越狱权限。也可以使用已 Root 的 Android 模拟器。
-
安装 ADB (Android Debug Bridge) / SSH (iOS): 用于与设备通信和传输文件。
-
安装 Python 和 Frida 工具: 在你的电脑上安装 Python 的
Bashfrida
和frida-tools
包。pip install frida frida-tools
-
下载并运行 Frida Server:
-
根据你的设备架构(ARM、ARM64 等)从 Frida GitHub Release 页面下载对应的
frida-server
文件。 -
将
frida-server
推送到设备上的一个可执行目录(例如/data/local/tmp/
)。 -
在设备上通过 ADB shell 或 SSH 启动
frida-server
(需要 Root 权限)。
# 将frida-server推送到设备 adb push /path/to/frida-server /data/local/tmp/# 授予执行权限 adb shell "chmod 755 /data/local/tmp/frida-server"# 启动frida-server (在单独的shell或后台中) adb shell "/data/local/tmp/frida-server &"
-
-
Burp Suite 和证书: 确保 Burp Suite 已经配置好代理,并且它的 CA 证书已经安装到目标设备的用户信任证书存储区。
具体绕过步骤:
-
识别目标 App 的包名/Bundle ID:
-
Android: 使用
frida-ps -U
命令列出所有运行的进程,找到目标 App 的包名(例如com.example.app
)。 -
iOS: 使用
frida-ps -Uai
列出已安装的 App,找到 Bundle ID(例如com.apple.mobilesafari
)。
-
-
获取 SSL Pinning Bypass 脚本:
-
这是关键步骤。不要尝试自己从头写,非常复杂!!!。
-
社区中有很多通用或针对特定库的 SSL Pinning 绕过脚本。最常用的是 Frida CodeShare 上的脚本。
-
例如,一个非常流行的通用 Android SSL Pinning 绕过脚本是
universal-android-ssl-pinning-bypass-with-frida
。 -
对于 iOS 也有类似的通用脚本,例如
ios13-pinning-bypass
或ssl-kill-switch2
等。
-
-
使用 Frida 注入脚本并运行 App:
获取目标 App 的包名/Bundle ID 和绕过脚本后,就可以执行 Frida 命令了。
示例 (Android):
Bashfrida -U -f <包名> --no-pause --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida
-
-U
:连接通过 USB 连接的设备。 -
-f <包名>
:启动指定包名的 App。 -
--no-pause
:App 启动后不暂停,直接运行。 -
--codeshare <作者/脚本名>
:从 Frida CodeShare 下载并注入指定的脚本。
示例 (iOS):
Bashfrida -U -f <Bundle ID> --no-pause --codeshare federicodotta/ios13-pinning-bypass
或者,如果下载了
Bash.js
脚本文件到本地进行注入,可以使用-l
参数:frida -U -f <包名/Bundle ID> --no-pause -l /path/to/your/bypass_script.js
-
-
验证抓包:
-
在执行上述命令后,App 会启动(或重新启动)。
-
此时,将手机的 Wi-Fi 代理设置指向你的 Burp Suite 监听地址和端口。
-
尝试在 App 中进行网络操作。在 Burp Suite 的 "Proxy" -> "HTTP history" 中看到 App 的 HTTPS 流量,且能够正常解密。
-
注意事项:
-
设备 Root/越狱: 这是最基本也是最重要的一步。
-
脚本兼容性: 没有一个脚本是万能的。有些 App 可能使用了非常规的 SSL Pinning 实现,或者更新了代码,导致通用脚本失效。这时可能需要编写定制的 Frida 脚本。
-
App 反 Root/越狱检测: 有些 App 会检测设备是否 Root 或越狱,如果检测到,可能会拒绝运行或禁用某些功能。需要结合 Root 隐藏工具(如 MagiskHide)来绕过检测。
-
网络安全配置 (Android): Android 7.0 及更高版本引入了
network_security_config.xml
,允许开发者在应用层面配置网络安全策略,包括不信任用户安装的 CA 证书。Frida 脚本通常会 hook 相关的 API 来绕过这个限制。 -
持久性: Frida 注入是运行时动态的,App 重启后需要重新注入。如果需要永久绕过,可能需要对 App 进行静态修改(反编译、打补丁、重打包)。
Frida 是一个非常强大的工具,但它的使用需要一定的技术和对移动安全的理解。希望大家可以一起交流学习~
如果思路上有帮助到你,辛苦点点赞哦~
大家的支持是我不断更新的动力!