展望近几年,随着移动设备的快速崛起,我们正从互联网时代进入到移动互联网时代,很多厂商纷纷开发自身产品的移动客户端以响应移动设备崛起的热潮。伴随着时代的脚步,渗透测试工程师们也从主要的Web安全测试上延伸到移动安全测试领域中。本文以「APP抓不到数据包」的问题为核心进行探讨。 

基于移动应用渗透测试中的服务端测试,测试方法与Web渗透测试大体相同,相比较Web渗透测试,APP渗透测试常常伴随着两个主要的问题,影响着测试人员的测试。一是APP截取的数据报文处于加密状态,在无法解密的情况下无法对数据包进行安全测试,二是基于各类SSL的安全配置导致数据包无法抓取。第一个问题基于逆向工程,本文暂不提及。本文的主要内容是基于第二个问题的探讨。

APP的传输方式主要以HTTP和HTTPS传输 ,大部分的APP可通过Burpsuite(可替换任意抓包工具,Fidller,wireshark等)进行抓包,将Burpsuite的证书导入手机中。配置好相关的代理即可进行数据包的抓取。但是部分APP在配置好代理后,会出现无法连接网络的情况(如下图)。

基于「APP抓不到数据包」的几点思考-JE2Se ' Blog
抓不到数据包

在解决这一问题之前,首先了解下HTTP与HTTPS的相互关系。客户端与服务端进行网络通讯,由于客户端与服务端之间的通讯可能存在多层交换机,横跨了很多的网络节点,且HTTP的协议特点是所有的数据均为明文传输,可能导致通讯数据被网络中的「中间人」进行嗅探监听。所以衍生出了HTTPS传输,HTTPS就是在HTTP的基础上添加了SSL安全协议。客户端与服务端使用非对称加密方式进行数据包加密传输,此时的「中间人」截取的数据信息为使用非对称加密加密过的报文信息,在不知道私钥的情况下无法进行数据的破解。

理想情况下这种传输方式相对安全,但是如果中间人分别伪造客户端以及服务端,分别向双方发送公钥以及私钥建立非对称加密传输通讯,则这种加密方式也不安全(如下图)。

基于「APP抓不到数据包」的几点思考-JE2Se ' Blog
中间人

该问题原因在证书检验方面,没有对证书的进行一致性检验。针对这一现象衍生出了另外的几种加密方式,双向认证以及SSL pinning(证书绑定)。

首先了解一下什么是SSL Pinning,在开发时就将服务端证书相关信息打包到客户端里。在进行HTTPS校验时对比客户端与服务端的证书是否一致,相同则建立通讯,不同则认为存在中间人攻击的可能执行终止通讯的操作。

另外一种双向认证,客户端与服务端分别存放不同的证书,客户端在通讯时会校验服务端的证书的一致性,反之,服务端在建立通讯前也要验证客户端证书的一致性,验证皆无问题后才建立通讯。

基于「APP抓不到数据包」的几点思考-JE2Se ' Blog

双向认证和SSL  Pinning均可以防止中间人劫持。但是双向认证相比较SSL Pinning,双向认证在证书上花销比较高,且实现的效果也大体相同,所以市面上大部分的APP采用SSL Pinning来保障APP的通信安全。但是这两种方式都存在一个弊端,如果使用的证书超过有效期。证书失效会导致APP拒绝服务。

由于证书的强校验,本地的Burpsuite证书会不可信,Burpsuite则抓不到数据包。所以在传输层中将无法进行通讯流量的劫持。关于SSL Pinning的反制,主要有两种办法,第一种是反编译APP文件,篡改内部证书信息。涉及到逆向,调试,重签名等技术,如果客户端存在壳保护、混淆、完整性自校验等防护则无法进行替换。第二种这是利用了Hook技术。Hook就是一个函数钩子,把程序原本要调用的函数改成另一个函数,就是对原函数的一个挂钩(hook) 。比如,如果出现证书校验错误,则会停止加载页面并结束通讯,只需要Hook 证书校验失败的处理方法,让其继续加载页面并保持通讯即可。具体的SSL Pinning的反制,主要以Xposed框架和Frida框架进行Hook关键函数,从而进行数据包的截取。

Xposed框架首先需要Root权限。安卓可以使用Xposed框架的JustTrustme或者SSLUnpinning 模块。针对常见的第三方库进行Hook,使校验证书的函数直接返回True。具体的使用方法:手机安装Xposed框架(建议使用模拟器,防止变砖),下载对应模块,重启后可继续按照常规的方法流程继续进行数据包的抓取。

相比较Xposed框架,Frida框架不需要Root的权限,首先在电脑上安装Frida,并在客户端安装Frida-server,我们可以直接将Frida注入到目标APK之中。Frida工具中包含了一个能够让应用程序在运行时加载Frida的动态库,并允许我们对目标应用程序的代码和指令进行动态修改。

Xposed框架适用于安卓,Frida适用于安卓以及iOS。针对iOS的SSL Pinning还有一种方法,使用ssl-kill-switch2进行反制,需要手机越狱, 在 Cydia 中添加以下插件Debian Packager、Cydia Substrate、PreferenceLoader,并下载安装ssl-kill-switch2 ,即可进行抓包。ssl-kill-switch2在Secure Transport API中修补特定的低级别SSL功能,以覆盖并禁用系统的默认证书验证以及任何类型的自定义证书验证,以绕过SSL Pinning。

基于「APP抓不到数据包」的几点思考-JE2Se ' Blog
抓到包了

最后补充几个APP其他出现几率较小抓不到包的可能性,某些APP使用了自定义的库进行证书校验,导致无法匹配通用的Hook函数,导致抓包失败,可通过反编译查看源码重新编写Hook脚本抓包。另外一种因为安卓7.0系统之后,系统不再信任用户导入的证书,并且自己项目里面的自签名证书也会不受信任。这样就导致抓包软件可能抓不到HTTPS的请求,且如果你的证书不是CA的证书,是自签名的证书,将无法请求服务器。解决方法是使用低版本安卓系统进行客户端测试。