
Eine vollständige Hardwaresicherheitsanalyse des NETIS WF2409E Routers. Durch das Zerlegen des Geräts, die Identifizierung von Debug-Schnittstellen, das Extrahieren der Firmware und andere Arbeiten werden der gesamte Prozess der Hardwareanalyse, Schwachstellendetails und entsprechende Sicherheitsempfehlungen dokumentiert, in der Hoffnung, die Sicherheit von IoT-Geräten zu verbessern.

| Kategorie | Parameter | Beschreibung |
|---|---|---|
| Geräteinformationen | Modell | Netis WF2409E |
| Typ | 300Mbps Wireless N Router | |
| Stromversorgung | DC 9V/500mA | |
| Hardware-Version | V1.8 | |
| PCB-Version | PB-7189-M02G-20 | |
| Herstellungsdatum | 2015-03-23 | |
| Herstellungsland | China | |
| Netzwerk-Identifikatoren | Seriennummer | 2409EEU5B102714 V1.8 |
| MAC-Adresse | W8D398DFB68 | |
| Standard-SSID | netis_BDFB68 | |
| Standard-Passwort | password | |
| Verwaltungsadresse | http://netis.cc | |
| Hardware-Schnittstellen | WAN-Port | 1 (blau RJ45) |
| LAN-Ports | 4 (schwarz RJ45, LAN1-4) | |
| Antennen | 3 externe Antennen | |
| Stromanschluss | DC-Eingang (PWR) | |
| Funktionstasten | Default | Reset auf Werkseinstellungen |
| WPS | Geschützte WiFi-Konfiguration |



| Parameter | Spezifikation |
|---|---|
| Prozessormodell | RealTek RTL8196E |
| Architektur | 16-Bit |
| Taktfrequenz | 380 MHz |
| Kompilierungsdatum | 2014.09.29 |
| Parameter | Beschreibung |
|---|---|
| Bootloader-Typ | Proprietärer RealTek-Bootloader |
| Kernel-Ladeadresse | 0x80500000 |
| Startadresse für Ausführung | 0x80003440 |
| Signatursuchbereich | 0x10000-0x170000 |
| Parameter | Wert |
|---|---|
| IP-Adresse | 192.168.0.1 |
| Subnetzmaske | 255.255.255.0 |
| MAC-Adresse | 04:8d:38:bd:fb:69 |
| Drahtloses Interface | wlan0 (einschließlich va0-va3, vxd) |
| Parameter | Wert |
|---|---|
| Gerätemodell | netis WF2419E_RU |
| Firmware-Version | V2.5.40200 |
| Firmware-Datum | 2016.09.02 |
| BusyBox-Version | v1.00-pre8 (2015.01.23) |
Es ist wichtig zu beachten, dass dieses Gerät wahrscheinlich kein U-Boot verwendet. Wichtige Anzeichen:
---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-Befehle :
<RealTek> FLR 80000000 0 100 #Lesen aus Flash DB 80000000 100 #Anzeigen des Speicherinhalts



/dev/mtdblock1 als Root-Verzeichnis / gemountetnone als Prozessdateisystem /proc gemountettmpfs als temporäres Dateisystem /var gemountetDas Root-Dateisystem ist wie folgt konfiguriert:
/dev/mtdblock1Dies deutet auf die Verwendung von MTD-Flash-Speicher als Medium hin, wobei die Systemdateien durch Nur-Lesen und squashfs-Kompression geschützt und volumenoptimiert sind.
Das Prozessdateisystem ist wie folgt konfiguriert:
Das temporäre Dateisystem ist wie folgt konfiguriert:


binwalk -E --save netis.bin


binwalk netis.bin

Und erhält:

| Offset | Partitions-Header |
|---|---|
| 0x12F0 | ![]() |
| 0x32818 | ![]() |

etc/passwd:
Mit dem Hash-Entschlüsselungsdienst https://hashes.com/en/decrypt/hash wurde das Root-Passwort erfolgreich als realtek wiederhergestellt.

web/welcome.htm:Dies ist die Standard-Webinterface-Seite

Gerätesuche in FOFA über Merkmale in web/welcome.htm:
Suchbefehle:
body="./images/logo_netis.png" && body="display:block; height:60px; float:left;"


Für den Zugriff auf das Administrationspanel des Geräts kann eine Authentifizierung mit Benutzername und Passwort erforderlich sein

Nach erfolgreicher Authentifizierung kann das Administrationspanel betreten werden

Zuerst wurden mit dem Befehl ~/squashfs-root/web$ find die verfügbaren Verzeichnisse gefunden und mit Burpsuit wurde deren Zugänglichkeit überprüft:| | 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== |
Mögliche Fundorte für Informationen:
Nach der Überprüfung können wir in der Datei ==/version.txt== die folgenden Informationen finden:

Die Extraktion dieser Informationen wurde mit einem Python-Skript realisiert:

Derzeit wurden die folgenden Schwachstellen in diesem Gerät entdeckt, von denen die Schwachstelle CVE-2023-38829 eine Befehlseinschleusungsschwachstelle ist, die im Netzwerktestmodul des Routers NETIS SYSTEMS Router WF2409E in den Funktionen ping und traceroute existiert. Über die Weboberfläche können bösartige Befehle in die Parameter dieser Funktionen eingeschleust werden, was zur Ausführung von Befehlen führt.
Um das Vorhandensein dieser Schwachstelle zu überprüfen, meldete ich mich im Router-Admin-Panel an und testete die Schwachstelle in den Funktionen ping und traceroute.
Hier habe ich den Befehl cd && ls && cd etc/ && cat passwd eingeschleust, der den Inhalt der Passwortdatei ausgab.
Unten wird die Ausgabe des Router-Admin-Panels bei der Befehlseinschleusung gezeigt, was das Vorhandensein der Schwachstelle bestätigt.

Analyse der erkannten Befehlseinschleusungsschwachstellen nach CVSS 3.1:
Bewertung der Basismetrik:
Auswirkungsmetrik:


Bewertung: 9.2/10 Punkte, was in die Kategorie "kritisch" fällt. CVSS-Vector: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:F/RL:O/RC:C
Diese hohe Bewertung der Schwachstelle ist auf folgende Gründe zurückzuführen:
Lassen Sie uns zunächst die Dateien finden, in denen Schwachstellen sein könnten:
find . -name "*.cgi" ./web/cgi-bin/cgitest.cgi ./bin/cgitest.cgi
Ich nehme an, dass Schwachstellen in CGI-Programmen auftreten können. Daher werde ich zunächst versuchen, die Datei ./web/cgi-bin/cgitest.cgi mit IDA Pro zu analysieren.
Zuerst müssen die Aufrufstellen ähnlicher Funktionen gefunden werden. Durch die Suche konnte die Zeichenkette "killall ping" gefunden werden.
Bei der Analyse der Aufrufstelle ist zu sehen, dass das Programm nach der Initialisierung der Funktionen ping und traceroute /bin/network_test.sh aufruft.

Und die Stelle, an der die Schwachstelle liegt, ist genau im Netzwerktestmodul. Gut, wir müssen /bin/network_test.sh analysieren.
Zunächst muss eine Suche durchgeführt werden.

Wir finden die Funktion network_test_sh:
......

Bei der detaillierten Analyse der Funktion können die Module zur Befehlsausführung und Ergebnispeicherung entdeckt werden.

In ihnen: Ausführung des Ping-Befehls: ping -c %d -s %d %s -W %d > %s &
Ausführung des Traceroute-Befehls: 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
Установка аналогична установке на macOS, но с использованием WSL (Windows Subsystem for Linux). После установки WSL и дистрибутива Linux (например, Ubuntu) выполните команды, указанные для Linux.```
# Ситуация с командой traceroute
loc_420574:
la $t9, sprintf #также прямой вызов sprintf
lw $a2, 0x108+var_D0($sp) #также отсутствует проверка параметров
ERSTE SCHRITTE =================```
la $t9, run_by_system jalr $t9 ; run_by_system #прямой вызов system для выполнения команды move $a0, $s1 #отсутствуют проверки безопасности

Im Code fehlt eine ausreichende Überprüfung der Eingabeparameter, was ein potenzielles Risiko einer Befehlsinjektion darstellt. Ein Angreifer kann den übergebenen IP-Parameter manipulieren, um Shell-Befehle auszuführen, zum Beispiel:```
# Нормальный ввод 192.168.0.1
# Примеры вредоносного ввода
192.168.0.1; rm -rf / #удаление файлов
192.168.0.1 & id & #выполнение произвольных команд
Dieses Skript nutzt eine Command Injection-Schwachstelle in der Weboberfläche des Geräts aus, um durch das Erstellen spezieller HTTP-Anfragen entfernte Befehle auszuführen. Das Skript führt den Exploit mit zwei HTTP-POST-Anfragen durch: Die erste Anfrage injiziert den Befehl, die zweite erhält das Ausführungsergebnis.
Das erste Paket (netcore_set.cgi) dient zum: Injizieren und Ausführen des Befehls

Das zweite Paket (netcore_get.cgi) dient zum: Abrufen des Ausführungsergebnisses

2. URL-Kodierung aller Parameter
3. Senden einer POST-Anfrage an netcore_set.cgi
### 11.3 Zweite Phase: Ergebnisse erhalten
1. Erstellung der zweiten POST-Anfrage:```
{ "mode_name": "netcore_get",
"noneed": "noneed" }
Zum Testen des Skripts habe ich eine Datei ceshi auf dem Host erstellt und versucht, sie über das Skript auf das Gerät hochzuladen



Erfolgreich!
Tatsächlich ermöglicht diese Schwachstelle die vollständige Kontrolle über das Gerät, da das Gerät standardmäßig Root-Zugriff verwendet.
| Prüfparameter | Zustand | Anmerkung |
|---|
| Betriebsanzeige | In Ordnung | Leuchtet stabil beim Einschalten |
| Netzwerk-LEDs | In Ordnung | Blinken bei Verbindung |
| WAN-Port-Status | In Ordnung | Normale Netzwerkverbindung |
| LAN-Ports-Status | In Ordnung | Alle 4 Ports funktionieren |
| WiFi-Funktion | In Ordnung | Antennen intakt, Signal normal |
| WPS-Funktion | In Ordnung | Taste reagiert |
| Reset-Funktion | In Ordnung | Default-Taste funktioniert |
| Nr. | Chip-Modell | Hersteller | Hauptfunktion | Technische Daten | Anmerkungen |
|---|
| 1 | EM63A165TS-6G | EtronTech | Systemspeicher | - Kapazität 32 Mbit - Frequenz 166 MHz - Architektur SDRAM - Gehäuse TSOP-II | - Wird für temporäre Datenspeicherung verwendet - Unterstützt Berechnungen des Hauptprozessors |
| 2 | FR9886 61504 | Unbekannt | Spannungsversorgung | - Gehäuse SOIC-8 - Integrierter Schaltkreis | - DC-DC - Zuständig für Spannungsregelung - Sorgt für stabile Systemstromversorgung |
| 3 | RTL8196E | Realtek/RMC | Hauptprozessor | - MIPS-Architektur - SoC-Design - Hergestellt in Taiwan | - Zentraler Prozessor des Systems - Zuständig für Hauptberechnungen und -steuerung - Integrierte Netzwerkverarbeitung |
| 4 | MX25L3206E | Macronix | Flash-Speicher | - Kapazität 32 Mb (4 MB) - SPI-Schnittstelle - SOIC-Gehäuse | - Speicherung der System-Firmware - Aufbewahrung von Konfigurationsdaten |
| 5 | RTL8192ER | Realtek/RMC | Drahtlose Kommunikation | - WiFi-Controller - QFN-Gehäuse | - Verarbeitung drahtloser Signale - Unterstützung von WiFi-Funktionen |
| Parameter | Wert | Hexadezimalwert |
|---|
| Chip-Modell | MX25L3205D | - |
| Gesamtkapazität | 4 MB | 0x400000 |
| Blockgröße | 64 KB | 0x10000 |
| Sektorgröße | 4 KB | 0x1000 |
| Seitengröße | 256 Byte | 0x100 |
| Dienstname | Status | Anmerkung |
|---|
| DHCP-Server | Läuft | Normal |
| HTTP-Server (Boa) | Läuft | Anormale Neustarts |
| IAPP | Läuft | IEEE 802.11f |
| MiniIGD | Läuft | v1.08.1 |
| mini_upnpd | Fehler | Datei nicht gefunden |
| telnetd | Fehler | Datei nicht gefunden |
| ota_init.sh | Fehler | Datei nicht gefunden |
| Befehl | Syntax | Funktion |
|---|
| HELP | ? | Hilfe anzeigen |
| DB/DW | DB/DW <Länge> | Speicher byteweise/wordweise lesen |
| EB/EW | EB/EW | Speicher byteweise/wordweise schreiben |
| FLR | FLR | Daten von Flash in RAM lesen |
| FLW | FLW <dst_ROM><src_RAM> | Daten von RAM in Flash schreiben |
| IPCONFIG | IPCONFIG | IP-Adresse konfigurieren |
| LOADADDR | LOADADDR | Ladeadresse setzen |
| CMP | CMP | Daten im Speicher vergleichen |
| J | J | Zur Ausführung springen |
| MDIOR/MDIOW | MDIOR/W [data] | PHY-Register lesen/schreiben |
| PHYR/PHYW | PHYR/W [data] | PHY-Register lesen/schreiben (alternative Methode) |
| PORT1 | PORT1 | Test des Patchs von Port 1 |
| AUTOBURN | AUTOBURN 0/1 | Steuerung des automatischen Brennvorgangs |
| Befehlstyp | Verfügbare Befehle |
|---|
| Basis-Befehle | ., :, cd, help, exit |
| Ausführungssteuerung | break, continue, eval, exec |
| Variablenoperationen | export, read, readonly, set, shift |
| Prozessverwaltung | times, trap, wait |
| Rechteverwaltung | login, newgrp, umask |
| Kategorie | Werkzeuge | Funktion |
|---|
| Netzwerkwerkzeuge | iptables ip6tables brctl ifconfig | Firewall-Konfiguration, IPv6-Firewall, Bridge-Verwaltung, Konfiguration von Netzwerkschnittstellen |
| Systemverwaltung | busybox ps kill mount | Sammlung grundlegender Werkzeuge, Prozessanzeige, Prozessverwaltung, Dateisystem-Mount |
| VPN-Kommunikation | pppd pptp l2tpd pptpctrl | PPP-Daemon, PPTP-Client, L2TP-Daemon, PPTP-Steuerung |
| Drahtlosverwaltung | iwcontrol iwpriv wlanapp.sh wps_init.sh | Drahtloskontrolle, private Drahtlosbefehle, Verwaltung drahtloser Anwendungen, WPS-Initialisierung |
| Firewall-Skripte | firewall.sh firewall_ipv6.sh firewall_pptp.sh | Haupt-Firewall, IPv6-Firewall, PPTP-Firewall |
| DHCP/DNS | dhcpc.sh dhcpd.sh dnrd | DHCP-Client, DHCP-Server, DNS-Weiterleitung |
| Webdienst | boa webs cgitest.cgi | Webserver, Webverwaltung, CGI-Test |
| Pfad | Informationstyp | Beschreibung |
|---|
| /proc/cpuinfo | CPU-Informationen | Detaillierte Prozessorinformationen |
| /proc/meminfo | Speicherinformationen | Zustand der Systemspeichernutzung |
| /proc/mtd | Partitionsinformationen | Aufteilung des Flash-Speichers |
| /proc/net/* | Netzwerkinformationen | Status der Netzwerkschnittstellen und Verbindungen |
| /proc/sys/* | Systemparameter | Einstellbare Systemparameter |
| /proc/version | Versionsinformationen | Kernelversionsinformationen |
| Komponente | Beschreibung | Technische Daten |
|---|
| RTL8196E | Hauptprozessor | - MIPS-Architektur - SoC-Design - Hergestellt in Taiwan - Zentraler Prozessor des Systems - Zuständig für Hauptberechnungen und -steuerung - Integrierte Netzwerkverarbeitungsfunktionen |
| EM63A165TS-6G | Systemspeicher | - Kapazität 32 Mbit - Frequenz 166 MHz - SDRAM-Architektur - TSOP-II-Gehäuse - Temporäre Speicherung von Systemdaten - Unterstützt Berechnungen des Hauptprozessors |
| MX25L3206E | Flash-Speicher | - Kapazität 32 Mbit (4 MB) - SPI-Schnittstelle - SOIC-Gehäuse - Speicherung der System-Firmware - Aufbewahrung von Konfigurationsdaten |
| RTL8192ER | Drahtloses Netzwerk | - WiFi-Controller - QFN-Gehäuse - Verarbeitung drahtloser Signale - WiFi-Unterstützung |
| FR9886 61504 | Spannungsversorgung | - SOIC-8-Gehäuse - Integrierter Schaltkreis - DC-DC - Zuständig für Spannungsregelung - Sorgt für stabile Systemstromversorgung |
| Datei | Offset (dezimal) | Offset (hexadezimal) | Beschreibung | Zusätzliche Informationen |
|---|
| netis.bin | 4848 | 0x12F0 | LZMA-komprimierte Daten | Wörterbuchgröße: 8388608 Bytes, entpackte Größe: 56464 Bytes; Analyse des entpackten Inhalts erforderlich |
| netis.bin | 206872 | 0x32818 | LZMA-komprimierte Daten | Wörterbuchgröße: 8388608 Bytes, entpackte Größe: 3278684 Bytes; enthält vollständigen Linux-Kernel 2.6.30 |
| netis.bin | 1507328 | 0x170000 | SquashFS-Dateisystem | Little-Endian, gzip-Kompression, Größe: 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== |
| Schwachstellen-ID | Schwachstellentyp | Modell | Version | Bericht/Exploit |
|---|
| CVE-2023-42336 | Offenlegung sensibler Informationen | 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-Codeausführung | Netis | wf2409e_firmware < 3.6.42541 wf3409e < - | https://github.com/adhikara13/CVE-2023-38829-NETIS-WF2409E |