移动安全-突破证书校验

前言

如果你是干web安全的,当你在测试目前大多数的手机APP应用程序时,你一定遇到过burpsuite无法抓到数据包的情况,开始你以为只是https的问题,但是当你使用了burpsuite伪证书也无法抓取到时,你心里除了有句“MMP……”外,你一定也在思考这其中的蹊跷。

为什么HTTPS的网站使用伪证书可以抓到,而在APP里面同样的方法就抓不到?答案是:APP启用了SSL Pinning(又叫“SSL证书绑定”)

HTTPS的原理你必然懂,在建立SSL通道的过程中,当客户端向服务端发送了连接请求后,服务器会发送自己的证书(包括公钥、证书有效期、服务器信息等)给客户端,如果客户端是普通的浏览器,比如IE浏览器,则:

  1. 使用内置的CA证书去校验服务器证书是否被信任,如果不被信任,则会弹出https的告警提示信息,由用户自己决定是否要继续;
  2. 同样,用户也可以主动地将服务器证书导入到浏览器的受信任区,下次打开时该服务器证书将会自动被信任。

为啥中间人可以劫持https流量,以及在浏览器上我们为什么可以使用burp伪造证书,正是因为上面的2点,即:

  1. 浏览器允许用户自行忽略证书告警,用户在无足够的信息安全意识时,可能会直接忽略刘浏览器的安全提示;
  2. 浏览器允许“导入证书到浏览器信任区“这个操作让浏览器信任burp伪造的证书。这种伪造证书的中间人攻击给HTTPS带来了很大的威胁。

SSLPinning

如果能够这样做,是不是就可以解决这种“中间人劫持+伪造证书”攻击的问题:

客户端在收到服务器的证书后,对该证书进行强校验,验证该证书是不是客户端承认的证书,如果不是,则直接断开连接。

浏览器其实已经这样做了,但是如“前面”所说,选择权交给了用户,且浏览器由于其开放性允许让用户自导入自己的证书到受信任区域。

但是在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是一个框架,它可以改变系统和应用程序的行为,而不接触任何APK。它支持很多模块,每个模块可以用来帮助实现不同的功能。
  2. JustTrustMe 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK中所有用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。
  3. 关于JustTrustMe绕过证书校验的源码分析,可阅读文章 xposed+justTrustme使用与分析

【环境准备】

  1. 准备一个有root权限的andorid手机;
  2. 下载Xposed的APK安装包,下载地址
  3. 下载JustTrustMe模块,下载地址,注意下载 JustTrustMe.apk版本。

【安装过程】

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的证书校验,成功抓包:
移动安全-突破证书校验