我一直在研究缓冲区溢出问题。我已经能够运行一些简单的漏洞利用。我一直通过使用“C”代码来执行此操作,该代码将包含 shell 代码的字符串转换为函数指针。这样做对我来说很有趣,例如我从来没有假设函数指针可以允许用户执行代码,这些代码甚至没有硬编码在源代码中。下面是一个简单的例子:
#include <unistd.h>
char code[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb"
"\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89"
"\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd"
"\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f"
"\x73\x68\x4e\x41\x41\x41\x41\x42\x42\x42\x42";
int main(int argc, char **argv)
{
/*creating a function pointer*/
char (*func)();
func = (char (*)()) code;
func();
}
这一小段代码将在 64 位 Linux 上生成一个 shell。问题是:是否可以使用 shell 脚本获得 root 权限。尝试一下会很有趣。 我在 Internet 上发现了一些声称能够执行此操作的 shell 脚本,但是它们仅生成段。当我尝试运行它们时出现故障。 如果有人能给我任何提示,我将不胜感激,这是否可能。 如果有任何有趣的 shell 脚本可供使用,我也将不胜感激。
干杯。
最佳答案
只有一个常规的缓冲区溢出,shell 代码不能做任何原始程序不能做的事情,你需要一个真正的内核漏洞。
当您有以 root 身份运行的程序时,您通常会获得 root shell,因为它们有 +s flag (设置 uid)或者因为它们是从系统外部某处获取用户输入的守护进程。
Setuid 程序是以不同于您启动它们的用户身份运行的程序。以 su
为例,它属于 root 并设置了 +s,因此无论谁启动它,它都以 root 身份运行。然后该程序会尝试确认您是否被允许提升权限并为您请求的用户生成一个 shell。如果 su
中存在缓冲区溢出漏洞,并且您要将常规 /bin/sh
有效载荷放入其中,您最终会得到一个 root shell。
守护进程可以是一个以 root 身份运行以执行某些操作的网络界面(也许它可以关闭电脑)。如果它有一个您可以从计算机外部访问的漏洞,例如 HTTP header 中的缓冲区溢出,您将再次能够生成 root shell。
您看到的 shell 可能使用了 setuid()
C 函数(或类似函数),它可以做与 +s 相同的事情 如果进程有足够的特权.
关于linux - 64 位 Linux 上的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19446100/