
TP-Link Omada ER605 라우터의 DDNS 클라이언트 데몬(cmxddnsd)을 통한 사전 인증 원격 코드 실행 익스플로잇
Comexe DDNS 서비스를 사용하도록 구성된 장치의 TP-Link Omada ER605 DDNS 클라이언트 데몬(cmxddnsd)을 대상으로 하는 PoC(개념 증명) 익스플로잇 체인입니다.
⚠️ 법적 고지 / 윤리: 이 저장소는 승인된 보안 연구 및 통제된 실험실 재현 전용입니다. 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에는 사용하지 마십시오.
이 PoC는 다음을 결합하는 체이닝 방식을 시연합니다:
이 체인은 다음의 공개된 이슈들에 해당합니다:
| CVE | ZDI 권고 | 유형 (ZDI/NVD 기준) | 체인에서의 개괄적 역할 |
|---|---|---|---|
| CVE-2024-5244 | ZDI-24-503 | 보안을 통한 은폐에 의존 (DDNS 메시지에 접근/스푸핑 가능) | 유효한 것처럼 보이는 DDNS 메시지 제작/스푸핑을 가능하게 함 |
| CVE-2024-5243 | ZDI-24-502 | DNS 이름 처리 과정의 버퍼 오버플로 | DNS 이름 관련 상태에 영향을 주거나 오염시키고 ASLR 우회 유출 경로를 가능하게 하는 데 사용됨 |
| CVE-2024-5242 | ZDI-24-501 | DDNS 오류 코드 처리 과정의 스택 기반 버퍼 오버플로 | ROP 기반 RCE를 위한 제어 흐름 하이재킹 프리미티브로 사용됨 |
참고: 이 README는 CVE ↔ 이슈 설명을 ZDI/NVD 표현에 맞춥니다. 정확한 익스플로잇 구성은 펌웨어 빌드 및 로컬 재현 세부 사항에 따라 달라질 수 있습니다.
exploit.py와 이 저장소의 분석 노트를 참조하세요.
< ER605(UN)_V2_2.2.42.2.2ER605(UN)_V2_2.2.4 Build 20240119 (이후 버전)ZDI는 Comexe DDNS가 활성화/구성된 경우 영향을 네트워크 인접(network-adjacent) 으로 설명합니다. 실제로 재현하려면 일반적으로 라우터의 DDNS/DNS 트래픽 경로를 충분히 관찰하고 조작하여 다음을 수행할 수 있어야 합니다:
이 저장소는 통제된 실험실 외부에서 그러한 위치 확보를 위한 단계별 운영 가이드를 의도적으로 제공하지 않습니다.
┌─────────────────┐ ┌─────────────────────────┐
│ TP-Link ER605 │ │ Attacker │
│ (cmxddnsd) │ │ (authorized lab setup) │
└───────┬─────────┘ └───────────┬─────────────┘
│ │
│ (1) DDNS message spoofing/impersonation │ CVE-2024-5244
│<-----------------------------------------│
│ │
│ (2) Parsing-time overflow affects DNS- │ CVE-2024-5243
│ name-related state; later leak occurs│
│ in DNS query sending path (e.g., │
│ sndDnsQuery) to bypass ASLR │
│<-----------------------------------------│
│ │
│ (3) Error-code overflow for control-flow │ CVE-2024-5242
│ hijack → ROP → system(command) │
│<-----------------------------------------│
주요 구분:
_chkPkt 인접 파싱 로직을 통해).exploit.py — 실험실 재현에 사용되는 PoC 구현(빌드별 상수/오프셋 입력 필요).README.md — 이 문서.이 PoC는 대상 펌웨어 및 libc에 따라 달라지는 빌드별 값(예: 오프셋, 가젯 위치, 유출 해석)을 필요로 합니다. 이러한 값은 의도적으로 플레이스홀더로 남겨져 있으며 테스트된 빌드 분석을 통해 도출해야 합니다.
예시 플레이스홀더(exploit.py 참조):
system() 오프셋파싱 로직에서 반복되는 안티 패턴은 구분자에서 파생된 길이를 사용하여 공격자가 제어하는 필드 데이터를 대상 버퍼 크기로 적절히 제한하지 않고 복사하는 것입니다(개념적으로):
char *end = strchr(ptr, '\x01'); // delimiter
int len = end - ptr; // attacker-influenced length
memcpy_or_strncpy(dest, ptr, len); // missing bounds check -> overflow
PoC는 MIPS 지연 슬롯에 적합한 가젯 형태를 사용합니다:
move $t9, $s0
jalr $t9
move $a0, $s1 ; delay slot
저장된 레지스터 덮어쓰기를 통해 $s0 및 $s1을 제어함으로써 간결한 system(command) 호출 시퀀스를 가능하게 합니다.
실제 페이로드 구성은 다음에 의해 제약을 받습니다:
\x01), 그리고이 재현에 사용된 정확한 제약 조건은 exploit.py를 참조하세요.
이 코드와 문서는 교육 목적 및 승인된 보안 연구를 위해서만 제공됩니다. 명시적 허가 없이 사용하는 것은 금지되며 불법일 수 있습니다.