如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

tplink路由器在国内甚至国际上,都是占有率第一的。就是这样的一款路由器,如果告诉你,路由器的密码除了你知晓的那个,还有个另外的影子密码,也能进入你的路由器,你是不是吓了一大跳?

最近,苏南大叔,想升级自己的路由器固件,就百度到现在正在使用的一款的路由器的密码漏洞。当然了,这款路由器的最新固件,已经没有这个漏洞了。但是升级固件.... 只有发烧友才会这么干吧....

前言

好,苏南大叔手里面的实验产品是个tplinkTL-WR842N,软件版本号是:2.3.4 Build 141118 Rel.74025n。苏南大叔最终的实验结果是:使用了一个计算出来的密码(并非原本的密码),进入了路由器。这个算是个不大不小的漏洞了。

如果你手头的路由器也是这款型号,不如试试吧,也许有类似的漏洞。网上其实流传有解密攻略POC,但是最终最关键的部分,是语焉不详,不知所云。在本篇文章中,苏南大叔将讲述具体的解密算法。

一个路由器两个密码,你的tplink路由器还安全吗? - 000

一个路由器两个密码,你的tplink路由器还安全吗? - 001

下载config.bin

当然是在你的路由器的ip地址后面加上config.bin来下载的了。ip地址呢,一般都是192.168.1.1,你可以查看你的路由器背面的说明。而这个config.bin文件里面就包含了加密后的密码!而且是双重加密的。但是,对于网站来说,这么重要的东西,居然可以直接下载,这本身就是有问题的。这就是最大的隐患。

一个路由器两个密码,你的tplink路由器还安全吗? - config

分析config.bin文件

这个文件默认打开后,是个乱码,大家都看不懂。需要使用个openssl的工具进行转换。去openssl的官方去查找下载这个工具的话,貌似会失望的。这种太程序员的工具类都只是提供源码,让自己编译的。而编译的过程,一般都会较为痛苦,所以,我们还是跳过这个过程比较好。所以,苏南大叔在百度上面找了一个opensslexe压缩包。

一个路由器两个密码,你的tplink路由器还安全吗? - 333

如果你找到的版本里面,有对应openssl的可执行文件,那就对了。然后把第一步中下载到的config.bin文件拖到openssl.exe一起,目的仅仅是执行命令的时候,不用考虑路径问题。

openssl enc -d -des-ecb -nopad -K 478DA50BF9E3D2CF -in config.bin

一个路由器两个密码,你的tplink路由器还安全吗? - open_cmd

这里面的参数是怎么来的,苏南大叔表示傻傻的不清楚。执行完毕后,刚才还是乱码的config.bin文件。变得清晰起来,然后,我们移动到第一行,看一下authKey这个值,就是加密后的密码。

破解密码

下一个漏洞就是,这个密码的加密算法,是用js写在前端里面的。直接看登录页的源码,似乎看不出什么问题来,但是如果打开chrome的开发者模式,切换到source标签,就可以在lib目录的Quary.js文件中,找到加密的算法。关键词是orgAuthPwd。别问我怎么找到的,职业敏感性而已。

一个路由器两个密码,你的tplink路由器还安全吗? - quary

苏南大叔的思路是:随机生成密码,然后把随机的密码,用找出的算法加密,如果加密的结果和authkey一致,那么就停止计算。while(true)死循环写在开发者工具的console里面,然后电脑风扇狂转了一个小时,啥也没跑出来。

所以只能换个思路:既然加密算法已知了,而加密后的密码,我们也是已知的。我们可以倒推原密码。所以,仔细阅读了一下,加密的js源码,写了个解密的js放到了node里面,去跑一下。蛮容易的,就拿到了个密码。原理上来说,确实是可以有很多个密码,用这个加密算法加密后,得到相关的加密结果(authKey)的。

关键代码描述

原加密算法:

this.securityEncode = function(input1, input2, input3)
{
    var dictionary = input3;
    var output = "";
    var len, len1, len2, lenDict;
    var cl = 0xBB, cr = 0xBB;

    len1 = input1.length;
    len2 = input2.length;
    lenDict = dictionary.length;
    len = len1 > len2 ? len1 : len2;

    for (var index = 0; index < len; index++)
    {
        cl = 0xBB;
        cr = 0xBB;

        if (index >= len1)
        {
            cr = input2.charCodeAt(index);
        }
        else if (index >= len2)
        {
            cl = input1.charCodeAt(index);
        }
        else
        {
            cl = input1.charCodeAt(index);
            cr = input2.charCodeAt(index);
        }

        output += dictionary.charAt((cl ^ cr)%lenDict);
    }

    return output;
};
this.orgAuthPwd = function(pwd)
{
    var strDe = "RDpbLfCPsJZ7fiv";
    var dic = "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciX"+
              "TysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgML"+
              "wygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3"+
              "sfQ1xtXcPcf1aT303wAQhv66qzW";

    return this.securityEncode(pwd, strDe, dic);
};

我写的简易解密算法:

newsn.net:这里是【评论】可见内容

解密点说明

解密的过程,相对简单。只是需要特殊说明一下xor的逆转算法,还是xor.....在js里面,如果A^B=C,那么A=C^B。这个按位异或的操作,很罕见,所以,这里特别说明一下。

其实还需要说明一下,解密出来的新密码,虽然不同的位数下,都可以加密得到最终的authKey。但是只有和原密码长度一致的新密码,才能进入管理界面。所以,可能在长度方面,还是有所限制的。

结束语

这个tplink路由器的登录密码poc就记录到这里为止。很久没有做这方面的破解了。很高兴还能够解出来最终的数据。更多加密加密的文章,大家可以点击这里查看:https://newsn.net/tag/加密解密/

这个漏洞,tplink官方早就有修复,但是带有这问题的路由器,还是存在的。比如苏南大叔现在正在使用的这款路由器。很多年了,蛮好用的.........

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。