前言:网络课需要完成一个抓包的实验,了解到Fiddler可以抓取HTTP和HTTPS协议(或者Charles),Wireshark可以抓取TCP/DNS等协议,除此之外还用到了Kali进行ARP欺骗,对电脑端、iOS端(利用rvictl工具)或安卓端(利用tcpdump工具)进行抓包。下面是遇到的问题和一些总结。

抓包前,需要先了解下OSI与TCP/IP模型

1. 工具介绍

1.1 Fiddler

该软件可以实现对PC端或手机端中HTTP/HTTPS的流量抓取,需要进行一定配置

Fiddler配置参考:

https://blog.csdn.net/weixin_40608713/article/details/114873070

然后在iPhone上访问网页,Fiddler软件就可以抓取到HTTP/HTTPS流量了。

如果获取到的Web视图有乱码,需要win+r,输入regedit进入注册表,然后访问:HKEY_CURRENT_USER\Software\Microsoft\Fiddler2,在这里添加字符串值,键名为HeaderEncoding 键值为GBK

最后,配置规则以显示对应的服务器IP地址。

Fiddler中显示Server IP方法参考:

https://blog.csdn.net/qq_41571369/article/details/125433001

1.2 Charles

功能和Fiddler很接近,区别在于Charles还支持SOCKS5代理和监听Socket(目前只用到了这两个区别)。

推荐Mac电脑使用,因为破解版比较好找。

Charles注册码生成:

https://www.zzzmode.com/mytools/charles/

Registered Name: 515code.com
License Key: bb653130968de40237

Charles抓包参考:

https://www.51cto.com/article/593915.html

如果需要只抓取手机包,把电脑的请求过滤掉,可以取消勾选 Proxy -> macOS proxy

使用代理方式抓包不意味着所有APP应用的包都能抓到,以Android系统为例,Android 7.0之后,Google推出更加严格的安全机制,应用默认不信任用户证书(手机里自己安装的证书),自己的APP可以通过配置解决,但是抓其它APP的请求就行不通了。因此会出现无法进入官方应用商店等情况(iOS同理)。解决方法详见第4节。

1.3 Wireshark

相比前两个只能抓应用层协议的抓包工具,Wireshark支持抓TCP/UDP等更底层的协议。

对电脑端抓包也很简单,安装好后选择对应的网卡接口就能看到流量包。

先开启IP地址解析成对应域名,在Wireshark的首选项中找到Name Resolution,勾选Resolve network(IP) addresses,或者根据需求勾选其他转换选项。

接下来使用过滤器即可筛选出想要的数据包,下面是一些规则例子。

指定TCP协议,IP收/发地址为105.75.58.18,端口7000且包长度大于0

tcp and ip.addr==105.75.58.18 and tcp.port==7000 and tcp.len > 0

查找DNS解析包含baidu的域名

dns.qry.name contains baidu

1.4 Kali(ARP欺骗)

在Apple Silicon的Mac上推荐使用VMware虚拟机,因为Parallels对Linux的支持并不是很好

VMware for M1下载链接

https://customerconnect.vmware.com/cn/downloads/get-download?downloadGroup=FUS-PUBTP-22H2

下载Apple Silicon版本的Kali镜像,然后使用PD虚拟机安装。

安装Kali教程参考

https://blog.csdn.net/Bluffing/article/details/114821845

在Kali上安装Parallels Tools(实测安装不上,不建议使用PD)

安装Parallels Tools参考

https://www.jianshu.com/p/2c06e37dc07b

建议安装GNOME桌面:

1
sudo apt -y install kali-desktop-gnome

安装arpspoof:

1
sudo apt-get install -y dsniff ssldump

使用arpspoof进行欺骗:

1
sudo arpspoof -i eth0 -t 172.16.60.230 -r 172.16.255.254

流量转发:

1
echo 1 > /proc/sys/net/ipv4/ip_forward

经过实测,以Windows10为攻击的目标机器,能够抓取到大部分TCP/TLS/DNS等流量,但是不知道为什么很多网站加载很慢,图片几乎无法加载,不清楚是不是流量转发的问题。

下面这张图片是抓到了PING百度和网易云的部分流量。

ARP欺骗抓包测试

下面两步是在网络上找的方法,实测只能抓到虚拟机自己的,无法抓到攻击目标。

图片监听(对HTTPS可能无效):

1
sudo driftnet -i eth0

访问网站监听:

1
sudo urlsnarf -i eth0

1.5 Nmap

使用Nmap可以扫描局域网中的主机,例如:

1
2
nmap -sP -PI -PT 172.16.57.0/24
# 或者在kail中使用 fping -g 172.16.57.0/24

扫描完后可以通过arp查看缓存表

如果需要清空,在Mac上执行下列命令

1
sudo arp -ad

2. iOS端抓包

相比电脑端,抓取手机端流量难度会比较大。

第一种方案:使用Charles + Wireshark

这个方案会出现一个问题:当我们打开一个游戏的时候(例如原神),Wireshark抓取电脑端的原神有大量的UDP包,但对iOS端的原神几乎抓不到UDP包。即使在小火箭打开了UDP转发,Charles开启SOCKS代理,但是不知道是Charles的问题还是UDP转发端口没开放的问题,依然无法捕捉UDP流量。

  1. 要求:电脑和手机要连在同一个局域网下,并且能相互PING通

  2. 使用Fiddler打开HTTP代理,在手机端的WIFI设置代理(HTTP代理);或者用Charles打开SOCKS5代理,在手机端要使用支持的代理软件(例如小火箭)

  3. 给手机安装HTTPS证书(最后要在 关于本机-证书信任列表 勾选)

  4. 手机上访问HTTPS页面,软件中可以看到相应的流量,并且能解密内容

第二种方案:使用rvictl进行真机抓包(可抓UDP)

iOS 5后,Apple引入了RVI remote virtual interface的特性,它只需要将iOS设备使用USB数据线连接到Mac上,然后使用rvictl工具以iOS设备的UDID为参数在Mac中建立一个虚拟网络接口rvi,就可以在Mac设备上使用tcpdump/Wireshark等工具对创建的接口进行抓包分析。

  1. 要求:需要有MacBook,iPhone通过USB线连接到电脑上,开启流量或WIFI

  2. 打开Xcode,在菜单栏找到Window,然后选择Devices and Simulators,可以看到iPhone对应的UDID(Identifier)

  3. 在终端执行下列命令,即可创建虚拟网卡(-s后面的参数为iPhone的UDID)

    1
    2
    rvictl -s 00008110-0021191E3A62401E
    # Starting device 00008110-0021191E3A62401E [SUCCEEDED] with interface rvi0
  4. 打开Wireshark,多次执行即可多开

    1
    sudo /Applications/Wireshark.app/Contents/MacOS/Wireshark
  5. 选择rvi0接口,即可监听流量

  6. 移除虚拟网卡

    1
    rvictl -x 00008110-0021191E3A62401E

3. 安卓tcpdump抓包

电脑系统为macOS,首先安装adb工具:

1
brew install android-platform-tools --cask

常用的一些adb命令:

1
2
3
4
5
6
adb devices  # 查看连接计算机的设备
adb get-serialno # 获取序列号
adb reboot # 重启机器
adb shell cat /proc/cpuinfo # 获取CPU信息
adb shell service list # 后台服务信息
# 更多参考:https://www.ngui.cc/el/1821472.html

下载tcpdump:http://www.androidtcpdump.com/android-tcpdump/downloads

然后复制到手机上:

1
adb push tcpdump /storage/sdcard0/tcpdump

安装到系统目录

1
2
3
adb shell
su
cp /storage/sdcard0/tcpdump /system/bin/tcpdump

这里会出现一个问题,由于系统分区默认只读,我们需要把文件系统改为可读可写。

以华为P20为例,需要下载 https://github.com/evdenis/adb_root/issues/11 中的adb_root.zip文件,通过Magisk安装并重启,随后在电脑上执行下列命令:

1
2
adb remount  # remount succeeded
mount -o rw,remount /system # 由于EROFS,此命令在使用外部终端(Termux等)的emui9.1上不起作用,只能使用下面的备用方案

备用方案:由于/system无法修改权限,换其他文件夹执行

1
2
3
4
5
6
7
cp /storage/sdcard0/tcpdump /data/tcpdump
chmod 777 /data/
cd /data
chmod 777 tcpdump
./tcpdump -i any -p -vv -s 0 -w capture.pcap # 开始抓包

adb pull /data/capture.pcap /Users/zhangzhaoming/Downloads # 导出到电脑用Wireshark分析

以上方案没办法破解HTTPS内容,解决方法详见下一部分。

4. 安卓中安装系统证书

注意:以下方法是建立在安卓设备已 ROOT 的情况下。

有些APP程序在运行时,一旦设置了Charles代理,一些接口就无法访问,主要是在SSL握手时停留在了域名握手后,连接建立,但无法正常通信。

以Android系统为例,其将证书分为两个存储区:系统用户。在7.0之后,系统安全性有很大的提升,其中一项就是针对APP开发者提供了网络安全配置选项(networkSecurityConfig),可以选择只信任系统证书,也可以选择连系统的都不信任,只信任自己的。但证书是有失效期的,只使用自己的证书代价是一定要在失效前打包新的证书并确保全量更新,否则未更新用户将无法使用。因此这种用法不是很常见。

Charles的证书是安装在用户这个存储区的。因此遇到配置了networkSecurityConfig的APP就无法成功抓包。

又由于 EROFS 文件特性,我使用的这台P20(EMUI 9.1)无法直接编辑 /system 分区中的文件,所以利用文件管理器将用户存储区的证书移动到系统存储区这种方案就不可行了。

解决方案:利用Magisk的movecert模块去移动证书,参考:https://www.52pojie.cn/thread-1665234-1-1.html

Magisk模块

然后就可以使用Charles代理监听HTTPS了。上面方法解决了安卓中的证书问题(也有可能无法解决,华为P20还是出现部分抓包unknown的情况),在iOS中同样会存在这种问题,由于我使用的iPhone13目前无法越狱,因此暂时没办法解决类似的证书问题。

5. 使用macOS监听数据链路层

在Wireshark中可以抓取链路层的802.11协议,下面做一些总结。

首先,网卡要开启监听模式。对于macOS来说,先按住Option键,然后打开无线诊断,菜单栏选择窗口->嗅探器,选择频道与频宽,开始监听(结束后会自动生成pcapng文件到 /var/tmp/ 目录下)。

除此之外,在无线诊断菜单中选择扫描,即可捕捉到WIFI的详细信息,包括物理地址、波段、频道和频宽等。

或在终端探测WIFI信号强度与频道:

1
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s

6. 案例:对微信进行抓包?

适用场景:有些链接只能用微信客户端打开,微信登录并进行相应授权后才能进入到页面。因此用电脑游览器打开是进入不了的,这样就看不到HTML源码。这个时候就体现出用Fiddler抓包的好处了。

下面是使用iPhone通过微信访问某个链接,使用Fiddler抓取到的内容,可以看到HTTPS已经被解密。

Fiddler界面

重点来了,上面方法仅限于抓取并解密 HTTPS ,像我们平时与其他人聊天的内容,这些抓包工具完全捕捉不到。这是因为微信开发团队用了特定的协议(例如 mmtls 协议),我们无法简单破解里面的内容,就算抓到这些流量也只能看到一堆乱码。

但是,人在的地方就有江湖。也有不少高级骇客通过逆向、hook等方式,去破解微信的协议,然后在此基础上开发了相关API接口。有了这个API接口,我们可以用编程语言来操作微信,实现自动发朋友圈、点赞、加群、发消息等功能,还能获取到微信不想让我们看到的字段(例如微信支付中,要用到的小程序session_id)。

我们在搜索引擎或一些二手平台上搜索「wx协议」「小程序协议」等关键字就可以看到,很多人在出售技术支持和源码,这背后涉及不少灰产业务(例如微信小程序代抢票、疫苗,公众号水军点赞等)。

下图为某网站上展示的微信协议源码价格(灰产地带,谨慎触碰):

某网站微信协议源码价格

除此之外,还有部分APP采用 SSL Pinning 或其他协议(例如 SPDY)导致无法正常抓包。

7. 总结

结合Fiddler中的HTTP/HTTPS流量对应的Server IP,可以在Wireshark中找到对应的部分封包(如果要抓取手机流量,需要用Fiddler/Charles代理,要注意在Wireshark中ip.src对应电脑的IP,因为电脑代理手机发送请求给外部服务器),这两个软件一起使用效果最佳。

除此之外,还解决了iOS设备代理后无法捕捉UDP包的问题,对于安卓系统也有其他的解决方案(tcpdump,需要手机ROOT权限)。

关于EROFS文件系统,感兴趣的可以看下:https://www.usenix.org/conference/atc19/presentation/gao

分享我的一点感受:现在的安卓在逐渐走向闭源和去多样化,安卓13已经原生支持华为的EROFS了,然后配合各种安全性限制(很多厂商对内核进行了修改),ROOT将会越来越难(即使成功了也可能是不完全ROOT,用户无法直接对 /system 分区做修改),用户对设备只有使用权而没有所有权。