webmin遠程命令執行漏洞(cve-2019-15107)深入分析

漏洞描述

近日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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章