使用 Wireshark 监控 Android 流量
智能手机的普及和便捷性为随时随地获取信息带来了真正的福音。我喜欢能够连接到 Wi-Fi 热点,查看我的邮件,检查我的银行余额或阅读最新的科技新闻——所有这些都无需携带或启动笔记本电脑。现在移动开发已成为主流,大多数访问都是通过专门的应用程序完成的,而不是通过 Web 浏览器。
这种从直接 Web 访问转向专用智能手机应用程序的趋势,带来了更丰富的用户体验,但也使得确切了解“幕后”发生的事情变得更加困难。在我们的 Linux 机器上,有很多工具可以帮助用户窥探机器的内部数据流向。我们的浏览器有简单的 HTTP 与 HTTPS 检查来查看是否存在加密,并且有简单易用的浏览器插件(如 Firebug)让我们准确地查看通过 Web 发送和检索的内容。在操作系统层面,像 Wireshark 这样强大的工具让我们能够更深入地挖掘,捕获所有流经网络接口的流量。智能手机通常被锁定,以至于普通用户几乎不可能直接在手机上运行任何网络监控或跟踪软件——那么好奇的用户如何访问手机流量呢?
幸运的是,只需稍作努力,您就可以使用 Linux 将几乎任何笔记本电脑变成秘密共享无线接入点 (WAP),连接您的手机,并相对轻松地查看进出手机的数据流。您真正需要的只是一台运行 Linux 的笔记本电脑,配备一个无线连接和一个以太网连接。
拦截流量第一步是设置您自己的“淘气”WAP,您可以在其中捕获和记录所有通过它的 Internet 流量——模拟流氓员工可能从咖啡店 Wi-Fi 热点获取的那种信息。让我们以一种与发行版无关的方式来完成这件事,这种方式不会干扰您现有的路由器(无需更改安全设置),并且不需要在您的手机上进行 root 或安装任何不正当的东西。
错误的开始尝试使用快捷方式来捕获此流量可能很诱人。以下是我尝试过并放弃的几种技术,最终坚持使用了 hostapd/dnsmasq/iptables 解决方案。
Ubuntu 的内置热点
Ubuntu 在其网络设置中隐藏了一个方便的“用作热点”功能。不幸的是,它以 ad hoc 模式创建热点,这与大多数版本的 Android 不兼容。我没有尝试 Fedora 的实现,但我推荐的方法适用于任何发行版。
监听模式
仅仅将无线网卡置于监听模式并捕获所有无线流量(与 SSID 无关)是很诱人的。这非常酷,但也有很多“陷阱”:
-
您的无线网卡驱动程序必须支持监听模式。许多但并非所有网卡都支持此模式。
-
您的捕获需要包括四个 WPA “握手”数据包。
-
您可能需要编译并使用 airmon-ng 来启动监听模式,然后在 airmon 创建的 mon0 伪设备上进行捕获。
-
如果 WAP 使用加密,则您捕获的数据包也将被加密。Wireshark 确实具有帮助解码数据包的功能,但您需要输入有关 WAP 使用的安全方案的信息,并切换几组选项,直到解码后的数据包看起来正确为止。对于初次用户来说,在不必担心打开和关闭安全选项的情况下,理解 Wireshark 转储已经够难的了。
使用 Android 模拟器捕获
另一种方法是在您的捕获设备上使用 Android 模拟器,安装然后运行目标应用程序,并从模拟器捕获流量。然而,实际上在模拟器上安装银行应用程序要困难得多:
-
由于最近 Android 许可的更改,主要的 Android VM 不再包含 Google Play 商店。(我尝试了 Android SDK 和 Genymotion 的免费产品。)
-
如果您的手机没有 root,则将应用程序的 .apk 文件从手机转移到 VM 并不容易。
要将笔记本电脑变成 WAP,您首先将使用 hostapd 将无线网卡用作接入点模式(广播 SSID,使用安全进行身份验证等等)。接下来,您将使用 dnsmasq 为连接到无线连接的客户端提供 DNS 和 DHCP 服务。最后,iptables 的伪装功能将用于将无线连接上的客户端的 IP 流量定向到 Internet(通过您的以太网连接),然后将响应路由回无线侧的正确客户端。
hostapdhostapd 是一个小实用程序,可让您创建自己的无线接入点。安装非常简单,配置也同样容易。大多数无线网卡和现代内核都将使用 mac80211 驱动程序。通过 lsmod|grep mac80211
检查您的驱动程序。如果那是您的驱动程序,请通过 ifconfig
找到您的无线设备,并为您选择的 SSID 设置,如下所示,用于不安全的、完全开放的接入点:
===[/etc/hostapd/hostapd.conf]======
interface=wlan0
driver=nl80211
ssid=WatchingU
channel=1
===[/etc/hostapd/hostapd.conf]======
我建议不要为此测试使用 Wi-Fi 安全;这将是多余的,因为您的接入点只是临时的。如果您需要更永久的解决方案,hostapd 支持许多不同的身份验证选项。
dnsmasq现在 hostapd 已准备好让客户端连接到您的无线连接,您需要 dnsmasq 来提供 DCHP 并为您的接入点提供 DNS。幸运的是,dnsmasq 也非常容易安装和配置。以下示例是最低要求。确保您指定的 dhcp-range
不会与网络上已有的任何内容冲突。默认情况下,dnsmasq 将读取您现有的 /etc/resolv.conf 并将其中列出的 DNS 设置传播到其客户端。这是一个非常合理的默认配置,但如果您需要其他配置,请使用 no-resolv
选项并手动指定 DNS 服务器。
========[/etc/dnsmasq.conf]===============
interface=wlan0
dhcp-range=10.0.0.3,10.0.0.20,12h
========[/etc/dnsmasq.conf]===============
iptables
您的无线接入点的最后一部分是 iptables,它将使用 IP 伪装来获取来自无线连接的流量,通过有线连接发送它,并将任何响应路由回无线侧的正确来源。有很多特定于发行版的方式来保存和编写 iptables 规则脚本,但创建一个与发行版无关的 shell 脚本来启用 iptables 和网络地址转换 (NAT) 更简单。用于 iptables 的脚本,它将 hostapd 和 dnsmasq 连接在一起,如下所示(修改 wlan0 和 eth0 条目以匹配您的系统):
=======[makeWAP.sh]==============
#!/bin/bash
export DEV_IN=wlan0;
export DEV_OUT=eth0;
echo "Bringing up $DEV_IN"
#This address/mask should match how you configured dnsmasq
ifconfig $DEV_IN up 10.0.0.1 netmask 255.255.255.0
echo "Starting dnsmasq"
dnsmasq
echo "Configuring iptables"
#Clear everything in iptables
iptables -Z;
iptables -F;
iptables -X;
#Turn on iptables NAT, forwarding, and enable
#forwarding in the kernel
iptables --table nat --append POSTROUTING --out-interface
↪$DEV_OUT -j MASQUERADE
iptables --append FORWARD --in-interface $DEV_IN -j ACCEPT
↪sysctl -w net.ipv4.ip_forward=1
echo "Starting hostapd"
hostapd /etc/hostapd/hostapd.conf 1> /dev/null
=======[makeWAP.sh]==============
要测试一切,请将您的捕获笔记本电脑连接到具有 Internet 访问权限的有线连接,并断开任何现有的无线连接。运行 makeWAP.sh 脚本(sudo ./makeWAP.sh
)以启动 WAP。
在手机上,关闭移动数据(对于 Android 4.3,这可以通过 设置→数据使用→移动数据→关闭 来完成),打开 Wi-Fi,并连接到新的 WAP(在上面的示例中,SSID 将是“WatchingU”)。连接后,测试一些站点以确保您可以从 Internet 访问数据。
如果一切正常,恭喜您,您已将您的笔记本电脑变成了世界上最荒谬的、规格过高的无线路由器!
WiresharkWireshark 是一个网络数据包分析器,您将使用它来捕获并理解新创建的接入点上流动的数据。您将仅仅触及它的功能的表面,因为它是一个极其强大的工具,其能力远远超出本项目中使用的“戳几下数据包”。
为您的 Linux 版本安装 Wireshark。如果可能,请获取 1.10 或更高版本,因为 1.10 添加了对动态解码 gzip 压缩的 HTTP 数据的支持(并且有很多这样的数据)。在 1.10 之前,您必须将 TCP 流保存到文件,编辑掉标头,然后 gunzip 它以查看原始数据。这很快就会变得乏味,因此让 Wireshark 在后台为您完成所有这些操作非常棒。
首次运行 Wireshark 时,如果它抱怨没有可用于捕获的设备,您必须为您的 ID 授予 Wireshark 使用的各种设备和应用程序的权限。对于 Ubuntu,运行 sudo dpkg-reconfigure wireshark-common
,并选择允许非 root 用户捕获数据包的选项,并确保您的 ID 在“Wireshark”组中。对于其他发行版,搜索哪些设备和脚本需要由哪些组拥有。
在继续捕获流量之前,关闭手机上所有非必要的应用程序和服务,以便更容易找到感兴趣的流量。您需要筛选的数据包越少越好。
捕获未加密的 Web 流量在您开始寻找敏感数据之前,让我们先熟悉一下未加密的流量在 Wireshark 中的样子。
-
从 Wireshark 启动屏幕中,选择无线设备 (wlan0),然后选择“开始”图标以启动新的捕获。
-
在手机上,使用浏览器转到 https://linuxjournal.cn。
-
手机上的页面加载完成后,按 Wireshark 中的“停止”图标,并将捕获文件保存到安全位置,并命名为类似“Capture_LJ.pcapnp”的名称。
现在,让我们看看这个转储。在 Wireshark 中打开转储文件后,转到 视图→名称解析,并确保选中“启用网络层”。这将通过将 IP 地址转换为主机名来提高可读性。初始视图(图 1)可能有点吓人,但有一些简单的技巧可以使解码此数据更容易。

图 1. Wireshark 输出
如图 1 所示,Wireshark 的转储屏幕每行显示一个 TCP 数据包,但当重新组装成完整的 TCP 流时,数据更容易被理解。要获取完整的流,请右键单击源或目标为 www.linuxjournal.com 的任何行,然后选择“追踪 TCP 流”。这将自动查找所有相关的数据包并将它们组合在一起,以便于阅读的格式。

图 2. 追踪 TCP 流
在此示例中,您可以看到来自我的手机的 HTTP GET 请求(红色),以及来自 Linux Journal Web 服务器的 HTTP 响应(蓝色)。在这里,您可以开始看到未加密的信息在服务器之间来回流动。由于服务器响应的“Content-Type”标头指示响应是 JPEG 图像,因此您可以通过一些额外的操作来查看该图像。按“另存为”按钮将流保存到临时文件(使用 RAW 格式),然后使用像 emacs 或 vi 这样的编辑器从图像二进制内容中修剪掉标头文本。这需要一些练习,但通常很明显 HTTP 标头在哪里停止,二进制位在哪里开始。

图 3. 原始 TCP 转储
删除标头(以及任何残留的页脚或其他标头部分)后,您可以将文件保存为 .jpeg 扩展名并查看它。
继续手动浏览转储,并查找有趣的 TCP 段。您也可以使用 Wireshark 的过滤功能采取更系统的方法。使用像 tcp.stream eq 1
这样的过滤器(图 4),并不断迭代流 ID,直到您看到所有流,如果数据包看起来有希望,则使用“追踪流”深入挖掘。

图 4. 过滤到单个 TCP 流
捕获低敏感度应用程序流量现在您对使用 Wireshark 捕获和查看转储感到更加舒适了,让我们尝试窥探来自 Android 应用程序的信息。对于下一个测试,我使用了应用程序“reddit is fun”,因为它发送和接收可能未加密的非敏感数据。
使用与之前相同的技术捕获应用程序搜索或查询:在笔记本电脑上启动 Wireshark,从手机启动并运行应用程序,然后停止 Wireshark 并保存捕获文件。
图 5 显示了来自“reddit is fun”的示例 TCP 流。

图 5. Gzip 编码的 JSON
同样,来自应用程序的请求是红色的,来自 reddit 服务器的响应是蓝色的。请注意,由于请求未编码,因此任何监控 WAP 的人都可以检测到您对“Raspberry Pi”数据的兴趣。响应的内容类型是 JSON,即使 Content-Encoding 设置为“gzip”,Wireshark 也允许您将内容正文视为纯 JSON。如果您的 TCP 流页面中的数据看起来乱码,则您可能拥有较旧版本的 Wireshark,该版本不支持即时 gzip 解码。要么将内容保存到文件并自行 gunzip,要么升级您的 Wireshark 版本。
注意:看看响应中那个滑稽的“Server”标头——是否有一些聪明的 reddit 工程师正在向一些脚本小子发送 SQL 注入攻击?
捕获高敏感度应用程序数据到目前为止,从应用程序捕获流量的过程应该非常简单了。让我们尝试运行银行或高敏感度应用程序,并使用前面描述的技巧来查看您是否可以检测到应用程序以明文形式发送了任何不应该发送的信息。老实说,找到如此低级(且容易避免)的缺陷的可能性非常非常低。Android 应用程序开发现在已经非常成熟,并且 Android 库使使用 SSL 加密非常容易。不过,再次检查一下感觉很好,所以请按照与之前相同的步骤操作,但登录您选择的银行应用程序。
现在,当您逐步浏览 TCP 流时,您应该注意到一些主要差异。大多数流量将是 HTTPS 而不是 HTTP,并且协议将是 TLS 而不是 TCP 或 HTTP。此外,即使尝试了标准的 gunzip 技巧,TCP 流也不再包含人类可读的内容(图 6)。

图 6. 加密流量
逐步浏览 TCP 流,追踪每个流,并验证是否没有暴露任何可怕信息的纯文本或未加密通信。
下一步既然您几乎可以肯定没有发现任何可怕的东西,那么这些网络监控技能还可以应用到哪里呢?以下是一些有趣的想法:
-
连接像 Wii 或 PS3 这样的游戏机,看看它在启动和登录时发送什么样的信息。
-
创建一个实际上不会去任何地方的 WAP,只是看看有什么设备尝试连接。也许有您甚至不知道的设备正在使用 Wi-Fi?
-
获取您支持的服务器的 SSL 证书,并尝试 Wireshark 的 SSL 解码。
-
在脚本中反转 wlan0 和 eth0 的指定,并反向设置系统(将笔记本电脑的 Wi-Fi 连接到您现有的 WAP,并将设备插入笔记本电脑的以太网端口)以监控仅有线设备的输出。我的“智能”蓝光播放器在启动时与各种意想不到的地方进行通信!