漏洞描述
近日Webmin被發現存在一處遠程命令執行漏洞,經過分析後,初步猜測其爲一次後門植入事件。
Webmin是目前功能最強大的基於Web的Unix系統管理工具。管理員通過瀏覽器訪問Webmin的各種管理功能並完成相應的管理動作。據統計,互聯網上大約有13w臺機器使用Webmin。當用戶開啓Webmin密碼重置功能後,攻擊者可以通過發送POST請求在目標系統中執行任意命令,且無需身份驗證。
漏洞分析
首先分析msf給出的插件
根據插件,還原出poc如下:
當poc執行後,會向password_change.cgi發送POST請求
接下來看下password_change.cgi
位於37行到188行處,存在if-else語句
他們分別是
1、if ($wuser)
2、elsif ($gconfig{‘passwd_cmd’})
3、elsif ($in{‘pam’})
4、else
我們需要確認,程序到底進入那個if分支了
我們先print $wuser
從上圖打印結果看,wuser不爲空,所以這裏直接進入if ($wuser)分支
在if ($wuser)分支中,首先執行encrypt_password方法,如下圖紅框處
encrypt_password方法位於aclacl-lib.pl
該方法的底層,調用了crypt方法,如下圖,位於acl/md5-lib.pl中
傳入該crypt方法的第一個參數爲$passwd
打印此時passwd
可見值爲 AkkuS|dir,也就是POST請求中的old參數值
encrypt_password底層調用crypt進行編碼後,將計算值return,賦值給$enc,如下圖
由於我們傳入的pass(AkkuS|dir)並不是root用戶的密碼,下圖紅框處的eq結果爲false
因此觸發pass_error,系統需要把Failed to change password : The current password is incorrect這個信息反饋給用戶
但是注意上圖紅框處,在pass_error方法的傳參中,$in{’old’}被 qx/ /包裹
瞭解下qx/ /在perl中的用法:
qx執行外部程序,相當於“
也就是說,$in{’old’}的值會被執行。$in{’old’}就是POST中傳入的old參數,可控,所以這裏造成了任意代碼執行漏洞。
值得注意的是,POST中的old參數,是用戶修改密碼時所提交的舊密碼。衆所周知,密碼是一個字符串,而非可執行代碼,這裏將傳入的舊密碼字符串拿來執行,並非正常業務邏輯所爲。
不僅如此,$in{‘old’}的值在被執行後,會拼接在$text{‘password_eold’}參數後面,一同傳入pass_error中,如下圖
打印$text{‘password_eold’},查看它的值
當我們的$in{’old’}傳入”AkkuS|dir”時,dir執行後的返回值會拼接到The current password is incorrect後,傳入pass_error
接着,在pass_error中被打印出來
這裏不僅僅將用戶舊密碼拿來執行,更是通過pass_error,把返回值直接打印到返回值中,更加落實了被植入後門的猜測
對比官網 SourceForgegithub三個不同地方下載的Webmin代碼發現,官網 SourceForge存在代碼執行點,而github不存在
1、官網與SourceForge:
這裏存在qx包裹的$in{‘old’}
再來看github上下載的同版本Webmin代碼
Pass_error中竟然沒有被qx包裹的$in{‘old’}
對比如下:
也就是說,github上下載的Webmin不存在代碼執行漏洞,而官網和SourceForge上卻存在
被植入後門依據
1、 將用戶提交的舊密碼通過qx直接執行
正常業務邏輯中舊密碼爲字符串,而非可執行代碼,這裏將密碼字符串拿來直接執行,不符合邏輯
2、 將執行結果通過報錯打印到返回值中
如果僅僅是執行代碼,攻擊者無法判斷後臺執行是否成功,以及無法得到執行成功後的返回值,例如”dir”、”ifconfig”這類指令,是需要看回顯值的。因此,在這裏通過pass_error將執行成功的返回值隱蔽的返回
3、 官網 SourceForge代碼中存在漏洞,github代碼中無漏洞
通過以上三點,初步猜測,Webmin代碼被移植入後門
POC無需管道符
目前業界流傳的poc,都是需要使用管道符 “|”的形式:
例如msf給出的poc:”AkkuS|dir ”
但是經過漏洞深入的分析發現,old中的值最終會被直接執行,因此並不需要管道符
可以構造如下poc
有大佬寫了一個MSF利用模塊,鏈接:https://www.exploit-db.com/exploits/47230
GitHub上有個Python檢測腳本,鏈接:https://github.com/jas502n/CVE-2019-15107
Webmin官方對Webmin源代碼被植入後門的解釋說明:http://webmin.com/exploit.html