尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

BurpSuite+安卓模拟器:破解Android 7+证书信任的HTTPS抓包实战

BurpSuite+安卓模拟器:破解Android 7+证书信任的HTTPS抓包实战 为了抓APP的HTTPS包我在真机上折腾了一晚上最后发现问题根本不在工具而在系统证书信任策略。Android 7.0之后系统默认不再信任用户安装的CA证书BurpSuite的证书装上了HTTPS流量照样解密失败或直接拒绝连接。换到安卓模拟器之后十分钟就走通了完整链路。这篇东西不是讲基础的“BurpSuite怎么用”而是把“BurpSuite 安卓模拟器”这套组合从选型、安装、配置到排查的完整流程捋一遍尤其适合做APP渗透测试、接口调试、协议分析的朋友能省下大量和真机环境纠缠的时间。1. 为什么真机抓包越来越难方案选型背后的逻辑1.1 Android 7.0证书信任机制真机抓包变难的根源很多人以为抓包就是“开代理、装证书、看流量”三步走放在五六年前确实如此。但从Android 7.0API 24开始系统改变了CA证书的信任策略默认情况下App只信任系统内置证书不信任用户手动安装的CA证书。也就是说你在“设置-安全-加密与凭据”里装的Burp证书只对系统级组件和少数老版本App生效现代App直接忽略它。更麻烦的是Android的targetSdkVersion如果大于等于24App就遵循这套新的网络安全配置。现在应用商店里还能下载到的ApptargetSdk基本都在26以上有的甚至到了34。这就导致在真机上做HTTPS中间人抓包经常是证书装了、代理也配了Burp那边就是一片空白。真机抓包还有其他隐形阻力厂商定制ROM对证书安装的路径做了限制部分系统不让你把证书装进系统分区USB调试授权弹窗频繁多开分身、双域等机制会干扰代理配置。我在不同品牌的真机上踩过不少坑有的机器带魅族Flyme的旧证书管理逻辑有的机器在Android 12上连安装用户证书都要先过密码验证步骤繁琐还容易被App做“证书固定”检测直接闪退。模拟器方案能避开的正是这些坑。核心思路很简单找一个足够旧或足够可控的Android系统镜像让Burp的CA证书以系统证书的身份存在。这样既绕开了用户证书不被信任的限制又能通过快照在遇到复杂操作时秒级回滚。1.2 模拟器方案的天然优势很多人对模拟器有偏见觉得它“卡”“慢”“失真”其实做抓包测试时模拟器的优势非常明显系统镜像可控可以选Android 5、Android 7、Android 9甚至Android 12不同镜像对应不同证书信任策略和App兼容性。真机想换系统版本只能换手机。root成本极低模拟器自带root开关或者一键Magisk想在系统证书目录里放文件真的就是adb push一条命令的事。快照回滚搞测试很容易把环境弄坏模拟器的快照功能可以一键还原到干净状态真机上想还原系统只能刷机。不受硬件限制不用考虑手机没电、USB线松动、驱动安装失败这些物理世界的问题。从实际项目角度看模拟器适合大部分场景普通APP接口分析、WebView抓包、游戏协议分析、恶意样本行为观察、快速验证Burp扩展插件效果。唯一不太适合的是那些依赖于真机传感器GPS、陀螺仪、NFC或者特殊厂商ROM接口的App这类场景才需要回到真机做定向突破。1.3 “双保险”的真实含义标题里说“双保险”有两层意思。第一层是指工具组合的保险BurpSuite负责中间人拦截、重放修改、解码伪造安卓模拟器负责提供可控的、没有真机限制的运行环境两个工具配合起来才能把一条HTTPS链路完整地“看透”。第二层是指证书层面的保险我会在正文里详细讲用户证书和系统证书两种安装姿势。早期调试用用户证书就够了但真正要测现代App必须把Burp证书装进系统证书目录。两条路都走通才能覆盖不同targetSdk的App场景。这也是为什么我把这篇叫“双保险”而不是“单靠某个网关口”。2. 准备阶段BurpSuite和模拟器的安装与选型2.1 BurpSuite安装与运行要点BurpSuite社区版是免费的官网直接下载jar包或Windows安装包满足日常抓包重放的需求没有问题。专业版多出了主动扫描、漏洞扫描、BApp扩展等能力如果只是接口调试和APP渗透测试的初级到中级需求社区版够用。安装环境上新版BurpSuite要求JDK 17以上建议直接上JDK 21。Windows用户在官网找“Burp Suite Community Edition”下载即可注意不要下到第三方捆绑包。macOS和Linux用户则直接终端里用java -jar burpsuite_community_*.jar启动前提是JAVA_HOME和PATH配好。一个容易被忽略的参数是启动时的内存分配。BurpSuite社区版默认堆内存比较小抓大包、跑大量请求时会卡成PPT。建议写一个启动脚本把堆内存调大java -Xmx2g -jar burpsuite_community_*.jarWindows下还可以在burpsuite.vmoptions文件里改内存参数。另外注意Burp必须装在全英文路径下JVM对中文路径的兼容性并不好我之前遇到过插件加载失败和配置文件写入异常排查了一圈才发现是路径里有中文。启动后第一件事不是急着抓包而是先把代理监听端口想清楚。默认监听127.0.0.1:8080这个配置在浏览器代理调试时没问题但模拟器要访问宿主机端口时必须让Burp监听在所有网卡上。这个细节放到第3节讲联动时展开。2.2 模拟器选型为什么我推荐雷电市面上安卓模拟器非常多暴风、夜神、蓝叠、MuMu、雷电、逍遥还有面向开发的Genymotion。我个人的选择标准是三条root是否方便、Android版本是否可切换、CPU虚拟化兼容性是否好。这些年用下来雷电模拟器是抓包配置最顺手的。原因有几点自带root开关不需要额外刷Magisk支持Android 7、Android 9等不同镜像切换其中Android 7镜像在“系统证书安装”和“现代App兼容性”之间取得了很好的平衡性能在主流模拟器里属于第一梯队配合VT虚拟化开起来很流畅。如果你用macOS可能优先考虑MuMu或夜神M系列芯片上Android模拟器的支持情况各有差异。Genymotion功能强大但个人版有会话时长限制配置也偏开发向日常做抓包反而有点杀鸡用牛刀。关于Android版本的具体选择我强烈建议优先选Android 7API 24左右的镜像原因在1.1节已经说过Android 7及以上默认不信任用户证书但通过root把证书放进系统证书目录就能解决而Android 5/6虽然更“听话”但现代App的最低兼容版本往往已经在Android 7之上装上去直接提示“设备不兼容”。Android 9镜像也可以但有些系统分区挂载的细节比Android 7更麻烦新手容易卡壳。安装雷电模拟器要确保电脑BIOS里开启了虚拟化技术。任务管理器-性能-虚拟化如果显示“已启用”直接装没启用就去BIOS把Intel VT-x或AMD SVM打开否则模拟器要么起不来要么慢到让人怀疑人生。2.3 基线检查把环境先跑通正式配置Burp之前先把模拟器的几个基础项检查好模拟器能正常启动并联网。打开浏览器访问一个普通网站确认网络通畅。模拟器能访问宿主机。在模拟器浏览器里访问http://10.0.2.2:8080如果返回错误页面没关系因为Burp还没配置但“能连通”这个前提要先确认。adb连接正常。雷电模拟器默认在安装目录下自带adb或者你把Android SDK的platform-tools加到系统PATH里用adb devices能看到设备。root权限可用。雷电里打开“系统应用-设置-其他设置-开启Root权限”然后在模拟器终端或adb shell里执行su能切到root就说明OK。我这里多说一句10.0.2.2是安卓模拟器对宿主机回环地址的特殊映射。也就是说模拟器里的网络栈会把10.0.2.2这个IP指向你电脑的127.0.0.1。理解这一点后面配置转发入口时就不会糊涂。3. 模拟器流量转发配置与BurpSuite联动3.1 BurpSuite监听配置别只监听127.0.0.1很多人抓包失败第一坑就是Burp只监听本机回环地址模拟器那边自然连不上。正确操作是在BurpSuite里打开Proxy settings找到Proxy Listeners点AddBind to address选择All interfaces端口保持8080或自定义勾选“HTTP and HTTPS”协议。Windows系统如果开了防火墙第一次启动Burp时会弹出允许入站连接的窗口一定要选“允许”否则模拟器过来的请求会被防火墙直接拦截。如果之前不小心点了拒绝去“Windows安全中心-防火墙和网络保护-允许应用通过防火墙”里把Java或Burp的入口打开。Linux或macOS则检查一下系统防火墙一般默认放行但要留意某些安全软件把Java进程的网络访问拦截掉了。配置完成后可以在Burp的Proxy Listeners列表里看到监听地址变成了0.0.0.0:8080这就表示宿主机所有网卡上的8080端口都在被Burp监听。模拟器流量进入后第一步就走进了Burp的拦截通道。3.2 模拟器WiFi转发设置10.0.2.2带来的坑模拟器里的网络环境可以当成一个虚拟WiFi。要让流量走到Burp就得让模拟器知道“转发到哪个地址哪个端口”。以雷电模拟器Android 7为例具体操作打开模拟器系统设置进入WLAN。长按当前已连接的WiFi网络一般是“AndroidWifi”或类似名称。选择“修改网络”。勾选“显示高级选项”。将“代理服务器”设置为手动。主机名填10.0.2.2端口填8080。保存断开重连WiFi让配置生效。这里有个我常遇到的坑部分模拟器版本在WLAN设置里可能找不到“修改网络”入口这时可以直接在模拟器的“设置-无线和网络”里找“代理”相关项。有的国产模拟器干脆在“系统设置-网络”里给了一个全局代理的开关填法一样。还有一点很多教程让你把代理地址填成宿主机的局域网IP比如192.168.x.x。这也能通但会引入局域网防火墙、路由隔离等问题。用10.0.2.2是最稳定的因为它是模拟器虚拟网卡内置的宿主机映射不经过外界网络。如果后续抓包时改了Burp端口记得把代理端口同步修改。3.3 链路验证先让浏览器走通配置完代理后别急着开Burp的拦截先把链路验证一下。打开模拟器里的浏览器地址栏输入http://burp注不是http://burp.com而是BurpSuite在代理端口上提供的一个固定虚拟域名。如果看到BurpSuite的CA证书下载页面说明链路已经打通。这个页面上通常有CA Certificate下载链接后面安装证书时就要用到它。有些精简版模拟器的自带浏览器可能有问题建议先装个Chrome或者Via等轻量浏览器顺便也能模拟真实用户环境。这一步一定要在装证书前做因为如果链路不通后面所有证书操作都没有意义。链路通了之后我在Burp里看到的就是模拟器浏览器发出的代理请求里面混杂着各种系统自动发起的连接。为了后续调试时视野干净建议在Burp的Proxy settings里把那些不关心的主机流量过滤掉或者干脆用“Target-Scope”功能设置只监听目标App对应的域名。4. BurpCA证书在模拟器中的两种安装姿势4.1 用户证书安装快速方案把Burp的CA证书装成用户证书是最快、最省事的方式。适合老版本ApptargetSdk低于24或系统组件调试。步骤如下在BurpSuite中导出CA证书。路径Proxy settings - Import/Export CA certificate - Export选择DER格式导出一个cacert.der文件。把DER格式转成手机能直接安装的PEM或CRT格式openssl x509 -inform DER -in cacert.der -out cacert.pem把转换后的文件传到模拟器。可以用adb push也可以在模拟器浏览器访问http://burp直接下载证书。在模拟器里打开“设置-安全-从存储设备安装证书”找到刚才的cacert.pem给它命名确定。重启模拟器或者等待片刻在“信任的凭据-用户”标签页里能看到Burp的证书。这套流程走完在Android 7以下的系统版本里HTTPS抓包基本就通了但在Android 7以上即便是系统浏览器也可能不认这个用户证书。所以只装用户证书现代App的流量依然收不到这就是为什么需要系统证书方案。4.2 系统证书安装一劳永逸方案把Burp证书放进系统证书目录是让现代App信任Burp的关键所在。Android的系统CA证书放在/system/etc/security/cacerts/目录文件名格式是“证书主题哈希值.0”Burp的证书得转成这个名字才能被系统识别。完整步骤导出DER格式证书后转换成PEMopenssl x509 -inform DER -in cacert.der -out cacert.pem计算证书的旧版主题哈希Android用这个算法命名证书文件openssl x509 -inform PEM -subject_hash_old -in cacert.pem这条命令会输出一个十六进制字符串假设是9a5ba575。记住这个值待会儿文件名要用。把证书重命名为哈希值加.0后缀cp cacert.pem 9a5ba575.0用adb把文件推到模拟器临时目录adb push 9a5ba575.0 /sdcard/adb shell进入root并重新挂载系统分区为可写adb shell su mount -o rw,remount /system这里有一个在雷电模拟器上经常遇到的坑mount -o rw,remount /system直接执行可能会报错因为部分镜像用了SELinux或分区只读规则。我常用的替代方案是用Magisk模块或RE管理器直接改挂载。雷电Android 7镜像在root权限下执行adb remount通常能成功但如果不行试试mount -o rw,remount /system_root不同模拟器镜像的系统分区挂载点不一样设备的/system有时是挂在/system_root/system下的报错就换个挂载点试。把证书文件复制到系统目录并设置权限cp /sdcard/9a5ba575.0 /system/etc/security/cacerts/ chmod 644 /system/etc/security/cacerts/9a5ba575.0重启模拟器。重启后进入“设置-安全-信任的凭据-系统”能看到Burp的证书说明系统证书安装成功。装好系统证书后即使是很挑剔的现代App只要它没有自己做“证书固定”Certificate PinningHTTPS流量都能被Burp解密。这是整个模拟器抓包方案里最有价值的一步。4.3 两种方式的适用边界有人可能会问“既然系统证书一劳永逸为什么还提用户证书”原因是系统证书安装需要root、需要处理系统分区挂载对新手有一定门槛而且某些模拟器镜像做了额外保护系统分区写不进去。这时候临时用用户证书顶一下至少能解决一部分老App的调试问题。归纳一下证书方式是否需要rootAndroid 7以上现代App操作复杂度适用场景用户证书否基本不信任低老App、系统组件、临时验证系统证书是信任中高现代App、HTTPS全量解密正式做APP安全评估时别省这一步直接把系统证书装上。我在真机调试时费很大劲也搞不定的证书信任问题在模拟器上装系统证书之后一次就过了。5. 开始抓包常见场景与验证流程5.1 HTTP流量验证从基础到顺手配置完环境第一次抓包建议先用纯HTTP站点验证。在模拟器浏览器里访问一个HTTP网站回到BurpSuite右侧的HTTP history面板能看到请求和响应都带着明文内容。这里有一个资深玩家会注意到的细节BurpSuite的拦截开关Intercept默认是关闭的。如果开着拦截所有流量都会卡在Proxy-Intercept面板不会自动落到History里。刚开始测试时把Intercept关闭让流量直接放行专心看History。History里还能看到模拟器系统组件的各种后台连接比如connectivitycheck.gstatic.com这类连通性检测域名。看到它们说明代理链路完全OK接下来可以关掉浏览器进入App测试环节。5.2 HTTPS流量验证证书是否生效的试金石在模拟器浏览器访问一个HTTPS网站Burp的History里应该出现解密后的明文请求。如果能看到请求路径、Cookie、POST参数说明证书链路完好。如果浏览器报证书错误或页面无法访问大概率是证书安装不到位。这里有个快速验证思路BurpSuite代理设置里有一个“TLS pass through”列表如果之前误加了目标域名会直接放行HTTPS流量而不解密看到History里只有CONNECT请求没有明文内容时检查一下这个列表。另一个小技巧是验证完浏览器后记得在模拟器里把浏览器的缓存和SSL状态清一下不然老域名里的证书状态会干扰后续测试。5.3 APP协议抓包实战从安装到观察模拟器里直接安装目标App的APK浏览器下载或adb install打开App后用几个关键操作比如登录、拉取列表、上传图片然后回Burp看History。正常情况下HTTPS请求会以明文形式出现在History里参数、Header、返回包一目了然。但很多App写得比较贼它不理会系统WiFi代理设置。这类App在初始化网络连接时使用了自定义的网络栈或者直接检测到代理的存在就拒绝服务。解决这个问题的通用方案是使用透明代理把所有流量在TCP层强制转发到Burp。我常用的工具是ProxyDroid配合模拟器的root权限可以在iptables层面做流量转发不依赖App是否尊重系统代理。ProxyDroid配置要点模拟器安装ProxyDroid并给予root权限。设置里把“Default Proxy”关掉或者让它继承系统代理。转发模式选择“Global”这样所有App的流量都会经过代理。代理主机填10.0.2.2端口8080。开启转发服务回Burp看流量。开启透明转发后即使App检测到系统代理也拦不住因为在TCP层它根本看不到代理的存在。不过要注意个别App会用反调试、root检测、Frida检测等手段做对抗这个就超出了“环境配置”范畴需要结合动态调试进一步处理我在第6节简单展开。6. 常见问题与排查技巧实录6.1 BurpSuite收不到模拟器流量的排查这是在模拟器抓包里最常遇到的问题。链路不通时我会按顺序排查Burp监听地址是否为All interfaces只监听127.0.0.1必然收不到外部流量。Windows防火墙是否放行了Java这个最常见模拟器在电脑本地怎么都不通时先把防火墙入口检查一遍。模拟器的代理地址是否为10.0.2.2填成局域网IP也行但会被隔离策略干扰。代理端口是否和Burp监听端口一致改过端口之后两边很容易对不上。模拟器是否真的连上了WiFi部分精简镜像的WiFi会自动断开需要手动重连。按这个顺序走一遍95%的问题都能解决。如果还不行在模拟器里用浏览器访问http://10.0.2.2:8080能返回内容但Burp没反应那就是代理没生效连内容都访问不到说明是网络层问题先从连接性入手。6.2 证书装了但依旧报错的排查场景一浏览器访问HTTPS报错但用户证书明明装了。原因通常是模拟器系统是Android 7以上用户证书默认不被信任。解决办法就是装系统证书没有捷径。场景二系统证书装了但某个App依旧连不上。这时要考虑App是否做了证书固定只认自己内置的证书或公钥。判断方法在Burp的History里如果看到CONNECT请求成功后立即RST或者App直接闪退/提示网络错误大概率是证书固定。绕过证书固定的思路包括用Frida hook验证逻辑、用Objection的android sslpinning disable命令等具体操作需要针对不同App的加固和混淆程度做定制。场景三证书文件的hash名不对或权限不对。进入系统证书目录逐个检查文件名和权限系统证书目录下的文件基本都要644或444属主root。写错一个字母系统就不认这个证书。6.3 检测与反检测模拟器与root痕迹做安全测试时App会检测模拟器、root、Xposed、Frida等环境。检测到模拟器就退出或检测到root就把功能禁用这类情况属于移动应用安全对抗范畴。常用的初步对策用MagiskHide或Shamiko隐藏root模拟器里关闭“开发者选项”和“USB调试”如果App对模拟器特征做检测比如检测Build.FINGERPRINT、CPU型号、传感器列表可以先用网上现成的改机工具修改这些参数但这种方式治标不治本真正严格的环境对抗必须回归到动态调试和代码分析。6.4 乱码、HTTP/2等细节问题用Burp抓包时可能会遇到响应包中文乱码。这不是代理配置问题而是Burp的显示编码不匹配。在Burp的Response面板里检查底部字符编码设置改成UTF-8一般能解决。如果服务端返回的Content-Type里指定了其他编码按实际情况调整。关于HTTP/2现代App普遍启用了HTTP/2但Burp的中间人流程会对部分HTTP/2流量做降级处理。如果发现某个App在Burp下面请求特别慢或者连接反复重置可以在Burp的Proxy settings里把“HTTP/2”相关选项调整一下或者干脆在模拟器侧的OkHttp/网络库层面禁用HTTP/2测试。下面把高频问题整理成一个速查表方便遇到问题时直接对照现象可能原因解决思路Burp完全收不到数据Burp监听127.0.0.1改成All interfaces模拟器连不上代理防火墙拦截Java防火墙放行BurpHTTPS报证书错误用户证书不生效改装系统证书某App单独连不上证书固定或代理检测Frida绕过或透明代理Burp里全是CONNECTTLS pass through清空pass through列表响应中文乱码编码不匹配Burp显示编码改UTF-8App检测到rootMagisk痕迹隐藏root或临时卸载root证书hash计算错误文件名不匹配重新算subject_hash_old实际操作中还有个容易踩的坑有些模拟器版本的“设置-安全-从存储设备安装证书”会强制要求设置锁屏PIN否则拒绝安装。遇到这种情况先去“设置-安全-屏幕锁定”里设一个简单的PIN再回去装证书。最后再分享一个能显著提升效率的小细节模拟器配置完成后先做一个干净快照。后面无论把环境搞得多乱一条命令就能回到“Burp已配置好、证书已装好”的状态。我自己的习惯是分三个阶段各存一个快照原始干净系统、证书安装完成后、常用工具全部装好后。这样在不同项目之间切换永远不用从零开始配环境。这套“BurpSuite 安卓模拟器”的组合比真机抓包省下的时间不是一星半点熟练之后一套环境十分钟以内就能搭完。
返回列表