关于抓包的那些坑爹事

前几天高博交给我几个VPN样本让我抓一下包,其中有一个样本某个ip地址用Charles抓不到,关闭代理依然能正常使用,这个就像我很早之前测过一个某面新闻也是这样的情况————用代理软件抓包无法抓到某个ip或域名,开启或者关闭代理都不影响APP本身的刷新,因为APP没有加壳,直接拿来逆了逆源码看看到底是怎么回事

跟进AsyncHttpClient,实际上是调用了httpClient.getParams().setParameter(“http.route.default-proxy”, httpHost)

Google搜索AsyncHttpClient+抓包

类似的还有某mm商场客户端(v7.1.0)也采用了类似的方法导致抓不到包

关键的地方就在http.route.default-proxy这行了,如果没有设置ip端口则默认路由直连,不走wifi代理,这就是为什么我们用Charles抓不到包而且不用代理依然可以访问网络的原因了,解决方法也很简单,装一个ProxyDroid设置全局代理,将流量全部转发为wifi代理,这样我们就能愉快的抓包了,之前搞的那个某面新闻也是同样的道理。


iOS平台上也有类似的VPN工具,没错就是大名鼎鼎的Shadowrocket,区别网络库直连和SSL pinning的方法就是看挂代理之后APP是否能通信正常,如果APP正常通信却抓不到包,那肯定就是前者了

下面再来介绍另一个重头戏————SSL pinning
原理请Google关键词,简单来说就是APP通过预埋服务端证书来校验服务器证书和域名(单向校验,双向校验这里暂不讨论),这里我们拿一个之前外派的时候的APP,他使用了SSL pinning导致我们无法抓包登陆
Desktop Preview

查看logcat

APP是360加固的,脱壳后进行反编译

找到assets文件夹下的证书(一般都会放在这)

这里我们不使用JustTrustMe模块(这里不得不提JustTrustMe项目的released那个apk版本太老了,需要重新编译,因为原项目无法实时打印出hook到的函数,所以我修改了一下打印日志的位置放在了repo里 修改版)而使用神器frida,参考一篇很棒的外文文章 利用Frida绕过Certificate Pinning,绕过 Certificate Pinning都离不开对应用程序的SSLContext的相关操作,利用Frida脚本控制SSLContext能全面绕过Android上的certificate pinning
这里使用burp的证书,注意使用什么代理证书一定要统一,不能从burp导出的证书然后用Charles进行抓包测试

成功绕过了SSL pinning检查!
Desktop Preview

再来看另一个APP

利用frida进行绕过

未完待续…

参考
Android安全开发之安全使用HTTPS
小米安全中心——Frida.Android.Practice (ssl unpinning)
Android Security: SSL Pinning