from–https://blog.csdn.net/jmh1996/article/details/106011155
前言
日常科研生活中有许多抓取安卓手机上特定应用的纯净数据包的需求。目前常见的做法是通过应用设置,关闭其他非目标应用的网络访问权限(包括访问WLAN和流量数据),只把目标应用的访问网络权限打开。这种方法具有一定的可行性,但是缺点在于无法去除关闭OS自己产生的流量,这还是会引入一些背景杂流。
本文提供的方法可以实现直接按进程/应用过滤数据包,可以捕获完全纯净的应用数据。
本方法的技术路线如下:
Android系统在用户安装好某个APP会,就会给这个APP分配一个设备内唯一的user id,这个user id的生存周期是从APP成功安装开始到APP被用户卸载结束。APP的包名和它的user id直接的映射关系可以在系统的/data/system/packages.xml文件得到,这个文件内容类似于如下,里面就有package name和userId的映射关系。
自Linux 2.6.14 开始,iptables的扩展就已经支持通过出站数据包的拥有者(进程的用户名或用户ID)来过滤数据包【1】,并将数据包打上相应的内核过滤标签。当然只有使用socket api产生的网络数据包才有所谓的拥有者。ICMP啥的是没有应用者一说的。
为了将应用的入站数据包捕获下来,可以通过iptables的connmark给流打上流标签。
使用iptables把带有流标签的INPUT和OUTPUT的数据包丢到NFLOG的消息池里面去,并指定消息池的标号。
使用tcpdump,从NFLOG的消息池中获取相应的数据包。特定NFLOG消息池的数据包会首先被内容丢到一个名为“NFLOG:标号”的虚拟网卡上,通过tcpdump –i 参数来指定从这个特定的虚拟网卡上抓包就可以获取所需数据包了。从“NFLOG:标号”抓取的数据包,链路层头是NFLOG的linux内核网络过滤器的日志头,它和创建的以太网头不同。网络层、传输层、应用层是正常的,没有被NFLOG改动。
系统要求
• libpcap 1.2.1 or newer (commit cc8520ff5294900d93509eaf843684c51af102a9)
• Linux Kernel with NFLOG (CONFIG_NETFILTER_XT_TARGET_NFLOG).
• Effective UID 0 (root) or the CAP_NET_ADMIN capability.(需要获取Android设备的root权限),不想root自己真机的,可以使用模拟器,比如雷电模拟器,这个速度快,而且系统自带root。
案例解说
捕获安卓自带的浏览器(com.android.browser)访问youtube的流量。
首先,获取安卓自带浏览器的用户ID:10012
使用adb获取带root的shell:
adb root
adb shell
编写iptables规则:
iptables -A OUTPUT -m owner --uid-owner 10012 -j CONNMARK --set-mark 10012
#把OUTPUT数据包里面,用户ID是10012的流打上10012的流标签
iptables -A INPUT -m connmark --mark 10012 -j NFLOG --nflog-group 10012
#把入站流中带有10012标签的数据包放到nflog消息池中,消息池的标号为10012
iptables -A OUTPUT -m connmark --mark 10012 -j NFLOG --nflog-group 10012
#把出站流中带有10012标签的数据包放到nflog消息池中,消息池的标号为10012
最后捕获数据包:
tcpdump -i nflog:10012 -w uid-10012.pcap
附件里面有两个pcap文件:browser-only.pcap是从nflog:10012抓取的,broswer-eth0.pcap是同一时刻从以太网卡抓取的。他们都是访问youtube.com时的流量。
- 捕获Spotify登录时的流量。
Spotify的包名:com.spotify.music,它的userID通过查看packages.xml文件可知是10157.adb root adb shell iptables -A OUTPUT -m owner --uid-owner 10157 -j CONNMARK --set-mark 10157 #把OUTPUT数据包里面,用户ID是10157的流打上10157的流标签 iptables -A INPUT -m connmark --mark 10157 -j NFLOG --nflog-group 10157 #把入站流中带有10012标签的数据包放到nflog消息池中,消息池的标号为10012 iptables -A OUTPUT -m connmark --mark 10157 -j NFLOG --nflog-group 10157 #把出站流中带有10157标签的数据包放到nflog消息池中,消息池的标号为10157 tcpdump -i nflog:10157 -w uid-10157.pcap
附件有两个pcap: uid-10157.pcap和uid-10157-eth0.pcap。可以对比着看。
资源链接
【1】iptables-extensions文档: http://ipset.netfilter.org/iptables-extensions.man.html
坑点
【1】如果tcpdump,频繁出现 No buffer space avaiable的错误,考虑:1)升级tcpdump,2)使用-w 把数据包直接写入文件。
【2】报错:
tcpdump: Can't listen on group group index: Operation not permitted
这是因为iptables的规则提交给netfilter内核模块需要时间!
解决方法:下完上面的三条iptables命令后,sleep几秒,再tcpdump抓nflog的包就可以了。