ToToLink-X5000R登录绕过

文章发布时间:

最后更新时间:

文章总字数:
1k

预计阅读时间:
4 分钟

前言

跟着看雪上的这位师傅复现的 https://www.kanxue.com/chm.htm?id=17830

好文章 学到了面对一个路由器时的分析思路

模拟

固件下载地址http://www.totolink.cn/home/menu/newstpl.html?menu_newstpl=products&id=65

mipsel架构 模拟脚本

1
2
3
4
#/bin/sh
sudo tunctl -t top0 -u root
sudo ifconfig top0 192.168.6.2
sudo qemu-system-mipsel -M malta -kernel ./mipsel_kernel/vmlinux-3.2.0-4-4kc-malta -hda ./mipsel_kernel/debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=top0 -nographic

模拟起来后 进入其中配置eth0网络接口与top0位于同一c段

随后打包squashfs-root文件夹 通过scp上传到模拟系统中

以squashfs-root文件夹为根目录

1
chroot ./squashfs-root/ /bin/sh

随后启动路由器服务

1
./usr/sbin/lighttpd -f ./lighttp/lighttpd.conf

image-20230815184214754

会因为找不到文件而报错

直接在对应目录下创建一个空文件就可以了

成功启动服务

固件分析

首先我们要清楚 我们要从哪个方向来分析这个路由器 这一点是至关重要的 不能漫无目的

我们选择针对登录这一点来分析 首先试着随便输入密码 并且通过抓包来查看登录检测涉及到了哪些文件

image-20230815184817104

可以看到 密码的发送是通过这个包来进行的

同时你可以注意到状态是302 这意味着服务器返回了重定向响应 来看一下跳转的地址是什么

image-20230815184849802

1
http://192.168.6.1/formLoginAuth.htm?authCode=0&userName=&goURL=phone/login.html&action=login&flag=1

有着比较多的参数 应该是用来判断用户的密码是否正确 我们找到这个包对应的cgi文件

搜索username字符串 尝试找到对应的代码

发现了sub_42A2D0函数 其功能似乎是根据其他参数来决定重定向的网址 来看下面的代码

image-20230815193100787

根据v9来判断重定向的网址 这里猜测应该是flag这个参数

1
http://192.168.6.1/formLoginAuth.htm?authCode=0&userName=&goURL=phone/login.html&action=login&flag=ie8

通过单独修改flag为ie8 最后成功重定向到了login_ie.html 证实了猜想 但是好像没有什么软用

接下来想的是为www目录下找到formLoginAuth.htm这个网址 但是好像没有 那么就去lighttpd这个文件来看看

可以看到 根据不同的网址来进入不同的函数 我们来跟进到form_login函数中

image-20230815193537526

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
if ( v8 )
{
fbss = 0;
do
{
v13 = time(0);
if ( !ws_get_cookie(a1, "SESSION_ID", v16, 0) && form_get_idx_by_sessionid(&fl_sess, v13, v16) != -1 )
{
sprintf(a2, "http://%s/%s?timestamp=%ld", v23, v20, v13);
return 1;
}
sprintf(v15, "%ld:%d", v13, 2);
sprintf(v19, "%d:%s", 2, v15);
}
while ( form_get_idx_by_sessionid(&fl_sess, v13, v19) != -1 );
if ( !v6 )
v6 = "";
if ( form_add_session(&fl_sess, &fl_sess_bak, -1, v17, v6, v19, 2, v13) )
{
ws_set_cookie(a3, "SESSION_ID", v19, 0, "/", 0);
sprintf(a2, "http://%s/%s?timestamp=%ld", v23, v20, v13);
return 0;
}
ws_clear_cookie(a3, "SESSION_ID", "/");
fbss = 4;
if ( !strcmp(&v14, "ie8") )
{
sprintf(a2, "http://%s%s", v23, "/login_ie.html");
}
else
{
if ( atoi(&v14) == 1 )
{
sprintf(a2, "http://%s%s%s", v23, "/phone", "/login.html");
return 0;
}
sprintf(a2, "http://%s%s", v23, "/login.html");
}
return 0;
}

这里可以看到对于v8的值进行了判断 如果不为0则进入if分支 可以看到对于a2进行了操作

而我们看到下面 a2应该是重定向的地址

image-20230815194828730

那么v8的值怎么来的呢 可以看到应该是跟authcode的参数有关系 那么我们将authcode修改为1后试试

image-20230815194901122

结果发现还是跳转回到login.html页面 但是参数确实多了个timestamp

image-20230815195043221

这里应该是由于我们重定向导致的 但是将flag删除掉 也没有办法 因为会进入最后的else分支 默认重定向到/login.html

但是我们仔细观察一下参数 还是有一个叫做goURL的 我们把这个参数删除掉后

成功绕过了登录 进入了后台

image-20230815195258957