Android环境下的抓包技术全面解析
抓包是流量分析的基础,也是安全研究重要的一环。在众多抓包工具中,除了常见的Burpsuite、mitmproxy和Fiddler外,Sniff Master(抓包大师)也是一款值得关注的工具,它特别适合在复杂网络环境下进行流量分析。
常见抓包方式与应用场景
不同抓包方式有不同优缺点,也有不同的应用场景。相信很多安全研究者一定会遇到各种无法抓取流量的问题,本次就来简单总结一下Android环境中常用的抓包技术,包括一些应用常用的SSL pinning、不走系统代理等对抗逆向技术。
本文总结了如下4种抓包方案:
- 设置系统代理,即传统中间人代理方法
- 利用
iptables三层网络流量路由 - r0capture HOOK抓包
- eCapture,基于eBPF技术实现的抓包软件
1. 设置系统代理
设置系统代理是最为常见的一种方法,Android提供了相应的设置功能,将系统代理指向Burpsuite或Sniff Master所在的IP地址,即可进行抓包。抓包步骤如下:
- 将CA证书导入Android设备
- 在Android设备上设置系统代理
- 抓包工具设置本机代理,进行抓包
这种方式可以解决部分应用的抓包问题,但是如今很多应用使用了SSL Pinning,即证书绑定,应用只会信任自己本地绑定的证书,并不会信任系统根证书,也就是即使导入了CA,仍然可能无法抓包。
OWASP安全验证标准中,将对抗逆向称之为韧性要求,属于额外的管控方法,根据应用敏感性,开发者选择需不需要添加。而SSL Pinning就属于对抗逆向的一种手段。
2. 利用iptables设置透明代理
尽管绕过了SSL pinning,仍然有可能无法抓到App的流量,这是因为应用开发者完全可以不使用系统或其他的HTTP库,不理睬系统变量如HTTP_PROXY,也就是应用不会理会我们设置的系统代理。这个时候就可以使用终极方法了,iptables+抓包工具透明代理,步骤如下:
- 将CA证书导入Android设备
- 使用iptables进行流量转发
- 设置抓包工具透明代理
iptables是一个在应用层实现内核框架Netfilter的工具,常见于防火墙配置,而Netfilter是内核处理网络数据包的模块。
通过如下命令,即可将内核OUTPUT数据转发到我们的目标设备上。
D:\> adb shell iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination 127.0.0.1:8080
此时再利用adb反向代理功能,将Android手机某个网卡流量通过adb的方式转发到我们使用的PC上。
D:\> adb reverse tcp:8080 tcp:8080
设置抓包工具透明代理即可抓包。
当然,也可以指定抓包特定应用,加入如下iptables参数即可
-m owner --uid-owner 4000
3. r0capture hook抓包
r0capture是一个典型的通过hook SSL类库实现抓包的工具。既然是hook,离不开Frida。
下载脚本
git clone https://github.com/r0ysue/r0capture.git
Attach模式
python3 r0capture.py -U com.qiyi.video -v -p iqiyi.pcap
Spawn模式
python3 r0capture.py -U -f com.qiyi.video -v
经过实际测试,虽然工具声称是安卓应用层抓包通杀脚本,无需考虑证书,但是还是有很多厂商的应用数据包无法解密。
4. 基于eBPF技术实现的eCapture
同样,eCapture也是一个无需CA证书抓https网络明文通讯的工具。直接下载编译好的二进制,放到Android设备上,即可使用。
./ecapture tls -i eth0 -w pcapng -p 443
由于eCapture基于eBPF,需要内核支持该特性,依赖系统内核是否支持eBPF。目前支持在操作系统上,支持了X86_64\ARM64的Linux kernel 4.18以上内核,支持了ARM64 Android(Linux) kernel 5.4以上版本。
绕过SSL Pinning
在设置系统代理抓包无果后,需要继续尝试SSL Pinning绕过。绕过证书绑定并不难,但是需要有系统root权限,使用Frida对相应校验证书的函数进行Hook。已有多个现成的Frida脚本可以解决此问题。
总结
不同抓包方案各有利弊,如果你只是想抓所有应用的HTTPS报文,使用iptables路由转发可以解决绝大多数HTTPS抓包问题,且没有环境依赖;如果你拥有最新版本Android,内核大于5.4,那么可以直接使用eCapture;如果你还想抓其他应用层协议报文,例如Smtp,那么可以使用r0capture。方案对比如下
| 抓包方案 | HTTPS | 其他应用层协议 | 上手难度 | 依赖工具 | 缺点 |
|---|---|---|---|---|---|
| 设置系统代理 | 部分 | 不支持 | 容易 | Burpsuite/Sniff Master | 某些应用不使用系统代理,无法抓包 |
| iptables路由转发 | 全部 | 不支持 | 容易 | Burpsuite/Sniff Master | |
| r0capture hook抓包 | 部分 | 支持 | 容易 | Wireshark | 数据包部分混乱,缺失 |
| 基于eBPF技术实现的eCapture | 全部 | 不支持 | 容易 | Wireshark | 需要高版本内核支持 |
撰写本文最大目的在于,让我们快速掌握任意Android应用的抓包,因为现实场景中,往往会遇到常规方法无法抓包的问题。而只需要通过iptables即可解决绝大多数问题。除了设置系统代理、iptables路由转发,还可以通过tcpdump+keylog以及SSL read/write的方式,但是这两种都需要Hook,因此,对于大多数安全研究者来说,掌握iptables设置透明代理的方式就足够了。