夜神模拟器安卓高版本HTTPS抓包实战:Burp证书植入系统分区
1. 项目概述与核心痛点
在移动应用安全测试、逆向分析或者日常开发调试中,抓包是获取应用与服务器交互数据最直接有效的手段。Burp Suite作为Web安全领域的“瑞士军刀”,其代理抓包功能强大且灵活,是安全研究员和开发者的首选工具。然而,当我们将这套成熟的方案迁移到安卓移动端,特别是面对安卓7.0(API Level 24)及以上的系统时,一个经典的“拦路虎”出现了:系统不再信任用户安装的CA证书。
这意味着,即使你成功在夜神模拟器上配置了Burp Suite的代理,面对采用SSL Pinning(证书绑定)或严格遵守系统证书策略的App,你看到的很可能只是一片HTTPS流量加密后的乱码,或者干脆连接失败。这并非工具失效,而是安卓系统在安全策略上的一次重要升级。本次实战的目的,就是彻底打通这条通路,解决安卓高版本系统的证书信任问题,让你在夜神模拟器中也能畅通无阻地捕获和分析HTTPS流量。
整个流程的核心思路可以概括为:将Burp Suite的CA证书,从“用户证书”提升为“系统级可信证书”。在安卓7.0以下,用户只需在设备上安装Burp导出的证书,即可完成信任。但在7.0及以上,系统默认只信任预置在系统分区(/system/etc/security/cacerts)中的证书。因此,我们的操作将从简单的“安装”转变为需要一定系统权限的“植入”。
2. 环境准备与工具选型
工欲善其事,必先利其器。一个稳定、可控的测试环境是成功的第一步。这里我们选择夜神模拟器,不仅因为它对开发者友好、性能稳定,更关键的是它提供了便捷的Root权限获取方式,这是我们后续操作的基础。
2.1 为什么选择夜神模拟器?
市面上安卓模拟器选择众多,如雷电、逍遥、MuMu等。选择夜神模拟器进行抓包实战,主要基于以下几点考量:
- Root权限获取便捷:夜神模拟器在设置中直接提供了“开启Root权限”的开关,无需刷机、解锁Bootloader等复杂操作。这对于需要修改系统文件的证书信任操作至关重要。
- 网络配置灵活:其网络模式通常设置为“桥接”或“NAT”,可以轻松与宿主机(运行Burp的电脑)处于同一局域网,方便代理设置。
- 系统纯净且可定制:我们可以安装一个相对纯净的安卓7.0或9.0镜像,避免厂商定制系统带来的未知干扰。同时,夜神支持多开不同版本的系统,便于测试兼容性。
- 稳定性与兼容性:在长期使用中,夜神模拟器与Burp Suite的配合表现较为稳定,出现网络环路、代理失效等问题的概率相对较低。
注意:部分最新版本的夜神模拟器(如基于Android 12的版本)可能出于安全性考虑,对系统分区的修改做了更严格的限制。如果实践过程中遇到无法挂载系统分区为可写的情况,可以尝试换用稍旧版本的安卓9(Pie)镜像,成功率更高。
2.2 Burp Suite的配置要点
Burp Suite的版本选择社区版(Community)或专业版(Professional)均可,抓包的核心代理功能没有区别。关键配置在于代理监听器。
- 安装与启动:在宿主机(Windows/Mac/Linux)上正常安装并启动Burp Suite。
- 配置代理监听器:进入
Proxy->Options标签页。确保Proxy Listeners中有一个监听器在运行,通常地址是127.0.0.1:8080。你需要将其绑定到宿主机的局域网IP上,因为模拟器将作为另一个“设备”来连接这个代理。- 点击对应监听器的
Edit。 - 在
Binding标签页,将Bind to address从Loopback only改为All interfaces或选择你宿主机的具体局域网IP(如192.168.1.100)。 - 记住这里的端口号(默认8080)。
- 点击对应监听器的
- 导出CA证书:这是后续安装到模拟器的关键文件。
- 确保浏览器已配置代理指向Burp(
127.0.0.1:8080)。 - 访问
http://burp或http://127.0.0.1:8080,点击CA Certificate链接下载证书。文件通常名为cacert.der。 - 为了方便安卓系统识别,我们需要将其转换为PEM格式。可以使用OpenSSL命令(需提前安装OpenSSL):
openssl x509 -inform DER -in cacert.der -out cacert.pem - 转换后,再将
cacert.pem重命名为9a5ba575.0。这里的文件名规则是:对证书进行md5哈希,取前8位小写字符,后缀为.0。可以通过命令获取:
输出结果(假设是openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -19a5ba575)就是文件名。这个重命名步骤是让系统证书库能够正确识别它的关键。
- 确保浏览器已配置代理指向Burp(
2.3 宿主机防火墙与网络检查
一个常见的失败原因是宿主机的防火墙或网络设置阻止了模拟器的连接。
- 关闭防火墙(临时):在宿主机上,暂时关闭防火墙或为Burp Suite(
javaw.exe或java进程)和对应的端口(如8080)添加入站规则,允许任何连接。 - 测试网络连通性:在夜神模拟器中,打开浏览器,输入宿主机的局域网IP和Burp端口,例如
http://192.168.1.100:8080。如果能看到Burp Suite的欢迎页面,说明网络通路是正常的。如果无法访问,请检查夜神模拟器的网络设置(通常设置为“桥接模式”),并确认宿主机IP是否正确。
3. 夜神模拟器初始配置与Root开启
配置好Burp后,我们开始设置夜神模拟器。
- 创建与选择镜像:启动夜神多开器,创建一个新的模拟器实例。建议选择Android 7.1.2或Android 9的镜像。这两个版本具有代表性,且修改系统证书的流程成熟稳定。
- 开启Root权限:启动该模拟器实例。进入系统设置,找到“关于平板电脑”(或类似选项),连续点击“版本号”7次以开启“开发者选项”。在“开发者选项”中,确保“USB调试”是开启的。然后,在夜神模拟器侧边栏的工具箱中,找到“设置”或“系统设置”,里面会有“开启Root权限”的开关,打开它。模拟器会提示重启,照做即可。
- 安装Root权限管理工具:重启后,系统通常会自带一个SuperUser或KingRoot应用。为了更方便地进行命令行操作,建议在模拟器内安装一个终端应用,如
Termux,或者使用ADB(Android Debug Bridge)从宿主机连接进行操作。我们后续步骤将主要使用ADB,因为它更高效。
4. 核心实战:向系统分区植入CA证书
这是整个流程中最关键、最具技术含量的一步。我们的目标是将重命名后的Burp证书文件9a5ba575.0放入系统的受信任证书存储目录/system/etc/security/cacerts/,并设置正确的权限。
4.1 使用ADB连接模拟器
首先确保宿主机上安装了Android SDK Platform-Tools(包含adb)。夜神模拟器通常自带ADB,但可能端口不同。
- 查找夜神ADB端口:打开夜神模拟器安装目录,在命令行中执行
nox_adb.exe connect 127.0.0.1:62001(这是夜神默认的第一个实例端口,第二个实例可能是62025,依此类推)。也可以使用夜神自带的NoxConsole.exe进行连接。 - 连接与提权:连接成功后,使用
adb shell进入模拟器的shell环境。首先验证Root权限:输入su,回车后,模拟器上的Root权限管理应用会弹出授权请求,点击“允许”。此时命令行提示符应从$变为#,表示已获得超级用户权限。
4.2 挂载系统分区为可写
默认情况下,/system分区是以只读(ro)模式挂载的,我们需要将其重新挂载为可读写(rw)模式。
# 在 adb shell (#) 下执行 mount -o rw,remount /system或者更精确地指定分区:
mount -o rw,remount /dev/block/sda6 /system具体的分区设备名可能因镜像而异,可以先执行mount | grep /system来查看。
实操心得:如果
mount命令失败,提示 “/system not in /proc/mounts” 或 “block device required”,可以尝试使用magisk提供的magisk --mount-master或工具busybox mount。另一种更通用的方法是,在su后,先执行adb disable-verity(在宿主机的ADB命令行执行),然后重启模拟器,再尝试挂载。夜神模拟器有时需要在其设置中关闭“安全启动”选项。
4.3 推送证书文件并设置权限
挂载成功后,就可以将证书文件推送到系统目录了。
推送文件:在宿主机的命令行(非adb shell)中,执行:
adb push 9a5ba575.0 /system/etc/security/cacerts/如果推送失败,提示“只读文件系统”,说明上一步的挂载没有成功,需要返回排查。
设置权限:文件推送成功后,回到
adb shell(确保在#权限下),执行:chmod 644 /system/etc/security/cacerts/9a5ba575.0这个权限(
-rw-r--r--)是系统证书的标准权限,必须设置正确,否则系统将忽略该证书。验证与重启:可以执行
ls -l /system/etc/security/cacerts/ | grep 9a5ba575来确认文件存在且权限正确。最后,重启模拟器。重启是为了让系统重新加载证书库。执行reboot或直接关闭模拟器再启动。
4.4 备选方案:使用Magisk模块(更优雅)
如果你觉得直接修改/system分区风险较高或操作繁琐,使用Magisk模块是一种更现代、更安全(可逆)的方法。
- 在夜神模拟器中安装Magisk:这需要先刷入一个包含Magisk的镜像,或者通过特定方法在已Root的系统中安装Magisk Manager并刷入Magisk。夜神对Magisk的支持度因版本而异,操作相对复杂。
- 安装“Move Certificates”模块:在Magisk的模块仓库中,有一个名为“Move Certificates”的模块。它的原理是,在系统启动时,将用户证书目录(
/data/misc/user/0/cacerts-added/)下的证书,动态地、临时地“链接”或“绑定”到系统证书视野中,从而实现系统级信任。 - 操作流程:安装该模块后,你只需要将Burp证书(
cacert.der)重命名为.crt格式(如burp.crt),然后通过系统设置 -> 安全 -> 加密与凭据 -> 安装证书 -> CA证书,将其安装为用户证书。重启后,Magisk模块会自动将其提升为系统信任。- 优点:无需修改
/system分区,完全可逆,卸载模块即恢复原状。 - 缺点:依赖Magisk环境,在模拟器上搭建Magisk环境有一定门槛。
- 优点:无需修改
5. 配置模拟器代理与最终验证
系统证书植入并重启后,我们进行最后的代理配置和验证。
配置Wi-Fi代理:
- 在夜神模拟器中,进入“设置” -> “WLAN”(或“网络和互联网” -> “Wi-Fi”)。
- 长按当前连接的网络(通常是
WiredSSID或eth0),选择“修改网络”。 - 展开“高级选项”,将“代理”设置为手动。
- 代理服务器主机名:填写你宿主机的局域网IP地址。
- 代理服务器端口:填写Burp Suite的监听端口,默认为
8080。 - 保存设置。
最终验证:
- 方法一(系统验证):在模拟器中,进入“设置” -> “安全” -> “加密与凭据” -> “信任的凭据” -> “系统”。在冗长的列表里,你应该能找到以 “PortSwigger” 或 “PortSwigger CA” 开头的证书。这说明证书已被系统成功信任。
- 方法二(流量验证):这是最直接的验证。在模拟器中打开浏览器,访问任意HTTPS网站,例如
https://www.baidu.com。此时,Burp Suite的Proxy->Intercept标签页如果处于开启状态,应该能截获到这次HTTPS请求,并且Target站点地图中能看到该域名。查看Proxy->HTTP history,应该能看到明文(或解密后)的HTTP/HTTPS请求和响应,而不是SSL握手错误或乱码。
6. 常见问题排查与实战技巧
即使按照步骤操作,也可能会遇到各种问题。这里记录一些典型的“坑”和解决方案。
6.1 问题排查清单
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| Burp无法截获任何流量 | 1. 模拟器代理未设置或设置错误。 2. 宿主机防火墙阻止。 3. Burp监听器未绑定到正确IP。 | 1. 检查模拟器Wi-Fi代理的IP和端口是否正确。 2. 在模拟器浏览器访问 http://<宿主机IP>:8080,看是否能打开Burp页面。3. 检查Burp Proxy Listeners是否绑定到All interfaces或宿主机IP。 |
| 只能抓到HTTP,HTTPS全是乱码或连接错误 | 1. 系统证书未成功安装或信任。 2. App使用了证书绑定(SSL Pinning)。 | 1. 检查“设置 -> 信任的凭据 -> 系统”中是否存在PortSwigger证书。 2. 确认证书文件权限是否为644。 3. 对于证书绑定的App,需要额外进行脱壳(Dump)、反编译并使用工具(如Frida, Objection)绕过Pinning检测。 |
adb push证书时提示“Read-only file system” | /system分区挂载为只读模式。 | 1. 确认已执行su获取#权限。2. 使用 mount -o rw,remount /system重新挂载。3. 尝试使用 magisk --mount-master或检查模拟器是否关闭了“安全启动”。 |
| 安装证书后,某些App(如银行、微信)仍无法抓包 | 1. 目标App使用了安卓的“网络安全配置”。 2. 目标App使用了自定义证书库或更严格的校验。 | 1. 这是安卓7.0引入的特性,App可以声明只信任系统预置的特定证书。对付方法通常是反编译修改其网络安全配置文件(network_security_config.xml),或使用Xposed/LSPosed模块全局绕过。 |
| 夜神模拟器启动失败,提示与Hyper-V冲突 | 宿主机Windows开启了Hyper-V虚拟化,与夜神(基于VirtualBox)冲突。 | 1. 关闭Hyper-V(控制面板->程序->启用或关闭Windows功能)。 2. 在命令提示符(管理员)执行 bcdedit /set hypervisorlaunchtype off并重启。3. 或者,换用基于Hyper-V的模拟器(如Windows自带的WSA)。 |
6.2 进阶技巧与注意事项
针对证书绑定(SSL Pinning)的App:系统级证书只是第一步。很多金融、社交类App会使用SSL Pinning技术,将服务器证书的公钥或哈希值硬编码在App内,只信任特定的证书。此时,即使系统信任了Burp的CA,App自身也会拒绝连接。解决此问题需要结合逆向工程工具:
- Frida/Objection:通过注入脚本,在运行时Hook关键的证书验证函数(如
OkHttpClient.Builder、TrustManager等),使其返回“验证通过”。这是目前最主流的方法。 - Xposed/LSPosed模块:安装如“TrustMeAlready”、“SSLUnpinning”等模块,可以全局或针对特定App绕过证书绑定。
- 修改APK:反编译APK,修改
network_security_config.xml文件或smali代码,然后重打包签名。此方法步骤繁琐,且可能触发App的签名校验。
- Frida/Objection:通过注入脚本,在运行时Hook关键的证书验证函数(如
使用低版本安卓镜像:如果研究目标不涉及高版本安卓特性,最简单的避坑方法是直接使用安卓7.0以下(如安卓5.1、6.0)的模拟器镜像。在这些版本上,只需通过浏览器下载安装Burp的CA证书(
.der文件),即可在“用户凭据”中完成信任,无需Root和修改系统分区。Burp证书的定期更新:Burp Suite的CA证书可能会过期或更换。如果你发现之前能抓包,突然不行了,可以检查一下Burp的证书有效期(在
Proxy->Options->Import / export CA certificate中查看),并重新导出、转换、植入新证书。模拟器的网络模式选择:夜神模拟器的“网络设置”推荐使用“桥接模式”。这样模拟器会从你的路由器获取一个独立的局域网IP,与宿主机处于同一网段,网络结构更清晰,代理设置也更稳定。避免使用复杂的NAT模式,可能引入不必要的路由问题。
整个流程走下来,你会发现解决安卓高版本抓包问题的核心,已经从网络配置转向了系统权限和安全性对抗。它融合了移动端配置、系统操作、安全原理和逆向工程等多个领域的知识。成功配置的那一刻,看着Burp中如瀑布般流出的明文HTTPS请求,你会觉得这一切的折腾都是值得的。这不仅是掌握了一个工具的使用,更是深入理解了现代移动应用安全机制的一个侧面。
