ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

安卓HTTPS抓包:将Burp CA证书安装为系统根证书全攻略

安卓HTTPS抓包:将Burp CA证书安装为系统根证书全攻略 搞安卓抓包的人迟早都会撞上一堵墙Burp的代理配好了手机也连上同一WiFi了可一抓HTTPS流量就是满屏的证书警告甚至直接连不上。我当年也被这个问题卡了整整一个下午后来才明白问题出在证书放的位置不对——你装的是用户证书而安卓从7.0开始就默认不信任它只有把Burp的CA证书放成系统根证书Burp才能堂堂正正当中间人。这篇内容就专门讲安卓上怎么把Burp CA证书做成系统根证书从原理讲到实操把会遇到的坑和排查思路一起列出来。适合正在做App开发调试、接口联调、安全测试的朋友尤其是卡在Android 7.0以上机型上抓不到HTTPS包的人。如果你用的是模拟器照着我这一套操作十分钟内能跑通如果手里是真机也有不用刷整个镜像的办法。1. 为什么非要把Burp证书放进系统目录先别急着敲命令搞清楚安卓的信任机制比什么都重要。很多人抓包失败不是操作不对而是不知道“用户证书”和“系统证书”在安卓眼里根本是两码事。1.1 安卓7.0起用户证书和系统证书被分开对待从Android 7.0API 24开始安卓对CA证书的信任策略做了一个非常“狠”的调整普通App默认只信任系统证书不再信任用户安装的证书。也就是说你辛辛苦苦把Burp证书导入手机在“设置-安全-加密与凭据”里能看到浏览器访问也一切正常但打开目标App去抓包照样提示证书错误因为App压根不认你后装进去的那张用户证书。这里用一个生活化的类比系统证书相当于“官方认证”是设备出厂时就盖好章的用户证书相当于“个人备注”你写在本子上自己看可以但公司大门保安不认。安卓7.0之后的默认策略就是让所有App只认官方章除非你以系统身份把证书塞进官方名录里。具体触发条件是App的targetSdkVersion。只要App的targetSdkVersion大于等于24它的默认网络安全配置就是“只信任系统CA”除非开发者主动在network_security_config.xml里声明信任用户证书。今天市面上绝大多数还在更新的ApptargetSdkVersion早就超过24了所以靠“装用户证书”这条路基本走不通。1.2 不同安卓版本的“系统证书”规则变化搞清楚版本差异能少踩很多坑。我按实操时的体感整理一下Android 7到9这一阶段/system分区的写入限制还没有那么死很多模拟器镜像或者userdebug版本固件可以直接adb remount证书放进/system/etc/security/cacerts/就能生效操作最省事。Android 10到13系统引入了动态分区和更严格的dm-verity校验/system默认只读想直接改需要先adb disable-verity再重启再adb remount否则会报错。Android 14及之后系统CA列表改由com.android.conscrypt这个APEX模块提供直接改/system/etc/security/cacerts可能不会被读取。这个阶段最稳妥的方式是走Magisk模块用模块把证书挂载到正确路径。所以先确认你的测试环境是模拟器还是带Magisk的真机版本是Android 9还是Android 14这一步选错方案后面就是一堆“奇怪”的故障。我自己习惯的做法是先在Android 9的模拟器上把整套流程跑通再去处理真机和更高版本效率最高。2. 准备工作导出Burp证书并算好文件名开始实操之前先把环境、工具和证书文件准备好。搞抓包最忌讳的就是一边配代理一边找驱动中途手忙脚乱。2.1 你需要准备哪些东西清单如下一台电脑装好Burp Suite社区版完全够用。一部安卓手机或者一个安卓模拟器。真机需要能解锁Bootloader并刷入Magisk模拟器建议用带root的镜像。ADB工具也就是Android SDK Platform-Tools。电脑上没有的话去Android开发者官网下载解压就能用。手机和电脑连同一个局域网保证网络互通。Java环境Burp运行必需这个一般装Burp的时候已经解决了。还有一个小建议先确定你电脑的局域网IP。命令行里Windows用ipconfigmacOS和Linux用ifconfig或ip addr记下地址后面配置代理和推送文件都要用。准备工作的顺序也有讲究。先把Burp的代理监听打开再导出证书最后给手机装证书。很多新手一上来就导证书结果Burp本身监听的是127.0.0.1:8080手机根本访问不到白折腾。2.2 从Burp导出CA证书并计算系统目录需要的文件名Burp导出证书的路径在Proxy - Options - TLS 选项卡找到Import / Export CA certificate选择Export certificate in DER format保存成cacert.der。DER是二进制格式也是系统CA目录里需要的格式。如果你手里只有PEM格式的证书也可以用openssl转一下openssl x509 -inform PEM -in cacert.pem -outform DER -out cacert.der接下来这一步非常关键也是很多人栽跟头的地方。安卓系统目录/system/etc/security/cacerts/里的证书文件名不是随便起的它要求使用证书Subject的subject_hash_old值加一个.0后缀。注意一定是subject_hash_old不是新版的subject_hash两个算法不一样用错文件名系统不认。计算命令openssl x509 -inform DER -subject_hash_old -in cacert.der -noout比如输出结果是9a5ba575那就把文件改名为9a5ba575.0。这个文件名就是安卓启动时扫描CA目录的依据名字不对后面的努力全白费。如果你对命令行不熟也可以用Burp导出PEM格式然后一条命令直接转成DER并打印hashopenssl x509 -inform PEM -in cacert.pem -outform DER -out cacert.der openssl x509 -inform DER -subject_hash_old -in cacert.der -noout到这一步你应该已经拿到了一个类似9a5ba575.0的证书文件。这只是“原料”下一步就是把它送进系统目录。3. 实操三套把证书装成系统证书的方案证书文件准备好了接下来分场景讲怎么把它塞进系统目录。我按由易到难的顺序给三条路模拟器直接写入、真机Magisk模块方案、以及Android 14上的特殊处理。3.1 模拟器最快路径adb root加adb remount直接写入如果你用的是模拟器比如带root的Android 9镜像这一套流程最省心。先在电脑上执行adb devices确认设备在线。然后依次执行adb root adb remount adb push 9a5ba575.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/9a5ba575.0 adb reboot解释一下每个命令在干什么。adb root让adb服务以root权限重启这样才能写系统分区adb remount把/system分区重新挂载成可写adb push把证书文件传进去chmod 644设置文件权限为owner可读写、其他用户可读最后reboot重启让系统在启动时重新加载CA列表。这里有个细节要注意有些模拟器镜像本身就直接是root不需要adb root执行反而会报错“adbd cannot run as root in production builds”。遇到这种情况就跳过adb root直接adb remount试试。如果提示只读文件系统说明这个镜像不是userdebug版本需要换一个可写系统镜像或者走下面的Magisk方案。在Android 10以上的模拟器上adb remount往往会失败因为系统分区的verity校验还开着。这时候先执行adb root adb disable-verity adb reboot adb root adb remountadb disable-verity会关闭分区的完整性校验重启后再remount就能写入了。这个操作在模拟器上没问题但在真机上会降低系统安全等级我后面会专门说真机该怎么处理。3.2 真机通用方案Magisk模块不用反复重刷系统真机和模拟器最大的区别是你不会为了一颗测试证书去刷一个userdebug系统镜像。主流做法是走Magisk模块用模块的挂载能力把证书“骗”进系统CA目录。第一步先在手机上安装用户证书。很多人跳过这步直接去搞系统目录结果Magisk模块扫描不到证书。具体流程手机设置里先设置锁屏PIN或密码。这一步不做“安装证书”按钮是灰色的我见过太多人卡在这。把手机的WiFi代理指向电脑的Burp监听地址比如192.168.1.100:8080。用手机浏览器访问http://burp点击页面右上角的CA Certificate下载证书。到“设置 - 安全 - 加密与凭据 - 安装证书 - CA证书”里安装刚才下载的证书。装好后在“信任的凭据 - 用户”里能看到PortSwigger CA。第二步安装Magisk模块。社区里比较常用的有MagiskTrustUserCerts、AlwaysTrustUserCerts原理都一样模块的开机脚本会把/data/misc/user/0/cacerts-added/目录下的用户证书复制到系统CA目录并重命名为hash.0格式。操作步骤到GitHub下载对应模块的zip包比如后面的MagiskTrustUserCerts模块下载zip。打开Magisk App进入“模块”点击“从本地安装”选择zip。安装完成后重启手机。重启后打开“设置 - 安全 - 加密与凭据 - 信任的凭据 - 系统”如果能找到PortSwigger CA说明模块生效了。这个方案的好处是以后换电脑、换Burp证书只要重新安装用户证书再重启一次就好不用碰系统分区。坏处是系统升级后模块会被覆盖需要重新装一遍。3.3 Android 14及以后为什么直接改system目录可能无效Android 14这套系统里CA列表实际由com.android.conscrypt这个APEX模块管理/system/etc/security/cacerts对应用层来说可能是只读的即使你通过Magisk改写了/system/etc/security/cacerts系统也不一定会重新加载。这时候正确思路是用Magisk模块挂载到/apex/com.android.conscrypt/cacerts对应的路径。市面上的MagiskTrustUserCerts自适应版本已经处理了这些问题。如果你的Android 14设备用老模块失败就去找更新日志里明确写着“Support Android 14”的版本。本质上模块做的事情是判断系统版本然后把证书文件挂载到正确的APEX CA路径下。还有一种更“硬核”的办法是自己在Magisk模块里写post-fs-data.sh用mount --bind把证书文件绑定到正确路径。这个对普通用户太麻烦我一般直接用现成模块省时省力。这里给一个思路如果你自己编过Android系统镜像也可以把证书直接编进system.img但那套编译环境太重了日常调试完全没必要。3.4 装完之后怎么验证是否真的生效很多朋友证书装完Burp里还是抓不到包就开始怀疑证书有问题。其实90%的情况是没验证系统是否真的加载了新CA。验证方法有三个层次。第一个系统UI层面重启手机后进入“设置 - 安全 - 加密与凭据 - 信任的凭据 - 系统”翻列表找PortSwigger CA。能看到基本就成功了。第二个命令行层面adb shell ls -l /system/etc/security/cacerts/ | grep 9a5ba575如果能看到9a5ba575.0且权限是-rw-r--r--文件位置没问题。Android 14上路径可能显示在/apex/com.android.conscrypt/cacerts这也是正常的。第三个也是最有说服力的验证用手机浏览器访问任意HTTPS网站同时观察Burp的HTTP history面板如果能出现明文请求内容说明中间人链路完整打通。这一步确认之后才可以去抓目标App的包。4. 抓包App的配套设置和问题排查证书进入系统目录只是第一步接下来还牵扯到代理配置、App不走代理、SSL Pinning等一堆问题。我把这些配套细节放到一起讲省得你们一个个去翻文档。4.1 手机代理怎么配才靠谱最基本的代理配置是手机WiFi设置里长按当前WiFi网络 - 修改网络 - 高级选项 - 代理改为手动主机名填电脑局域网IP端口填Burp的监听端口比如8080。这样手机的所有HTTP/HTTPS流量都会走Burp。但实际操作中你会发现很多App根本不买账装了代理照样能联网Burp却收不到任何流量。原因有两个一是部分App不走系统代理它们在代码里直接用Socket或者自研网络库绕过了WiFi代理设置二是有的App检测到代理就拒绝联网。绕过第一类问题可以用ADB设置全局代理adb shell settings put global http_proxy 192.168.1.100:8080这条命令把代理写到系统全局配置连很多不读WiFi代理设置的App也会走。清除代理adb shell settings put global http_proxy :0这里:0的意思是清空代理。经常有朋友配完代理忘记清结果一查网络全部超时这个坑要记住。对于那些连系统全局代理都不走只走原生TCP/UDP的App普通HTTP代理就无解了需要上透明代理思路是让设备上的流量通过iptables转发到Burp监听的端口。常见做法是配合ProxyDroid、Postern这类工具手机需要root权限。说实话透明代理配置起来复杂度高一些我建议先把普通HTTPS抓包吃透再去碰它否则问题叠加在一起很难排查。4.2 装了系统证书还是抓不到包多半是SSL Pinning或者代理没生效如果系统证书已经装好Burp的代理也能看到手机的TCP连接但目标App一打开就提示“网络错误”或者直接闪退那很可能遇到了SSL Pinning。SSL Pinning的机制可以理解为App把服务端的证书指纹写死在客户端里它只认这一把钥匙不认系统里任何CA签发的证书。Burp作为中间人即使持有系统信任的根证书也改变不了指纹不匹配的事实App就会拒绝握手。绕过SSL Pinning的常见技术基调是Hook比如用Frida加载脚本在运行时让App跳过证书校验逻辑。这类工具有objection、各种Frida脚本等。不过这已经属于另一个大话题了而且涉及安全研究边界问题我这里不展开讲。你只要知道抓不到HTTPS不一定是证书配置问题也可能是App做了针对性防护。另外还有一个容易被忽视的点部分App哪怕信任系统证书也会在network_security_config里限制允许的域名范围不在白名单里的域名直接拒绝请求。这种情况靠改证书没用得配合抓包工具做更精细的流量分析或者从App逆向层面看它的配置。4.3 常见问题速查表现象原因解决办法“安装证书”按钮是灰的没设置锁屏PIN或密码先到设置里设置锁屏密码装了用户证书App仍提示证书错误安卓7.0默认不信任用户证书按第3章操作把证书转成系统证书adb remount报只读文件系统系统分区verity校验开启先adb disable-verity再重启或改用Magisk模块证书文件名不对用了subject_hash而不是subject_hash_old用openssl x509 -subject_hash_old重新计算命名代理配了但Burp没流量App不走WiFi代理用adb设置全局代理或透明代理方案系统CA列表有Burp证书App仍连不上App做了SSL Pinning使用Frida等Hook方案绕过需授权环境Magisk模块装完没生效Android 14 APEX路径不同换支持Android 14的模块版本推送证书后系统信任列表没有没重启手机重启让系统重新加载CA列表这张表是我实际操作中最常遇到的几个问题的浓缩建议收藏。排查的大原则是先确认系统证书是否存在再确认代理是否生效最后再考虑是不是App防护策略。5. 聊几句实操心得和这几年的习惯最后分享一点我自己的实操习惯。第一手边永远备一个Android 9的模拟器镜像验证证书流程快模拟器root方便导入系统证书基本一条龙不需要担心真机的厂商定制和分区保护。等流程验证完了再上真机处理Magisk模块出问题也好对比。第二证书文件名一定要用subject_hash_old这是性价比最高的一行命令。包括团队里新人过来问我为什么证书装不上十次有八次是文件名算错了剩下两次是没重启。第三抓包这件事永远要在你自己拥有、或者已经获得明确授权的设备和App上进行。开发调试自己的应用接口、做内部的渗透测试、分析自己公司产品的网络行为这些都没问题。拿到别人的App或未授权的服务上去搞性质就完全变了。这不是客套话带人的时候我反复强调做安全研究的人手越稳能走的路才越长。把这套系统证书的思路搞明白之后后续往上加东西也顺了比如配合Frida做动态调试、利用Magisk模块做更多系统级测试都是在“证书信任模型”这块地基上盖楼。先把地基打好抓包这条路就通了大半。
返回列表