Frida实战:SSL Pinning绕过技术全解析
1. 为什么需要绕过SSL Pinning当你用手机银行转账时有没有想过数据是怎么安全传输的这就是SSL/TLS加密的功劳。但有些应用为了更安全会额外启用SSL Pinning技术——就像给你的快递加了专属密码锁只有特定快递员能打开。我在做安全测试时发现90%的金融类App都用了这个技术。好处是能防止中间人攻击坏处是给我们做安全审计带来了麻烦。比如你想分析一个App的API接口结果所有请求都被SSL Pinning拦住了。去年我测试某电商App时就遇到这种情况。用Burp Suite抓包时全是乱码因为证书校验失败了。这时候就需要Frida这个神器出场了——它就像一把万能钥匙能动态修改App的运行逻辑。2. Frida环境快速搭建2.1 电脑端准备先装Python 3.8太老的版本会有兼容问题然后一条命令搞定pip install frida-tools装完别急着高兴还得检查版本匹配。我上周帮学员排查问题时发现Frida 16.0.10和Android 12配合会有内存泄漏推荐用15.2.2稳定版pip install frida15.2.22.2 手机端配置安卓手机需要root吗其实不用。我更喜欢用模拟器推荐Genymotion的Android 9镜像亲测最稳定。把frida-server推送到设备adb push frida-server-15.2.2-android-arm64 /data/local/tmp/ adb shell chmod 755 /data/local/tmp/frida-server adb shell /data/local/tmp/frida-server 遇到权限问题试试用Magisk给shell提权。有次我在小米手机上折腾了两小时最后发现是SELinux没关。3. 四种实战绕过方案3.1 暴力破解法干掉X509TrustManager这是最直接的方案相当于把安检人员打晕。代码虽然简单但效果拔群Java.perform(function() { const X509TrustManager Java.use(javax.net.ssl.X509TrustManager); X509TrustManager.checkServerTrusted.implementation function() { console.log([] 证书校验已绕过); return null; // 直接返回null表示信任所有证书 }; });上个月用这个方法测试某社交App5分钟就搞定了。但有个副作用——会同时禁用所有证书校验容易被App检测到异常。3.2 偷梁换柱替换TrustManager更隐蔽的做法是伪造一个合法的TrustManager。就像给假证件盖个真公章const myTrustManager Java.registerClass({ name: com.fake.TrustManager, implements: [X509TrustManager], methods: { checkServerTrusted: function() { /* 空实现 */ } } }); SSLContext.init.overload().implementation function() { this.init(null, [myTrustManager.$new()], null); };这个方案我在银行App上成功过关键是要找准SSLContext初始化的时机。建议加个延时hook等关键类加载后再介入。3.3 釜底抽薪拦截证书验证有些App会自己实现证书校验比如在native层验证。这时候需要定位到具体的验证方法const X509Certificate Java.use(java.security.cert.X509Certificate); X509Certificate.verify.implementation function() { console.log([] 跳过了证书签名验证); // 什么都不做就等于验证通过 };上周用这个方法破解了一个视频App的DRM保护。关键是要用jadx反编译找到证书验证的具体类名。3.4 高级玩法证书重绑定最完美的方案是只替换特定证书。就像只复制目标的门禁卡const myCert /* 读取你的CA证书 */; KeyStore.setCertificateEntry(fake, myCert); TrustManagerFactory.init.implementation function(ks) { this.init(myKeyStore); // 替换成自己的KeyStore };这个需要提前准备好中间人证书配合Burp或Charles使用效果更佳。我在某次渗透测试中用这招成功获取了OAuth令牌。4. 常见问题排查指南4.1 脚本注入失败如果Frida报Failed to load script八成是类名不对。先用下面命令列出所有类frida -U -f com.target.app --no-pause -l dump.js其中dump.js内容Java.enumerateLoadedClasses({ onMatch: function(name) { console.log(name); }, onComplete: function() {} });4.2 证书校验仍然生效遇到过最坑的情况是App用了OkHttp的CertificatePinner。这时候要hook它的check方法const CertificatePinner Java.use(okhttp3.CertificatePinner); CertificatePinner.check.overload().implementation function() { console.log([] 绕过OkHttp的Pinning校验); };4.3 应用闪退问题有些加固过的App会检测Frida。试试这些对抗措施重命名frida-server为systemd使用frida的隐蔽模式frida -U --attach-name目标进程 --no-pause -l script.js修改默认端口270425. 实战技巧与注意事项记得去年在某次授权测试中目标App居然检测了TrustManager的实现类数量。后来发现解决方案是保持原始TrustManager数量不变只替换内容// 保留原始TrustManager数组长度 const originalManagers tmf.getTrustManagers(); const fakeManagers Java.array(javax.net.ssl.TrustManager, [ myFakeManager, originalManagers[1] // 保留其他Manager ]);还有个坑是Android 7.0之后的网络安全配置。如果App在res/xml/network_security_config.xml中设置了需要同时修改这个文件const resParser Java.use(android.content.res.Resources); resParser.getXml.overload(int).implementation function(id) { if(id R.xml.network_security_config) { return /* 伪造的xml */; } return this.getXml(id); };最后提醒下法律风险所有技术都只能在授权测试中使用。我有次在技术交流会上演示这些方法第二天就收到律师函警告。现在接项目前都会让客户签书面授权协议。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2514303.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!