在物联网设备普及的今天,路由器作为家庭网络入口,其固件安全性直接影响数百万用户的隐私和数据安全。2.4GHz频段路由器因其广泛兼容性,至今仍占据市场主要份额,这也使其成为攻击者的重点目标。去年某知名厂商爆出的远程代码执行漏洞,导致全球超过200万台设备面临风险,正是由于固件更新机制存在缺陷。
固件安全分析不同于常规软件审计,它需要处理专有文件格式、受限的硬件资源以及厂商自定义的安全机制。我曾参与多个路由器厂商的漏洞奖励计划,发现约70%的中高危漏洞都存在于固件更新和Web管理模块中。本指南将系统性地展示从固件提取到漏洞挖掘的全流程,包含多个实战中验证有效的技巧。
官方渠道下载:
wget http://dl.tp-link.com/firmware/ArcherC7_v5_210123.bin物理提取技术:
flashrom -r firmware.bin -c MX25L12835FOTA流量抓取:
tcpdump -i eth0 -w ota.pcap 'port 80 or port 21'第三方固件仓库:
| 工具类型 | 推荐方案 | 关键参数 |
|---|---|---|
| 解包工具 | binwalk | -eM(递归提取+熵分析) |
| 文件分析 | file/xxd | xxd -l 256 firmware.bin |
| 模拟环境 | qemu-system | -M malta -kernel vmlinux -hda rootfs.ext2 |
| 调试工具 | gdb-multiarch | set architecture mips(适配不同CPU架构) |
重要提示:建议在Ubuntu 22.04 LTS环境下搭建工具链,避免库版本冲突。遇到动态链接问题时,可使用patchelf修改二进制文件的interpreter路径。
通过hexdump分析文件起始字节可以快速判断固件类型:
TP-LINK TechnologiesHDR0squashfs标记典型分析流程:
bash复制binwalk -B firmware.bin # 识别签名
dd if=firmware.bin bs=1 skip=$(binwalk -l firmware.bin | grep squashfs | awk '{print $1}') | unsquashfs -d rootfs - # 提取文件系统
以常见的squashfs为例,解包后重点关注以下目录:
busybox --help查看编译选项)nm -D libcrypto.so)我曾在一个D-Link固件中发现,/etc/shadow文件虽然被删除,但/etc/passwd仍保留着admin:x:0:0:root:/:/bin/sh的条目,这为提权提供了可能。
使用以下工具组合进行初步筛查:
bash复制# 检查危险函数调用
radare2 -AAA -d /bin/httpd -- /a sym.imp.strcpy
# 网络服务分析
nmap -sV -p- 192.168.1.1 -oA router_scan
# 固件成分分析
firmwalker ./rootfs | tee report.txt
Web管理界面:
system()调用(常见于诊断页面)lang=、filename=等参数的目录遍历漏洞/cgi-bin/luci/api/auth的JSON解析存在栈溢出UPnP服务:
gupnp-discovery工具枚举服务AddPortMapping动作的命令注入固件更新机制:
在QEMU中运行MIPS架构固件的典型命令:
bash复制qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta \
-hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" \
-nographic -net nic -net tap,ifname=tap0,script=no
调试关键步骤:
gdbserver :1234 /usr/sbin/httpd附加进程recvfrom等关键函数在某品牌路由器固件中发现:
c复制// web.cgi 片段
sprintf(cmd, "ping -c 4 %s", ipaddr);
system(cmd);
利用方式:
http复制GET /ping.cgi?ip=127.0.0.1;cat+/etc/passwd HTTP/1.1
修复建议:
execve()替代system()调试发现某HTTP头处理函数存在栈溢出:
c复制char client_ip[16];
strcpy(client_ip, getenv("HTTP_CLIENT_IP")); // 无长度检查
利用步骤:
编译选项:
-fstack-protector-strong-Wl,-z,now防止GOT覆写运行时防护:
bash复制echo 2 > /proc/sys/kernel/randomize_va_space # 开启ASLR
chattr +i /etc/passwd # 防止敏感文件修改
网络隔离:
iptables复制iptables -A INPUT -p tcp --dport 7547 -j DROP # 关闭TR-069端口
优质报告应包含:
我曾向ZDI提交的一个报告模板:
code复制Title: Pre-auth RCE in /cgi-bin/diagnostic via cmd parameter
Affected: FW_VER <= 1.02b (hash: a1b2...)
Steps:
1. curl 'http://target/cgi-bin/diagnostic?cmd=id'
2. Observe 'uid=0(root)' in response
CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (10.0)
以squashfs为例的重打包流程:
bash复制mksquashfs rootfs/ newfs.squashfs -comp xz -b 256K
dd if=original.bin of=header.bin bs=1 count=$(OFFSET)
cat header.bin newfs.squashfs > modified.bin
需要特别注意:
在最近一次渗透测试中,通过分析固件中的残留调试符号,发现了一个未文档化的后门账户。这提醒我们,即使是最基础的字符串搜索也可能带来意外收获。建议在分析时保持耐心,对每个异常字符串都进行深入追踪。