做什么setresuid()和setresgid()做什么?
为了更好地理解这个例子,我们需要看一下这两个函数以及它们所取的三个参数。
从这个答案(和凭据(7)手册页):
在 Linux 上,每个进程都有以下用户和组标识符:
真实用户 ID 和真实组 ID。这些 ID 确定谁拥有该进程。总而言之,这就是你。
有效用户 ID 和有效组 ID。内核使用这些 ID 来确定进程在访问消息队列、共享内存和信号量等共享资源时将拥有的权限。在大多数 UNIX 系统上,这些 ID 还确定访问文件时的权限。但是,Linux 使用文件系统 ID 来执行此任务。总而言之,这是您可以做的。
保存的 set-user-ID 和保存的 set-group-ID。这些 ID 在 set-user-ID 和 set-group-ID 程序中使用,以保存程序执行时设置的相应有效 ID 的副本。set-user-ID 程序可以通过在其真实用户 ID 和保存的 set-user-ID 中的值之间来回切换其有效用户 ID 来承担和放弃特权。总而言之,这就是你以前的样子。
此外,了解 SetUID-Bit 也很重要。它的作用是运行一个具有所有者权限的可执行程序,而不是调用它的人。
一个安全 nightmare
您的问题特别提到nightmare由rootSetUID-Bit 拥有并设置。这意味着任何被允许执行的用户nightmare基本上都将其执行为root. 这意味着所有的子进程nightmare——比如它们在调用时产生的system()——也被执行为root.
但现在真的,setresuid()做什么?
在这种情况下?没有什么。由于用户已经在执行事情root,它不会以任何方式影响进一步的利用。
你能用/dev/tty吗?
在这种情况下,这个问题没有多大意义。您必须查看相关的代码片段以了解字符串/dev/tty的来源。
if (open("/dev/tty", O_RDWR) != -1) {
fire();
rax = sub_4008d0();
}
这意味着程序正在尝试打开/dev/tty以进行读写,如果成功,则调用fire().
通过命名一个 bash 函数/dev/tty(),你不会得到想要的结果,因为它open()需要一个文件的路径作为它的第一个参数。它完全独立于bash并且没有 bash 函数的概念。
怎么样puts()?
同样,这没有多大意义。strings不是魔术,也不了解上下文。它所做的只是寻找一系列可打印的 ASCII 字符的字节。
puts() 只是一个输出字符串的 C 函数。
怎么样/usr/bin/aafire?
虽然我没有亲自尝试,但似乎实际上/usr/bin/aafire可以用来代替/usr/bin/sl -al. 如果这不正确,请发表评论,我将编辑这部分。
如果使用相对路径,它仍然有效吗?
是的,实际上甚至更好!system()内部调用sh -c,它必须解析$PATH要查找的变量sl。如果路径变量被修改为包含.或任何其他优先级高于的用户可写目录/usr/bin,那么我可以符号链接./sl到/bin/bash.
根 SUID 文件是哪种二进制/ELF 是否重要?
是的,因为 SetUID-Bit 在 shell scripts 中被忽略。它必须是本机可执行文件。