我们的目的是利用程序中的竞态条件漏洞来修改一个对我们来说不可写的文件 /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 文件(这可能是由于操作系统内核中的一些竞态条件问题)。如果你丢失了该文件,则将无法再次登录。为了避免这种麻烦,请备份原始密码文件或做好虚拟机的备份。这样,你就可以轻松恢复。