code4f 2025-11-10 08:50 采纳率: 98.6%
浏览 0
已采纳

Burp抓包手机App时HTTPS证书信任问题

在使用Burp Suite抓取手机App的HTTPS流量时,常因SSL证书信任问题导致抓包失败。典型表现为客户端抛出“SSL handshake failed”或“Certificate not trusted”错误。此问题多源于App内置了证书绑定(Certificate Pinning)机制,或系统/应用未正确信任Burp生成的CA证书。即使已在手机中安装Burp证书,Android 7及以上版本的应用默认不信任用户证书,需将证书移至系统受信任凭据才能生效。此外,部分应用使用双向认证或检测代理环境,进一步阻碍正常抓包。如何绕过证书锁定并确保Burp证书被目标App信任,成为移动安全测试中的关键难点。
  • 写回答

1条回答 默认 最新

  • Qianwei Cheng 2025-11-10 09:28
    关注

    一、问题背景与核心挑战

    在移动应用安全测试中,使用Burp Suite抓取HTTPS流量是常规操作。然而,由于现代App普遍采用安全增强机制,导致抓包失败的情况频繁发生。最典型的错误提示包括“SSL handshake failed”和“Certificate not trusted”,其根源主要集中在以下三个方面:

    1. 证书绑定(Certificate Pinning):App将特定服务器证书或公钥硬编码,拒绝接受任何第三方CA签发的证书,包括Burp生成的中间人证书。
    2. Android系统信任模型变化:自Android 7(API 24)起,默认情况下应用不再信任用户安装的CA证书,必须将Burp CA证书移至系统级受信任凭据目录。
    3. 代理检测与双向认证:部分App通过检测环境变量、网络延迟、证书指纹等方式识别代理行为;少数金融类App甚至启用mTLS(双向TLS),要求客户端提供有效证书。

    二、分层分析:从基础到高级障碍

    层级技术点影响范围典型表现
    1未安装Burp CA证书所有Android/iOS设备Certificate not trusted
    2证书为用户凭据,非系统级Android 7+仅部分App可抓包
    3证书绑定(OkHttp, Network Security Config)主流金融、社交AppSSL handshake failed
    4动态Pinning + 公钥哈希校验高安全性App(如银行)连接立即中断
    5代理检测(Proxy Detection)反调试加固App功能受限或闪退
    6mTLS(双向认证)企业级通信Apphandshake_failure alert

    三、解决方案路径图谱

    
    # 常见绕过步骤概览
    1. 导出Burp CA证书(cacert.der)并转换为系统兼容格式
    2. 将证书推送至Android设备 /system/etc/security/cacerts/
    3. 修改文件权限:chmod 644 <hash>.0
    4. 使用Frida或Xposed框架Hook SSL相关API
    5. 利用Magisk模块自动注入系统证书
    6. 动态Patch APK,移除CertificatePinner调用
    7. 启动App时附加Frida脚本禁用pinning逻辑
    8. 配合Objection等工具实现自动化绕过
    
        

    四、实战案例:Android App证书绑定绕过流程

    graph TD A[启动Burp Proxy] --> B[配置手机代理指向Burp] B --> C[导出Burp CA证书为DER格式] C --> D[转换为PEM并计算Subject Hash] D --> E[重命名为<hash>.0] E --> F[Root设备后推送到/system/etc/security/cacerts/] F --> G[设置权限: chmod 644 <hash>.0] G --> H[尝试抓包观察是否仍报错] H -- 失败 --> I[判断是否存在Certificate Pinning] I --> J[使用APKTool反编译目标APK] J --> K[搜索'CertificatePinner', 'pins='关键字] K --> L[定位OkHttpClient构建处] L --> M[修改smali代码移除pinner设置] M --> N[重新打包并签名APK] N --> O[安装测试并验证抓包成功]

    五、高级技巧:基于Frida的运行时Hook方案

    对于无法静态修改的加固App,可采用动态插桩方式。以下为通用Frida脚本片段,用于绕过OkHttp的证书绑定:

    
    Java.perform(function () {
        var CertificatePinner = Java.use('okhttp3.CertificatePinner');
        CertificatePinner.check.overloads.forEach(function (overload) {
            overload.implementation = function (hostname, chain) {
                console.log("[*] Bypassing CertificatePinner for " + hostname);
                return;
            };
        });
    });
        

    该脚本通过拦截CertificatePinner.check()方法调用,直接返回而不执行实际校验,从而实现运行时绕过。适用于大多数基于OkHttp实现pinning的应用场景。

    六、iOS平台特殊处理策略

    iOS系统同样存在类似限制,但解决路径略有不同:

    • 需在设置中手动启用已安装的Burp证书为“完全信任”状态。
    • iOS 10.3+要求在“设置 → 通用 → 关于本机 → 证书信任设置”中开启对特定CA的信任。
    • 对于启用ATS(App Transport Security)且配置严格规则的应用,可能需要越狱后使用SSLKillSwitch2工具全局禁用SSL验证。
    • 利用frida-ios-dump等工具提取IPA并分析NSURLSessionConfigurations中的pinned domains。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月11日
  • 创建了问题 11月10日