1.920版前的Webmin:Unauthenticated RCE (未經驗證的遠端程式碼執行漏洞)
這個0day攻擊漏洞被公告在@DEFCON AppSec Village
開發商已經修復此漏洞,請將webmin更新至1.930版。
Exploit-DB Link
CVE-Mitre Link
下載 defcon_webmin_unauth_rce.rb
在webmin介面中,必須允許「user password change」利用漏洞,這是唯一的條件。許多webmin管理器都支援下述功能,允許用戶使用舊密碼重新設置為新密碼。讓我們仔細看看這情形,在研究webmin程式時,我注意到一些有趣的.cgi檔案,其中一個是「password_change.cgi」。
此檔案的參數要求只有一個,就是將「miniserv.conf」設定檔中的「passwd_mode」值設為2。
所以管理員該如何啟動這設定?我們慢慢看下去…
在「Webmin> Webmin Configuration> Authentication」,應該檢查「Prompt users with expired passwords to enter a new one (提醒使用舊密碼的用戶設置新密碼)」。這就代表著將「miniserv.conf」中的「passwd_mode」值設為2。
參數值設定好之後,用戶可藉由驗證舊密碼來更改到期的密碼。那麼,漏洞到底在哪裡?我們回到「password_change.cgi」看看。
「password_change.cgi」會將舊密碼發送到「acl / acl-lib.pl」中的「encrypt_password」函數。
這個函數會呼叫另外一個函數「unix_crypt」。
而另外一邊,「unix_crypt」這函數又會被「Validate old password (驗證舊密碼)」呼叫。
這時候,我們利用驗證舊密碼的時候,透過讀取shadow檔使用「vertical bar (|)」。讓我們利用burp suite發送請求來查看一下。
我們發送一個帶有一般「POST」資料請求,並自然給出錯誤訊息「Failed to change password: The current password is incorrect (無法更改密碼:當前密碼不正確)」。
漏洞完全就藏在「舊」參數中。
用戶名稱、舊密碼或其他資訊是否正確根本無關緊要。
「password_change.cgi」檔會檢查伺服器上「舊」參數的資訊,甚至不會檢查用戶名稱是否正確與否。
我們將使用「vertical bar (|)」,並嘗試在伺服器上執行不同指令。
誠如結果所示,伺服器會執行「ifconfig」指令並顯示輸出。
現在我們將發送一個惡意payload參數到伺服器並接收shell session。
我會將利用「netcat」這個payload參數來證明,因為我已經知道「netcat」已存在於伺服器上。
正如大家所見,收到了shell。當我們執行「pwd」指令,我們可以看到「acl」資料夾正在執行惡意payload參數,因為這裡呼叫了這個函數。