如果你是干web安全的,当你在测试目前大多数的手机APP应用程序时,你一定遇到过burpsuite无法抓到数据包的情况,开始你以为只是https的问题,但是当你使用了burpsuite伪证书也无法抓取到时,你心里除了有句“MMP……”外,你一定也在思考这其中的蹊跷。
为什么HTTPS的网站使用伪证书可以抓到,而在APP里面同样的方法就抓不到?答案是: APP启用了SSL Pinning(又叫“SSL证书绑定”) 。
HTTPS的原理你必然懂,在建立SSL通道的过程中,当客户端向服务端发送了连接请求后,服务器会发送自己的证书(包括公钥、证书有效期、服务器信息等)给客户端,如果客户端是普通的浏览器,比如IE浏览器,则:
为啥中间人可以劫持https流量,以及在浏览器上我们为什么可以使用burp伪造证书,正是因为上面的2点,即:
如果能够这样做,是不是就可以解决这种“中间人劫持+伪造证书”攻击的问题:
客户端在收到服务器的证书后,对该证书进行强校验,验证该证书是不是客户端承认的证书,如果不是,则直接断开连接。
浏览器其实已经这样做了,但是如“前面”所说,选择权交给了用户,且浏览器由于其开放性允许让用户自导入自己的证书到受信任区域。
但是在APP里面就不一样,APP是HTTPS的服务提供方自己开发的客户端,开发者可以先将自己服务器的证书打包内置到自己的APP中,或者将证书签名内置到APP中,当客户端在请求服务器建立连接期间收到服务器证书后,先使用内置的证书信息校验一下服务器证书是否合法,如果不合法,直接断开。
当然攻击者也可以通过把这个APP源码给逆出来,然后找到证书校验这段逻辑,给他干掉,或者干脆把证书信息换成自己的服务器证书信息,然后重新打包签名,但是一旦APP做了代码加密和混淆,这个操作也会变得比较难搞。
因此这样看来, 通过预先把服务器的证书信息“绑定“在APP的native端,然后建立连接时使用预先内置的绑定信息进行服务器证书校验,同时使用足够的代码加密或混淆,是比较合适的解决办法,这个搞法就是“SSL Pinning”.
【注意】 不要将SSL Pinning和 HTTPS 双向认证 搞混了,HTTPS协议本身是支持双向认证的,既除了客户端对服务器证书进行验证外,服务器也可以要求客户端提供自己的证书信息并对其进行验证,在APP上,HTTPS双向认真的方案也可以防止中间人劫持,但这种双向认证开销较大,且安全性与SSL Pinning一致,因此目前大多数APP都采用SSL Pinning这种方案。
如何突破APP客户端的证书校验?
如果你逆向比较在行,你就自己逆源码,然后过加密混淆,然后干掉SSL pinning。不过使用 Xposed + JustTruestMe 应该也不丢人。
【环境准备】
【安装过程】
1、选择下载好的Xposed installer的apk包,即可开始安装,安装完成后,打开xposed应用,他会提示“xposed框架未安装”,就如他提示所言,这里安装需要重启: 2、点击“确定”,开始安装。 3、点击“install”,他会自动下载安装,下载速度根据网速而定。 4、当你看到这个的时候,就是安装好了,接着就是重启手机了。 5、接下来就是安装可以禁止证书验证的模块,安好后就可以愉快的进行抓包了,把前面所述的JustTrustMe.apk 下载之后,直接安装就行了。这个JustTrustme是没有界面的,但手机会提示xposed模块没有激活; 6、打开Xposed中的模块,就可以找到安装好的JustTrustme,只需勾选上,然后重启手机就行 。 7、接下来就可以直接使用Burpsuite正常抓包了,JustTrustMe会将APP中所有进行证书验证的方法都Hook,绕过所有证书验证,从而达到可以正常抓包的效果。
【注意】实际上,还需要在Xposed框架中同时安装上 SSLkiller 模块( 下载地址 ),才能确保成功突破SSLPinning。
【测试案例】
1、对某行手机APP进行测试,未进行证书校验且未加密的版本,可直接用BP抓包: 2、使用Xposed框架突破进行了客户端证书校验的加密版本的APP的证书校验,成功抓包:
有些APP在你设置完 BurpSuite 代理后无法正常抓包但是却可以正常通信……你会很诧异这是什么情况,数据流量跑哪里去了……设置完代理后还可以正常通信,说明不是证书单向认证也不是双向认证的问题。实际上这是因为APP采用了默认禁用系统代理的网络请求框架。
以下是移动 APP 流行的网络请求框架,虽然图中的有些框架已经缺乏维护了,甚至被 Android官方废弃了,比如 httpclient,但是在测试中依然遇到还有不少 APP 使用的情况,相对而言,遇到最多的还是 okhttp,这里不做讨论。
默认情况下AsyncHttpClient、cz.msebera.android.httpclient禁用系统代理,造成无法抓包,但同时,针对其他框架,我们也可以对代码进行处理,关闭系统代理或者开启代理,指定代理。
以 HttpURLConnection 为例,通过参数 Proxy.NO_PROXY 即可禁用系统代理。 以AsyncHttpClient为例,通过设置可走自定义的代理。 其他的网络框架开启或关闭设置那就需要读者你自己去 google 了,现在知道了产生的原因的,那抓包的思路就有了吧。
Proxy.NO_PROXY
如果你的逆向分析能力不行,又想解决以上禁用系统代理的网络请求框架下 APP 的抓包问题,那么 VPN 抓包APP—— Packet Capture 将是一个不二之选。
Packet Capture
Packet Capture 一款依托安卓系统自身 VPN 来达到免 Root 抓取数据包的应用程序。它是一个强大的调试应用,可以捕获 Android 手机上的任何网络流量,它利用 Android 系统的 VPN service 完成网络请求的捕获,无需root,并可以通过中间人技术解密抓取到的 https 请求。
Packet Capture 的下载安装此处不演示,可参考博文: Packet Capture(Android APP端抓包工具) 。注意安装过程会要求安装证书,用于SSL解密。
1、成功安装后主界面如下: 2、先来看看捕获全部app流量的:
3、点击查看QQ浏览器一个具体的数据包详情(为拜登图像的请求包):
4、复制请求包到 pc 的 BurpSuite 中 Repeater 模块,点击 Send 会要求设置服务器域名、端口、协议,设置完成可直接发送成功: 可在响应包中选择 Render 查看图片预览: 至此,我们如果遇到无法抓包的app便有了另一种捕获数据包并进行重放测试的方法。