在前面的任务中,我们实际上是"作弊"了,因为我们要求程序减慢运行速度以便我们发动攻击。这显然不是一个真实的攻击。在这个任务中,我们将执行真正的攻击。在此之前,请确保从 vulp 程序中删除了 sleep() 语句。
竞态条件攻击中的典型策略是在目标程序运行时并行运行攻击程序,希望关键步骤能够在那个时间窗口内完成。当然,这样的概率是很低的,主要是因为那个时间窗口比较短。但我们可以反复进行攻击,直到成功为止。
在模拟攻击过程中,我们使用 "ln -s" 命令来创建或改变符号链接。现在我们需要在程序中做到这一点。可以使用 C 语言中的 symlink() 来创建符号链接。由于 Linux 系统不允许在一个链接已存在的情况下创建新的链接,因此需要先删除旧的链接。以下是一个如何先删除链接再使 /tmp/XYZ 指向 /etc/passwd 的 C 代码片段,请编写你的攻击程序。
unlink("/tmp/XYZ");
symlink("/etc/passwd","/tmp/XYZ");
因为我们需要多次运行存在漏洞的程序,所以我们将编写一个程序来做。为了避免手动为 vulp 程序输入内容,可以使用输入重定向。具体做法是将我们的输入保存在一个文件中,并通过 "vulp < inputFile" 来让 vulp 从该文件获取输入(也可以使用管道)。
攻击成功需要一段时间,因此我们需要一种自动检测攻击是否成功的办法。一个简单的办法是监控文件的时间戳。以下是一个 shell 脚本,它运行 "ls -l" 命令,该命令输出有关文件的信息,包括最后修改时间。通过比较此命令的输出与先前产生的输出,我们可以判断文件是否已被修改。
下面的程序循环运行存在漏洞的程序(vulp),它的输入是 echo 通过管道提供的。你需要决定实际输入的内容。如果攻击成功,即密码被修改了,则脚本将停止。你需要有些耐心,攻击成功通常会发生在 5 分钟内。
#!/bin/bash
CHECK_FILE="ls -l /etc/passwd"
old=$($CHECK_FILE)
new=$($CHECK_FILE)
while [ "$old" == "$new" ] ⬅ 检查 /etc/passwd 是否被修改
do
echo "your input" | ./vulp ⬅ 运行存在漏洞的程序
new=$($CHECK_FILE)
done
echo "STOP... The passwd file has been changed"
当你的脚本终止时,登录到 test 用户,验证是否具有 root 权限。然后在攻击程序的终端窗口中按 Ctrl-C 停止攻击程序。
如果10分钟后,您的攻击仍未成功,则可以停止攻击,并检查 /tmp/XYZ 文件的所有权。如果此文件的所有者成为 root 用户,请手动删除此文件,然后重试攻击,直到攻击成功。请在实验报告中记录这一观察结果。在任务 2.C 中,我们将解释原因并提供一种改进的攻击方法。