MASTG-TECH-0010: 基本网络监控/嗅探
使用 tcpdump、netcat (nc) 和 Wireshark可以实时远程嗅探所有 Android 流量。首先,请确保您的手机上安装了最新版本的 Android tcpdump。以下是安装步骤
adb root
adb remount
adb push /wherever/you/put/tcpdump /system/xbin/tcpdump
如果执行 adb root
返回错误 adbd cannot run as root in production builds
,请按如下方式安装 tcpdump
adb push /wherever/you/put/tcpdump /data/local/tmp/tcpdump
adb shell
su
mount -o rw,remount /system;
cp /data/local/tmp/tcpdump /system/xbin/
cd /system/xbin
chmod 755 tcpdump
在某些生产版本中,您可能会遇到错误 mount: '/system' not in /proc/mounts
。
在这种情况下,您可以将上述行 $ mount -o rw,remount /system;
替换为 $ mount -o rw,remount /
,如此 Stack Overflow 帖子中所述。
请记住:要使用 tcpdump,您需要在手机上拥有 root 权限!
执行一次 tcpdump
以查看它是否有效。当收到几个数据包后,您可以按 CTRL+c 停止 tcpdump。
$ tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:54:06.590751 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply
04:54:09.659658 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply
04:54:10.579795 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
要远程嗅探 Android 手机的网络流量,首先执行 tcpdump
并将其输出通过管道传输到 netcat
(nc)
tcpdump -i wlan0 -s0 -w - | nc -l -p 11111
上面的 tcpdump 命令包括
- 监听 wlan0 接口,
- 定义捕获的大小(快照长度),以字节为单位,以获取所有内容 (-s0),以及
- 写入文件 (-w)。我们传递
-
而不是文件名,这将使 tcpdump 写入 stdout。
通过使用管道 (|
),我们将 tcpdump 的所有输出发送到 netcat,后者在端口 11111 上打开一个侦听器。您通常需要监视 wlan0 接口。如果需要其他接口,请使用命令 $ ip addr
列出可用选项。
要访问端口 11111,您需要通过 adb 将端口转发到您的主机。
adb forward tcp:11111 tcp:11111
以下命令通过 netcat 连接到转发的端口并通过管道传输到 Wireshark。
nc localhost 11111 | wireshark -k -S -i -
Wireshark 应立即启动 (-k)。它通过 netcat 从 stdin (-i -) 获取所有数据,netcat 连接到转发的端口。您应该看到来自 wlan0 接口的所有手机流量。
您可以使用 Wireshark 以人类可读的格式显示捕获的流量。弄清楚使用了哪些协议以及它们是否未加密。捕获所有流量(TCP 和 UDP)非常重要,因此您应该执行测试应用程序的所有功能并对其进行分析。
这个巧妙的小技巧现在允许您识别使用了哪些类型的协议以及应用程序正在与哪些端点通信。现在的问题是,如果 Burp 无法显示流量,我该如何测试端点?对此没有简单的答案,但有一些 Burp 插件可以帮助您入门。
Firebase/Google Cloud Messaging (FCM/GCM)¶
Firebase Cloud Messaging (FCM) 是 Google Cloud Messaging (GCM) 的继任者,是 Google 提供的一项免费服务,允许您在应用程序服务器和客户端应用程序之间发送消息。服务器和客户端应用程序通过 FCM/GCM 连接服务器进行通信,该服务器处理下游和上游消息。
下游消息(推送通知)从应用程序服务器发送到客户端应用程序;上游消息从客户端应用程序发送到服务器。
FCM 适用于 Android、iOS 和 Chrome。 FCM 目前提供两种连接服务器协议:HTTP 和 XMPP。如 官方文档中所述,这些协议的实现方式不同。以下示例演示了如何拦截这两种协议。
测试环境准备¶
您需要在手机上配置 iptables 或使用 bettercap 才能拦截流量。
FCM 可以使用 XMPP 或 HTTP 与 Google 后端通信。
HTTP¶
FCM 使用端口 5228、5229 和 5230 进行 HTTP 通信。通常,仅使用端口 5228。
- 为 FCM 使用的端口配置本地端口转发。以下示例适用于 macOS
$ echo "
rdr pass inet proto tcp from any to any port 5228-> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 5229 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 5230 -> 127.0.0.1 port 8080
" | sudo pfctl -ef -
- 拦截代理必须侦听端口转发规则中指定的端口(端口 8080)。
XMPP¶
对于 XMPP 通信,FCM 使用端口 5235(生产)和 5236(测试)。
- 为 FCM 使用的端口配置本地端口转发。以下示例适用于 macOS
$ echo "
rdr pass inet proto tcp from any to any port 5235-> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 5236 -> 127.0.0.1 port 8080
" | sudo pfctl -ef -
拦截请求¶
拦截代理必须侦听端口转发规则中指定的端口(端口 8080)。
启动应用程序并触发使用 FCM 的功能。您应该在拦截代理中看到 HTTP 消息。
推送通知的端到端加密¶
作为额外的安全层,可以使用 Capillary 加密推送通知。 Capillary 是一个简化从基于 Java 的应用程序服务器向 Android 客户端发送端到端 (E2E) 加密推送消息的库。