主页 > 网络知识 > 绕过Disable Functions来搞事情(2)

绕过Disable Functions来搞事情(2)

因为新进程启动将加载LD_PRELOAD中的.so文件,所以要存在可以控制PHP启动外部程序的函数并能执行,比如mail()、imap_mail()、mb_send_mail()和error_log()函数等

一般而言,利用漏洞控制 web 启动新进程 a.bin(即便进程名无法让我随意指定),新进程 a.bin 内部调用系统函数 b(),b() 位于 系统共享对象 c.so 中,所以系统为该进程加载共享对象 c.so,想办法在加载 c.so 前优先加载可控的 c_evil.so,c_evil.so 内含与 b() 同名的恶意函数,由于 c_evil.so 优先级较高,所以,a.bin 将调用到 c_evil.so 内的b() 而非系统的 c.so 内 b(),同时,c_evil.so 可控,达到执行恶意代码的目的。基于这一思路,常见突破 disable_functions 限制执行操作系统命令的方式为:

编写一个原型为 uid_t getuid(void); 的 C 函数,内部执行攻击者指定的代码,并编译成共享对象 getuid_shadow.so;

运行 PHP 函数 putenv()(用来配置系统环境变量),设定环境变量 LD_PRELOAD 为 getuid_shadow.so,以便后续启动新进程时优先加载该共享对象;

运行 PHP 的 mail() 函数,mail() 内部启动新进程 /usr/sbin/sendmail,由于上一步 LD_PRELOAD 的作用,sendmail 调用的系统函数 getuid() 被优先级更好的 getuid_shadow.so 中的同名 getuid() 所劫持;

达到不调用 PHP 的 各种 命令执行函数(system()、exec() 等等)仍可执行系统命令的目的。

之所以劫持 getuid(),是因为 sendmail 程序会调用该函数(当然也可以为其他被调用的系统函数),在真实环境中,存在两方面问题:

一是,某些环境中,web 禁止启用 sendmail、甚至系统上根本未安装 sendmail,也就谈不上劫持 getuid(),通常的 www-data 权限又不可能去更改 php.ini 配置、去安装 sendmail 软件;

二是,即便目标可以启用 sendmail,由于未将主机名(hostname 输出)添加进 hosts 中,导致每次运行 sendmail 都要耗时半分钟等待域名解析超时返回,www-data 也无法将主机名加入 hosts(如,127.0.0.1 lamp、lamp.、lamp.com)。

基于这两个原因,yangyangwithgnu 大佬找到了一个方式,在加载时就执行代码(拦劫启动进程),而不用考虑劫持某一系统函数,那我就完全可以不依赖 sendmail 了,详情参见:https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

利用方法

下面,我们通过 这道题来演示利用LD_PRELOAD来突破disable_functions的具体方法。

 

image-20210209160409300

 

构造如下拿到shell:

/?Ginkgo=ZXZhbCgkX1BPU1Rbd2hvYW1pXSk7 # 即eval($_POST[whoami]);

 

image-20210209160855754

 

但是无法执行命令:

 

image-20210209161231346

 

怀疑是设置了disable_functions,查看phpinfo:

/?Ginkgo=cGhwaW5mbygpOw== # 即phpinfo();

发现确实设置了disable_functions:

 

image-20210209161056356

 

下面尝试绕过。

需要去yangyangwithgnu 大佬的github上下载该项目的利用文件:https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

本项目中有这几个关键文件:

 

image-20210209161852114

 

bypass_disablefunc.php:一个用来执行命令的 webshell。

bypass_disablefunc_x64.so或bypass_disablefunc_x86.so:执行命令的共享对象文件,分为64位的和32位的。

bypass_disablefunc.c:用来编译生成上面的共享对象文件。

对于bypass_disablefunc.php,权限上传到web目录的直接访问,无权限的话可以传到tmp目录后用include等函数来包含,并且需要用 GET 方法提供三个参数:

cmd 参数:待执行的系统命令,如 id 命令。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!