竞态条件漏洞实验
章节大纲
-
本实验的目标是让大家通过动手操作,加深大家在课堂上学到的竞态条件漏洞知识。竞态条件是指当多个进程同时访问和修改同一数据时,不同的顺序会导致执行的结果不同。如果一个拥有特权的程序存在竞态条件漏洞,攻击者可以运行一个并行过程来与该特权程序进行竞争,有可能能改变程序的结果。
本实验提供了一个具有竞态条件漏洞的程序,你的任务是想办法利用这个漏洞获得 root 权限。除了攻击之外,实验还将引导你研究一些可用于对抗竞态条件攻击的安全机制,你需要评估这些机制是否有效并解释为什么有效。本实验涵盖了以下主题:
-
竞态条件漏洞
-
黏性符号链接保护
-
最小权限原则
SEED 实验还有三个另外的与竞态条件相关的实验。一个是 Dirty COW 攻击实验,它利用操作系统内核中的竞态条件漏洞。另外两个是 Meltdown 和 Spectre 攻击,它们针对的是 CPU 内的竞态条件漏洞。这四个实验从应用层、内核层到硬件层提供了对竞态条件问题的全面覆盖。 -
-
本实验在 SEEDUbuntu20.04 VM 中测试可行。你可以在本页面右端选择虚拟机版本为 SEEDUbuntu20.04,点击“创建虚拟机”来获取虚拟机平台的临时用户名与密码,登录虚拟机平台即可获得一台预先构建好的 SEEDUbuntu20.04 VM,该虚拟机以及用户名密码将在开启 24 小时后自动销毁。你也可以在其他 VM、物理机器以及云端 VM 上自行配置环境进行实验,但我们不保证实验能在其他 VM 下成功。实验所需的文件可从下方下载,解压后会得到一个名为 Labsetup 的文件夹,该文件夹内包含了完成本实验所需的所有文件。
-
我们的目的是利用程序中的竞态条件漏洞来修改一个对我们来说不可写的文件 /etc/passwd。通过利用这一漏洞,我们希望向该文件中添加一条记录,创建一个具有 root 权限的新用户帐户。在这个用户密码文件中,每个用户都有一个记录,它由七个字段组成(通过冒号分开)。以下是 root 用户的记录。
root:x:0:0:root:/root:/bin/bash
对于 root 用户来说,第三个字段(用户 ID 字段)的值为 0。也就是说,在 root 用户登录时,其进程的用户 ID 将被设置为 0,从而赋予该进程 root 权限。实际上,root 帐户的权利并不来源于其名称,而是源自用户的 ID 字段。如果想创建一个具有 root 权限的新帐户,只需在该字段中放入 0 即可。
每个条目还包含一个密码字段,它是第二个字段。在上面的示例中,此字段设置为 "x",表示密码存储在另一个名为 /etc/shadow 的文件中。这就意味着我们还需要利用竞态条件漏洞在 shadow 文件中也添加一条记录。这并不难做到,但是我们有一种更简单的方法。与其将 "x" 放入密码文件中,我们可以直接将密码放在那里,这样操作系统就不会去 shadow 文件中查找密码。
密码字段并不存放实际的密码,而是存储其单向哈希值。为了得到一个密码的单向哈希值,我们可以在自己的系统中使用 adduser 命令创建一个新用户,并从 shadow 文件中获取该密码的单向哈希值。我们也可以简单地复制 seed 用户记录中的值,因为我们知道其密码是 dees。有趣的是,在 Ubuntu 的 Live CD 中有一个用于无口令帐户的神奇值,该值为 U6aMy0wojraho(第6位字符是零,不是字母 O)。如果我们把这个值放在用户记录的密码字段内,不需要密码就可以进入到这个用户的账号。
为了验证这个魔法口令是否有效,我们手动(作为超级用户)将以下条目添加到 /etc/passwd 文件的末尾。请报告你是否不用输入任何口令就能登录 test 帐户,登录后检查一下您是否拥有 root 权限
test:U6aMy0wojraho:0:0:test:/root:/bin/bash
完成此任务后,请从密码文件中删除该记录。在下一个任务中,我们需要以普通用户身份实现同样的目标。显然,我们不能直接对密码文件进行修改,但可以利用特权程序中的竞态条件漏洞来达到同样的目标。
- 注意:过去,一些同学在攻击过程中意外清空了 /etc/passwd 文件(这可能是由于操作系统内核中的一些竞态条件问题)。如果你丢失了该文件,则将无法再次登录。为了避免这种麻烦,请备份原始密码文件或做好虚拟机的备份。这样,你就可以轻松恢复。