2

我一直在玩缓冲区溢出的乐趣。我已经能够运行一些简单的漏洞利用。我一直在使用“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 权限。尝试一下会很有趣。我在互联网上发现了一些声称能够做到这一点的 shell 脚本,但是,它们只产生 seg。当我尝试运行它们时出现故障。如果有人能给我任何提示,我将不胜感激,这是否可能。我也很欣赏任何有趣的 shell 脚本。

干杯。

4

1 回答 1

0

如果只是常规的缓冲区溢出,shell 代码就不能做任何原始程序不能做的事情,你需要一个实际的内核漏洞利用。

当您有以 root 身份运行的程序时,您通常会获得 root shell,因为它们具有+s 标志(设置 uid),或者因为它们是从系统外部某处获取用户输入的守护进程。

Setuid 程序是以不同于您启动它们的用户身份运行的程序。su例如,它由 root 拥有并设置了 +s,因此无论谁启动它,它都以 root 身份运行。然后,该程序会尝试确认您被允许提升权限并为您请求的用户生成一个 shell。如果存在缓冲区溢出漏洞,su并且您要在其中放入常规/bin/sh有效负载,那么您最终会得到一个 root shell。

例如,守护进程可以是一个以 root 身份运行以执行某些操作的 Web 界面(也许它可以关闭 pc)。如果它有一个您可以从计算机外部访问的漏洞,例如 HTTP 标头中的缓冲区溢出,您将再次能够生成一个 root shell。

您看到的 shell 可能使用了C 函数(或类似的函数),如果进程具有足够的特权setuid(),它可以做与 +s 相同的事情。

于 2014-05-01T15:42:07.087 回答