对NETIS WF2409E路由器进行的一次完整硬件安全分析研究。通过对设备进行拆解分析、调试接口识别、固件提取等工作,记录了硬件分析的全过程、漏洞细节以及相应的安全建议,希望能帮助提高物联网设备的安全性。

| 类别 | 参数 | 描述 |
|---|---|---|
| 设备信息 | 型号 | Netis WF2409E |
| 类型 | 300Mbps 无线 N 路由器 | |
| 电源 | DC 9V/500mA | |
| 硬件版本 | V1.8 | |
| PCB 版本 | PB-7189-M02G-20 | |
| 生产日期 | 2015-03-23 | |
| 生产国 | 中国 | |
| 网络标识 | 序列号 | 2409EEU5B102714 V1.8 |
| MAC 地址 | W8D398DFB68 | |
| 默认 SSID | netis_BDFB68 | |
| 默认密码 | password | |
| 管理地址 | http://netis.cc | |
| 硬件接口 | WAN 口 | 1(蓝色 RJ45) |
| LAN 口 | 4(黑色 RJ45,LAN1-4) | |
| 天线 | 3 根外置天线 | |
| 电源接口 | DC 输入(PWR) | |
| 功能按钮 | Default | 恢复出厂设置 |
| WPS | 安全 WiFi 设置 |



| 参数 | 规格 |
|---|---|
| 处理器型号 | RealTek RTL8196E |
| 架构 | 16-bit |
| 时钟频率 | 380MHz |
| 编译日期 | 2014.09.29 |
| 参数 | 描述 |
|---|---|
| 引导加载程序类型 | RealTek 专有引导加载程序 |
| 内核加载地址 | 0x80500000 |
| 起始执行地址 | 0x80003440 |
| 签名搜索范围 | 0x10000-0x170000 |
| 参数 | 值 |
|---|---|
| IP 地址 | 192.168.0.1 |
| 子网掩码 | 255.255.255.0 |
| MAC 地址 | 04:8d:38:bd:fb:69 |
| 无线接口 | wlan0(含 va0-va3, vxd) |
| 参数 | 值 |
|---|---|
| 设备型号 | netis WF2419E_RU |
| 固件版本 | V2.5.40200 |
| 固件日期 | 2016.09.02 |
| BusyBox 版本 | v1.00-pre8 (2015.01.23) |
值得注意的是,该设备可能未使用 U-Boot。关键特征如下:
---RealTek(RTL8196E)at 2014.09.29-19:16+0800 v1.0 [16bit](https://github.com/victorique-123/cve-2023-38829-netis-wf2409e_report/blob/master/380MHz)
Bootloader 命令:
<RealTek> FLR 80000000 0 100 #从 Flash 读取
<RealTek> DB 80000000 100 #查看内存内容



/dev/mtdblock1 挂载为根目录 /none 挂载为进程文件系统 /proctmpfs 挂载为临时文件系统 /var根文件系统配置如下:
/dev/mtdblock1这表明使用 MTD Flash 作为存储介质,通过只读和 squashfs 压缩保护系统文件并优化空间。
进程文件系统配置如下:
临时文件系统配置如下:


binwalk -E --save netis.bin


binwalk netis.bin

得到结果:

| 偏移量 | 分区头部 |
|---|---|
| 0x12F0 | ![]() |
| 0x32818 | ![]() |

etc/passwd:
使用哈希解密服务 https://hashes.com/en/decrypt/hash,成功恢复 root 密码为 realtek。

web/welcome.htm:这是默认的 Web 界面页面

通过 web/welcome.htm 中的特征在 FOFA 中搜索设备:
搜索命令:
body="./images/logo_netis.png" && body="display:block; height:60px; float:left;"


访问设备管理面板可能需要使用用户名和密码进行身份验证

成功认证后,可以进入管理面板

首先使用命令 ~/squashfs-root/web$ find 找到可用目录,并通过 Burpsuit 检查其可访问性:| | 路径 (Payload) | 代码 (Code) | | 长度 (Lenth) |
| ------ | ---------------------------- | -------------- | ----- | ------------ |
| 1 | /cgi-bin | 200 | | 167 |
| 2 | /cgi-bin/cgitest.cgi | - | ERROR | - |
| 3 | /script | 200 | | 168 |
| 4 | /script/init.js | 200 | | 1282 |
| 5 | /script/logic.js | 200 | | 65677 |
| 6 | /script/menu.js | 200 | | 4976 |
| 7 | /script/netcore.js | 200 | | 151935 |
| 8 | /script/action.js | 200 | | 182624 |
| 9 | /script/debug.js | 200 | | 28570 |
| ==10== | ==/version.txt== | ==200== | | ==206== |
| ==11== | ==/update.htm== | ==200== | | ==1230== |
| 12 | /config | 200 | | 168 |
| 13 | /config/language_es.js | 200 | | 79333 |
| 14 | /config/language_it.js | 200 | | 76802 |
| 15 | /config/language_id.js | 200 | | 74795 |
| 16 | /config/language_du.js | 200 | | 78782 |
| 17 | /config/language_ma.js | 200 | | 73594 |
| 18 | /config/language_po.js | 200 | | 76458 |
| 19 | /config/language_tu.js | 200 | | 77747 |
| 20 | /config/language_fr.js | 200 | | 78165 |
| 21 | /config/language_ro.js | 200 | | 73621 |
| 22 | /config/language_cz.js | 200 | | 75968 |
| 23 | /config/language_ua.js | 200 | | 98335 |
| 24 | /config/language_us.js | 200 | | 84173 |
| 25 | /config/config.js | 200 | | 75899 |
| 26 | /config/language_ru.js | 200 | | 108998 |
| 27 | /config/language_de.js | 200 | | 78674 |
| 28 | /config/language_pt.js | 200 | | 77954 |
| 29 | /config/language_cn.js | 200 | | 62001 |
| 30 | /config/language_tc.js | 200 | | 74268 |
| 31 | /system_log.txt | 404 | | |
| ==32== | ==/index.htm== | ==200== | | ==4336== |
| 33 | /css | 200 | | 167 |
| 34 | /css/style.css | 200 | | 5441 |
| 35 | /css/netcore.css | 200 | | 11536 |
| 36 | /css/welcome.css | 200 | | 6270 |
| 37 | /Config.tgz | 404 | | 326 |
| 38 | /images | 200 | | 168 |
| 39 | /images/first.png | 200 | | 838 |
| 40 | /images/icon_no.gif | 200 | | 240 |
| 41 | /images/top_right_bg.gif | 200 | | 222 |
| 42 | /images/logo_netis.png | 200 | | 7297 |
| 43 | /images/icon_jian.gif | 200 | | 239 |
| 44 | /images/show_pwd.png | 200 | | 1433 |
| 45 | /images/icon_no1.gif | 200 | | 498 |
| 46 | /images/nextt.png | 200 | | 1026 |
| 47 | /images/lastt.png | 200 | | 845 |
| 48 | /images/icon_intro_internet.gif | 200 | | 6994 |
| 49 | /images/help_b1.gif | 200 | | 540 |
| 50 | /images/high.gif | 200 | | 10846 |
| 51 | /images/yandex_en.png | 200 | | 3519 |
| 52 | /images/help_b1.jpg | 200 | | 620 |
| 53 | /images/back.gif | 200 | | 379 |
| 54 | /images/icon_intro_wireless.jpg | 200 | | 3838 |
| 55 | /images/icon_jian1.gif | 200 | | 490 |
| 56 | /images/left_021.jpg | 200 | | 558 |
| 57 | /images/edit.gif | 200 | | 365 |
| 58 | /images/pre.png | 200 | | 1029 |
| 59 | /images/btn_mobile_setup.jpg | 200 | | 3053 |
| 60 | /images/icon_now.gif | 200 | | 242 |
| 61 | /images/top_right_bg.jpg | 200 | | 223 |
| 62 | /images/bg_intro_bottom.png | 200 | | 3562 |
| 63 | /images/favicon.ico | 200 | | 4458 |
| 64 | /images/btn_quick_setup.jpg | 200 | | 4353 |
| 65 | /images/bg_intro_top.png | 200 | | 3605 |
| 66 | /images/mt-link.gif | 200 | | 5823 |
| 67 | /images/link.gif | 200 | | 1045 |
| 68 | /images/del.gif | 200 | | 313 |
| ==69== | ==/images/Makefile== | ==200== | | ==593== |
| 70 | /images/icon_jia1.gif | 200 | | 490 |
| 71 | /images/blue.jpg | 200 | | 2584 |
| 72 | /images/normal.gif | 200 | | 10818 |
| 73 | /images/yandex.png | 200 | | 2159 |
| 74 | /images/bg_leftmenu.gif | 200 | | 686 |
| 75 | /images/icon_jia.gif | 200 | | 252 |
| 76 | /images/icon_now1.gif | 200 | | 487 |
| ==77== | ==/welcome.htm== | ==200== | | ==30155== |
| ==78== | ==/index.html== | ==200== | | ==326== |
| 79 | /help | 200 | | 166 |
| ==80== | ==/backup.htm== | ==200== | | ==1304== |
潜在的信息存放位置:
检查后,我们可以在 ==/version.txt== 文件中找到以下信息:

该信息的提取通过 Python 脚本实现:

目前在该设备中发现了以下漏洞,其中 CVE-2023-38829 是存在于 NETIS SYSTEMS Router WF2409E 路由器网络测试模块的 ping 和 traceroute 功能中的命令注入漏洞。通过 Web 管理界面,可以在这些功能的参数中注入恶意命令,导致命令执行。
为了验证该漏洞的存在,我登录了路由器管理面板,并在 ping 和 traceroute 功能中测试了漏洞。
这里我注入了命令 cd && ls && cd etc/ && cat passwd,该命令输出了密码文件的内容。
以下是在注入命令时路由器管理面板的输出,确认了漏洞的存在。

CVSS 3.1 分析发现的命令注入漏洞:
基本指标评分:
影响指标:


最终评分:9.2/10,属于“严重”等级。 CVSS-Vector: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:F/RL:O/RC:C
漏洞评分如此之高是由于以下原因:
首先,让我们找到可能包含漏洞的文件:
find . -name "*.cgi" ./web/cgi-bin/cgitest.cgi ./bin/cgitest.cgi
我假设漏洞可能出现在 CGI 程序中,因此首先尝试使用 IDA Pro 分析文件 ./web/cgi-bin/cgitest.cgi。
首先需要找到类似函数的调用位置,通过搜索找到了字符串 "killall ping"。
在分析调用位置时,可以看到程序在初始化 ping 和 traceroute 函数后调用了 /bin/network_test.sh

而漏洞所在的位置正是网络测试模块。好的,我们需要分析 /bin/network_test.sh。
首先需要执行搜索。

找到函数 network_test_sh:
......

在详细分析函数时,可以发现命令执行和结果保存模块。

其中:ping 命令执行:ping -c %d -s %d %s -W %d > %s &
traceroute 命令执行:traceroute -I -m %d %s > %s &
loc_4205B8: lw v0, 0x108+var_D4(sp) #прямая загрузка параметров lw a3, 0x108+var_D8(sp) la t9, sprintf #прямой вызов sprintf #отсутствует проверка параметров перед sprintf
## 配置
- **honeypot_config.yaml** — 主要配置文件。
- **server_config.yaml** — Web服务器设置(端口、TLS、超时)。
- **rules/** — 包含检测规则YAML文件的目录。
- **modules/** — Web应用模块(WordPress、Joomla、Drupal、Roundcube等)。
- **config_extended.yaml.example** — 扩展配置示例。
### 环境变量
| 变量 | 描述 | 默认值 |
|-----------|----------|--------------|
| `LOG_DIR` | 日志目录路径 | `/var/log/honeypot` |
| `DATA_DIR` | 数据目录路径(数据库) | `/var/lib/honeypot` |
| `CONFIG_DIR` | 配置目录路径 | `/etc/honeypot` |
| `INTERFACE` | 监听网络接口 | `0.0.0.0` |
| `PORT_HTTP` | HTTP端口 | `80` |
| `PORT_HTTPS` | HTTPS端口 | `443` |
| `TLS_CERT` | TLS证书路径 | `cert.pem` |
| `TLS_KEY` | TLS密钥路径 | `key.pem` |
| `DEBUG` | 启用调试 | `false` |
### 配置示例
```yaml
honeypot:
name: "my-honeypot"
version: "1.0"
log_level: "info"
modules:
- wordpress
- joomla
- drupal
rules:
- sql_injection
- xss
- lfi
server:
listen: "0.0.0.0:8080"
tls:
enabled: true
cert: "/etc/honeypot/cert.pem"
key: "/etc/honeypot/key.pem"
timeout: 30
规则存储在 rules/ 目录中。每条规则是一个单独的YAML文件。示例:
rule:
id: "sql_injection"
name: "SQL Injection"
severity: "high"
pattern: "(?i)(select|union|insert|drop|delete|update|alter|exec|--|#)"
description: "检测SQL注入"
action: "block"
threshold: 3
interval: 60
loc_420574: la $t9, sprintf #также прямой вызов sprintf lw $a2, 0x108+var_D0($sp) #также отсутствует проверка параметров
(No input provided)```
# После построения команды происходит прямое выполнение
la $t9, run_by_system
jalr $t9 ; run_by_system #прямой вызов system для выполнения команды
move $a0, $s1 #отсутствуют проверки безопасности

代码中缺乏对输入参数的充分验证,存在潜在的命令注入风险。攻击者可以控制传入的IP参数来执行shell命令,例如:```
192.168.0.1; rm -rf / #удаление файлов 192.168.0.1 & id & #выполнение произвольных команд
## 11. 利用脚本
### 11.1. 脚本概述
此脚本利用设备Web界面的命令注入漏洞,通过构造特殊的HTTP请求来远程执行命令。该脚本通过两个HTTP POST请求进行漏洞利用:第一个请求注入命令,第二个请求获取执行结果。
第一个数据包 (netcore_set.cgi) 用于:注入并执行命令

第二个数据包 (netcore_get.cgi) 用于:获取命令执行结果

### 11.2 第一阶段:命令注入
1. 构建包含以下关键参数的POST请求体:```
{ "mode_name": "netcore_set",
"tools_type": "2",
"tools_ip_url": f"| {command}", # точка инъекции команды
"tools_cmd": "1",
"net_tools_set": "1" }
2. 向 netcore_get.cgi 发送请求
3. 解析响应中的 tools_results 字段以获取命令执行结果
### 11.4 测试脚本
为了测试脚本,我在主机上创建了文件 `ceshi`,并尝试通过脚本将其上传到设备

成功!
实际上,该漏洞允许完全控制设备,因为设备默认使用 root 权限
| 检查项 | 状态 | 备注 |
|---|
| 电源指示灯 | 正常 | 通电后稳定亮起 |
| 网络指示灯 | 正常 | 连接时闪烁 |
| WAN 口状态 | 正常 | 正常连接网络 |
| LAN 口状态 | 正常 | 全部 4 个端口工作正常 |
| WiFi 功能 | 正常 | 天线完好,信号正常 |
| WPS 功能 | 正常 | 按钮响应 |
| 复位功能 | 正常 | Default 按钮正常工作 |
| 编号 | 芯片型号 | 制造商 | 主要功能 | 技术规格 | 备注 |
|---|
| 1 | EM63A165TS-6G | EtronTech | 系统内存 | - 容量 32 Mbit - 频率 166MHz - SDRAM 架构 - TSOP-II 封装 | - 用于临时数据存储 - 支持主处理器计算 |
| 2 | FR9886 61504 | 未知 | 电源管理 | - SOIC-8 封装 - 集成电路 | - DC-DC - 负责电压调节 - 提供稳定的系统电源 |
| 3 | RTL8196E | Realtek/RMC | 主处理器 | - MIPS 架构 - SoC 设计 - 台湾制造 | - 系统中央处理器 - 负责主要计算和管理 - 集成网络处理功能 |
| 4 | MX25L3206E | Macronix | Flash 存储器 | - 容量 32Mb (4MB) - SPI 接口 - SOIC 封装 | - 存储系统固件 - 保存配置数据 |
| 5 | RTL8192ER | Realtek/RMC | 无线通信 | - WiFi 控制器 - QFN 封装 | - 处理无线信号 - 支持 WiFi 功能 |
| 参数 | 值 | 十六进制值 |
|---|
| 芯片型号 | MX25L3205D | - |
| 总容量 | 4MB | 0x400000 |
| 块大小 | 64KB | 0x10000 |
| 扇区大小 | 4KB | 0x1000 |
| 页大小 | 256B | 0x100 |
| 服务名称 | 状态 | 备注 |
|---|
| DHCP 服务器 | 运行中 | 正常 |
| HTTP 服务器 (Boa) | 运行中 | 异常重启 |
| IAPP | 运行中 | IEEE 802.11f |
| MiniIGD | 运行中 | v1.08.1 |
| mini_upnpd | 错误 | 文件未找到 |
| telnetd | 错误 | 文件未找到 |
| ota_init.sh | 错误 | 文件未找到 |
| 命令 | 语法 | 功能 |
|---|
| HELP | ? | 显示帮助信息 |
| DB/DW | DB/DW <地址> <长度> | 逐字节/逐字读取内存 |
| EB/EW | EB/EW <地址> <值> | 逐字节/逐字写入内存 |
| FLR | FLR <目标><源><长度> | 从 Flash 读取数据到 RAM |
| FLW | FLW <ROM目标><RAM源><长度> | 从 RAM 写入数据到 Flash |
| IPCONFIG | IPCONFIG <IP 地址> | 设置 IP 地址 |
| LOADADDR | LOADADDR <地址> | 设置加载地址 |
| CMP | CMP <目标><源><长度> | 比较内存数据 |
| J | J <地址> | 跳转执行 |
| MDIOR/MDIOW | MDIOR/W [data] | 读取/写入 PHY 寄存器 |
| PHYR/PHYW | PHYR/W [data] | 读取/写入 PHY 寄存器(替代方法) |
| PORT1 | PORT1 | 端口 1 补丁测试 |
| AUTOBURN | AUTOBURN 0/1 | 控制自动刷写 |
| 命令类型 | 可用命令 |
|---|
| 基本命令 | ., :, cd, help, exit |
| 执行控制 | break, continue, eval, exec |
| 变量操作 | export, read, readonly, set, shift |
| 进程控制 | times, trap, wait |
| 权限控制 | login, newgrp, umask |
| 类别 | 工具 | 功能 |
|---|
| 网络工具 | iptables ip6tables brctl ifconfig | 防火墙配置、IPv6 防火墙、桥接管理、网络接口配置 |
| 系统管理 | busybox ps kill mount | 基本工具集、进程查看、进程管理、文件系统挂载 |
| VPN 通信 | pppd pptp l2tpd pptpctrl | PPP 守护进程、PPTP 客户端、L2TP 守护进程、PPTP 控制 |
| 无线管理 | iwcontrol iwpriv wlanapp.sh wps_init.sh | 无线控制、无线私有命令、无线应用管理、WPS 初始化 |
| 防火墙脚本 | firewall.sh firewall_ipv6.sh firewall_pptp.sh | 主防火墙、IPv6 防火墙、PPTP 防火墙 |
| DHCP/DNS | dhcpc.sh dhcpd.sh dnrd | DHCP 客户端、DHCP 服务器、DNS 转发 |
| Web 服务 | boa webs cgitest.cgi | Web 服务器、网络管理、CGI 测试 |
| 路径 | 信息类型 | 描述 |
|---|
| /proc/cpuinfo | CPU 信息 | 处理器详细信息 |
| /proc/meminfo | 内存信息 | 系统内存使用状态 |
| /proc/mtd | 分区信息 | Flash 分区划分 |
| /proc/net/* | 网络信息 | 网络接口和连接状态 |
| /proc/sys/* | 系统参数 | 可调节的系统参数 |
| /proc/version | 版本信息 | 内核版本信息 |
| 组件 | 描述 | 技术规格 |
|---|
| RTL8196E | 主处理器 | - MIPS 架构 - SoC 设计 - 台湾制造 - 系统中央处理器 - 负责主要计算和管理 - 内置网络处理功能 |
| EM63A165TS-6G | 系统内存 | - 容量 32 Mbit - 频率 166 MHz - SDRAM 架构 - TSOP-II 封装 - 系统临时数据存储 - 支持主处理器计算 |
| MX25L3206E | Flash 存储器 | - 容量 32 Mbit (4 MB) - SPI 接口 - SOIC 封装 - 存储系统固件 - 保存配置数据 |
| RTL8192ER | 无线网络 | - WiFi 控制器 - QFN 封装 - 处理无线信号 - 支持 WiFi |
| FR9886 61504 | 电源管理 | - SOIC-8 封装 - 集成电路 - DC-DC - 负责电压调节 - 提供稳定的系统电源 |
| 文件 | 偏移量(十进制) | 偏移量(十六进制) | 描述 | 附加信息 |
|---|
| netis.bin | 4848 | 0x12F0 | LZMA 压缩数据 | 字典大小:8388608 字节,解压后大小:56464 字节;需要分析解压后的内容 |
| netis.bin | 206872 | 0x32818 | LZMA 压缩数据 | 字典大小:8388608 字节,解压后大小:3278684 字节;包含完整 Linux 2.6.30 内核 |
| netis.bin | 1507328 | 0x170000 | SquashFS 文件系统 | 小端序,gzip 压缩,大小:2628241 字节 |
| 0x170000 |
![]() |
| 路径 (Payload) | 代码 (Code) | 长度 (Lenth) |
|---|
| ==10== | ==/version.txt== | ==200== | ==206== |
| ==11== | ==/update.htm== | ==200== | ==1230== |
| ==32== | ==/index.htm== | ==200== | ==4336== |
| ==69== | ==/images/Makefile== | ==200== | ==593== |
| ==77== | ==/welcome.htm== | ==200== | ==30155== |
| ==78== | ==/index.html== | ==200== | ==326== |
| ==80== | ==/backup.htm== | ==200== | ==1304== |
| 漏洞编号 | 漏洞类型 | 型号 | 版本 | 报告/利用 |
|---|
| CVE-2023-42336 | 敏感信息泄露 | Netis | wf2409e_firmware < 1.0.1.705 wf3409e < v4 | https://github.com/adhikara13/CVE/blob/main/netis_WF2409E/Root_Hard_Code.md |
| CVE-2023-38829 | 远程代码执行 | Netis | wf2409e_firmware < 3.6.42541 wf3409e < - | https://github.com/adhikara13/CVE-2023-38829-NETIS-WF2409E |