iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
Security

Like an Exploition:IoT 韌體漏洞鍊成術系列 第 7 篇

【𝕯𝖆𝖞 𝟕】My First CVE (Reproduction) - Web Command Injeciton (2/2)

  • 分享至 

  • xImage
  •  

前言

昨天透過靜態分析確認了 CVE-2025-25632 的命令注入路徑,今天進入動態環境實際觸發漏洞。我們會比較不同的模擬方案,最終使用 EMUX 完成完整的攻擊鏈驗證。

0x01 模擬環境比較

在實際模擬方面,先介紹一下兩種常用的 QEMU 模式:

QEMU是一個開源的模擬器,可以執行針對不同 CPU 架構所開發的軟體。有分成部分靜態模擬的 QEMU-USER 和 整個rootfs模擬的 QEMU-SYSTEM 兩種模式

QEMU-user 模式

qemu-arm -L rootfs-v19 rootfs-v19/bin/httpd

觀察:

  • httpd 進程會啟動但不會監聽 port 80
  • 缺少了一個 Configuration Management 的運行環境
    • cfmd daemon 需要 MTD 設備、/proc/mtd、網卡驅動支援
    • 啟動 cfmd 後沒有出現 HTTP listener
      結論:死掉,沒辦法模擬完整的 http。QQ

QEMU-system

qemu-system-arm -M vexpress-a9 -kernel zImage -dtb vexpress-v2p-ca9.dtb ...

限制:

  • 提供完整 ARM kernel (EMUX 2.6.39)
  • 通用 ARM rootfs 可以啟動 SSH (port 22222)
  • 但 AC15 特定服務(cfmd、httpd、telnet)未整合
  • 需要手動掛載 AC15 rootfs 並執行初始化腳本

結論:硬體虛擬化正確,但缺少 AC15 環境整合

EMUX 完整解決方案

優勢:

  • QEMU-system + NFS mount + chroot 自動化
  • 預載 NVRAM/CFM shim libraries
  • 隔離網路環境(--internal Docker network)
  • 支援多種嵌入式設備(包括 Tenda AC15)

0x02 EMUX 環境建置

網路隔離設定

# 建立內部網路(無外網存取)
docker network create --internal ac15-lab

# 啟動 EMUX 容器
docker run -it --rm \
  --name emux-tenda-ac15 \
  --privileged \
  --network ac15-lab \
  -v ac15-emux-case:/emux/work \
  emux/firmware:latest /bin/bash

網路拓撲:

Host
  └─ Docker network: ac15-lab (--internal)
       └─ EMUX container
            └─ QEMU ARM guest (TAP interface)
                 └─ AC15 services @ 192.168.100.2
                      ├─ httpd:80
                      └─ telnetd:23

ARM Guest 啟動

在 EMUX 容器內執行內建run-init :

  1. 載入 NVRAM emulation library
  2. 掛載 AC15 squashfs rootfs
  3. chroot 進入 /emux/firmware/AC15/squashfs-root
  4. 啟動 cfmd、httpd、telnetd

0x03 CFM 系統與認證流程

CFM (Configuration Management) 架構

cfmd (daemon)
  ├─ NVRAM emulation (persistent storage)
  ├─ Key-value database (sys.*, lan.*, wan.*)
  └─ Provides: GetValue(), SetValue() APIs
       ↓
httpd (web server)
  └─ Calls CFM APIs for config read/write

實際認證流程

Step 1: 讀取 CFM 中的密碼

# 在 ARM guest 中查詢
cfm get sys.userpass

# 輸出
ce80adc6ed1ab2b7f2c85b5fdcd8babc

Step 2: 登入取得 session cookie

curl -i -X POST http://192.168.100.2/login/Auth \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=admin&password=ce80adc6ed1ab2b7f2c85b5fdcd8babc"
HTTP/1.1 302 Found
Set-Cookie: password=ce80adc6ed1ab2b7f2c85b5fdcd8babcavrcvb; path=/
Location: http://192.168.100.2/main.html

Step 3: 使用有效 cookie 存取 /goform/*

export SESSION="password=ce80adc6ed1ab2b7f2c85b5fdcd8babcavrcvb"

curl -X POST http://192.168.100.2/goform/telnet \
  -H "Cookie: $SESSION" \
  -d "xxx"

上一篇
【𝕯𝖆𝖞 𝟔】My First CVE (Reproduction) - Web Command Injeciton (1/2)
下一篇
【𝕯𝖆𝖞 𝟖】CVE-2025-25634 (1/2)
系列文
Like an Exploition:IoT 韌體漏洞鍊成術 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言