80、固件逆向(三):路由器固件漏洞挖掘、后门分析

各位好,我是老周。今天咱们聊点实战的——路由器固件里的漏洞和后门。说实话,这活儿我干了快十年,从当年玩Linksys WRT54G开始,到现在各种IoT设备,套路其实没怎么变。但每次挖到新东西,还是会有那种「原来如此」的快感。

你想想看,一个路由器固件,说白了就是个嵌入式Linux系统。它跑在MIPS、ARM或者RISC-V上,有内核、有文件系统、有各种服务。漏洞和后门就藏在这些角落里。嗯,咱们今天就把它们揪出来。

一、固件漏洞挖掘的常见入口

我个人习惯,拿到一个固件先不急着反汇编。先看看它暴露了哪些接口。说白了,攻击面决定了你能挖多深。

1. Web管理界面

这是最肥的一块肉。几乎所有路由器都有Web管理页面,而且很多厂商的代码质量……嗯,你懂的。常见的漏洞包括:

  • 命令注入:比如ping、traceroute功能,用户输入直接拼到系统命令里
  • 路径遍历:通过../读取/etc/shadow或者配置文件
  • 认证绕过:cookie硬编码、session固定、或者干脆没认证
  • CSRF/XSS:虽然现在少了,但老固件里一抓一把

实战案例:我记得有一次分析某品牌路由器,它的诊断页面有个「ping测试」。输入IP后,后端直接执行 system("ping -c 4 " + user_input)。我输入 127.0.0.1; telnetd -l /bin/sh,然后……嗯,你懂的。

2. UPnP服务

UPnP(通用即插即用)是另一个重灾区。很多厂商直接用了开源库,比如libupnp,但版本老旧。CVE-2012-5958这种经典漏洞,就是libupnp的栈溢出。我当年挖过一个设备,它的UPnP服务居然以root权限运行,而且没有ASLR保护。一个精心构造的SSDP请求就能拿到shell。

3. 固件更新机制

这个很有意思。很多路由器检查固件签名的方式……嗯,形同虚设。我见过以下几种:

  • 只检查文件名后缀(.bin就行)
  • 检查文件头魔数,但内容随便改
  • 签名验证在用户空间,可以绕过
  • 甚至有的根本不验证,直接刷

小技巧:如果你能伪造一个固件更新包,那基本上就等于拿到了设备的完全控制权。我曾经用这个手法,在某个智能网关里植入了持久化后门,运行了两年都没被发现。

二、后门分析:从发现到利用

后门这东西,分两种:一种是厂商故意留的(比如调试接口、硬编码密码),另一种是攻击者植入的。咱们今天主要聊前者,因为后者需要先拿到设备,不在固件逆向的范畴内。

1. 硬编码凭据

这是最常见的后门。厂商为了方便调试,会在固件里写死一组用户名和密码。比如:

  • 用户名:admin,密码:admin
  • 用户名:root,密码:123456
  • 用户名:debug,密码:debug123

但更隐蔽的是,有些后门账号不会出现在Web登录页面,而是直接通过telnet或SSH访问。怎么找?

方法:用binwalk解包固件后,grep搜索常见关键词:grep -r "password" .grep -r "passwd" .grep -r "login" .。然后看/etc/passwd和/etc/shadow文件。如果发现一个奇怪的用户,比如"service"、"debug"、"factory",那基本就是后门。

2. 隐藏端口和服务

有些后门不会直接暴露在标准端口上。它们可能监听在高端口(比如2323、32764),或者通过某种触发条件才开启。我记得有个设备,它的后门服务监听在TCP 32764端口,但只有发送特定魔数(比如"SCAN")才会响应。这种后门很难被常规扫描发现。

3. 调试接口

很多路由器有UART或JTAG接口。如果你能物理接触到设备,这些接口就是最直接的后门。但咱们做固件逆向的,更关心的是软件层面的调试接口。比如:

  • telnetd默认开启,但只允许特定IP连接
  • 某个CGI脚本可以执行任意命令
  • 某个二进制文件有隐藏的命令行参数

注意:分析后门时,一定要确认这个后门是厂商故意留的,还是被攻击者植入的。如果是后者,那说明设备已经被入侵了,你的分析环境也要做好隔离。

三、实战流程:从固件到漏洞

好了,理论说完了,咱们走一遍实战流程。我以某款常见路由器为例,演示如何从固件里挖出漏洞和后门。

Step 1:获取固件并解包

# 下载固件
wget http://example.com/firmware.bin

# 用binwalk分析
binwalk -Me firmware.bin

# 进入解包目录
cd _firmware.bin.extracted/

Step 2:文件系统分析

解包后,你会看到一个完整的文件系统。重点关注:

  • /etc/:配置文件、密码文件
  • /usr/sbin/:各种服务二进制
  • /www/:Web页面和CGI脚本
  • /lib/:动态链接库

Step 3:搜索硬编码凭据

# 搜索密码相关
grep -r "password" . --include="*.conf" --include="*.xml" --include="*.html"

# 搜索常见后门用户名
grep -r "admin\|root\|debug\|service\|factory" ./etc/passwd ./etc/shadow 2>/dev/null

Step 4:分析Web服务

找到Web服务器(通常是httpd或lighttpd),分析它的CGI脚本。重点关注:

  • 输入验证是否严格
  • 是否调用了system()、popen()等危险函数
  • 是否有文件包含漏洞

我的经验:用Ghidra或IDA反汇编httpd二进制,搜索systemexecvepopen等函数。然后回溯调用链,看哪些输入能到达这些函数。我曾经用这个方法,一天挖了三个命令注入漏洞。

Step 5:网络服务扫描

在模拟环境中启动固件(用QEMU或Firmadyne),然后扫描端口:

nmap -sS -p 1-65535 192.168.1.1

如果发现非标准端口开放,比如2323、32764、5555,那很可能就是后门。

四、知识体系总览

下面这张图,是我自己总结的固件漏洞挖掘知识体系。你看一眼,心里就有数了。

固件漏洞挖掘知识体系 固件逆向分析 攻击面分析 漏洞类型 后门分析 Web管理界面 UPnP服务 固件更新 调试接口 命令注入 栈/堆溢出 路径遍历 认证绕过 硬编码凭据 隐藏端口 调试接口 隐藏命令 图:固件漏洞挖掘三大方向及常见子项

五、避坑指南

做固件逆向这么多年,踩过的坑比走过的路还多。分享几个常见的:

  • 别信文件系统:有些固件会伪装文件系统,比如把squashfs伪装成jffs2。用binwalk的-Me参数自动识别,但最好手动确认一下。
  • 注意字节序:MIPS有大端和小端,ARM也有。反汇编前先确认,否则你会看到一堆乱码。我刚开始就犯过这个错,对着大端代码用小端反汇编,折腾了两天。
  • 模拟环境要小心:用QEMU模拟固件时,有些设备会检测运行环境,然后自毁。我遇到过一台设备,检测到不是真实硬件就直接擦除flash。所以,先做好快照。
  • 后门不一定在二进制里:有些后门是通过配置文件开启的。比如某个服务默认监听127.0.0.1,但配置文件中有一行bind_ip=0.0.0.0,那就是个后门。

重要提醒:挖漏洞和找后门,一定要在法律允许的范围内进行。未经授权分析他人设备,是违法的。我所有的研究,都是在自有设备或获得授权的前提下进行的。

六、总结

路由器固件漏洞挖掘,说白了就是三步:找攻击面、分析漏洞、利用后门。工具方面,binwalk、Ghidra、QEMU、Firmadyne是必备的。但工具只是辅助,真正重要的是思路——你得知道攻击者会从哪里下手,厂商又会在哪里犯错。

我个人觉得,这个领域最有意思的地方在于,你永远不知道下一个漏洞会出现在哪里。可能是Web页面里的一个输入框,也可能是UPnP服务里一个不起眼的函数调用。嗯,这就是逆向工程的魅力所在。

好了,今天就聊到这儿。记住,多动手,多分析,多总结。下次见。


公众号:蓝海资料掘金营,微信deep3321