(这是 HNU 肖晟老师的《计算机网络》第一次实验)

实验环境

手机(iPhone)开启热点作为 gateway,让电脑(MacBook)连接热点作为攻击者,平板(iPad)也连接热点作为 victim。让我们来看看,当 victim 上网时,攻击者能看到什么。

混杂模式

大多数的网卡都支持开启混杂模式(promiscuous mode),只是一般工作在非混杂模式下。
在混杂模式下,网卡可以接收所有经过它的数据流,不论目的地是否是它。

在一般 Linux 发行版中需要手动开启混杂模式:

ip link set eth0 promisc on

开启之后,网卡应该就可以支持混杂模式了。

在终端使用 ifconfig 查看网卡接口信息,接口的 flags 中包含 PROMISC 就说明目前支持混杂模式,例如:

...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
    ether 1c:91:80:e2:0f:f6 
    inet6 fe80::1878:5529:853f:6fa1%en0 prefixlen 64 secured scopeid 0xc 
    inet 192.168.86.20 netmask 0xffffff00 broadcast 192.168.86.255
    inet6 240e:468:490:e659:402:bca2:58e4:dbae prefixlen 64 autoconf secured 
    inet6 240e:468:490:e659:e445:33c7:a581:43c8 prefixlen 64 autoconf temporary 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
...

MacBook 的 macOS 中网络接口命名和一般的设备不同,使用 ifconfig 显示时,en0 才是 Wi-Fi 网卡接口。可以在「系统信息.app」查看,或者直接看当前 active 的接口。

安装配置 Wireshark

macOS 下使用 homebrew 安装 Wireshark 时,formula 的版本和 cask 的版本存在 conflict,不能共存。只要安装 cask 的版本(带图形界面的)即可。(从官网下载安装是一样的)

brew install --cask wireshark

开启后会提示安装 ChmodBPF,否则无法使用。安装之后打开会发现还是提示没有安装,这时候还要给权限才能用:

sudo chmod 666 /dev/bpf*

给权限之后打开 Wireshark 就可以抓包了。注意 macOS 重启之后这个权限会重置,需要重新设置。

ARP 欺骗

开启了混杂模式只是保障了我们可以嗅探,但是这时候局域网内的其他主机并不愿意把包发给我们。我们要进行 ARP 欺骗,将自己伪装成一个 gateway,让其他主机乖乖地把包发给我们。

我们使用 ettercap 工具进行 ARP 欺骗。Windows 平台建议使用 arpspoof,这个程序更加简单轻量。

brew install ettercap
sudo ettercap -G # 以图形界面方式运行 Ettercap,注意要 sudo!

启动 Ettercap 后,进行 host 扫描或者等待自动探测 host,然后将 host list 中目标主机(即想要欺骗的 victim)加入 target1,将 gateway 加入 target2。
注意同一主机在 list 里可能有 IPv4 和 IPv6 两个表项,看 mac 地址可以区分(同一主机 mac 地址相同)。

Ettercap 中的 host list

如何才能确定这些 IP 谁是谁的呢?
对于 victim 的 IP,可以直接在 victim 设备的设置里查看,网络设置中会显示自己被分配到的 IP。有些时候,这个 list 里的 description 会显示设备名称。
对于 gateway 的 IP,则可以在任何连接该局域网的设备设置里看到,显示的「网关 IP」即是。
这个 list 中的 192.168.86.236 就是我们的 victim。

配置好 target 后,点击 MITM menu 里的 ARP poisoning 就可以启动 ARP 欺骗。这时候在 Wireshark 里就能抓到局域网内其他主机的包了。

使用 Wireshark 抓包

在 Wireshark 里筛选相应 IP 的包,就可以看到与 victim 有关的包。可以这么写查询语句:ip.addr == 192.168.86.236

嗅探到的有关 victim 的所有包

可以看到各种协议的流量,TCP、ARP、MDNS、HTTP……

观察截图中的 48 号开始的数据包,可以发现这完整演示了 TCP 三次握手的过程:

这个 TCP 连接用于什么目的呢?可以看到接下来对于这个服务器的一个请求就是 HTTP GET,也就是 victim 访问了湖大统一身份认证页面的网页。至此,我们直观地看到了从建立 TCP 连接到发送 HTTP 请求的全过程。

还注意到,这个连接由 victim 的 60431 端口和服务器的 80 端口建立。在下面的其他数据包里,victim 的端口各不相同,端口号都大于 60000。看来,发送端的确是任意选择一个不定端口进行发送的。

实践:湖大统一身份认证登陆

现在还有什么现代网站使用 HTTP 吗?答案是肯定的,比如:湖南大学「统一身份认证」的登录页面。这个页面是完全不支持 HTTPS。
那么理论上来说,我是不是可以看到在相同局域网登陆的同学的密码呢?

就 TM 你没用 HTTPS 是吧?

将前面的一切都配置好之后,在同一个局域网下,在目标设备上登录,筛选 Wireshark 的条件为发自 victim 的 IP 和使用 HTTP 协议,可以写 ip.src == 192.168.86.236 && http

确实看到了目标设备浏览器发出的 HTTP 请求!
查看包内容,可以看到表单发送的四个字段,其中赫然包含着这个 password:

捕获 victim 登录湖大统一认证的请求

然而查看发现,这个内容是加密的。结合之前对湖大登录认证的研究,在发送表单之前会对 password 进行 RSA 加密,加密的公钥是加载网页之初向服务器请求的(每次都不同),而对应的密钥只有服务器后端知道。所以,我们只能截获加密后的内容,没有服务器端的密钥就是没法解密的。
看来,虽然没有使用 HTTP,但是湖大统一认证的密码登录还是相对安全的。

值得注意的是,统一身份认证的登录页面使用了这种比较精巧的设计,利用非对称加密、每次生成不同的密钥对等来确保我们抓到的包看不到密码(也可能是因为有这样一套 HTTP 下也相对安全的机制,信息化办才不愿意升级 HTTPS),然而大多数的登录表单并不会采用这样复杂的设计,绝大多数还是直接明文发送密码或者密码哈希。如果不使用 HTTPS,确实会有很大的安全性问题。

校园网的 AP 隔离

马上我们就可以看到「在湖大登录个人门户」是「安全的」的另一个原因:校园网的 AP 隔离。如果两个设备都连在校园网,它们彼此之间是无法访问的,并不像一般的局域网一样。正因如此,校园网内不能联机玩 Minecraft。

所以,连接湖大校园网 Wi-Fi 时是无法进行这个实验的,即使进行了 ARP 欺骗,Wireshark 也无法嗅探到局域网其他主机发送的包,只能看到一些无意义的 MDNS 查询:

校园网中只能嗅探到一些无意义的 MDNS 查询

所以校园网内嗅探是不可行的。

HTTPS 下能嗅探吗?

如果主机使用 HTTPS 访问网站,我们还能看到其发送的请求吗?

仍然使用之前嗅探的实验环境,在 victim 上访问 HTTPS 网站进行登录操作,比如学习通:

学习通的登录页面

可以看到这个页面是使用 HTTPS 连接的。在这个页面输入账号密码登录,用 Wireshark 能够嗅探到:

和学习通服务器建立 HTTPS 连接的过程

我们知道 HTTPS 建立在服务器的 443 端口。可以看到,我们抓取到了 victim 和超星学习通服务器建立连接的 TCP 包(也就是发向 443 端口的这一系列包),但是在这之后发的包并没有使用 HTTP 协议(或者 HTTPS 协议?),而是使用了 TLSv1.2 协议。TLS 的全称是 Transport Layer Security,顾名思义是个加密协议。事实上对于这些使用 TLS 加密发送的数据包,我们查看只能看到一堆乱码。

比较诡异的是,学习通登录之后自动重定向到了一个 HTTP 页面,所以上图最后几行开始又是 HTTP 协议……不知道这垃圾平台的开发者是怎么想的。
如果筛选所有 HTTP 包,就只能看到登录成功、重定向之后 GET 的那些内容,看不到表单登陆 POST 账号密码的内容。

筛选 HTTP 包,只能看到 HTTP GET

综上所述,HTTPS 实际是「HTTP over TLS/SSL」,也就是用 TLS 这类加密协议传输的 HTTP,所以在 Wireshark 里捕获不到 HTTP 的请求内容,只能看到一个个加密后的 TLS 包。