
UDP/389를 통한 CVE-2026-41089 Netlogon CLDAP 스택 오버플로우에 대한 사전 인증(Pre-auth) PoC로, LSASS 충돌/DC 재부팅을 유발합니다. 익스플로잇 스크립트, 근본 원인 분석, 탐지 및 완화 지침을 포함합니다.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Windows Netlogon CLDAP 스택 버퍼 오버플로우를 통한 원격 코드 실행
패치되지 않은 Windows 도메인 컨트롤러에서 포트 389로 전송된 단일 조작된 UDP 패킷이 LSASS 내부의 528바이트 스택 버퍼를 오버플로우시킵니다. LSASS가 충돌하고, DC는 약 60초 후 재부팅됩니다. 자격 증명은 필요 없습니다.
| 공격 벡터 | UDP 389 (CLDAP), 사전 인증, 자격 증명 불필요 |
| 영향 | LSASS 충돌, DC 재부팅, 잠재적 RCE |
| CWE | CWE-121 (스택 기반 버퍼 오버플로우) |
| CVSS 벡터 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 게시일 | 2026년 5월 12일, Microsoft |
python3 poc.py 10.0.50.21 corp.local
PoC는 일반 핑을 보낸 다음, 130자 사용자 이름이 포함된 오버플로우 핑을 보내고 DC가 살아남았는지 확인합니다. 총 약 10초가 소요됩니다.
도메인 컨트롤러로 작동하는 Windows Server 버전:
| 서버 버전 | 수정 버전 |
|---|---|
| 2012 / 2012 R2 | ESU 전용 패치 |
| 2016 | 10.0.14393.9140 |
| 2019 | 10.0.17763.8755 |
| 2022 | 10.0.20348.5074 |
| 2022 23H2 | 10.0.25398.2330 |
| 2025 | 10.0.26100.32772 |
NlGetLocalPingResponse는 528바이트 스택 버퍼를 할당하고 이를 BuildSamLogonResponse에 전달합니다. 이 함수는 NetpLogonPutUnicodeString을 호출하여 서버 이름, 도메인 이름, GUID 및 공격자가 제어하는 사용자 이름을 버퍼에 기록합니다.
버그: NetpLogonPutUnicodeString은 최대 길이를 바이트 단위로 전달받지만 이를 WCHAR 개수로 해석합니다. 이 경로를 통해 기록되는 모든 문자열은 예상 공간의 두 배를 차지합니다. CLDAP 필터의 "User" 필드(최대 130자, 네트워크상 260바이트)는 결합된 쓰기 작업을 528바이트 경계를 넘어서 밀어냅니다.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528-byte stack buffer
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // byte/WCHAR size confusion
python3 poc.py <target_ip> <domain_name> [options]
| 플래그 | 설명 | 기본값 |
|---|---|---|
-l | 사용자 이름 길이(문자 수) | 130 |
-t | UDP 수신 타임아웃(초) | 5 |
-d | 오버플로우와 활성 상태 확인 사이 지연(초) | 3 |
# Connectivity test (short username, no overflow)
python3 poc.py 10.0.50.21 corp.local
# Default overflow attempt
python3 poc.py 10.0.50.21 corp.local -l 130
# Larger payload, longer timeout for slow networks
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Python 3.8+. 서드파티 패키지는 필요 없습니다.
오버플로우는 DoS(LSASS 충돌, DC 재부팅)를 유발합니다. 스택 손상은 RCE를 가능하게 할 수 있지만, 이 PoC는 DoS에 머물러 있습니다.
네트워크. "User" 필터 특성이 20~30자보다 긴 CLDAP 검색 요청을 찾으십시오. 일반적인 DC 로케이터 핑은 짧은 서비스 계정 이름을 사용합니다.
호스트. netlogon.dll과 관련된 LSASS 충돌(이벤트 ID 1000)을 관찰하십시오. Netlogon 디버그 로깅을 활성화하세요:
nltest /dbflag:0x2080ffff
mov edx, 0x40은 최대 사용자 이름 길이를 절반으로 줄입니다)법적 고지. 이 코드는 승인된 보안 연구 및 교육 목적으로 존재합니다. 소유하거나 테스트에 대한 서면 허가를 받은 시스템에 대해서만 테스트하십시오. 승인되지 않은 컴퓨터 시스템 접근은 CFAA 및 대부분의 관할권의 동등한 법률을 위반합니다.