APK安全测试实战:Burp Suite联动逍遥模拟器抓包与证书信任全攻略
1. 环境准备:搭建Burp Suite与逍遥模拟器联动作战平台
第一次尝试用Burp Suite抓取安卓应用流量时,我在证书安装环节卡了整整两天。后来发现,问题出在模拟器系统版本和证书格式的兼容性上。这次就把这些实战经验整理成保姆级教程,帮你避开我踩过的那些坑。
Burp Suite作为安全测试的瑞士军刀,配合逍遥模拟器这个轻量化的安卓环境,能完美复现移动端抓包场景。建议直接使用逍遥模拟器7.5.5版本(官网可下载),这个版本经过实测对证书安装最友好。Burp Suite推荐2023年之后的版本,社区版就够用,但记得提前配置好Java环境。
安装完成后先别急着连线,有个关键细节要注意:确保你的电脑和模拟器在同一个局域网。我习惯用WiFi共享的方式,把电脑变成热点,让模拟器直接连接这个热点网络。这样比用桥接模式稳定得多,具体操作是在网络设置里选择"无线网络",然后连接电脑热点的SSID。
2. 代理配置:让流量乖乖流经Burp Suite
2.1 Burp Suite监听设置
打开Burp Suite后直奔Proxy→Options,这里有个隐藏技巧:不要用默认的8080端口!很多应用会检测这个端口,改成9900这类冷门端口能避开大部分检测。我的配置组合是:
- 监听地址:All interfaces
- 端口:9900
- 勾选"Support invisible proxying"
记得点击"Import/export CA certificate"导出证书,后面会反复用到这个文件。导出时建议选择der格式,虽然安卓系统需要cer格式,但der格式转换起来更方便。
2.2 模拟器代理配置
逍遥模拟器的网络设置藏在系统设置的"WLAN"里,长按当前连接的网络选择"修改网络"。重点来了:
- 代理选择"手动"
- 主机名填电脑的IP(cmd里ipconfig查)
- 端口填Burp Suite设置的9900
- 别点保存!先打开浏览器访问
http://192.168.x.x:9900(换成你的IP)
这时应该能看到Burp Suite的欢迎页面。如果报错,八成是防火墙问题。我在Windows Defender里加了三条入站规则:
- 允许9900端口的TCP入站
- 允许BurpSuite.exe所有网络活动
- 允许模拟器进程的网络访问
3. 证书攻防战:从格式转换到系统级信任
3.1 证书格式的魔法转换
从Burp Suite导出的der证书就像加密的压缩包,需要转换成安卓能识别的pem格式。这里有个坑:网上教程都说要用OpenSSL,其实Windows自带的certmgr.msc就能搞定:
- 双击der证书导入到"受信任的根证书颁发机构"
- 右键证书→所有任务→导出
- 这次选择"Base64编码的X.509(.CER)"
转换后的证书通过模拟器的"共享文件夹"功能传进去。逍遥模拟器有个贴心设计:在文件管理器里直接点击证书会触发安装流程,但千万别急着点!这时候安装会失败,因为还没放到系统证书目录。
3.2 系统级证书安装秘籍
安卓7.0之后加强了证书限制,必须把证书装到系统分区才能抓HTTPS流量。逍遥模拟器有个黑科技入口:
- 打开设置→安全→加密与凭据
- 点击"安装证书"→"CA证书"
- 选择之前传进来的cer文件
- 关键步骤:命名时加上".system"后缀(如"burp.system")
这样操作后证书会被标记为系统证书,绕过应用的非信任限制。如果还是抓不到包,试试这个终极大招:
adb shell su -c "mount -o rw,remount /system" adb push cacert.cer /system/etc/security/cacerts/ adb shell su -c "chmod 644 /system/etc/security/cacerts/cacert.cer"4. 实战调试:抓包过程中的疑难杂症
4.1 顽固应用的对抗手段
现在不少应用会检测代理环境,我遇到过三种反抓包策略:
- 证书锁定(SSL Pinning):用Frida注入脚本绕过
Java.perform(function(){ var Certificate = Java.use("java.security.cert.Certificate"); Certificate.verify.overrides = true; }); - 代理检测:在AndroidManifest.xml里加
android:usesCleartextTraffic="true" - 双向认证:需要反编译apk提取客户端证书
4.2 流量分析的黄金技巧
Burp Suite的Scanner功能虽好,但面对移动端流量我更推荐手动测试:
- 拦截登录请求后,右键→"Send to Intruder"
- 在Positions里设置爆破点,比如手机号参数
- Payloads里加载常用漏洞字典(弱密码、SQL注入等)
- 重点观察响应中的
Set-Cookie、Location等头部
有个骚操作:在Proxy→HTTP history里右键任意请求,选择"Find related"→"By parameter",能快速定位所有含特定参数的请求,对找越权漏洞特别有用。
5. 高阶玩法:自动化测试与漏洞挖掘
5.1 批量测试的流水线搭建
用Python+Burp API实现自动化扫描:
from burp import IBurpExtender class BurpExtender(IBurpExtender): def registerExtenderCallbacks(self, callbacks): self._callbacks = callbacks self._helpers = callbacks.getHelpers() callbacks.setExtensionName("Auto Scanner") # 自动扫描所有流量 callbacks.registerProxyListener(self) def processProxyMessage(self, messageIsRequest, message): if not messageIsRequest: response = message.getMessageInfo().getResponse() analyzed = self._helpers.analyzeResponse(response) if "password" in analyzed.getHeaders()[0]: print("发现敏感信息泄露!")5.2 漏洞挖掘的六个关键点
根据OWASP Mobile Top 10,我总结的检查清单:
- 存储数据是否加密(SharedPreferences文件)
- 日志是否泄露敏感信息(Logcat调试)
- 组件暴露风险(
adb shell dumpsys package查exported属性) - 加密算法强度(搜
Cipher.getInstance调用) - 权限滥用(检查
uses-permission) - 硬编码密钥(strings.xml里搜password、key等)
有次在金融类APP里发现密钥硬编码,直接用frida脚本调出密钥:
Java.perform(function(){ var SecretKey = Java.use("com.example.SecretHolder"); SecretKey.getKey.implementation = function(){ console.log("密钥泄露: " + this.getKey()); return this.getKey(); } });6. 安全加固建议
开发阶段就要防范这类测试,推荐几个防护方案:
- 网络层:使用证书绑定+双向认证
- 代码层:关键逻辑用NDK实现
- 运行时:检测调试状态(
android.os.Debug.isDebuggerConnected()) - 混淆策略:不仅用ProGuard,还要上DexGuard
最近测试某电商APP时发现,他们用Native层校验证书指纹,常规方法很难绕过。最后是通过IDA Pro动态调试so文件,找到校验函数并patch才成功抓包。这种攻防对抗就像下棋,永远有更高级的玩法等着我们去探索。
