导语:Linux中的动态链接共享对象库(dynamically linked shared object libraries)有点像Windows的DLL文件,与Windows中的DLL植入攻击类似,可以利用弱文件权限的共享库执行任意代码,进行Linux提权。
如果将RPATH和弱文件权限提升到系统权限?
Linux应用使用动态链接共享对象库(dynamically linked shared object libraries)在不用重写代码的情况下,提供给应用同样的功能——有点像Windows的DLL文件。与Windows中的DLL植入攻击类似,Linux弱文件权限的共享库可以用来执行任意代码,并黑进Linux系统。
OS怎样找到共享库?
当使用共享库的应用运行时,操作系统就会以下面的顺序寻找库:
1. rpath-link选项中指定的目录;
2. –rpath选项中指定的目录;
3. LD_RUN_PATH;
4. LD_LIBRARY_PATH;
5. DT_RUNPATH或DT_RPATH中的目录;
6. /lib and /usr/lib;
7. /etc/ld.so.conf下的目录。
如何获取Root权限?
如果攻击者可以用恶意的共享库取代原来的共享库,那么当应用运行时,就可以加载恶意代码,并以运行者的权限运行恶意代码。如果应用是以root用户权限运行的,那么整个主机就沦陷了。
攻击者可能需要耐心等待应用的运行,或者用社会工程学的技巧来诱导系统管理员执行运行恶意代码的应用。如果应用在开始菜单中被调用,比如cron或者其他进程,那么权限提升利用过程会快很多。
可以用ldd工具来找出使用共享库的二进制文件:
下面的攻击路径可以识别一个二进制文件有没有使用易受攻击的共享库文件。
示例
用RPATH和弱文件权限编译的二进制文件可以进行root提权。
Ldd上运行二进制文件证明了该文件使用了共享库:
当objdump运行时,可以看到它是被/tmp/program/main处的静态RPATH编译的:
/tmp分区默认是可写的,如果创建分区时没有NOEXEC标志,攻击者就可以在contextBinary运行时写入恶意的共享库。在有问题的服务器上,有个root权限的cron任务刚刚执行了有漏洞的二进制文件:
在这个例子中我们用metasploit框架来创建可以在系统上植入的共享库。首先在攻击者的主机上设立handler
这时,恶意库就创建了。利用的第一步是操作系统寻找共享库可以模仿的库:
之前我用msfvenom创建的有相同payload的共享库作为handler:
在被攻击的主机上,创建了目录结构而且库在可写的:
一旦cron任务运行,恶意库就会执行。在metasploit控制台上有以root权限运行的shell会话,如图所示:
如何防御?
如果是系统管理员:
通过若文件权限来确保低权限的用户不能对下面位置进行写操作:
· RPATH或RUNPATH特定的位置;
· LD_RUN_PATH和LD_LIBRARY_PATH环境变量的特定位置;
· /lib或/usr/lib;
· /etc/ld.so.conf中特定的位置。
如果是开发者:
如果库用了RPATH或RUNPATH编译,指定该目录为只有拥有者和root可以写入。或者库可以移到/lib或/ur/lib目录下,然后用chrpath工具从编译的二进制文件中移除RPATH或RUNPATH。
· 以应用所需的最小权限执行应用,root权限调用的恶意二进制文件会黑掉整个主机。
· 考虑在/tmp分区中设定NOEXEC选项。
总结
文中证明了一种利用弱文件权限和硬编码的RPATH来进行Linux主机提权方法的可行性。当然,共享库也可以以其他的方式被利用。