一次简单的thinkphp5渗透

admin 2024年5月26日19:44:06评论7 views字数 3631阅读12分6秒阅读模式

一.    利用thinkphp报错获取源码信息

在开启debug报错的情况下。

通过一些接口的报错,我们能确定thinkphp版本(5.0.24)和部分源码。


比如登录口,我们可以使password[]=123456传输数组,md5()无法处理数组来报错。


一次简单的thinkphp5渗透

比如不传某个关键参数,对方没写对于此参数为空的处理,就会泄露源码信息。

一次简单的thinkphp5渗透

这个newapi很显然是二开的主要代码,其非常多次的使用了$_GET原生传参,不过可惜的是5.0.24已经完全修复了exp注入。


二.    源码代码审计

泄露了部分源码,就可以找关键字,从而去搜源码。这里目标是二开的,而且做的比较粗糙,我搜到了二开前的原始源码。

后台有数据库备份功能,这个功能基本没什么问题,不会产生注入或者二次注入。但有个小技巧可以清空库中的值,包括admin账户本身。算是一个破坏性漏洞,后面会提到。

一次简单的thinkphp5渗透

后台还有两个不加掩饰的任意文件上传。

一次简单的thinkphp5渗透

权限校验部分是比较流行的一段带eval的代码,部分cms在这段代码上栽过跟头,不过这里用的是field('url'),导致根本不存在condition键,所以这部分代码是完全无意义的。无法利用。

一次简单的thinkphp5渗透

以及public/static目录存在很多富文本编辑器。

一次简单的thinkphp5渗透

其中ueditor存在远程图片下载,虽然校验比较严格,但还是比较容易进行布尔SSRF,无法控制内容且协议有限。而kindeditor我以前的一篇文章提到过如果未配置上传文件夹,则可以进行目录读取。

一次简单的thinkphp5渗透

/static/addons/editor/kindeditor/php/file_manager_json.php?path=www/

一次简单的thinkphp5渗透

目录读取有什么用法呢?又是在之前的一篇文章中,我们演示了如何用一个Nday去读session,这次也是一样的,读tmp目录的session就行,甚至开了open_basedir都无法阻止读/tmp的session。

一次简单的thinkphp5渗透

因为session必须有值,也就是说可以根据session文件的大小来判断是否为正确且存活的session,当然也可以直接爆破,还是比较简单和轻松进入后台的。

一次简单的thinkphp5渗透

此外,如果对方备份过数据库,也可以读/www/wwwroot/xxx/public/data目录,然后下载备份的sql文件,解md5进行登录。


三.    getshell

试试源代码中存在的文件上传,发现对方丧心病狂的删除了thinkphp自带的file类。

一次简单的thinkphp5渗透

但在别处找到了一个上传点,利用报错看了眼源码,写法过于直接,无法利用。

一次简单的thinkphp5渗透

反复琢磨后,唯一可以getshell的点只能是反序列化,稍微细心点可以发现,其上传配置和email配置是用的序列化数据储存在数据库中。

一次简单的thinkphp5渗透

也就是说我们只要获取数据库权限,修改ob_system表,打入thinkphp5.0.24的反序列化payload即可。
因为我们具有目录读取,在没有open_basedir()的情况下,可以读取/www/server/phpmyadmin目录,可以发现宝塔phpmyadmin的随机目录。

一次简单的thinkphp5渗透

然后去888端口访问phpmyadmin,如果能成功爆破登录,可以修改ob_system.email_server字段。

一次简单的thinkphp5渗透

生成thinkphp5.0.24反序列化poc,并转为hex编码,以避免x00字符问题,在phpmyadmin中执行如下语句。

UPDATE `ob_system` SET `value` =0xAAAAAAAAAAAAAAAA WHERE `ob_system`.`name` = 'email_server'


最后访问/admin/config/email触发即可getshell。
爆破也有一定技巧,因为这种服务器的数据库账户名和密码可能都跟数据库名挂钩,可以通过目录读取获取mysql的data文件来获取数据库名,也可以通过让数据库报错,thinkphp debug也会回显数据库名。
不过对方也很大可能会利用宝塔随机生成mysql密码。


当然,获取数据库权限的方式的多种多样的,除了爆破之外,如果后台存在数据库功能,我们可以利用之前提到过的破坏性漏洞清空admin账户,让站长无法登录后台,这样他就有可能通过phpmyadmin去重置admin账户,而/tmp目录就会留存phpmyadmin的session,再用目录读取获取之。有点类似存储XSS的思路。

清空数据库操作如下,先正常备份ob_admin。

一次简单的thinkphp5渗透

下载SQL文件如下。

一次简单的thinkphp5渗透

备份接口传参如果稍微修改一下,备份出来的SQL是这样的。

一次简单的thinkphp5渗透

一次简单的thinkphp5渗透

很明显,如果将此SQL还原,先删除ob_admin表,再创建ob_admin表,后续INSERT INTO就执行不了了,效果等同于清空ob_admin表,导致无法登录。

我们还可以利用phpmyadmin/ueditor SSRF/mysql外联来ddos攻击mysql,达到mysql短暂瘫痪的结果,如果能做到,thinkphp5.0.24开启debug就会直接将数据库账户密码抛错带出。效果如下。

一次简单的thinkphp5渗透


以及可能的堆叠注入问题,thinkphp的PDO还是经常出现堆叠注入的,不过这个cms上暂时没发现。

四.    后续渗透

在获取了webshell权限之后,如果想进一步收集证据和消除尾巴,通常还需要提权。
CVE-2021-4034是一个很难得的,在linux环境非常通杀的提权exp。在目标环境中(kernel 3.10.0-327/CentOS 7.2.1511),我用此exp提权成功。
https://github.com/arthepsy/CVE-2021-4034

pkexecversionrpm -qa polkit
CentOS 6:polkit-0.96-11.el6_10.2CentOS 7:polkit-0.112-26.el7_9.1CentOS 8.0polkit-0.115-13.el8_5.1CentOS 8.2polkit-0.115-11.el8_2.2CentOS 8.4polkit-0.115-11.el8_4.2Ubuntu 20.04 LTSpolicykit-1 - 0.105-26ubuntu1.2Ubuntu 18.04 LTSpolicykit-1 - 0.105-20ubuntu0.18.04.6Ubuntu 16.04 ESMpolicykit-1 - 0.105-14.1ubuntu0.5+esm1Ubuntu 14.04 ESMpolicykit-1 - 0.105-4ubuntu3.14.04.6+esm1

这儿有个小坑,如果在目标上编译,低权限账户gcc会报错cannot execute 'cc1',这是环境变量的问题。

find /usr/lib/gcc -name "*cc1"export PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:$PATH


然后就是日志问题。
1,/root/.bash_history

set +o history


不记录整个shell期间的操作,但是这样会导致自己shell操作的时候不能↑。

history -c

将整个shell期间的操作历史删除,操作结束后用一次就行了,推荐使用。
注意如果想单纯的替换或者删除.bash_history,需要登录两次,或者使用非shell的手段去删。因为整个shell的操作历史会默认缓存,exit的一瞬间保存到.bash_history,必须再登录一次才能删除。

2,nginx日志
/www/wwwlogs/xxx.log
/www/wwwlogs/xxx.error.log
webshell的操作,后台登录,web漏洞利用都会在这里记录。

3,宝塔waf日志
/www/wwwlogs/btwaf/xxx.log
如果在渗透过程中触发过宝塔waf,就需要清理。

4,thinkphp日志
/www/wwwroot/xxx/runtime/log
如果渗透过程中让thinkphp报错,mysql报错,这里也需要清理。

5,cms日志
一般cms后台也会有日志记录管理员操作,储存在mysql中。

6,宝塔面板登录日志
/www/server/panel/data/default.db
如果进过宝塔面板,也会存在日志。

7,宝塔面板web日志
/www/server/panel/logs/request/

如果对方使用的正版宝塔,此文件中可能存在/www/server/panel/data/userinfo.json微信号或者手机号。
如果想权限维持,宝塔面板也是个不错的选择,bt——14可以看到宝塔面板的随机地址和初始密码。如果对方修改过初始密码,就必须在/www/server/panel/data/default.db中创建一个新的账户。
如果不知道宝塔的salt规律,可以先备份default.db,然后bt——5修改密码,再将原来的账户加上去即可,效果如下。

一次简单的thinkphp5渗透



原文始发于微信公众号(珂技知识分享):一次简单的thinkphp5渗透

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月26日19:44:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一次简单的thinkphp5渗透http://cn-sec.com/archives/2780508.html

发表评论

匿名网友 填写信息