Android抓包工具
- Fiddler
- Burpsuite
- Charls
- HttpCanary
- Packet Capture
- Tcpdump
- Wireshark
抓包原理
从上面这个原理图,可以看出抓包的核心问题主要是两个:
- MITM Server如何伪装成真正的Server;
- MITM Client如何伪装成真正的Client。
第一个问题,MITM Server要成为真正的Server,必须能够给指定域名签发公钥证书,且公钥证书能够通过系统的安全校验。
比如Client发送了一条https://www.baidu.com/的网络请求,MITM Server要伪装成百度的Server,必须持有www.baidu.com域名的公钥证书并发给Client,同时还要有与公钥相匹配的私钥。MITM Server的处理方式是从第一个SSL/TLS握手包Client Hello中提取出域名www.baidu.com,利用应用内置的CA证书创建www.baidu.com域名的公钥证书和私钥。创建的公钥证书在SSL/TLS握手的过程中发给Client,Client收到公钥证书后会由系统会对此证书进行校验,判断是否是百度公司持有的证书,但很明显这个证书是抓包工具伪造的。
为了能够让系统校验公钥证书时认为证书是真实有效的,我们需要将抓包应用内置的CA证书手动安装到系统中,作为真正的证书发行商(CA),即洗白。这就是为什么HTTPS抓包一定要先安装CA证书。
第二个问题,MITM Client伪装成Client。大部分服务器Server并不会校验客户端client证书,此为单向认证。当然存在部分应用使用双向认证,即Server也校验Client的证书。因此需要伪装成Client则需要Client内置的证书以及对应的密钥,而这两部分存在于Client端,因此可以提取并进行伪造。
抓包协议及其抓包解决方案
HTTP
最简单的一种,直接上抓包工具进行抓包就可以了。不需要任何额外配置。
HTTPS
-
单向认证
校验方式-
客户端没有进行校验(形同虚设)
虽然没有客户端没有进行校验,但是由于整个认证校验流程需要走完,因此也是需要有绕过方法。 -
证书锁定(Certificate Pinning)
需要在客户端代码内置仅接受指定域名的证书,而不接受操作系统或浏览器内置的CA根证书对应的任何证书,通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此客户端与服务端(例如API网关)之间的通信是可以保证绝对安全。但是CA签发证书都存在有效期问题,缺点是在 证书续期后需要将证书重新内置到APP中。 -
公钥锁定( Public Key Pinning)
提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。制作证书密钥时,公钥在证书的续期前后都可以保持不变(即密钥对不变),所以可以避免证书有效期问题,一般推荐这种做法。
解决方法
-
针对1的解决方法
-
Android 7.0 以上 且 targetSdkVersion >= 24
- AndroidManifest中配置networkSecurityConfig.[2]
- 平行空间/Virtual
-
-