SEED Labs – Environment Variable and Set-UID Program Lab
相关链接
- Lab 网址:https://seedsecuritylabs.org/Labs_20.04/Software/Environment_Variable_and_SetUID/
- 任务书:https://seedsecuritylabs.org/Labs_20.04/Files/Environment_Variable_and_SetUID/Environment_Variable_and_SetUID.pdf
- VM 手册:https://github.com/seed-labs/seed-labs/blob/master/manuals/vm/seedvm-manual.md
Task 1
使用printenv
或env
打印环境变量:
使用export
和unset
设置或取消设置环境变量:
Task 2
编译 myprintenv.c,运行结果保存到 file,再改变程序使父进程打印环境变量,运行结果保存到 file2。
结论:file 与 file2 的内容相同,因为运行 a.out 时,子进程继承父进程所有的环境变量。
Task 3
编译 myenv.c,运行结果保存到 file,再改变execve()
的第三个参数为 environ,运行结果保存到 file2。
结论:将 NULL 传入execve()
函数,新进程不包含任何环境变量;将 environ 传入execve()
函数,当前进程所有环境变量传递给新程序。
Task 4
system()
函数使用execl()
来执行/bin/sh
; execl()
调用execve()
,并将环境变量数组传递给它。 因此,使用system()
,调用进程的环境变量被传递到新程序/bin/sh
。编译 2_4.c 并运行验证。
|
|
Task 5
|
|
编译上述程序,将其所有权更改为 root,并使其成为 Set-UID 程序。使用export
设置如下环境变量。
可以发现LD_LIBRARY_PATH
在 Set-UID 进程中被屏蔽掉了。
Task 6
编译如下程序,将其所有者更改为 root,并将其设为 Set-UID 程序。
|
|
|
|
恶意代码如下:
|
|
-p
选项告诉 bash 不要使用保护机制,否则 bash 会主动放弃 root 权限。
编译 ls.c 并更改 PATH 环境变量:
|
|
执行 2_6:
恶意代码以 root 权限运行。
Task 7
|
|
编译:
|
|
设置LD_PRELOAD
环境变量:
|
|
编译 myprog.c:
|
|
myprog 为常规程序,并以普通用户身份运行:
将 myprog 设为 Set-UID root 程序,并以普通用户身份运行:
睡眠 1 秒。
将 myprog 设为 Set-UID root 程序,在 root 账户下再次导出LD_PRELOAD
环境变量并运行:
将 myprog 设为 Set-UID user1 程序(即所有者是 user1,这是另一个用户帐户),在另一个用户帐户(非 root 用户)中再次导出LD_PRELOAD
环境变量并运行它:
睡眠 1 秒。
修改 myprog.c 如下:
|
|
重复上述过程:
当 Set-UID 进程的真实用户 ID 和有效用户 ID 不一样时,将忽略环境变量LD_PRELOAD
和LD_LIBRARY_PATH
。
Task 8
编译 catall.c,使其成为 root 拥有的 Set-UID 程序。将 /bin/sh 链接到另一个没有防御对策的 shell —— zsh。
获得 root shell。
使用execve()
而非system()
:
攻击失败。
system()
不支持数据和代码的分离,因此攻击者可以把新的指令嵌入输入中,导致攻击代码被执行。execve()
将输入分成代码和数据,因此攻击者的输入无法变成代码。
Task 9
编译 cap_leak.c,将其所有者更改为 root,并将其设为 Set-UID 程序。
利用文件描述符,成功以普通用户身份写入 /etc/zzz 文件。