作者:HausenChen

1.1 引子

作为 WiFi 安全的一部分,近年来 WiFi 安全事件层出不穷,而其中的 ARP 攻击事件更加普遍,越来越成为移动互联网时代手机用户的一大痛点。请看以下一个 WiFi 安全事件。

A 君从广州到上海出差,在星巴克买了一杯咖啡,坐在门口连上某个热点的 WiFi 正在浏览一个网站,发现这个网站需要邮箱注册,注册后发现需要登录邮箱激活。于是 A 君这打开了邮箱大师上的 APP。

——图 1 用户登录邮箱使用场景——

输入了账号和密码,点击登录,登录成功没有问题。可是过一会,重新登录这个邮箱,发现登录不上去了。很明显,用户 A 的账号和密码是他在喝咖啡的时候被盗取的并且被瞬间修改了。那密码究竟是怎么被盗取的呢?

其中一种可能的原因是用户 A 连接的 WiFi 遭受 ARP 攻击了。

如果我们产品要做一个功能,要求能够检测出这种 ARP 攻击,在用户连接 WiFi 的时候能第一时间给予提示,让用户免遭损失。针对这样的安全方面的测试需求,我们应该如何测试呢?

1.2 安全测试的难点

针对 1.1 中的产品需求,要想测试好,有以下测试难点:

● 安全攻击原理认知缺乏:

对 ARP 攻击的原理不清楚,对产品检测的逻辑也不清楚;

● 安全测试经验缺乏:

这类安全方面的功能点没有测试过,不好下手;

● 测试策略难以制定:

在理清攻击原理和测试目标的前提下,应该如何设计测试策略,能更高效地完成测试任务?

● 测试环境缺乏:

不知道怎么搭建测试环境?怎么评估搭建的测试环境是否满足测试需求?

1.3 难点突破

针对 1.2 章节提到的测试难点,下面咱们来一一对症下药,各个击破。

1.3.1 安全攻击原理认知缺乏——ARP 攻击原理剖析

先了解一下 ARP 原理:某机器 A 要向网关发送报文,会查询本地的 ARP 缓存表(对于 anroid 系统就是/proc/net/arp),找到网关的 IP 地址对应的 MAC 地址后,就会进行数据传输。如果未找到,则 A 广播一个 ARP 请求报文,网关识别到是自己的 IP 地址,于是向 A 主机发回一个 ARP Reply。其中就包含有网关的 MAC 地址,A 接收到网关的应答后,就会更新本地的 ARP 缓存表。接着使用这个 MAC 地址发送数据。

ARP 协议的原理存在一个可以被利用的漏洞:当 A 没有发起 ARP Request 时,其他人也可向 A 发送一个 ARP Reply。当 A 收到一个 ARP Reply 时,不会质疑,而是直接对本地的 ARP 缓存表进行更新,将应答中的 IP 和 MAC 地址存储在 ARP 缓存表中。因此,当局域网中的某台机器 B 向 A 发送一个自己伪造的 ARP Reply,即 IP 地址为网关的 IP,而 MAC 地址是 B 的,则当 A 收到后就会更新本地的 ARP 缓存表,这样 A 本来要发给网关的内容就会发给 B 了。同理,B 也可以用同样的方式对网关进行 ARP 欺骗。在 A 和网关之间作为中间人,而 A 和 B 完全不知道。

假设一个只有三台电脑组成的局域网,该局域网由交换机连接。其中一个电脑名叫 A,代表攻击方;一台电脑叫 S,代表源主机,即发送数据的电脑;令一台电脑名叫 D,代表目的主机,即接收数据的电脑(这里的电脑其实也可以换成智能手机,所以如下图 4 中用了电脑/手机表示这个网络节点)。这三台电脑的 IP 地址分别为 192.168.0.2,192.168.0.3,192.168.0.4。MAC 地址分别为 MAC_A,MAC_S,MAC_D。其网络拓扑环境如图 3。

——图 2: ARP 欺骗网络拓补图——

现在,S 电脑要给 D 电脑发送数据了,在 S 电脑内部,上层的 TCP 和 UDP 的数据包已经传送到了最底层的网络接口层,数据包即将要发送出去,但这时还不知道目的主机 D 电脑的 MAC 地址 MAC-D。这时候,S 电脑要先查询自身的 ARP 缓存表,查看里面是否有 192.168.0.4 这台电脑的 MAC 地址,如果有,那很好办,就将封装在数据包的外面。直接发送出去即可。如果没有,这时 S 电脑要向全网络发送一个 ARP 广播包,大声询问:我的 IP 是 192.168.0.3,硬件地址是 MAC-S,我想知道 IP 地址为 192.168.0.4 的主机的硬件地址是多少?

这时,全网络的电脑都收到该 ARP 广播包了,包括 A 电脑和 D 电脑。A 电脑一看其要查询的 IP 地址不是自己的,就将该数据包丢弃不予理会。而 D 电脑一看 IP 地址是自己的,则回答 S 电脑:―我的 IP 地址是 192.168.0.4,我的硬件地址是 MAC_D。

需要注意的是,这条信息是单独回答的,即 D 电脑单独向 S 电脑发送的,并非刚才的广播。现在 S 电脑已经知道目的电脑 D 的 MAC 地址了,它可以将要发送的数据包上贴上目的地址 MAC-D,发送出去了。同时它还会动态更新自身的 ARP 缓存表,将 192.168.0.4-MAC_D 这一条记录添加进去,这样,等 S 电脑下次再给 D 电脑发送数据的时候,就不用大声询问发送 ARP 广播包了。这就是正常情况下的数据包发送过程。

总结来说,这个通信过程分为以下四步。

(1)主机 S: 查询自己的 ARP 缓存表,确认是否 IP-D/MAC-D 的记录存在;

(2)主机 S: 发一个 ARP 请求的广播包,询问跟 IP-D 关联的 MAC 地址是多少;

(3)主机 D: 发一个 ARP 回复包,告知我的 MAC 地址是 MAC-D,IP 地址是 IP-D;

(4)主机 S: 更新自己的 ARP 缓存表,下次要发包给 IP-D 的时候直接发给 MAC-D。

1.3.2 安全测试经验缺乏——ARP 攻击测试建模

针对如上 ARP 攻击的原理,假如我们要测试一个能检测出以上 ARP 攻击的功能,怎么办呢?首先,基于 ACC 的模型,可以将 ARP 攻击检测功能的三要素定义如下,说白了是要明确测试目标。

(1)Attributes:

A,准确:在有和无 ARP 攻击时能准确检测出有和无 ARP 攻击;

B,通用: 不管有没有 ROOT 用户,都能满足 A。

(2)Components:

——图 3 ARP 检测功能子模块——

(3)Compatibilities 矩阵

——表 1 ARP 检测功能 Compatibilities 矩阵——

1.3.3 测试策略难以制定——ARP 攻击测试策略

通过对 1.3.2 章节对测试目标的确定,借用 Safety 领域的安全分析方法,我们可以画出 ARP 攻击功能的软件失效故障树 FTA(Fault Tree Analysis)如下:

故障定义:没有达到 Attributes 中的目标,我们用 “ARP 检测功能失效” 来统称。

——图 4 ARP 检测功能故障树——

由上图可见,每个条件判断都是一个逻辑或,我们认为检测失效、或者检测展示失效,或者日志上报失效都可以导致 ARP 检测功能失效,所以对每个失效路径,我们可以快速得到核心用例路径如下:

——表 2 由故障树导出核心用例——

1.3.4 测试环境缺乏——测试环境搭建

对于 WiFi 安全测试,和普通业务功能测试的最大的区别是WiFi 安全测试对测试环境要求很高,所以往往测试环境的准备成为整个 WiFi 安全测试最难的也是最耗时的点。

那应该怎么准备测试环境呢?

1.3.4.1 攻击环境准备

设备环境:

PC:一台(装有 TPLINK 无线网卡)

手机 1:作为热点手机(华为 Mate8,Android 6.0)

手机 2(被测手机):连接 PC,用来查看 ARP 缓存表,确认 ARP 攻击成功(OPPO,Android 4.4.2),安装有腾讯手机管家。

手机 3:用户手机,通过连上热点,然后登陆邮箱操作(三星 S5,Android 4.4.4)

环境准备步骤:

Step1: PC 上安装 TPLINK 无线网卡驱动,确保 TPLINK 网卡能用;

Step2:PC 上安装 CAIN 攻击软件,见附录;

Step3:手机 1 开设一个热点,如热点名为 Hausen01;

Step4: 手机 2、3 和 PC 都连上该热点。

1.3.4.2 网络拓补图

经过章节 2 中 Step4 后,可以通过 ipconfig 查看 PC 的 IP,如本次实例为 192.168.43.131。

可以通过 ipconfig /all 查看 PC 的 MAC,如:EC:17:2F:CE:78:62

由此我们可以得到整个攻击环境的网络拓扑图如下:

图中,攻击确认手机也就是被测对象,由于我们的测试目标是腾讯手机管家的 APP 检测 ARP 攻击的能力,所以这台手机要装上腾讯手机管家。

1.3.4.3 ARP 攻击制造

Step1: 攻击前 ARP 表检查
攻击前先检测手机 ARP 表如下(可以看到 HW address 列没有出现两个同样的 MAC 地址,说明当前网络没有受到 ARP 攻击)。

Step2: 关闭防火墙

Step3: 嗅探器打开

打开 CAIN,启动嗅探器

Step4: 设备扫描

扫描局域网的所有设备

直到扫描结果如下(可以看到设备 IP 和章节 3 中的网络拓补图是对应的,这里因为 CAIN 安装在 PC 上,而 CAIN 不会显示本机的 IP,因此 192.168.43.131 在这里看不出来):

Step5: 攻击链路添加

切换到底部 ARP 的 TAB,点击菜单栏 + 号。

在弹出的页面(如下),鼠标点击页面左侧一个 host 节点,比如 192.168.43.152, 会在页面右侧出现跟该节点的同一局域网的其他节点,比如 192.168.43.20(另一台手机),和 192.168.43.1(网关)。

点击上图右侧的网关节点,即选择了 192.168.43.152 到网关的链路,点击 OK 后会跳转到以下界面,说明这条攻击链路被添加了。

Step6: 启动 ARP 攻击

点击以下图中的黄色图标即可。

Step7: 攻击成功确认

CANI 上的表现:

Step8: 密码盗取

接下来我们重现下章节 1.1 的用户场景:
通过 192.168.43.152 这台手机(假如是一台用户手机)的邮箱客户端,登录一个 qq 邮箱看看。

一点击登录,回到攻击 PC 的 CAIN 软件界面,可以看到密码和账号直接明文显示了。是不是很震撼?

Step9: 安全探秘
通过 Step8,我们都看到密码被 PC 捕获到了,但为什么会这样子呢。下面来解释下。

在 192.168.43.20 的手机,通过 USB 连接 PC,adb shell 进去打印 ARP 缓存表如下:

结合章节 1.3.1 讲到的 ARP 攻击原理,看第二条记录:攻击 PC 的 IP 是 192.168.43.131,MAC 是 ec:17:2f:ce:78:62,说明我 192.168.43.20 要发包给攻击 PC 的话,可以正常找到攻击 PC 的 MAC,这个没有问题。

但是看第三条记录:192.168.42.1——ec:17:2f:ce:78:62,这说明什么呢?我们都知道我们在局域网要想访问外网的话要通过网关,说明我 192.168.43.20 要访问外网的话,先发包给网关,也就是 192.168.42.1,但是由于这个缓存表记录的网关的 IP 对应的是攻击 PC 的 MAC,所以导致我发给网关的包都会跑到攻击 PC 去了。这就是为什么说登录客户端会造成密码泄露的根源。也就是章节 1.1 的安全事故的根源。

1.3.4.4 测试确认

在经过 1.3.4.3 的 ARP 攻击确认后,我们在被测手机,打开腾讯手机管家,连接被攻击热点,确认以下几点:

(1)确认检测出 ARP 攻击,并确认产品 UI 上能展示正确:

(2)确认攻击上报日志正确(和管家其他日志上报查询方法一样,具体不表)。

其他测试路径确认方法类似,此处从略。

1.4 WiFi 安全测试小结

作为一个测试人员,在接到一个安全测试的测试需求时,应该如何下手?

本文抛砖引玉,基本可以遵循以下的思路来:

(1)把安全原理吃透;

(2)对测试目标进行测试建模;

(3)有效制定测试策略;

(4)搭建一个比较靠谱的测试环境。

这样基本就能应对安全测试的一些入门问题了。至于深度安全测试,比如出现问题时候如何定位,产品数据有问题时如何和从测试人员的角度主导或者配合开发、产品童鞋跟进解决,诸如此类的问题本文先不讲,留到后续再讨论。

本章完~

原文链接:enter link description here


TMQ(腾讯移动品质中心)是腾讯最早专注在移动 APP 测试的团队
我们专注于移动测试技术精华,饱含腾讯多款亿级 APP 的品质秘密,文章皆独家原创,我们不谈虚的,只谈干货!

扫码关注我们

扫一扫 关注 TMQ
精彩分享不断


↙↙↙阅读原文可查看相关链接,并与作者交流