SEED Labs – Dirty COW Attack Lab

注意
本文最后更新于 2023-11-18,文中内容可能已过时。

在根目录下创建一个名为 zzz 的文件,将其权限设置为普通用户只读,并向文件中输入一些随机内容。

1
2
3
4
sudo touch /zzz
sudo chmod 644 /zzz
sudo gedit /zzz
cat /zzz

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/11/image-20231118111544896.png

1
2
ls -l /zzz
echo 99999 > /zzz

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/11/image-20231118111636587.png

如果我们尝试以普通用户的身份向这个文件写入,我们将会失败,因为这个文件只对普通用户可读。然而,由于系统中存在 Dirty COW 漏洞,我们可以找到一种方法来写入这个文件。我们的目标是将 “222222” 替换为 “******"。

1
2
3
gcc cow_attack.c -lpthread
a.out
cat /zzz

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/11/image-20231118112505365.png

cow_attack.c 中,write 线程的工作是在内存中将字符串 “222222” 替换为 “******"。由于映射内存属于 COW 类型,这个线程仅能修改映射内存的一个副本中的内容,这不会对底层的 /zzz 文件造成任何更改。madvise 线程丢弃映射内存的私有副本,以便页表可以重新指向原始的映射内存。如果在 write() 系统调用仍在运行时执行 madvise() 系统调用,原始的映射内存就可能被修改。

/etc/passwd 每条记录第三个字段指定了分配给用户的用户 ID(UID)值。UID 是访问控制的主要依据,root 用户的 UID 字段包含一个特殊值 0,这就是使其成为超级用户的原因,而不是其名称。我们将利用 Dirty COW 漏洞将一条记录的 UID 更改为 0。

创建一个名为 charlie 的新帐户:

1
sudo adduser charlie

帐户创建后,将在 /etc/passwd 中添加一条新记录:

1
cat /etc/passwd | grep charlie

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/11/image-20231118184433653.png

修改 cow_attack.c 如下,重新编译并运行。

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/11/image-20231118191642049.png

第一处修改将 /etc/passwd 作为目标文件,并在接下来将其映射到内存中。第二处修改将从映射内存中找到字符串 charlie:x:1001,把位置参数传给线程。第三处修改指定了写线程的修改结果。

获得 root shell:

1
su charlie

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/11/image-20231118191932226.png