TP-LINK TL-WDR5620 路由器管理员密码加密方式探索与暴力破解

出租房内的WIFI很卡,所以我想到路由器里面看一下什么情况,但是我没有路由器管理员密码,我就只能尝试破解一下。

登陆

先进入路由器管理登陆页面,在浏览器输入192.168.1.1

default

登陆页面很简单,一个密码输入框,一个点击按钮,至于忘记密码功能对于我们来说没用。

在输入框输入密码1,点击确定进行登陆

当然,密码是错误的。

error

点击F12,切换至网络

networks

需要刷新网页才会显示网络传输文件

networks2

再次输入密码,并点击确定,然后观察网络标签状态,会发现多了一行数据

post

网页使用post向路由器发送了一次数据,我们查看一下数据

json

可以发现网页使用POST向路由器发送了JSON数据,数据中包含密码,我们输入的是1,可是JSON数据却为0yWcQbhc9TefbwK,那么密码肯定被加密过。

那么我们首先要搞懂这个加密方式。

查看post相应数据

response

post响应数据表示此次登陆的状态,我们可以通过响应数据判断登陆是否成功。

同时也说明路由器在接受到POST的密码后会进行匹配并返回结果。

加密

首先,我们查看网页源码

source

可以看到源码代码数量不对,我们直接鼠标右键把网页保存下来。

找到密码输入位置

source

密码输入框是input控件,id为lgPwd,我们在源码的其他部分搜索,

lgPwd

可以在源码附近看到security encode关键字,找到这个函数的实现,就在调用上方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
securityEncode: function(a, b, c) {
var e =
"",
f, g, h, k, l = 187,
n = 187;
g = a.length;
h = b.length;
k = c.length;
f = g > h ? g : h;
for (var p = 0; p < f; p++) n = l = 187, p >= g ?
n = b.charCodeAt(p) :
p >= h ?
l = a.charCodeAt(p) :
(l = a.charCodeAt(p), n = b.charCodeAt(p)), e += c.charAt((l ^ n) % k);
return e
},

代码是用js写的,js不是我的专业,我把它转换为Qt/C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <QCoreApplication>
#include <QDebug>

QString encode(QString a,QString b,QString c){
QString r;
QChar n,l;
int g = a.size();
int h= b.size();
int k = c.size();
int f = g > h ? g : h;
qDebug()<<g<<h<<k<<f;
for (int p=0 ; p < f; ++p){
n=l=187;
if(p>=g){
n=b.at(p);
}else{
if(p>=h){
l=a.at(p);
}else{
l=a.at(p);
n=b.at(p);
}
}
int ln = l.unicode();
int nn = n.unicode();
int index = (ln^nn)%k;
QChar z=c.at(index);
qDebug()<<p<<index;
r.append(z);
}
return r;
}

int main(int argc, char *argv[])
{
QString a="RDpbLfCPsJZ7fiv";
QString b="1";
QString c="yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUW \
BU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20x \
qxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a \
0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoi \
c4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW";

qDebug()<<encode(a,b,c);
}

使用1运算结果为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ./en 
15 1 255 15
0 99 48
1 0 121
2 203 87
3 217 99
4 247 81
5 221 98
6 248 104
7 235 99
8 200 57
9 241 84
10 225 101
11 140 102
12 221 98
13 210 119
14 205 75
"0yWcQbhc9TefbwK"

可以看到和浏览器自动生成的一样。

暴力破解

我们已经知道明文密码的加密方式了,而且登录验证采用POST方式,登录错误不限制。

那么我们就使用暴力POST方式进行破解。

flowchart TB

A(开始) --> B{结束?}
B --No--> C[取一条]
C --> D[加密]
D --> E[POST]
E --> F[Response]
F --> B
G[字典] --> C

先生成可能的密码组成字典,然后读取字典每一行,加密为密文,然后写个程序不停的向路由器POST直到试出密码,这个操作就叫暴力破解。

source

我们可以从输入框input处发现

1
<input id="lgPwd" name="password" type="password" maxlength="32">

密码的最长限度被限制为32个字符。

一般人会使用字母、数字,高级一点的会使用特殊字符,在高级一点的会使用20为以上的密码,比如我就算使用了特殊字符常用密码不过16位。

第一步我们设置密码长度为8-16位,字符为字母和数字。26个字母和10个数字共36个字符,字典共 36(168)=368=282110990745636 ^ {(16-8)} = 36 ^ 8 = 2821109907456

就这个数量级,得算到猴年马月,还是使用字典吧。从网上下载了一个50GB的字典。

太监了

我还没有来得及暴一下,我就搬家换房子了。


TP-LINK TL-WDR5620 路由器管理员密码加密方式探索与暴力破解
https://blog.jackeylea.com/hack/how-to-hack-tplink-tp-wdr5620-router-pwd/
作者
JackeyLea
发布于
2022年6月16日
许可协议