型号:X5000R
AX1800 无线双频千兆路由器
下面有分析思路,设备模拟过程比较靠近新手,师傅们可以直接跳到后面分析过程。
漏洞

登陆页面构造参数,无需密码
formLoginAuth.htm?authCode=1&action=login
可直接绕过登陆,进入后台


产生原因在lighttpd wen服务文件from_login函数中

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 | if (iVar2 = = 0 ) {
iVar1 = strcmp((char * )&sa58, "ie8" );
if (iVar1 = = 0 ) {
pcVar1 = "/login_ie.html" ;
}
else {
iVar1 = atoi((char * )&sa58);
if (iVar1 = = 1 ) {
pcVar2 = "/login.html" ;
pcVar1 = "http://%s%s%s" ;
pcVar3 = "/phone" ;
LAB_409114:
sprintf(param_2,pcVar1,acStack1860,pcVar3,pcVar2);
return 1 ;
}
pcVar1 = "/login.html" ;
}
sprintf(param_2, "http://%s%s" ,acStack1860,pcVar1);
return 1 ;
}
|
上面代码是登陆检查,当iVar2=1的时候,直接跳过检查,不需要登陆。
iVar2的值是autoCode参数的值。
所以构造autoCode=1即可绕过。
模拟
下面是详细分析思路。
今天偶然发现这款非常小众的路由器,至于多小众,我分析这款官方月销15台。
我分析的这款是 AX1800,官方可以直接下载固件。
这款固件超级适合新手第一次分析使用。
binwalk分析
1 | binwalk TOTOLINK_C8343R - 1C_X5000R_IP04433_MT7621A_SPI_16M256M_V9 . 1.0u . 6118_B20201102_ALL .web
|

squashfs文件系统,uImage,LZMA压缩文件中应该也是个比较大的内容,直接使用-Me参数递归提取。
1 | binwalk - Me TOTOLINK_C8343R - 1C_X5000R_IP04433_MT7621A_SPI_16M256M_V9 . 1.0u . 6118_B20201102_ALL .web
|

里面有标准的文件系统
查看架构

mips小端序,查看其文件系统瞅瞅有没有什么东西。
有个工具叫firmwalker,可以自动分析文件系统,提取重要文件,我个人觉得不是特别好用。
我比较推荐使用vscode来做分析。
下面是要关注的一些地方
其他地方也尽量看一下,经验多了就容易清楚哪些文件是做什么的了,没经验就慢慢来。
这里发现了这几个文件:



可以看到他使用了lighttpd 的web服务文件,
一般固件大概会有这几个轻量级httpd文件:lighttpd,httpd,uhppd。
其他的还有很多。
尝试使用qemu-user模拟http服务。
1 2 | cp (which qemu - mipsel - static) . /
sudo chroot . . / qemu - mipsel - static . / usr / sbin / lighttpd
|

这里的报错是需要用-f参数指定配置文件,上面已经发现了lighttpd.conf文件。
1 | sudo chroot . . / qemu - mipsel - static . / usr / sbin / lighttpd - f . / lighttp / lighttpd.conf
|

没有这个文件,这里我们先去把这个路径改一下,在lighttpd.conf中

把它改到固件的系统文件中./var/run/lighttpd.pid
,并且去创建这个文件。
运行

这里虽然正常启动,但是如果不挂载文件夹,还是挺多问题的,所以我更倾向使用系统模式。
这里系统模式不做赘述,我写了个脚本,可以很方便启动。
核心文件比较大,大家按文件自行下载
https://people.debian.org/~aurel32/qemu/mips/
我把脚本放链接放这里
https://gitee.com/p1piyang/backward-analysis/tree/master/
qemu启动
sudo 启动
1 | ifconfig eth0 192.168 . 5.12 up
|
将文件系统上传
1 | scp - r squashfs - root / root@ 192.168 . 5.12 : / root /
|
挂载
1 | chroot . / squashfs - root / / bin / sh
|
启动
1 | . / user / sbin / lighttpd - f . / lighttp / lighttpd.conf
|

分析
刚开始是想直接去分析lighttpd的。随手登陆了一下,看了下包。
我个人浅薄的经验,不要单纯去无目的的分析某个应用,我之前犯过这种错误,太容易对着一个程序漫无目的的乱逛,希望你没有这种情况。
这里明显可以看到调用了cgi文件,之前看文件的时候看到了这个东西的。

可以去分析下这个文件。
1 2 3 4 5 | ghidra open !!!
Link 死大头!!!
search "action" !!!
|

action=login,交叉引用,看一下。

说实话,ghidra的这个伪代码看着老奇怪了,这里是判断了登陆还是升级。

if下面,这里判断flag=1,最后的逻辑是将字符串格式化到acStack4456
中

再往下这个地方我刚开始比较懵了,因为websGetVar程序查找表变量var
,相当于获取参数。所以这里并没有往下看,而是换了个思路点。
这里知道了他是对登陆做了个判断。
去查找登陆的请求参数


发现了这么个地方。
根据登陆的包。

发现他返回了一串地址。并且主动访问了这串地址。

所以这个地方是判断密码的地方。本来想试试正确密码,来分析下,结果密码怎么都不对。
这里解释下,因为我没有设备,是直接在官网下载的固件,所以这个密码怎么都不对,我怀疑是固件模拟的问题,就没有往下追究。
他主动访问了formloginAuth.htm,在www/文件夹下并没有这个文件,所以去找下lighttpd文件分析下
1 2 3 4 5 | ghidra open !!!
Link 死大头!!!
search "formLoginAuth" !!!
|

跟进from_Login函数

这里就发现了参数处理

判断几个参数做了什么,userName是空的先不看,goURL是某个html文件,盲猜他是的从哪来的,action是要做什么。
所以现在要看一下authCode
如果authCode不等于0,iVar2就等于整形的authCode的值。
往下分析。

这里改成1之后直接,跳过了这个判断。
但是只吧这个改为1之后还是返回到登陆界面。

这里pcVar2=1,导致跳过了设置pcVar2 = home.html
所以我猜测goUrl参数不是从哪来,而是从哪去。
最后发现果然是哦。
其实在ghidra反编译的时候,好多地方不太习惯,很多地方靠函数名和字符串硬猜。
希望师傅们多多指导嘿嘿。
物联网安全入门
最后于 2022-3-11 10:50
被p1yang编辑
,原因: 内容有不清晰