
Un estudio completo de análisis de seguridad de hardware realizado sobre el router NETIS WF2409E. Mediante el desmontaje del dispositivo, la identificación de interfaces de depuración y la extracción del firmware, se documenta todo el proceso del análisis de hardware, los detalles de las vulnerabilidades y las recomendaciones de seguridad correspondientes, con el objetivo de contribuir a mejorar la seguridad de los dispositivos IoT.

| Categoría | Parámetro | Descripción |
|---|---|---|
| Información del dispositivo | Modelo | Netis WF2409E |
| Tipo | Router inalámbrico N de 300 Mbps | |
| Alimentación | DC 9V/500mA | |
| Versión de hardware | V1.8 | |
| Versión de PCB | PB-7189-M02G-20 | |
| Fecha de fabricación | 2015-03-23 | |
| País de fabricación | China | |
| Identificadores de red | Número de serie | 2409EEU5B102714 V1.8 |
| Dirección MAC | W8D398DFB68 | |
| SSID predeterminado | netis_BDFB68 | |
| Contraseña predeterminada | password | |
| Dirección de administración | http://netis.cc | |
| Interfaces de hardware | Puerto WAN | 1 (RJ45 azul) |
| Puertos LAN | 4 (RJ45 negros, LAN1-4) | |
| Antenas | 3 antenas externas | |
| Conector de alimentación | Entrada DC (PWR) | |
| Botones funcionales | Default | Restablecer a configuración de fábrica |
| WPS | Configuración protegida de WiFi |



| Parámetro | Especificación |
|---|---|
| Modelo del procesador | RealTek RTL8196E |
| Arquitectura | 16-bit |
| Frecuencia de reloj | 380MHz |
| Fecha de compilación | 2014.09.29 |
| Parámetro | Descripción |
|---|---|
| Tipo de bootloader | Bootloader propietario de RealTek |
| Dirección de carga del kernel | 0x80500000 |
| Dirección inicial de ejecución | 0x80003440 |
| Rango de búsqueda de firma | 0x10000-0x170000 |
| Parámetro | Valor |
|---|---|
| Dirección IP | 192.168.0.1 |
| Máscara de subred | 255.255.255.0 |
| Dirección MAC | 04:8d:38:bd:fb:69 |
| Interfaz inalámbrica | wlan0 (incluye va0-va3, vxd) |
| Parámetro | Valor |
|---|---|
| Modelo del dispositivo | netis WF2419E_RU |
| Versión de firmware | V2.5.40200 |
| Fecha de firmware | 2016.09.02 |
| Versión de BusyBox | v1.00-pre8 (2015.01.23) |
Es importante señalar que este dispositivo probablemente no utiliza U-Boot. Indicadores clave:
---RealTek(RTL8196E)at 2014.09.29-19:16+0800 v1.0 [16bit](https://github.com/victorique-123/cve-2023-38829-netis-wf2409e_report/blob/HEAD/380MHz)
Comandos del bootloader:
<RealTek> FLR 80000000 0 100 #Чтение из Flash DB 80000000 100 #Просмотр содержимого памяти



/dev/mtdblock1 montado como directorio raíz /none montado como sistema de archivos de procesos /proctmpfs montado como sistema de archivos temporal /varEl sistema de archivos raíz está configurado de la siguiente manera:
/dev/mtdblock1Esto indica el uso de memoria flash MTD como medio de almacenamiento, mientras que los archivos del sistema están protegidos y optimizados en tamaño mediante solo lectura y compresión squashfs.
El sistema de archivos de procesos está configurado de la siguiente manera:
El sistema de archivos temporal está configurado de la siguiente manera:


binwalk -E --save netis.bin


binwalk netis.bin

Y obtener:

| Desplazamiento | Cabecera de la sección |
|---|---|
| 0x12F0 | ![]() |
| 0x32818 | ![]() |

etc/passwd:
Usando el servicio de descifrado de hashes https://hashes.com/en/decrypt/hash, la contraseña de root se recuperó con éxito como realtek.

web/welcome.htm:Esta es la página web de interfaz predeterminada

Búsqueda de dispositivos en FOFA mediante características en web/welcome.htm:
Comandos de búsqueda:
body="./images/logo_netis.png" && body="display:block; height:60px; float:left;"


Para acceder al panel de administración del dispositivo puede ser necesaria la autenticación con usuario y contraseña

Tras una autenticación exitosa se puede acceder al panel de administración

Primero, usando el comando ~/squashfs-root/web$ find, se encontraron los directorios disponibles y, con Burpsuit, se verificó su accesibilidad:| | 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 | | 330 |
| ==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== |
Ubicaciones potenciales de información:
Tras la verificación, podemos encontrar en el archivo ==/version.txt== la siguiente información:

La extracción de esta información se implementó mediante un script de Python:

Actualmente se han detectado las siguientes vulnerabilidades en este dispositivo, entre las cuales la vulnerabilidad CVE-2023-38829 es una vulnerabilidad de inyección de comandos presente en el módulo de pruebas de red del router NETIS SYSTEMS Router WF2409E en las funciones ping y traceroute. A través de la interfaz web de administración es posible inyectar comandos maliciosos en los parámetros de estas funciones, lo que conduce a la ejecución de comandos.
Para comprobar la presencia de esta vulnerabilidad, accedí al panel de administración del router y probé la vulnerabilidad en las funciones ping y traceroute.
Aquí inyecté el comando cd && ls && cd etc/ && cat passwd, que mostró el contenido del archivo de contraseñas.
A continuación se muestra la salida del panel de administración del router al inyectar el comando, lo que confirma la presencia de la vulnerabilidad.

Análisis CVSS 3.1 de las vulnerabilidades de inyección de comandos detectadas:
Evaluación de métricas base:
Métricas de impacto:


Puntuación final: 9.2/10 puntos , que corresponde a la categoría "crítica". Vector CVSS: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:F/RL:O/RC:C
Una puntuación tan alta de la vulnerabilidad se debe a las siguientes razones:
Primero busquemos los archivos donde puedan haber vulnerabilidades:
find . -name "*.cgi" ./web/cgi-bin/cgitest.cgi ./bin/cgitest.cgi
Supongo que las vulnerabilidades pueden manifestarse en los programas CGI, por lo que primero intentaré analizar el archivo ./web/cgi-bin/cgitest.cgi con IDA Pro.
Primero hay que encontrar los lugares de llamada de funciones similares; mediante la búsqueda se pudo encontrar la cadena "killall ping".
Al analizar el lugar de la llamada se puede ver que el programa, tras inicializar las funciones ping y traceroute, llama a /bin/network_test.sh

Y el lugar donde se encuentra la vulnerabilidad está precisamente en el módulo de pruebas de red. Bien, necesitamos analizar /bin/network_test.sh.
En primer lugar, es necesario realizar una búsqueda.

Encontramos la función network_test_sh:
......

Al analizar la función en detalle se pueden detectar los módulos de ejecución de comandos y de guardado de resultados.

En ellos: Ejecución del comando ping: ping -c %d -s %d %s -W %d > %s &
Ejecución del comando 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
El texto del fragmento (chunk 4/14) no fue incluido en el mensaje. Por favor, proporciona el contenido a traducir.```
# Ситуация с командой traceroute
loc_420574:
la $t9, sprintf #также прямой вызов sprintf
lw $a2, 0x108+var_D0($sp) #также отсутствует проверка параметров
No se proporcionó ningún contenido en el campo INPUT. No hay texto que traducir.```
la $t9, run_by_system jalr $t9 ; run_by_system #прямой вызов system для выполнения команды move $a0, $s1 #отсутствуют проверки безопасности

En el código falta una validación suficiente de los parámetros de entrada, lo que crea un riesgo potencial de inyección de comandos. Un atacante puede controlar el parámetro IP transmitido para ejecutar comandos de shell, por ejemplo:```
# Нормальный ввод 192.168.0.1
# Примеры вредоносного ввода
192.168.0.1; rm -rf / #удаление файлов
192.168.0.1 & id & #выполнение произвольных команд
Este script aprovecha la vulnerabilidad de inyección de comandos en la interfaz web del dispositivo para ejecutar comandos de forma remota mediante la creación de solicitudes HTTP especiales. El script explota la vulnerabilidad con dos solicitudes HTTP POST: la primera inyecta el comando, la segunda obtiene el resultado de la ejecución.
El primer paquete (netcore_set.cgi) está diseñado para: inyectar y ejecutar el comando

El segundo paquete (netcore_get.cgi) está diseñado para: obtener el resultado de la ejecución del comando

2. Codificación URL de todos los parámetros
3. Envío de una solicitud POST a netcore_set.cgi
### 11.3 Segunda Etapa: obtención de resultados
1. Formación de la segunda solicitud POST:```
{ "mode_name": "netcore_get",
"noneed": "noneed" }
Для тестирования скрипта я создал файл ceshi на хосте и попытался загрузить его на устройство через скрипт



Успешно!
Фактически эта уязвимость позволяет получить полный контроль над устройством, так как устройство по умолчанию использует root-доступ
| Parámetro verificado | Estado | Nota |
|---|
| Indicador de alimentación | Funcional | Se enciende de forma estable al encenderse |
| Indicadores de red | Funcionales | Parpadean al conectar |
| Estado del puerto WAN | Funcional | Conexión de red normal |
| Estado de los puertos LAN | Funcionales | Los 4 puertos funcionan |
| Función WiFi | Funcional | Antenas intactas, señal normal |
| Función WPS | Funcional | El botón responde |
| Función de restablecimiento | Funcional | El botón Default funciona |
| № | Modelo de chip | Fabricante | Función principal | Especificaciones técnicas | Notas |
|---|
| 1 | EM63A165TS-6G | EtronTech | Memoria del sistema | - Capacidad de 32 Mbit - Frecuencia de 166 MHz - Arquitectura SDRAM - Encapsulado TSOP-II | - Se utiliza para almacenamiento temporal de datos - Admite los cálculos del procesador principal |
| 2 | FR9886 61504 | Desconocido | Gestión de alimentación | - Encapsulado SOIC-8 - Circuito integrado | - DC-DC - Se encarga de la regulación de voltaje - Proporciona alimentación estable al sistema |
| 3 | RTL8196E | Realtek/RMC | Procesador principal | - Arquitectura MIPS - Diseño SoC - Fabricado en Taiwán | - CPU central del sistema - Se encarga de los cálculos y la gestión principales - Procesamiento de red integrado |
| 4 | MX25L3206E | Macronix | Memoria Flash | - Capacidad de 32 Mb (4 MB) - Interfaz SPI - Encapsulado SOIC | - Almacenamiento del firmware del sistema - Guardado de datos de configuración |
| 5 | RTL8192ER | Realtek/RMC | Comunicación inalámbrica | - Controlador WiFi - Encapsulado QFN | - Procesamiento de señales inalámbricas - Soporte de funciones WiFi |
| Parámetro | Valor | Valor hexadecimal |
|---|
| Modelo del chip | MX25L3205D | - |
| Capacidad total | 4MB | 0x400000 |
| Tamaño de bloque | 64KB | 0x10000 |
| Tamaño de sector | 4KB | 0x1000 |
| Tamaño de página | 256B | 0x100 |
| Nombre del servicio | Estado | Nota |
|---|
| Servidor DHCP | En funcionamiento | Normal |
| Servidor HTTP (Boa) | En funcionamiento | Reinicios anómalos |
| IAPP | En funcionamiento | IEEE 802.11f |
| MiniIGD | En funcionamiento | v1.08.1 |
| mini_upnpd | Error | Archivo no encontrado |
| telnetd | Error | Archivo no encontrado |
| ota_init.sh | Error | Archivo no encontrado |
| Comando | Sintaxis | Función |
|---|
| HELP | ? | Mostrar ayuda |
| DB/DW | DB/DW <dirección> | Lectura de memoria byte a byte / palabra a palabra |
| EB/EW | EB/EW <dirección> | Escritura en memoria byte a byte / palabra a palabra |
| FLR | FLR | Lectura de datos desde Flash a RAM |
| FLW | FLW <dst_ROM><src_RAM> | Escritura de datos desde RAM a Flash |
| IPCONFIG | IPCONFIG <dirección IP> | Configuración de dirección IP |
| LOADADDR | LOADADDR <dirección> | Establecimiento de dirección de carga |
| CMP | CMP | Comparación de datos en memoria |
| J | J <dirección> | Salto a la ejecución |
| MDIOR/MDIOW | MDIOR/W [data] | Lectura/escritura de registros PHY |
| PHYR/PHYW | PHYR/W [data] | Lectura/escritura de registros PHY (método alternativo) |
| PORT1 | PORT1 | Prueba del puerto 1 |
| AUTOBURN | AUTOBURN 0/1 | Control de la programación automática (auto-flash) |
| Tipo de comando | Comandos disponibles |
|---|
| Comandos básicos | ., :, cd, help, exit |
| Control de ejecución | break, continue, eval, exec |
| Operaciones con variables | export, read, readonly, set, shift |
| Gestión de procesos | times, trap, wait |
| Gestión de permisos | login, newgrp, umask |
| Categoría | Herramientas | Función |
|---|
| Herramientas de red | iptables ip6tables brctl ifconfig | Configuración del firewall, firewall IPv6, gestión de puentes, configuración de interfaces de red |
| Administración del sistema | busybox ps kill mount | Conjunto de herramientas básicas, visualización de procesos, gestión de procesos, montaje del sistema de archivos |
| Comunicación VPN | pppd pptp l2tpd pptpctrl | Demonio PPP, cliente PPTP, demonio L2TP, control de PPTP |
| Gestión de comunicación inalámbrica | iwcontrol iwpriv wlanapp.sh wps_init.sh | Control inalámbrico, comandos privados inalámbricos, gestión de aplicaciones inalámbricas, inicialización de WPS |
| Scripts de firewall | firewall.sh firewall_ipv6.sh firewall_pptp.sh | Firewall principal, firewall IPv6, firewall PPTP |
| DHCP/DNS | dhcpc.sh dhcpd.sh dnrd | Cliente DHCP, servidor DHCP, reenvío de DNS |
| Servicio web | boa webs cgitest.cgi | Servidor web, administración web, prueba CGI |
| Ruta | Tipo de información | Descripción |
|---|
| /proc/cpuinfo | Información de la CPU | Información detallada del procesador |
| /proc/meminfo | Información de la memoria | Estado de uso de la memoria del sistema |
| /proc/mtd | Información de particiones | División de la memoria Flash |
| /proc/net/* | Información de red | Estado de las interfaces y conexiones de red |
| /proc/sys/* | Parámetros del sistema | Parámetros ajustables del sistema |
| /proc/version | Información de versión | Información de la versión del kernel |
| Componente | Descripción | Especificaciones técnicas |
|---|
| RTL8196E | Procesador principal | - Arquitectura MIPS - Diseño SoC - Fabricado en Taiwán - CPU central del sistema - Se encarga de los cálculos y la gestión principales - Funciones integradas de procesamiento de red |
| EM63A165TS-6G | Memoria del sistema | - Capacidad de 32 Mbit - Frecuencia de 166 MHz - Arquitectura SDRAM - Encapsulado TSOP-II - Almacenamiento temporal de datos del sistema - Admite los cálculos del procesador principal |
| MX25L3206E | Memoria flash | - Capacidad de 32 Mbit (4 MB) - Interfaz SPI - Encapsulado SOIC - Almacenamiento del firmware del sistema - Guardado de datos de configuración |
| RTL8192ER | Red inalámbrica | - Controlador WiFi - Encapsulado QFN - Procesamiento de señales inalámbricas - Soporte WiFi |
| FR9886 61504 | Gestión de alimentación | - Encapsulado SOIC-8 - Circuito integrado - DC-DC - Se encarga de la regulación de voltaje - Proporciona alimentación estable al sistema |
| Archivo | Desplazamiento (decimal) | Desplazamiento (hexadecimal) | Descripción | Información adicional |
|---|
| netis.bin | 4848 | 0x12F0 | Datos comprimidos LZMA | Tamaño del diccionario: 8388608 bytes, tamaño tras descompresión: 56464 bytes; se requiere análisis del contenido tras la descompresión |
| netis.bin | 206872 | 0x32818 | Datos comprimidos LZMA | Tamaño del diccionario: 8388608 bytes, tamaño tras descompresión: 3278684 bytes; contiene el kernel completo de Linux 2.6.30 |
| netis.bin | 1507328 | 0x170000 | Sistema de archivos SquashFS | Little endian, compresión gzip, tamaño: 2628241 bytes |
| 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== |
| ID de vulnerabilidad | Tipo de vulnerabilidad | Modelo | Versión | Informe/exploit |
|---|
| CVE-2023-42336 | sensitive information disclosure | 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 | remote code execution | Netis | wf2409e_firmware < 3.6.42541 wf3409e < - | https://github.com/adhikara13/CVE-2023-38829-NETIS-WF2409E |