
Uno studio completo di analisi della sicurezza hardware sul router NETIS WF2409E. Attraverso la disassemblaggio del dispositivo, l'identificazione delle interfacce di debug, l'estrazione del firmware e altre operazioni, sono state registrate l'intero processo di analisi hardware, i dettagli delle vulnerabilità e le corrispondenti raccomandazioni di sicurezza, con l'obiettivo di contribuire a migliorare la sicurezza dei dispositivi IoT.

| Categoria | Parametro | Descrizione |
|---|---|---|
| Informazioni sul dispositivo | Modello | Netis WF2409E |
| Tipo | 300Mbps Wireless N Router | |
| Alimentazione | DC 9V/500mA | |
| Versione hardware | V1.8 | |
| Versione PCB | PB-7189-M02G-20 | |
| Data di produzione | 2015-03-23 | |
| Paese di produzione | Cina | |
| Identificatori di rete | Numero di serie | 2409EEU5B102714 V1.8 |
| Indirizzo MAC | W8D398DFB68 | |
| SSID predefinito | netis_BDFB68 | |
| Password predefinita | password | |
| Indirizzo di gestione | http://netis.cc | |
| Interfacce hardware | Porta WAN | 1 (RJ45 blu) |
| Porte LAN | 4 (RJ45 neri, LAN1-4) | |
| Antenne | 3 antenne esterne | |
| Connettore di alimentazione | Ingresso DC (PWR) | |
| Pulsanti funzionali | Default | Reset alle impostazioni di fabbrica |
| WPS | Configurazione WiFi protetta |



| Parametro | Specifica |
|---|---|
| Modello processore | RealTek RTL8196E |
| Architettura | 16-bit |
| Frequenza di clock | 380MHz |
| Data di compilazione | 2014.09.29 |
| Parametro | Descrizione |
|---|---|
| Tipo di bootloader | Bootloader proprietario RealTek |
| Indirizzo di caricamento del kernel | 0x80500000 |
| Indirizzo iniziale di esecuzione | 0x80003440 |
| Intervallo di ricerca della firma | 0x10000-0x170000 |
| Parametro | Valore |
|---|---|
| Indirizzo IP | 192.168.0.1 |
| Subnet mask | 255.255.255.0 |
| Indirizzo MAC | 04:8d:38:bd:fb:69 |
| Interfaccia wireless | wlan0 (incluse va0-va3, vxd) |
| Parametro | Valore |
|---|---|
| Modello dispositivo | netis WF2419E_RU |
| Versione firmware | V2.5.40200 |
| Data firmware | 2016.09.02 |
| Versione BusyBox | v1.00-pre8 (2015.01.23) |
È importante notare che questo dispositivo probabilmente non utilizza U-Boot. I segni chiave:
---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)
Comandi Bootloader:
<RealTek> FLR 80000000 0 100 #Lettura da Flash DB 80000000 100 #Visualizzazione contenuto memoria



/dev/mtdblock1 montato come directory root /none montato come file system dei processi /proctmpfs montato come file system temporaneo /varIl file system di root è configurato come segue:
/dev/mtdblock1Ciò indica l'uso di memoria Flash MTD come supporto, con i file di sistema protetti e ottimizzati in termini di volume tramite sola lettura e compressione squashfs.
Il file system dei processi è configurato come segue:
Il file system temporaneo è configurato come segue:


binwalk -E --save netis.bin


binwalk netis.bin


| Offset | Intestazione partizione |
|---|---|
| 0x12F0 | ![]() |
| 0x32818 | ![]() |

etc/passwd:
Utilizzando il servizio di decifratura hash https://hashes.com/en/decrypt/hash, la password di root è stata recuperata con successo come realtek.

web/welcome.htm:Questa è la pagina dell'interfaccia web predefinita

Ricerca di dispositivi in FOFA tramite caratteristiche in web/welcome.htm:
Comandi di ricerca:
body="./images/logo_netis.png" && body="display:block; height:60px; float:left;"


Per accedere al pannello di amministrazione del dispositivo potrebbe essere richiesta l'autenticazione tramite login e password

Dopo l'autenticazione riuscita è possibile accedere al pannello di amministrazione

Prima di tutto, usando il comando ~/squashfs-root/web$ find sono state trovate le directory disponibili, e tramite Burpsuit è stata verificata la loro accessibilità:| | 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== |
Potenziali posizioni delle informazioni:
Dopo la verifica, possiamo trovare le seguenti informazioni nel file ==/version.txt==:

L'estrazione di queste informazioni è stata implementata tramite uno script Python:

Attualmente in questo dispositivo sono state rilevate le seguenti vulnerabilità, tra cui la vulnerabilità CVE-2023-38829 è una vulnerabilità di iniezione di comandi presente nel modulo di test di rete del router NETIS SYSTEMS Router WF2409E nelle funzioni ping e traceroute. Attraverso l'interfaccia di amministrazione web è possibile iniettare comandi dannosi nei parametri di queste funzioni, portando all'esecuzione di comandi.
Per verificare la presenza di questa vulnerabilità, ho effettuato l'accesso al pannello di amministrazione del router e ho testato la vulnerabilità nelle funzioni ping e traceroute.
Qui ho iniettato il comando cd && ls && cd etc/ && cat passwd, che ha visualizzato il contenuto del file delle password.
Di seguito è mostrato l'output del pannello di amministrazione del router durante l'iniezione del comando, confermando la presenza della vulnerabilità.

Analisi CVSS 3.1 delle vulnerabilità di iniezione di comandi rilevate:
Valutazione dei parametri di base:
Metriche di impatto:


Punteggio finale: 9.2/10 punti, che appartiene alla categoria 'critica'. Vector CVSS: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:F/RL:O/RC:C
Un punteggio così elevato della vulnerabilità è dovuto ai seguenti motivi:
Per prima cosa troviamo i file che potrebbero contenere vulnerabilità:
find . -name "*.cgi" ./web/cgi-bin/cgitest.cgi ./bin/cgitest.cgi
Presumo che le vulnerabilità possano manifestarsi nei programmi CGI, quindi per iniziare proverò ad analizzare il file ./web/cgi-bin/cgitest.cgi con IDA Pro.
Per prima cosa bisogna trovare i punti di chiamata di funzioni simili; tramite una ricerca sono riuscito a trovare la stringa "killall ping".
Analizzando il punto di chiamata, si può vedere che il programma, dopo l'inizializzazione delle funzioni ping e traceroute, chiama /bin/network_test.sh

E il punto in cui si trova la vulnerabilità è proprio nel modulo di test di rete. Bene, dobbiamo analizzare /bin/network_test.sh.
Innanzitutto è necessario effettuare una ricerca.

Troviamo la funzione network_test_sh:
......

Analizzando in dettaglio la funzione, si possono individuare i moduli di esecuzione dei comandi e di salvataggio dei risultati.

In essi: Esecuzione del comando ping: ping -c %d -s %d %s -W %d > %s &
Esecuzione 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
- `extra_users` (opzionale, lista): Un elenco di account utente aggiuntivi da creare sul target.
- `name`: Nome utente per il nuovo account.
- `password`: Password per il nuovo account (verrà hashata in modo sicuro).
- `groups` (opzionale, lista): Un elenco di gruppi aggiuntivi a cui aggiungere l'utente.
- `ssh_key` (opzionale, stringa): Una chiave SSH pubblica da aggiungere a authorized_keys dell'utente.
- `domain_name` (opzionale, stringa): Nome di dominio per l'email amministrativa (es. `example.com`).
- `github_username` (opzionale, stringa): Nome utente GitHub contenente chiavi SSH.
- `sudo_username` (opzionale, stringa): L'utente principale per cui configurare sudo (default: `deploy`).
- `locale` (opzionale, stringa): Locale di sistema (default: `en_US.UTF-8`).```
# Ситуация с командой traceroute
loc_420574:
la $t9, sprintf #также прямой вызов sprintf
lw $a2, 0x108+var_D0($sp) #также отсутствует проверка параметров
# pip install stable-baselines3
pip install sb3-contrib
Dopo aver installato le librerie, puoi procedere con la configurazione e l'addestramento del modello. Tieni presente che per lavorare con alcuni algoritmi potrebbe essere necessario installare dipendenze aggiuntive.```
la $t9, run_by_system jalr $t9 ; run_by_system #прямой вызов system для выполнения команды move $a0, $s1 #отсутствуют проверки безопасности

Nel codice manca una sufficiente validazione dei parametri di input, creando un potenziale rischio di injection di comandi. Un attaccante può manipolare il parametro IP passato per eseguire comandi shell, ad esempio:```
# Нормальный ввод 192.168.0.1
# Примеры вредоносного ввода
192.168.0.1; rm -rf / #удаление файлов
192.168.0.1 & id & #выполнение произвольных команд
Questo script sfrutta una vulnerabilità di iniezione di comandi nell'interfaccia web del dispositivo per eseguire comandi da remoto tramite richieste HTTP appositamente create. Lo script sfrutta la vulnerabilità utilizzando due richieste HTTP POST: la prima richiesta inietta il comando, la seconda ottiene il risultato dell'esecuzione.
Il primo pacchetto (netcore_set.cgi) è destinato a: iniezione ed esecuzione del comando

Il secondo pacchetto (netcore_get.cgi) è destinato a: ottenere il risultato dell'esecuzione del comando

2. Codifica URL di tutti i parametri
3. Invio della richiesta POST a netcore_set.cgi
### 11.3 Seconda Fase: ottenimento dei risultati
1. Formazione della seconda richiesta POST:```
{ "mode_name": "netcore_get",
"noneed": "noneed" }
Per testare lo script ho creato un file ceshi sull'host e ho provato a caricarlo sul dispositivo tramite lo script



Successo!
In realtà questa vulnerabilità permette di ottenere il pieno controllo del dispositivo, poiché il dispositivo utilizza di default l'accesso root
| Parametro testato | Stato | Nota |
|---|
| Indicatore di alimentazione | Funzionante | Acceso costantemente all'accensione |
| Indicatori di rete | Funzionanti | Lampeggiano durante la connessione |
| Stato porta WAN | Funzionante | Connessione di rete normale |
| Stato porte LAN | Funzionanti | Tutte e 4 le porte funzionano |
| Funzione WiFi | Funzionante | Antenne integre, segnale normale |
| Funzione WPS | Funzionante | Il pulsante risponde |
| Funzione reset | Funzionante | Il pulsante Default funziona |
| № | Modello chip | Produttore | Funzione principale | Specifiche tecniche | Note |
|---|
| 1 | EM63A165TS-6G | EtronTech | Memoria di sistema | - Capacità 32 Mbit - Frequenza 166 MHz - Architettura SDRAM - Package TSOP-II | - Utilizzata per l'archiviazione temporanea dei dati - Supporta i calcoli del processore principale |
| 2 | FR9886 61504 | Sconosciuto | Gestione dell'alimentazione | - Package SOIC-8 - Circuito integrato | - DC-DC - Responsabile della regolazione della tensione - Garantisce un'alimentazione stabile al sistema |
| 3 | RTL8196E | Realtek/RMC | Processore principale | - Architettura MIPS - Design SoC - Prodotto a Taiwan | - CPU del sistema - Responsabile dei calcoli principali e della gestione - Elaborazione di rete integrata |
| 4 | MX25L3206E | Macronix | Memoria Flash | - Capacità 32Mb (4MB) - Interfaccia SPI - Package SOIC | - Memorizzazione del firmware di sistema - Salvataggio dei dati di configurazione |
| 5 | RTL8192ER | Realtek/RMC | Comunicazione wireless | - Controller WiFi - Package QFN | - Elaborazione dei segnali wireless - Supporto funzioni WiFi |
| Parametro | Valore | Valore esadecimale |
|---|
| Modello chip | MX25L3205D | - |
| Capacità totale | 4MB | 0x400000 |
| Dimensione blocco | 64KB | 0x10000 |
| Dimensione settore | 4KB | 0x1000 |
| Dimensione pagina | 256B | 0x100 |
| Nome del servizio | Stato | Nota |
|---|
| Server DHCP | In esecuzione | Normale |
| Server HTTP (Boa) | In esecuzione | Riavvii anomali |
| IAPP | In esecuzione | IEEE 802.11f |
| MiniIGD | In esecuzione | v1.08.1 |
| mini_upnpd | Errore | File non trovato |
| telnetd | Errore | File non trovato |
| ota_init.sh | Errore | File non trovato |
| Comando | Sintassi | Funzione |
|---|
| HELP | ? | Mostra aiuto |
| DB/DW | DB/DW | Lettura memoria byte/word |
| EB/EW | EB/EW | Scrittura memoria byte/word |
| FLR | FLR | Lettura dati da Flash a RAM |
| FLW | FLW <dst_ROM><src_RAM> | Scrittura dati da RAM a Flash |
| IPCONFIG | IPCONFIG | Impostazione indirizzo IP |
| LOADADDR | LOADADDR | Impostazione indirizzo di caricamento |
| CMP | CMP | Confronto dati in memoria |
| J | J | Salto all'esecuzione |
| MDIOR/MDIOW | MDIOR/W [data] | Lettura/scrittura registri PHY |
| PHYR/PHYW | PHYR/W [data] | Lettura/scrittura registri PHY (metodo alternativo) |
| PORT1 | PORT1 | Test patch porta 1 |
| AUTOBURN | AUTOBURN 0/1 | Gestione del flashing automatico |
| Tipo di comando | Comandi disponibili |
|---|
| Comandi di base | ., :, cd, help, exit |
| Gestione dell'esecuzione | break, continue, eval, exec |
| Operazioni con variabili | export, read, readonly, set, shift |
| Gestione dei processi | times, trap, wait |
| Gestione dei permessi | login, newgrp, umask |
| Categoria | Strumenti | Funzione |
|---|
| Strumenti di rete | iptables ip6tables brctl ifconfig | Configurazione firewall, firewall IPv6, gestione bridge, configurazione interfacce di rete |
| Gestione di sistema | busybox ps kill mount | Set di strumenti di base, visualizzazione processi, gestione processi, montaggio file system |
| Connessione VPN | pppd pptp l2tpd pptpctrl | Demone PPP, client PPTP, demone L2TP, gestione PPTP |
| Gestione wireless | iwcontrol iwpriv wlanapp.sh wps_init.sh | Controllo wireless, comandi privati wireless, gestione applicazioni wireless, inizializzazione WPS |
| Script firewall | firewall.sh firewall_ipv6.sh firewall_pptp.sh | Firewall principale, firewall IPv6, firewall PPTP |
| DHCP/DNS | dhcpc.sh dhcpd.sh dnrd | Client DHCP, server DHCP, inoltro DNS |
| Servizio web | boa webs cgitest.cgi | Server web, gestione web, test CGI |
| Percorso | Tipo di informazione | Descrizione |
|---|
| /proc/cpuinfo | Informazioni CPU | Informazioni dettagliate sul processore |
| /proc/meminfo | Informazioni memoria | Stato di utilizzo della memoria di sistema |
| /proc/mtd | Informazioni partizioni | Partizionamento della memoria Flash |
| /proc/net/* | Informazioni di rete | Stato delle interfacce di rete e connessioni |
| /proc/sys/* | Parametri di sistema | Parametri di sistema regolabili |
| /proc/version | Informazioni versione | Informazioni sulla versione del kernel |
| Componente | Descrizione | Specifiche tecniche |
|---|
| RTL8196E | Processore principale | - Architettura MIPS - Design SoC - Prodotto a Taiwan - CPU del sistema - Responsabile dei calcoli principali e della gestione - Funzioni di elaborazione di rete integrate |
| EM63A165TS-6G | Memoria di sistema | - Capacità 32 Mbit - Frequenza 166 MHz - Architettura SDRAM - Package TSOP-II - Archiviazione temporanea dei dati di sistema - Supporta i calcoli del processore principale |
| MX25L3206E | Memoria Flash | - Capacità 32 Mbit (4 MB) - Interfaccia SPI - Package SOIC - Memorizzazione del firmware di sistema - Salvataggio dei dati di configurazione |
| RTL8192ER | Rete wireless | - Controller WiFi - Package QFN - Elaborazione dei segnali wireless - Supporto WiFi |
| FR9886 61504 | Gestione dell'alimentazione | - Package SOIC-8 - Circuito integrato - DC-DC - Responsabile della regolazione della tensione - Garantisce un'alimentazione stabile al sistema |
| File | Offset (decimale) | Offset (esadecimale) | Descrizione | Informazioni aggiuntive |
|---|
| netis.bin | 4848 | 0x12F0 | Dati compressi LZMA | Dimensione dizionario: 8388608 byte, dimensione dopo decompressione: 56464 byte; richiesta analisi del contenuto dopo decompressione |
| netis.bin | 206872 | 0x32818 | Dati compressi LZMA | Dimensione dizionario: 8388608 byte, dimensione dopo decompressione: 3278684 byte; contiene il kernel Linux 2.6.30 completo |
| netis.bin | 1507328 | 0x170000 | File system SquashFS | Little endian, compressione gzip, dimensione: 2628241 byte |
| 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 vulnerabilità | Tipo di vulnerabilità | Modello | Versione | Report/Exploit |
|---|
| CVE-2023-42336 | divulgazione di informazioni sensibili | 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 | esecuzione di codice remoto | Netis | wf2409e_firmware < 3.6.42541 wf3409e < - | https://github.com/adhikara13/CVE-2023-38829-NETIS-WF2409E |