SEED Labs – Dirty COW Attack Lab
目录
注意
本文最后更新于 2023-11-18,文中内容可能已过时。
相关链接
- Lab 网址:https://seedsecuritylabs.org/Labs_20.04/Software/Dirty_COW/
- 任务书:https://seedsecuritylabs.org/Labs_20.04/Files/Dirty_COW/Dirty_COW.pdf
- VM 手册(感觉对本实验帮助不大,可以另外看看这个版本的VM手册):https://web.ecs.syr.edu/~wedu/seed/Documentation/Ubuntu12_04_VM/Ubuntu12_04_VM_Manual.pdf
Task 1
在根目录下创建一个名为 zzz 的文件,将其权限设置为普通用户只读,并向文件中输入一些随机内容。
|
|
|
|
如果我们尝试以普通用户的身份向这个文件写入,我们将会失败,因为这个文件只对普通用户可读。然而,由于系统中存在 Dirty COW 漏洞,我们可以找到一种方法来写入这个文件。我们的目标是将 “222222” 替换为 “******"。
|
|
cow_attack.c 中,write 线程的工作是在内存中将字符串 “222222” 替换为 “******"。由于映射内存属于 COW 类型,这个线程仅能修改映射内存的一个副本中的内容,这不会对底层的 /zzz 文件造成任何更改。madvise 线程丢弃映射内存的私有副本,以便页表可以重新指向原始的映射内存。如果在 write() 系统调用仍在运行时执行 madvise() 系统调用,原始的映射内存就可能被修改。
Task 2
/etc/passwd 每条记录第三个字段指定了分配给用户的用户 ID(UID)值。UID 是访问控制的主要依据,root 用户的 UID 字段包含一个特殊值 0,这就是使其成为超级用户的原因,而不是其名称。我们将利用 Dirty COW 漏洞将一条记录的 UID 更改为 0。
创建一个名为 charlie 的新帐户:
|
|
帐户创建后,将在 /etc/passwd 中添加一条新记录:
|
|
修改 cow_attack.c 如下,重新编译并运行。
第一处修改将 /etc/passwd 作为目标文件,并在接下来将其映射到内存中。第二处修改将从映射内存中找到字符串 charlie:x:1001
,把位置参数传给线程。第三处修改指定了写线程的修改结果。
获得 root shell:
|
|