移动安全-APP证书校验与抓包

APP单向认证

如果你是干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的证书校验,成功抓包:
在这里插入图片描述

VPN流量抓取

有些APP在你设置完 BurpSuite 代理后无法正常抓包但是却可以正常通信……你会很诧异这是什么情况,数据流量跑哪里去了……设置完代理后还可以正常通信,说明不是证书单向认证也不是双向认证的问题。实际上这是因为APP采用了默认禁用系统代理的网络请求框架。

网络请求框架

以下是移动 APP 流行的网络请求框架,虽然图中的有些框架已经缺乏维护了,甚至被 Android官方废弃了,比如 httpclient,但是在测试中依然遇到还有不少 APP 使用的情况,相对而言,遇到最多的还是 okhttp,这里不做讨论。
在这里插入图片描述

默认情况下AsyncHttpClient、cz.msebera.android.httpclient禁用系统代理,造成无法抓包,但同时,针对其他框架,我们也可以对代码进行处理,关闭系统代理或者开启代理,指定代理。

以 HttpURLConnection 为例,通过参数 Proxy.NO_PROXY 即可禁用系统代理。
在这里插入图片描述
以AsyncHttpClient为例,通过设置可走自定义的代理。
在这里插入图片描述
其他的网络框架开启或关闭设置那就需要读者你自己去 google 了,现在知道了产生的原因的,那抓包的思路就有了吧。

Packet Capture

如果你的逆向分析能力不行,又想解决以上禁用系统代理的网络请求框架下 APP 的抓包问题,那么 VPN 抓包APP——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便有了另一种捕获数据包并进行重放测试的方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tr0e

分享不易,望多鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值