0x00
背景介紹
Discuz官方于2017年8月1號(hào)發(fā)布最新版X3.4版本,在最新版本中修復(fù)了多個(gè)安全問(wèn)題。360CERT和360 0KEE Team遂對(duì)該事件進(jìn)行跟進(jìn)。
0x01 漏洞概述
360CERT和360 0KEE Team通過(guò)對(duì)比Discuz_X3.3_SC_UTF8與Discuz_X3.4_SC_UTF8版本,發(fā)現(xiàn)X3.3_SC_UTF8版本存在數(shù)個(gè)漏洞。本報(bào)告主要涉及兩個(gè)漏洞:
1.authkey生成算法的安全性問(wèn)題:
用戶在初次安裝軟件時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)authkey寫(xiě)入全局配置文件和數(shù)據(jù)庫(kù),之后安裝文件會(huì)被刪除。該authkey用于對(duì)普通用戶的cookie進(jìn)行加密等密碼學(xué)操作,但是由于生成算法過(guò)于簡(jiǎn)單,可以利用公開(kāi)信息進(jìn)行本地爆破。
2.后臺(tái)任意代碼執(zhí)行問(wèn)題:
管理員在后臺(tái)對(duì)數(shù)據(jù)庫(kù)連接密碼進(jìn)行修改時(shí),由于沒(méi)有對(duì)輸入進(jìn)行檢查,導(dǎo)致任意代碼執(zhí)行。
0x02 漏洞攻擊面影響
1.影響面
Discuz基本上是基于Cookie而非Session,所以一旦authkey被獲取,將導(dǎo)致Cookie的加密失效,進(jìn)而可以解密Cookie的auth字段獲取用戶的密碼。系統(tǒng)中其他邏輯也大量使用了authkey和authcode算法,該漏洞可導(dǎo)致一系列安全問(wèn)題:偽造ulastactivity可控制session持久時(shí)間;郵箱校驗(yàn)的hash參數(shù)被破解,導(dǎo)致任意郵箱注冊(cè)等。
另外一旦擁有一個(gè)管理員賬號(hào),則可利用后臺(tái)任意代碼執(zhí)行漏洞,在后臺(tái)Getshell進(jìn)而控制服務(wù)器。
經(jīng)過(guò)360CERT與360 0KEE Team研判后確認(rèn),漏洞風(fēng)險(xiǎn)等級(jí)高,影響范圍廣。
2.影響版本
通過(guò)代碼分析,確定涉及如下版本:
lDiscuz_X3.3_SC_GBK
lDiscuz_X3.3_SC_UTF8
lDiscuz_X3.3_TC_BIG5
lDiscuz_X3.3_TC_UTF8
lDiscuz_X3.2_SC_GBK
lDiscuz_X3.2_SC_UTF8
lDiscuz_X3.2_TC_BIG5
lDiscuz_X3.2_TC_UTF8
lDiscuz_X2.5_SC_GBK
lDiscuz_X2.5_SC_UTF8
lDiscuz_X2.5_TC_BIG5
lDiscuz_X2.5_TC_UTF8
3.修復(fù)版本
lDiscuz_X3.4_SC_GBK
lDiscuz_X3.4_SC_UTF8
lDiscuz_X3.4_TC_BIG5
lDiscuz_X3.4_TC_UTF8
0x03 漏洞詳情
1.authkey生成算法的安全性漏洞
Discuz_X3.3_SC_UTF8\upload\install\index.php中
authkey的生成方法如下:
$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函數(shù)
由于字符生成集合是固定的,且沒(méi)有重復(fù)字符,那么函數(shù)中每一次生成hash都唯一對(duì)應(yīng)了chars數(shù)組中的一個(gè)位置,而且是使用同一個(gè)seed生成的。
在之后的代碼中使用了同樣的random函數(shù):
$_config['cookie']['cookiepre'] = random(4).'_';
Cookie的前四個(gè)字節(jié)是已知的,并且使用了同樣的random函數(shù),那么思路很明顯:
通過(guò)已知的4位,算出random使用的種子,進(jìn)而得到authkey后10位。那剩下的就需要搞定前6位,根據(jù)其生成算法,只好選擇爆破的方式,由于數(shù)量太大,就一定要選擇一個(gè)本地爆破的方式(即使用到authkey而且加密后的結(jié)果是已知的)。
在調(diào)用authcode函數(shù)很多的地方都可以進(jìn)行校驗(yàn),在這里使用找回密碼鏈接中的id和sign參數(shù):
sign生成的方法如下:
function dsign($str, $length = 16){
return substr(md5($str.getglobal('config/security/authkey')), 0, ($length ? max(8, $length) : 16));
}
爆破authkey 的流程:
1.通過(guò)cookie前綴爆破隨機(jī)數(shù)的seed。使用php_mt_seed工具。
2.用seed生成random(10),得到所有可能的authkey后綴。
3.給自己的賬號(hào)發(fā)送一封找回密碼郵件,取出找回密碼鏈接。
4.用生成的后綴爆破前6位,范圍是0x000000-0xffffff,和找回密碼url拼接后做MD5求出sign。
5.將求出的sign和找回密碼鏈接中的sign對(duì)比,相等即停止,獲取當(dāng)前的authkey。
2.后臺(tái)任意代碼執(zhí)行漏洞
對(duì)比X3.4與X3.3版本發(fā)現(xiàn)漏洞存在于:
upload\source\admincp\admincp_setting.php
在2535行左右,在后臺(tái)對(duì)UCenter的密碼進(jìn)行更新的時(shí)候,沒(méi)有對(duì)輸入的密碼進(jìn)行檢查,直接寫(xiě)入到配置文件,導(dǎo)致我們可以閉合前面的單引號(hào)從而達(dá)到getshell的目的,這里僅做了一個(gè)連接測(cè)試,如果連接成功則寫(xiě)入配置文件。
0x04 漏洞利用驗(yàn)證
1.authkey生成算法的安全性漏洞
使用一個(gè)普通用戶登錄:
獲取cookie前4位:uie7
使用上述腳本整理成php_mt_seed的參數(shù)格式:
接著再用php_mt_seed生成seed:
這里php_mt_seed的參數(shù)是:
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多參數(shù)時(shí)是4個(gè)數(shù)為一組,含義如下圖:
我們拿到的是第11-14次的隨機(jī)數(shù),要去估算第1-10次的,所以前面要空10組位置。
得到所有的種子后(約250-300),使用如下腳本處理得到所有可能的random(10):
然后重置密碼,得到找回鏈接:
整理后執(zhí)行爆破腳本:
最后破解出來(lái)為: 7e2000vULc0oQETA
對(duì)比數(shù)據(jù)庫(kù)中數(shù)據(jù),可以看出是一致的。
2.后臺(tái)任意代碼執(zhí)行漏洞
在管理員輸入U(xiǎn)Center的密碼時(shí),對(duì)于用戶的輸入沒(méi)有過(guò)濾,導(dǎo)致了輸入的數(shù)據(jù)直接寫(xiě)入文件中,利用步驟如下:
1.以管理員身份登錄后臺(tái)
2.設(shè)置一個(gè)可以遠(yuǎn)程訪問(wèn)的mysql,密碼為:123');phpinfo();//
3.修改UCenter 數(shù)據(jù)庫(kù)密碼為上述密碼
4.更新后即Getshell
配置文件中的內(nèi)容也被修改:
0x05 修復(fù)建議
Discuz官方已經(jīng)在2017年8月1日發(fā)布最新版,請(qǐng)用戶檢查自己使用的版本,并及時(shí)更新至最新版。
0x06 時(shí)間線
2017-08-01 Discuz官方安全更新
2017-08-07 360CERT和0KEE Team完成對(duì)新版本的首次分析
2017-08-22 360CERT和0KEE Team完成對(duì)后續(xù)分析并形成報(bào)告
0x07 參考文檔
https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/8446bd9e897bb19672389cc4aed42716ccd0f537
https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/bb600b8dd67a118f15255d24e6e89bd94a9bca8a
http://xintu.openwall.com/php_mt_seed/
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長(zhǎng)刪除。
轉(zhuǎn)載請(qǐng)注明出處http://www.quickersubmitter.com/xintu/9398.html