路由器漏洞分析系列(1):路由器固件模拟环境搭建
字数 1073 2025-08-04 08:17:24

路由器固件模拟环境搭建与漏洞分析指南

1. 固件提取工具 Binwalk 安装与使用

安装步骤

  1. 更新系统并安装基础工具:

    sudo apt-get update
    sudo apt-get install build-essential autoconf git
    
  2. 克隆并安装 Binwalk:

    git clone https://github.com/devttys0/binwalk.git
    cd binwalk
    sudo python setup.py install
    sudo ./deps.sh
    
  3. 提取固件(递归提取):

    binwalk -Me XX.bin
    

2. QEMU 模拟执行环境搭建

QEMU 安装

# 用户模式安装
sudo apt-get install qemu
sudo apt-get install qemu-user-static

# 系统模式安装
sudo apt-get install qemu-system

QEMU 运行模式

用户模式 (User Mode)

  1. 将 QEMU 可执行文件复制到当前目录:

    sudo cp $(which qemu-mips-static) .
    
  2. 使用 chroot 切换根目录并运行程序:

    sudo chroot . ./qemu-mips-static -E LD_PRELOAD="XX.so" -g 1234 bin/boa
    
    • -E LD_PRELOAD="XX.so":用于指定动态库实现函数劫持
    • -g 1234:开启调试模式,监听 1234 端口

系统模式 (System Mode)

  1. 启动 QEMU(以 MIPS 为例):

    sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta \
    -hda debian_squeeze_mips_standard.qcow2 \
    -append "root=/dev/sda1 console=tty0" \
    -net nic -net tap -nographic -s
    

    参数说明:

    • -M:指定开发板
    • -kernel:内核镜像路径
    • -hda/-hdb:IDE 硬盘镜像
    • -append:内核启动参数
    • -s:等同于 -g 1234,开启调试
  2. 将提取的文件系统拷贝到虚拟机:

    scp -r ./cpio-root root@192.168.84.129:/root/
    
  3. 在虚拟机中运行程序:

    export LD_PRELOAD='XX.so'
    chroot . bin/busybox
    

3. Firmadyne 固件模拟工具

安装与使用

  1. 按照 Firmadyne 官方文档步骤安装

  2. 建议修改 FAT.py 的 setup_network 函数以获取日志:

    def setup_network(arch, image_id):
        print "[+] Setting up the network connection, please standby"
        network_cmd = "sudo " + firmadyne_path + "/scripts/inferNetwork.sh " + image_id + " " + arch
        child = pexpect.spawn(network_cmd)
        child.logfile = file("mylog.txt", 'w')  # 添加此行获取日志
        child.sendline(root_pass)
        child.expect("Interfaces:", timeout=None)
        interfaces = child.readline().strip()
        print "[+] Network interfaces : " + interfaces
        child.expect(pexpect.EOF)
    

常见问题解决

问题/dev/mapper/loop0p1 does not exist and no size was specified

解决方法
makeImage.sh 脚本中,将 kpartx 挂载虚拟文件系统返回的 device 作为 mkfs.ext2 的参数。

4. 交叉编译环境搭建

sudo apt-get install linux-libc-dev-mips-cross
sudo apt-get install libc6-mips-cross libc6-dev-mips-cross
sudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnu
sudo apt-get install g++-mips-linux-gnu

5. 调试工具

GDB 调试

  1. 编译 MIPS 版 GDB 或使用 gdb-multiarch
  2. 使用纯 GDB(避免插件冲突):
    • ~/.gdbinit 中注释掉各种 source

IDA 使用

  • 在 Ubuntu 下通过 Wine 运行 Windows 版 IDA

Ghidra 反编译

  • 需要 JDK11
  • 优点:可直接查看反编译代码
  • 缺点:xref 功能不如 IDA,且不要用于 patch 文件(会修改原文件)

6. 关键注意事项

  1. Binwalk 安装:必须完整安装,包括依赖库
  2. QEMU 模式选择
    • 用户模式简单但功能有限
    • 系统模式复杂但信息更全面
  3. 网络配置:系统模式下需要正确配置网卡
  4. 调试准备:提前准备好调试端口和工具
  5. 交叉编译:确保工具链完整安装
  6. 反编译工具:Ghidra 和 IDA 各有优劣,建议结合使用

通过以上步骤,可以搭建完整的路由器固件模拟和漏洞分析环境,为后续的漏洞挖掘和分析工作奠定基础。

路由器固件模拟环境搭建与漏洞分析指南 1. 固件提取工具 Binwalk 安装与使用 安装步骤 更新系统并安装基础工具: 克隆并安装 Binwalk: 提取固件(递归提取): 2. QEMU 模拟执行环境搭建 QEMU 安装 QEMU 运行模式 用户模式 (User Mode) 将 QEMU 可执行文件复制到当前目录: 使用 chroot 切换根目录并运行程序: -E LD_PRELOAD="XX.so" :用于指定动态库实现函数劫持 -g 1234 :开启调试模式,监听 1234 端口 系统模式 (System Mode) 启动 QEMU(以 MIPS 为例): 参数说明: -M :指定开发板 -kernel :内核镜像路径 -hda/-hdb :IDE 硬盘镜像 -append :内核启动参数 -s :等同于 -g 1234 ,开启调试 将提取的文件系统拷贝到虚拟机: 在虚拟机中运行程序: 3. Firmadyne 固件模拟工具 安装与使用 按照 Firmadyne 官方文档步骤安装 建议修改 FAT.py 的 setup_network 函数以获取日志: 常见问题解决 问题 : /dev/mapper/loop0p1 does not exist and no size was specified 解决方法 : 在 makeImage.sh 脚本中,将 kpartx 挂载虚拟文件系统返回的 device 作为 mkfs.ext2 的参数。 4. 交叉编译环境搭建 5. 调试工具 GDB 调试 编译 MIPS 版 GDB 或使用 gdb-multiarch 使用纯 GDB(避免插件冲突): 在 ~/.gdbinit 中注释掉各种 source 行 IDA 使用 在 Ubuntu 下通过 Wine 运行 Windows 版 IDA Ghidra 反编译 需要 JDK11 优点:可直接查看反编译代码 缺点:xref 功能不如 IDA,且不要用于 patch 文件(会修改原文件) 6. 关键注意事项 Binwalk 安装 :必须完整安装,包括依赖库 QEMU 模式选择 : 用户模式简单但功能有限 系统模式复杂但信息更全面 网络配置 :系统模式下需要正确配置网卡 调试准备 :提前准备好调试端口和工具 交叉编译 :确保工具链完整安装 反编译工具 :Ghidra 和 IDA 各有优劣,建议结合使用 通过以上步骤,可以搭建完整的路由器固件模拟和漏洞分析环境,为后续的漏洞挖掘和分析工作奠定基础。