Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-47981 — PowerShell 평가 스크립트로, 커널 버전, PKU2U 레지스트리 키, 노출된 SPNEGO 포트를 확인하여 Windows 시스템에서 CVE-2025-47981(SPNEGO NEGOEX 힙 오버플로)을 점검합니다. 수정 단계와 탐지 지침을 제공합니다. | Kitploit
도구/GitHubGitHub/hkenzokimura/cve-2025-47981
Vulnerability ScannersConfiguration AuditingNetwork SecurityLearning & EducationIncident Response
GitHubhkenzokimura/cve-2025-47981

CVE-2025-47981

PowerShell 평가 스크립트로, 커널 버전, PKU2U 레지스트리 키, 노출된 SPNEGO 포트를 확인하여 Windows 시스템에서 CVE-2025-47981(SPNEGO NEGOEX 힙 오버플로)을 점검합니다. 수정 단계와 탐지 지침을 제공합니다.

저장소 보기
15시간 16분 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

🔵 CVE-2025-47981 — Windows SPNEGO NEGOEX 취약점 평가 스크립트

유형: 취약점 평가 — 탐지 / 규정 준수 점검 CVE: CVE-2025-47981 CVSS: 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) CWE: CWE-122 — 힙 기반 버퍼 오버플로우 별칭: "SPNEGO Nightmare" / "Windows Authentication Wormable RCE" 패치: KB5062560 | 2025년 7월 Patch Tuesday

Windows 시스템이 CVE-2025-47981에 취약한지 확인하는 PowerShell 평가 스크립트 — SPNEGO Extended Negotiation (NEGOEX) 메커니즘의 힙 기반 버퍼 오버플로우로 인증 없이 RCE가 가능합니다. 익스플로잇을 실행하지 않음 — 노출 및 패치 상태만 평가합니다.

Developed by: HKK


$ cat ./vulnerability_summary.txt

CVE-2025-47981은 Windows SPNEGO 인증 메커니즘의 내부 확장 계층인 NEGOEX 프로토콜의 힙 기반 버퍼 오버플로우입니다. 이 취약점으로 인해 인증되지 않은 공격자가 원격으로 임의 코드를 실행하여 잠재적으로 시스템에 대한 완전한 제어권을 얻을 수 있습니다.

분석가들은 이미 이 CVE가 "심각한 문제가 될 불행한 특성"을 지니고 있으며, 사용자 상호작용 없이 취약한 시스템 간에 자동으로 확산될 수 있는 웜 가능성(wormable)이 있다고 설명했습니다.

이 취약점은 Windows 10(버전 1607 이상)과 Windows Server 2008 R2부터 Server 2025까지 모든 Windows Server(Server Core 변형 포함)에 영향을 미치며, x64, x86 및 ARM64 아키텍처에서 33개 이상의 서로 다른 Windows 및 Server 구성이 취약한 것으로 확인되었습니다.


$ cat ./technical_background.txt

SPNEGO란 무엇이며 왜 커널에 있는가?

SPNEGO(Simple and Protected GSSAPI Negotiation Mechanism)는 Windows가 모든 인증 세션 전에 사용하는 인증 핸드셰이크 계층입니다. 애플리케이션은 프로토콜을 고정하지 않고 인증이 필요한 경우가 많습니다. Windows는 한 환경에서는 Kerberos를, 다른 환경에서는 NTLM을, 또는 다른 신뢰 모델에서는 확장 인증 메커니즘을 사용할 수 있습니다. SPNEGO는 사용할 인증 프로토콜을 결정하는 협상 메커니즘입니다.

root@kitploit:~
클라이언트                          서버
  │                                │
  │──── SPNEGO Negotiation ────────►│
  │     MechTypeList:               │
  │     [Kerberos, NTLM, NEGOEX]    │
  │                                │
  │◄─── Selected Mechanism ─────────│
  │                                │
  │──── Auth Exchange ─────────────►│  ← 여기 NEGOEX에서 오버플로우 발생

NEGOEX는 SPNEGO 내부의 확장 메커니즘입니다 — PKU2U(피어 투 피어) 인증 및 기타 사용자 지정 메커니즘을 협상할 수 있게 합니다. 취약점은 여러 조각으로 전송된 과대 크기의 SPNEGO_TOKEN 구조를 처리하는 ntoskrnl!SpnegoHandleExtended 함수에 있으며, 커널 힙에서 오버플로우를 유발합니다.

PKU2U가 위험을 증폭시키는 이유는?

"Network security: Allow PKU2U authentication requests to this computer to use online identities" 그룹 정책이 활성화된 시스템에서는 위험이 높습니다. 많은 Windows 배포에서 기본적으로 활성화되는 이 구성은 피어 투 피어 인증을 허용하여 NEGOEX의 취약한 코드 경로를 활성화함으로써, 그렇지 않으면 해당 경로를 노출하지 않을 엔드포인트에서 NEGOEX 공격 표면을 확장합니다.


$ cat ./architecture.txt

root@kitploit:~
┌─────────────────────────────────────────────────────────────────────────┐
│            CVE-2025-47981 ASSESSMENT SCRIPT — FLOW                      │
│                                                                         │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │  CHECK 1: Windows Version                                        │  │
│  │  Get-CimInstance Win32_OperatingSystem → .Version               │  │
│  │  컨텍스트: 패치 상관관계를 위한 정확한 빌드 식별                  │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                              │                                          │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │  CHECK 2: ntoskrnl.exe Version                                   │  │
│  │  Get-Item C:\Windows\System32\ntoskrnl.exe                      │  │
│  │  비교: 설치 버전 < 10.0.14393.8246 → 취약                        │  │
│  │  비교: 설치 버전 ≥ 10.0.14393.8246 → KB5062560 적용됨            │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                              │                                          │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │  CHECK 3: PKU2U Registry Key                                     │  │
│  │  HKLM:\SYSTEM\...\Lsa\pku2u\AllowOnlineID                      │  │
│  │  1 → PKU2U 활성화 → 공격 표면 확장                               │  │
│  │  0 → PKU2U 비활성화 → PKU2U 벡터 완화됨                          │  │
│  │  없음 → 기본 구성 (GPO를 통해 평가)                              │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                              │                                          │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │  CHECK 4: 노출된 SPNEGO 포트                                     │  │
│  │  Get-NetTCPConnection → 135, 445, 5985, 3389, 80, 443, 25      │  │
│  │  각 열린 포트 = 익스플로잇 전달 벡터                              │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                              │                                          │
│                    Format-Table -AutoSize                               │
│                    (펜테스트 보고서용 읽기 쉬운 출력)                    │
└─────────────────────────────────────────────────────────────────────────┘

$ cat ./design_decisions.md

1. ntoskrnl.exe를 통한 버전 확인

root@kitploit:~
$kernelPath = [System.IO.Path]::Combine($env:SystemRoot, "System32\ntoskrnl.exe")
$requiredVersion = "10.0.14393.8246"

$installedVersion = (Get-Item $kernelPath).VersionInfo.FileVersion

if ([version]$installedVersion -lt [version]$requiredVersion) {
    "취약 - 패치 누락 ($missingKB)"
}

왜 Get-HotFix가 아닌 ntoskrnl.exe인가?

Get-HotFix는 설치된 KB를 나열하지만 알려진 제한 사항이 있습니다:

  • DISM 또는 Windows Update를 통해 자동 모드로 적용된 KB를 감지하지 못함
  • 일부 시나리오에서 제거된 KB를 존재하는 것으로 표시할 수 있음
  • 실행 중인 실제 바이너리 상태를 반영하지 않음

ntoskrnl.exe 버전을 직접 확인하는 것이 더 안정적입니다 — KB가 실제로 적용되고 시스템이 재부팅된 경우에만 파일이 패치된 버전을 받기 때문입니다. 재부팅이 보류된 KB가 있는 시스템은 여전히 메모리에 이전 커널 버전을 보유합니다.

[version] 캐스트: PowerShell은 기본적으로 문자열을 사전순으로 비교합니다 — "10.0.14393.8246" -lt "10.0.14393.800"은 $false(잘못됨)가 됩니다. [version]으로 캐스트하면 옥텟별 올바른 숫자 비교가 보장됩니다.

[System.IO.Path]::Combine($env:SystemRoot, ...): 하드코딩된 C:\Windows 대신 SystemRoot를 사용합니다 — Windows가 다른 드라이브에 설치된 시스템에서도 이식 가능합니다.


2. 참조 버전 10.0.14393.8246

root@kitploit:~
10.0.14393.xxxx  →  Windows 10 version 1607 / Windows Server 2016
         │
         └─ 8246 = KB5062560이 적용된 빌드

왜 이 특정 빌드인가?

Windows Server 2016(기본 빌드 14393)은 패치가 가장 중요한 환경 중 하나입니다 — DC, 파일 서버 및 기업 내부 서비스에서 널리 사용됩니다. 버전 8246은 KB5062560(2025년 7월) 적용 후의 커널 빌드에 해당합니다.

다른 운영 체제의 경우 요구되는 최소 빌드 번호가 다릅니다 — 스크립트는 OS별 버전 테이블로 확장할 수 있습니다.


3. PKU2U 레지스트리 — AllowOnlineID

root@kitploit:~
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
$regName = "AllowOnlineID"

이 키는 무엇을 제어하나요?

이 취약점은 주로 "Allow PKU2U authentication requests to this computer to use online identities" 그룹 정책이 기본적으로 활성화된 시스템에 영향을 미치며, 이는 Windows 10 버전 1607 이상의 경우입니다.

AllowOnlineID 키는 해당 그룹 정책의 레지스트리 표현입니다. 활성화되면(= 1), 시스템은 PKU2U 인증을 수락합니다 — 오버플로우가 포함된 NEGOEX 코드 경로를 활성화합니다.

값상태위험
1PKU2U 활성화됨높음 — NEGOEX 벡터 활성화됨
0PKU2U 비활성화됨낮음 — 벡터 완화됨 (패치는 여전히 필요)
없음시스템 기본값GPO에 따라 다름 — gpresult /r로 확인

-ErrorAction SilentlyContinue: 키는 모든 시스템에 존재하지 않을 수 있습니다 — 스크립트는 오류를 생성하지 않고 부재를 정상적으로 처리합니다.


4. SPNEGO 포트 — 공격 표면

root@kitploit:~
$ports = @(135, 445, 5985, 3389, 80, 443, 25)

공격자는 SPNEGO 인증을 사용하는 취약한 서비스(예: SMB(445/TCP), RDP(3389/TCP), HTTP/S(80, 443/TCP) 및 SMTP(25/TCP))에 악성 패킷을 보내 인증 없이 원격으로 이 결함을 악용할 수 있습니다.

포트프로토콜SPNEGO가 사용되는 용도
135RPC Endpoint MapperRPC 인증 협상
445SMB파일 공유, named pipes 인증
5985WinRM (HTTP)PowerShell 원격, 관리
3389RDP원격 데스크톱 인증
80HTTPIIS Windows 인증 (Negotiate)
443HTTPSTLS를 통한 IIS Windows 인증
25SMTPExchange Extended Protection

Get-NetTCPConnection -LocalPort $port는 로컬 시스템에서 포트가 LISTEN 상태인지 확인합니다 — 각 열린 포트는 익스플로잇을 위한 독립적인 전달 벡터를 나타냅니다.


$ cat ./mitre_mapping.yml

root@kitploit:~
# 공격자 관점 (스크립트가 탐지/방지하는 것)

tactic: Initial Access
  - T1190   # Exploit Public-Facing Application
            # 인증 없는 SPNEGO 힙 오버플로우를 통한 RCE
            # 벡터: Negotiate 인증이 있는 모든 포트 (445, 5985, 3389...)

tactic: Execution
  - T1203   # Exploitation for Client Execution
            # ntoskrnl!SpnegoHandleExtended의 힙 오버플로우
            # 커널 힙 손상을 통한 RIP/EIP 제어

tactic: Lateral Movement
  - T1210   # Exploitation of Remote Services
            # 웜 가능: 자격 증명 없이 SMB/RPC를 통해 다른 호스트를 공격

  - T1550.002 # Pass-the-Hash
              # RCE 후: SYSTEM 액세스로 LSASS 해시 추출 가능

tactic: Privilege Escalation
  - T1068   # Exploitation for Privilege Escalation
            # 커널 컨텍스트의 버퍼 오버플로우 → 즉시 ring 0

# 방어자 관점 (평가 스크립트가 실행하는 것)

tactic: Discovery (Blue Team)
  - T1082   # System Information Discovery
            # 패치 평가를 위한 OS 및 ntoskrnl.exe 버전 수집

  - T1012   # Query Registry
            # HKLM:\...\pku2u\AllowOnlineID 확인

  - T1049   # System Network Connections Discovery
            # 노출된 SPNEGO 포트 매핑을 위한 Get-NetTCPConnection

$ cat ./detection_opportunities.md

익스플로잇 시도 탐지

root@kitploit:~
# NEGOEX 인증 변칙 — 과대 크기 SPNEGO 패킷
# 출처: Windows Security Event Log / ETW

EventID: 4625 (Logon Failure) with SubStatus 0xC000006D
  + 출처: 외부 호스트
  + 빈도: 높음 (스캔/익스플로잇 시도)
  + TargetUserName: ANONYMOUS LOGON 또는 비어 있음

# 대안: Sysmon Event 3 (Network Connection)
EventID: 3
조건:
  DestinationPort: 445 또는 5985 또는 135
  Initiated: false (인바운드 연결)
  Image: System 또는 lsass.exe
root@kitploit:~
# 실패한 익스플로잇 후 커널 크래시
# 출처: Windows Event Log → System

EventID: 1001 (BugCheck)
  BugCheckCode: 0x00000050 (PAGE_FAULT_IN_NONPAGED_AREA)
  또는
  BugCheckCode: 0x0000007E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED)
  컨텍스트: ntoskrnl.exe 크래시 → 가능한 익스플로잇 시도

네트워크 수준 탐지

root@kitploit:~
# Snort/Suricata — 과대 크기 SPNEGO 토큰 (개념적)
alert tcp any any -> $HOME_NET [445,5985,3389] (
  msg:"CVE-2025-47981 SPNEGO NEGOEX oversized token";
  content:"|60|";           # SPNEGO OID 마커
  content:"|a0|";           # MechTypeList 마커
  dsize:>4096;              # 합법적인 토큰은 4KB를 거의 초과하지 않음
  threshold:type both, track by_src, count 3, seconds 10;
  sid:2025479810;
)

$ cat ./remediation.md

root@kitploit:~
우선순위: 긴급 — 즉시 패치 (CVSS 9.8, 웜 가능)

1. 패치 (주요 조치):
   Windows Update → KB5062560 (2025년 7월 Patch Tuesday)
   WSUS: 모든 Windows 10 1607+ 시스템에 KB5062560 승인
   패치 후 재부팅 — ntoskrnl.exe는 재부팅 후에만 교체됨

2. 패치 후 검증:
   이 스크립트를 다시 실행
   예상 결과:
     ntoskrnl.exe 설치 버전: 10.0.14393.8246 (또는 그 이상)
     취약점 결과: 안전 - 패치 적용됨

3. 임시 완화 조치 (즉시 패치가 불가능한 경우):
   그룹 정책을 통해 PKU2U 비활성화:
     Computer Configuration → Windows Settings → Security Settings →
     Local Policies → Security Options →
     "Network security: Allow PKU2U authentication requests..." → 사용 안 함
   
   또는 레지스트리를 통해:
     Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
       -Name AllowOnlineID -Value 0

4. 네트워크 차단 (심층 방어):
   방화벽: 인바운드 135, 445, 5985를 승인된 호스트로 제한
   DC 및 중요 서버를 엄격한 ACL이 있는 VLAN으로 분리

5. 특별 우선순위 — 도메인 컨트롤러:
   DC는 나열된 모든 포트(RPC, SMB, LDAP)를 노출
   웜 가능 + DC 손상 = AD 도메인 전체 손상
   가능한 첫 번째 창에 DC 패치

$ cat ./usage.sh

root@kitploit:~
# 평가 스크립트 실행 (기본 읽기의 경우 관리자 권한이 필요하지 않지만,
# 일부 레지스트리 검사는 상승된 권한이 필요할 수 있음)
powershell.exe -ExecutionPolicy Bypass -File cve_2025_47981_check.ps1
root@kitploit:~
# 취약한 시스템에서의 예상 출력:
Name                              Value
----                              -----
ntoskrnl.exe 설치 버전             10.0.14393.7906
ntoskrnl.exe 요구 버전             10.0.14393.8246
PKU2U AllowOnlineID               1
열린 SPNEGO 포트                  {135, 445, 5985, 3389}
취약점 결과                        취약 - 패치 누락 (KB5062560)
Windows 버전                       10.0.14393.7906

# 패치된 시스템에서의 예상 출력:
취약점 결과                        안전 - 패치 적용됨
PKU2U AllowOnlineID               0

$ cat ./affected_versions.txt

root@kitploit:~
영향받는 버전 (33개 이상의 구성):
  Windows 10:      1607, 1809, 21H2, 22H2
  Windows 11:      22H2, 23H2, 24H2
  Windows Server:  2008 R2, 2012, 2012 R2, 2016, 2019, 2022, 2025
  아키텍처:        x64, x86, ARM64
  Server Core:     예 (위의 모든 버전)

높은 위험 요소:
  PKU2U GPO 활성화됨 (Win10 1607+ 기본값)
  외부 또는 신뢰할 수 없는 네트워크에서 접근 가능한 135/445/5985 포트

패치:
  KB5062560  →  2025년 7월 Patch Tuesday
  ntoskrnl.exe 최소 버전 → 10.0.14393.8246 (Windows Server 2016)
  버전별 특정 빌드 확인: msrc.microsoft.com

$ cat ./lessons_learned.txt

root@kitploit:~
[+] 문자열 대신 [version] 비교는 빌드 비교에서 오탐(false negative)을 방지
[+] ntoskrnl.exe는 패치 상태의 주요 진실 공급원 — Get-HotFix보다 신뢰성 높음
[+] PKU2U AllowOnlineID는 위험 증폭기 — 없는 시스템은 공격 표면이 줄어듦
[+] Get-NetTCPConnection은 로컬로 노출된 공격 표면을 빠르게 매핑
[+] Format-Table -AutoSize는 펜테스트 보고서에 복사할 준비가 된 출력 생성
[-] 스크립트는 Windows Server 2016(14393)만 확인 — 다른 빌드로 확장 필요
[-] gpresult를 통한 GPO 상태를 확인하지 않음 — 레지스트리는 실제 정책과 다를 수 있음
[-] 원격 연결을 테스트하지 않음 — 로컬에서 포트가 열려 있는지만 확인
[-] JSON/CSV 출력 없음 — 자동화된 규정 준수 파이프라인에 통합 어려움
[→] 개선 사항: OS별 버전 테이블, JSON 출력, Invoke-Command를 통한 원격 확인,
    취약점 상관관계를 위한 Qualys/Tenable 통합

CVE Assessment · CVSS 9.8 · Wormable · July 2025 Patch Tuesday · Detection only · No exploit

도구 다운로드