在某次授权的攻防演练项目中遇到了目标使用shuipfcms系统,接着对shuipfcms进行本地搭建后代码审计,最终获取目标权限。
背景
在某次授权的攻防演练项目中遇到了目标使用shuipfcms系统,接着对shuipfcms进行本地搭建后代码审计,最终获取目标权限。
思路介绍
- 某一处泄露Authcode
- 利用Authcode加密cloud_token
- thinkphp缓存getshell
代码分析
Authcode泄露
在shuipf/Application/Attachment/Controller/AdminController.class.php:37
swfupload函数是不需要鉴权就可以直接访问到的,可以看到红色箭头处,当我们的密钥不对的时候,会直接打印出系统的AuthCode。
如图所示:
我们得到这个AuthCode后可以干什么呢?
cloud_token解密
在shuipf/Application/Api/Controller/IndexController.class.php:17
这里我们POST进来一个token,然后调用authcode函数进行解密:
当key为空的时候,就会用authcode来解密了。
而这个CLOUD_USERNAME默认是没设置的,属于云平台的配置选项,所以默认条件下,这个地方的解密是用authcode来解密的。
上文已经泄露了authcode,所以这里解密后的内容也是我们可控的了。
然后看一下解密后的操作:
调用了一个S函数,这个是TP3内置的缓存操作函数。这里的键值是getTokenKey函数的返回值,跟进一下:shuipf/Libs/System/Cloud.class.php:161
OK,这个值还是比较好计算的。
thinkphp缓存getshell
然后看一下缓存的处理:
shuipf/Core/Library/Think/Cache/Driver/File.class.php:120
首先是文件名的生成方式,第一个红色箭头处,跟进:
这里的DATA_CACHE_KEY默认为空,不用管,但是$this->options['prefix']是有的。看一下生成方式:
就是三个长度的随机字母加一个下划线。这个就比较有难度了需要猜测和爆破了。
然后就是一个写入反序列化数据的操作。
我在本地测了一下,数据像这样:
成功写入了webshell。但是实战中的前缀需要爆破,win不区分大小写,会很快,linux则稍微麻烦一点。比如我本地是rDe_。
利用过程
首先我们发送报文获取authcode:
然后我们生成token发送:
响应报文中有验证通过就证明成功了。然后我们就需要找到我们的缓存文件了。
这次比较幸运,目标有列目录的漏洞。
然后我们访问缓存文件即可成功getshell。
注:zc.com解析为127.0.0.1为本地环境
- 本文作者: Duck
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/349
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!