?

Aug 24 2017

【漏洞分析】Discuz X3.3補丁安全分析

首頁 » 漏洞收集 » 【漏洞分析】Discuz X3.3補丁安全分析   

作者:360網絡安全響應中心 & 360信息安全部0KEE Team


0x00 背景介紹


Discuz官方于2017年8月1號發布最新版X3.4版本,在最新版本中修復了多個安全問題。360CERT和360 0KEE Team遂對該事件進行跟進。


0x01 漏洞概述


360CERT360 0KEE Team通過對比Discuz_X3.3_SC_UTF8Discuz_X3.4_SC_UTF8版本,發現X3.3_SC_UTF8版本存在數個漏洞。本報告主要涉及兩個漏洞: 

1. authkey生成算法的安全性問題:

用戶在初次安裝軟件時,系統會自動生成一個authkey寫入全局配置文件和數據庫,之后安裝文件會被刪除。該authkey用于對普通用戶的cookie進行加密等密碼學操作,但是由于生成算法過于簡單,可以利用公開信息進行本地爆破。

2. 后臺任意代碼執行問題:

管理員在后臺對數據庫連接密碼進行修改時,由于沒有對輸入進行檢查,導致任意代碼執行。


0x02 漏洞攻擊面影響


1. 影響面

Discuz基本上是基于Cookie而非Session,所以一旦authkey被獲取,將導致Cookie的加密失效,進而可以解密Cookie的auth字段獲取用戶的密碼。系統中其他邏輯也大量使用了authkey和authcode算法,該漏洞可導致一系列安全問題:偽造ulastactivity可控制session持久時間;郵箱校驗的hash參數被破解,導致任意郵箱注冊等。

另外一旦擁有一個管理員賬號,則可利用后臺任意代碼執行漏洞,在后臺Getshell進而控制服務器。

經過360CERT與360 0KEE Team研判后確認,漏洞風險等級高,影響范圍廣

2. 影響版本

通過代碼分析,確定涉及如下版本:

Discuz_X3.3_SC_GBK

Discuz_X3.3_SC_UTF8

Discuz_X3.3_TC_BIG5

Discuz_X3.3_TC_UTF8

Discuz_X3.2_SC_GBK

Discuz_X3.2_SC_UTF8

Discuz_X3.2_TC_BIG5

Discuz_X3.2_TC_UTF8

Discuz_X2.5_SC_GBK

Discuz_X2.5_SC_UTF8

Discuz_X2.5_TC_BIG5

Discuz_X2.5_TC_UTF8

3. 修復版本

Discuz_X3.4_SC_GBK

Discuz_X3.4_SC_UTF8

Discuz_X3.4_TC_BIG5

Discuz_X3.4_TC_UTF8


0x03 漏洞詳情


1. authkey生成算法的安全性漏洞

2.png

Discuz_X3.3_SC_UTF8\upload\install\index.php


$authkey = substr(md5($_SERVER['SERVER_ADDR'].$_SERVER['HTTP_USER_AGENT'].$dbhost.$dbuser.$dbpw.$dbname.$username.$password.$pconnect.substr($timestamp, 0, 6)), 8, 6).random(10);



可以看出authkey主要由兩部分組成:

MD5的一部分(前6位) + random生成的10位

跟入random函數


3.png



由于字符生成集合是固定的,且沒有重復字符,那么函數中每一次生成hash都唯一對應了chars數組中的一個位置,而且是使用同一個seed生成的。

在之后的代碼中使用了同樣的random函數:



$_config['cookie']['cookiepre'] = random(4).'_';



Cookie的前四個字節是已知的,并且使用了同樣的random函數,那么思路很明顯:

通過已知的4位,算出random使用的種子,進而得到authkey后10位。那剩下的就需要搞定前6位,根據其生成算法,只好選擇爆破的方式,由于數量太大,就一定要選擇一個本地爆破的方式(即使用到authkey而且加密后的結果是已知的)。

在調用authcode函數很多的地方都可以進行校驗,在這里使用找回密碼鏈接中的id和sign參數:

sign生成的方法如下:



function dsign($str, $length = 16){
    return substr(md5($str.getglobal('config/security/authkey')), 0, ($length ? max(8, $length) : 16));
}




爆破authkey 的流程:

1.通過cookie前綴爆破隨機數的seed。使用php_mt_seed工具。

2.用seed生成random(10),得到所有可能的authkey后綴。

3.給自己的賬號發送一封找回密碼郵件,取出找回密碼鏈接。

4.用生成的后綴爆破前6位,范圍是0x000000-0xffffff,和找回密碼url拼接后做MD5求出sign。

5.將求出的sign和找回密碼鏈接中的sign對比,相等即停止,獲取當前的authkey。

2. 后臺任意代碼執行漏洞

對比X3.4與X3.3版本發現漏洞存在于:

upload\source\admincp\admincp_setting.php


4.png


2535行左右,在后臺對UCenter的密碼進行更新的時候,沒有對輸入的密碼進行檢查,直接寫入到配置文件,導致我們可以閉合前面的單引號從而達到getshell的目的,這里僅做了一個連接測試,如果連接成功則寫入配置文件。

5.png


6.png



0x04 漏洞利用驗證


1. authkey生成算法的安全性漏洞

使用一個普通用戶登錄:

7.png


獲取cookie前4位:uie7

10.png

使用上述腳本整理成php_mt_seed的參數格式:


t8.png


接著再用php_mt_seed生成seed:



9.png


這里php_mt_seed的參數是:


0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 610 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 56 56 0 61 44 44 0 61 40 40 0 61 33 33 0 61





在這里需要注意:

php_mt_seed多參數時是4個數為一組,含義如下圖:


13.png



我們拿到的是第11-14次的隨機數,要去估算第1-10次的,所以前面要空10組位置。

得到所有的種子后(約250-300),使用如下腳本處理得到所有可能的random(10):


14.png


然后重置密碼,得到找回鏈接:

15.png


整理后執行爆破腳本:


16.png


最后破解出來為: 7e2000vULc0oQETA

對比數據庫中數據,可以看出是一致的。


17.png


2. 后臺任意代碼執行漏洞

在管理員輸入UCenter的密碼時,對于用戶的輸入沒有過濾,導致了輸入的數據直接寫入文件中,利用步驟如下:

1.以管理員身份登錄后臺

2.設置一個可以遠程訪問的mysql,密碼為:123');phpinfo();//

3.修改UCenter 數據庫密碼為上述密碼

4.更新后即Getshell

18.png


21.png


19.png


配置文件中的內容也被修改:

207.png


0x05 修復建議


Discuz官方已經在2017年8月1日發布最新版,請用戶檢查自己使用的版本,并及時更新至最新版。


0x06 時間線


2017-08-01  Discuz官方安全更新

2017-08-07  360CERT和0KEE Team完成對新版本的首次分析

2017-08-22  360CERT和0KEE Team完成對后續分析并形成報告


0x07 參考文檔


https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/8446bd9e897bb19672389cc4aed42716ccd0f537

https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/bb600b8dd67a118f15255d24e6e89bd94a9bca8a

http://www.openwall.com/php_mt_seed/

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽: Discuz漏洞

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «如何使用C#加密攻擊載荷來繞過殺毒軟件 | Xshell后門事件中用到的DNS Tunneling技術分析»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖