360安全路由某版本固件源码中发现多处安全隐患(PHP代码逻辑)

编号92164
Urlhttp://www.wooyun.org/bug.php?action=view&id=92164
漏洞状态厂商已经确认
漏洞标题360安全路由某版本固件源码中发现多处安全隐患(PHP代码逻辑)
漏洞类型应用配置错误
厂商奇虎360
白帽子Matt
提交日期2015-01-16 19:28:00
公开日期2015-03-02 19:28:00
修复时间(not set)
确认时间2015-01-19 00:00:00
Confirm Spend3
漏洞标签
关注数0
收藏数0
白帽评级
白帽自评rank20
厂商评级
厂商评rank7
漏洞简介
360安全路由某版本固件源码中发现多处安全隐患
漏洞细节

/*
由于手头上没有360路由,暂且一切都是从代码层面上来看的。
理论上漏洞是存在的。
*/
先用binwalk导出了360路由的固件
发现其用的是php写的web模块,
其中指令的交互是与本机的5000端口进行通信实现的,
包括重启等动作。

POC

并且验证代码存在多处漏洞
1 unserialize
在userclient的模块中,
验证用户的时候,首先通过读取cookie中的qty的值进行unserialize
所以这里存在一个潜在的威胁

```PHP
public function GetData()
{
global $_COOKIE;
$ArrRet = Array();
$sQRT = array_key_exists( self::COOKIE_NAME, $_COOKIE ) ? $_COOKIE[ self::COOKIE_NAME ] : '';
$sQRT = trim( $sQRT );
if ( ! empty( $sQRT ) )
{
$sQRT = @ stripslashes( $sQRT );
$ArrTmp = @ unserialize( $sQRT );//存在的点
if ( is_array( $ArrTmp ) && count( $ArrTmp ) )
{
$ArrRet = $ArrTmp;
}
}
return $ArrRet;
}
```


2 dev_mod
360的开发者模式存在俩种判断模式
1 手动开启了开发者模式
2 HTTP_HOST=127.0.0.1
在第二种模式中 我们完全可以通过
GET http://192.168.1.1/ HTTP/1.0
Host: 127.0.0.1
这样的请求达到请求的HOST是127.0.0.1
从而绕过他对HOST的判断

```PHP
function _is_dev_env() {
if (defined ( '_is_dev_env_cache' )) {
return true;
}

if (0 == strcasecmp ( '127.0.0.1', $_SERVER ['HTTP_HOST'] )) { //漏洞点
define ( '_is_dev_env_cache', 1 );
return true;
}

return false;
}
```


绕过开发者模式到底能看什么呢,就不用细说了,看下面的文件列表大概就知道了

[email protected]:~/Desktop/_360_Original_0605.bin.extracted/squashfs-root# grep -n -r "IsDebug" *
grep: home: 没有那个文件或目录
www/mag/incfsmag/CMagWifi.php:28: if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:64: if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:79: if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:118: if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:135: if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:165: if ($this->IsDebug()) {
www/mag/incfsmag/CMagNetwork.php:49: if ( parent::IsDebug() ) {
www/mag/incfsmag/CMagNetwork.php:102: if ( parent::IsDebug() ) {
www/mag/incfsmag/CMagNetwork.php:149: if ( parent::IsDebug() )
www/mag/incfsmag/CMagLoginChange.php:20: if ($this->IsDebug()) {
www/mag/incfsmag/CMagLoginChange.php:59: if ($this->IsDebug()) {
www/mag/incfsmag/CMagBase.php:16: public function IsDebug() {
www/mag/incfsmag/CMagWatt.php:19: if ($this->IsDebug()) {
www/mag/incfsmag/CMagWatt.php:44: if ($this->IsDebug()) {
www/mag/incfsmag/CMagDevice.php:25: if (parent::IsDebug ()) {
www/mag/incfsmag/CMagDevice.php:91: if (parent::IsDebug ()) {
www/mag/incfsmag/CMagOptimize.php:36: if ( parent::IsDebug() )
www/mag/incfsmag/CMagReboot.php:29: if ( parent::IsDebug() )
www/mag/incfsmag/CMagMacClone.php:20: if ($this->IsDebug()) {
www/mag/incfsmag/CMagMacClone.php:47: if ($this->IsDebug()) {
www/mag/incfsmag/CMagInfo.php:35: if ( parent::IsDebug() )
www/mag/incfsmag/CMagDeviceList.php:34: if ( parent::IsDebug() )
www/mag/incfsmag/CMagDeviceList.php:211: if ( parent::IsDebug() )
www/mag/incfsmag/CMagDeviceList.php:270: if ( parent::IsDebug() )
www/mag/incfsmag/CMagDhcp.php:23: if ($this->IsDebug()) {
www/mag/incfsmag/CMagDhcp.php:41: if ($this->IsDebug()) {
www/mag/incfsmag/CMagDhcp.php:67: if ($this->IsDebug()) {
www/mag/incfsmag/CMagDeviceBlackList.php:14: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagProtect.php:36: if ( parent::IsDebug() )
www/mag/incfsmag/CMagProtect.php:44: if ( parent::IsDebug() )
www/mag/incfsmag/CMagProtect.php:234: if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:264: if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:294: if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:314: if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:328: if ($this->IsDebug()) {
www/mag/incfsmag/CMagUpgrade.php:25: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:35: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:54: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:94: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:112: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:133: if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:163: if ($this->IsDebug ()) {
www/mag/incfsmag/CDiagnose.php:13: if ( parent::IsDebug() )
www/mag/incfsmag/CMagFirstLaunch.php:22: if ($this->IsDebug()) {
www/mag/incfsmag/CMagFirstLaunch.php:40: if ($this->IsDebug()) {
www/mag/incfsmag/CMagFirstLaunch.php:52: if ($this->IsDebug()) {
www/mag/incfsmag/CMagFirstLaunch.php:125: if ($this->IsDebug()) {


3 后门or正常服务?

class CMagReboot extends CMagBase
{
const SERVER_ADDR = '127.0.0.1';
const SERVER_PORT = 5000;


基本通讯功能都是与这个端口进行通信,
暂且不知道这个端口只是单独绑定在127还是绑定在所有的网卡上的
4 修改任意配置?
我猜这个要么是手机客户端使用的,要么是web的时候ajax请求,
不管怎么说这是一个验证的错误

ajax_execute.php

$cmd = isset($_REQUEST['cmd']) ? $_REQUEST['cmd'] : "";
$skipReferCheck = (0 == strcasecmp ('isinited_start', $cmd));
if (!$skipReferCheck) {
_check_refer();//检测来路,来路是不是Luyou360.com 这个绕过不用说罢
}
//login_verify_start
//isinited_start
// 开绿灯
$skipInitedCheck =
(0 == strcasecmp ('login_verify_start', $cmd)
||0 == strcasecmp ('isinited_start', $cmd) );
if (!$skipInitedCheck) {
$ajaxBase = new AjaxBase();
$ajaxIsInited = new AjaxIsInited();
$isDebug = $ajaxBase->isDebug();
if (!$isDebug && $ajaxIsInited->isInitedSucc()) {
echo "yyyy";
exit();
}
}
$result = null;
$ajaxMap = new AjaxMap();
try {
$worker = $ajaxMap->Parse($cmd);//这边可以调用一些模块
if (!empty($worker)) {
$result = $worker['o']->execute($worker['p']);
}
} catch (Exception $e) {}
if (empty ( $result )) {
$result = getResultArray( SRConst::SR_ERROR_UNKNOWN );
}
header( 'Content-type: text/html; charset=utf-8' );
echo @ json_encode(is_array($result) ? $result : Array());


这里是大致可以调用的模块,但是模块的参数都是加密的
很多模块哦,什么改ssid密码,拨号密码什么的
ajaxmap.php

var $cmdMap = Array(
'login_verify_start' => Array('c' => 'AjaxLoginVerify', 'p' => Array('cmd', 'userpwd')),

'islogin_start' => Array( 'c' => 'AjaxIsLogin', 'p' => Array('cmd', 'isblock')),
'isinited_start' => Array( 'c' => 'AjaxIsInited', 'p' => Array('cmd', 'isblock')),
'initpwd_start' => Array( 'c' => 'AjaxInitPwd', 'p' => Array('cmd', 'userpwd','isblock')),
'dwt_start' => Array( 'c' => 'AjaxDetectWLanType', 'p' => Array('cmd')),
'dwt_read' => Array( 'c' => 'AjaxDetectWLanType', 'p' => Array('cmd')),
'loginpppoe_start' => Array( 'c' => 'AjaxPPPOE', 'p' => Array('cmd', 'username', 'userpwd', 'dns_type', 'dns1', 'dns2')),//比如这个可以修改dns配置和pppoe配置
'loginpppoe_read' => Array( 'c' => 'AjaxPPPOE', 'p' => Array('cmd')),

'loginpppoesp_start' => Array( 'c' => 'AjaxPPPOESpecial', 'p' => Array('cmd', 'username', 'userpwd', 'dns_type', 'dns1', 'dns2', 'area')),
'loginpppoesp_read' => Array( 'c' => 'AjaxPPPOESpecial', 'p' => Array('cmd')),
'wanstatic_start' => Array( 'c' => 'AjaxWanStatic', 'p' => Array('cmd', 'ip', 'mask', 'gate', 'dns_type', 'dns1', 'dns2')),
'wanstatic_read' => Array( 'c' => 'AjaxWanStatic', 'p' => Array('cmd')),
'wandhcp_start' => Array( 'c' => 'AjaxWanDHCP', 'p' => Array('cmd', 'dns_type', 'dns1', 'dns2')),
'wandhcp_read' => Array( 'c' => 'AjaxWanDHCP', 'p' => Array('cmd')),
'wconfig_start' => Array( 'c' => 'AjaxConfigWLan', 'p' => Array('cmd', 'ssid', 'sspwd', 'isblock')),//比如这个可以修改ssid的名字密码
'wconfig2_start' => Array( 'c' => 'AjaxConfigWLan2', 'p' => Array('cmd', 'ssid', 'sspwd','userpwd'))
);


大概都是这么加密的
// 解密

$primarykey = parent::getAesKeyLen16();//aes看到我就吓尿了,
$username = lib_aes_decrypt($primarykey, $username);
$password = lib_aes_decrypt($primarykey, $password);
//check params
if (empty($username) || empty($password) ||
$dns_type < 0 || $dns_type > 2) {
return parent::getReturnJsonStruct(SRConst::SR_ERROR_PARAMETER);
}
传说中的key到手了,那我还不横着走?
CMagBase.php
public function getAesKeyLen16(){
return '360luyou#install';
}



修复方案

你猜

状态信息 2015-01-16: 细节已通知厂商并且等待厂商处理中
2015-01-19: 厂商已经确认,细节仅向厂商公开
2015-01-29: 细节向核心白帽子及相关领域专家公开
2015-02-08: 细节向普通白帽子公开
2015-02-18: 细节向实习白帽子公开
2015-03-02: 细节向公众公开
厂商回复此报告涉及产品为老款的360安全路由,我们已修复相关漏洞隐患,新的固件将很快发布在官网论坛上。
关于通信端口的问题,由于已绑定了127.0.0.1的网卡,任何外部请求都无法访问。
感谢白帽子对360安全路由的关注!
回应信息危害等级:中漏洞Rank:7 确认时间:2015-01-19 15:57
Showing 1-6 of 6 items.
评论内容评论人点赞数评论时间

求一份源码

Th1nk02015-03-03 01:19:00

哟哟哟哟哟!

wefgod02015-01-19 16:03:00

P1 么

U神02015-01-16 23:32:00

10W大奖吗?

贫道来自河北02015-01-16 21:12:00

打脸了

xy小雨02015-01-16 20:48:00

安全路由~

泳少02015-01-16 19:30:00