小米路由器固件仿真模拟方案
字数 1633 2025-08-19 12:41:22

小米路由器固件仿真模拟方案教学文档

前言

IoT固件仿真是漏洞挖掘的重要环节,本文详细介绍了小米路由器AX9000固件的仿真模拟方法。该方案同样适用于其他型号的小米路由器,最后将通过CVE-2023-26315漏洞验证来展示仿真环境的有效性。

环境准备

1. 获取内核与文件系统

小米AX9000采用AArch64el架构,需要自行提取内核与磁盘镜像:

  • 安装AArch64虚拟机
  • 从中提取内核与磁盘镜像

2. 网络配置

QEMU启动后网络配置步骤:

ip add add 192.168.192.132/24 dev enp0s1
ip link set enp0s1 up

验证宿主机与QEMU虚拟机间的网络连通性

基础仿真步骤

1. 文件系统挂载

将解压后的固件文件系统传入QEMU虚拟机后执行:

mount --bind /proc proc
mount --bind /dev dev
chroot . /bin/sh

2. 启动关键服务

启动进程管理器:

/sbin/procd &

HTTP服务启动与调试

1. 识别HTTP服务

小米路由器包含多个HTTP服务:

  • uhttpd
  • mihttpd(监听8198端口)
  • sysapihttpd(基于nginx,监听80端口)

2. 启动sysapihttpd

执行:

/etc/init.d/sysapihttpd start

3. 解决依赖问题

常见报错及解决方案:

  1. 缺失/var/lock/procd_sysapihttpd.lock

    • 创建对应目录和文件
  2. "Failed to connect to ubus"

    • 启动ubus服务:/sbin/ubusd &
  3. "usock: No such file or directory"

    • 创建/var/run/ubus.sock文件

4. 崩溃排查

使用strace跟踪进程:

strace -p <pid>

常见崩溃原因:

  • 缺失/etc/TZ文件
    • 解决方案:echo "WAUST-8WAUDT" > /etc/TZ
  • getsockopt错误导致重定向崩溃
    • 修改/usr/sbin/sysapihttpd二进制文件
    • 将CBZ指令patch为CBNZ

系统配置绕过

1. 跳过初始化配置

方法一(不推荐):

  • 修改/usr/lib/lua/luci/view/web/sysauth.htm
  • 注释掉重定向代码

方法二(推荐):

uci set xiaoqiang.common.INITTED=1
uci commit

2. 设置登录密码

密码存储机制:

  1. 密码存储在account.common.<用户名>配置项
  2. 存储值为sha1(密码明文 + "a2ffa5c9be07488bbb04a3a47d3c5f6a")

设置密码示例(密码为"winmt"):

uci set account.common.admin=b264db0fca361ef8eca919fa28e70d7a57d4c2db
uci commit

API访问权限问题

1. 503错误分析

/api/xqdatacenter/request访问报错原因:

  • _noinitAccessAllowed函数校验失败
  • 需要满足以下条件之一:
    • xqsys.getInitInfo()返回true(即xiaoqiang.common.INITTED=1
    • entry flag包含0x08

2. 解决方案

推荐方案:

uci set xiaoqiang.common.INITTED=1
uci commit

替代方案:

  • 修改xqdatacenter.lua源码
  • 在对应entry添加flag位0x08
  • 使用固件自带的luac重新编译

漏洞验证环境

1. 启动额外服务

/usr/sbin/datacenter &
/usr/sbin/plugincenter &

验证9090和9091端口是否正常监听

2. 验证CVE-2023-26315

使用相应exp验证漏洞,获取shell

关键知识点总结

  1. 固件仿真核心原则:不断解决报错,只要问题不涉及外设硬件,通常都有解决方案

  2. 小米路由器特有机制

    • 多HTTP服务并存(uhttpd/mihttpd/sysapihttpd)
    • UBUS总线通信机制
    • Lua实现的Web管理界面
    • UCI配置系统存储关键参数
  3. 调试技巧

    • 使用strace跟踪进程崩溃原因
    • 分析二进制文件定位关键报错点
    • 修改二进制指令绕过问题代码
  4. 权限系统

    • 初始化状态检查(INITTED标志)
    • API访问flag位控制(0x08表示允许未初始化访问)
  5. 认证机制

    • 双重SHA1哈希的密码存储方式
    • 固定key值参与哈希计算
    • Token认证机制

本方案为小米路由器固件仿真提供了完整指导,通过解决各类报错和系统限制,最终构建出可用于漏洞分析和验证的仿真环境。

小米路由器固件仿真模拟方案教学文档 前言 IoT固件仿真是漏洞挖掘的重要环节,本文详细介绍了小米路由器AX9000固件的仿真模拟方法。该方案同样适用于其他型号的小米路由器,最后将通过CVE-2023-26315漏洞验证来展示仿真环境的有效性。 环境准备 1. 获取内核与文件系统 小米AX9000采用AArch64el架构,需要自行提取内核与磁盘镜像: 安装AArch64虚拟机 从中提取内核与磁盘镜像 2. 网络配置 QEMU启动后网络配置步骤: 验证宿主机与QEMU虚拟机间的网络连通性 基础仿真步骤 1. 文件系统挂载 将解压后的固件文件系统传入QEMU虚拟机后执行: 2. 启动关键服务 启动进程管理器: HTTP服务启动与调试 1. 识别HTTP服务 小米路由器包含多个HTTP服务: uhttpd mihttpd(监听8198端口) sysapihttpd(基于nginx,监听80端口) 2. 启动sysapihttpd 执行: 3. 解决依赖问题 常见报错及解决方案: 缺失 /var/lock/procd_sysapihttpd.lock 创建对应目录和文件 "Failed to connect to ubus" 启动ubus服务: /sbin/ubusd & "usock: No such file or directory" 创建 /var/run/ubus.sock 文件 4. 崩溃排查 使用strace跟踪进程: 常见崩溃原因: 缺失 /etc/TZ 文件 解决方案: echo "WAUST-8WAUDT" > /etc/TZ getsockopt错误导致重定向崩溃 修改 /usr/sbin/sysapihttpd 二进制文件 将CBZ指令patch为CBNZ 系统配置绕过 1. 跳过初始化配置 方法一(不推荐): 修改 /usr/lib/lua/luci/view/web/sysauth.htm 注释掉重定向代码 方法二(推荐): 2. 设置登录密码 密码存储机制: 密码存储在 account.common.<用户名> 配置项 存储值为 sha1(密码明文 + "a2ffa5c9be07488bbb04a3a47d3c5f6a") 设置密码示例(密码为"winmt"): API访问权限问题 1. 503错误分析 /api/xqdatacenter/request 访问报错原因: _noinitAccessAllowed 函数校验失败 需要满足以下条件之一: xqsys.getInitInfo() 返回true(即 xiaoqiang.common.INITTED=1 ) entry flag包含0x08 2. 解决方案 推荐方案: 替代方案: 修改 xqdatacenter.lua 源码 在对应entry添加flag位0x08 使用固件自带的 luac 重新编译 漏洞验证环境 1. 启动额外服务 验证9090和9091端口是否正常监听 2. 验证CVE-2023-26315 使用相应exp验证漏洞,获取shell 关键知识点总结 固件仿真核心原则 :不断解决报错,只要问题不涉及外设硬件,通常都有解决方案 小米路由器特有机制 : 多HTTP服务并存(uhttpd/mihttpd/sysapihttpd) UBUS总线通信机制 Lua实现的Web管理界面 UCI配置系统存储关键参数 调试技巧 : 使用strace跟踪进程崩溃原因 分析二进制文件定位关键报错点 修改二进制指令绕过问题代码 权限系统 : 初始化状态检查(INITTED标志) API访问flag位控制(0x08表示允许未初始化访问) 认证机制 : 双重SHA1哈希的密码存储方式 固定key值参与哈希计算 Token认证机制 本方案为小米路由器固件仿真提供了完整指导,通过解决各类报错和系统限制,最终构建出可用于漏洞分析和验证的仿真环境。