
CVE-2025-54918 (Windows NTLM 취약점)의 시뮬레이션된 익스플로잇 및 완화. 탐지 스크립트, Ansible 패치, CI/CD 강화를 포함합니다. 하이브리드 클라우드 환경에서 낮은 수준의 액세스로부터 SYSTEM 권한 상승을 시연합니다.
CVE-2025-54918(Windows NTLM 취약점)의 모의 익스플로잇 및 완화. 탐지 스크립트, Ansible 패치, CI/CD 강화를 포함합니다. 하이브리드 클라우드 환경에서 낮은 수준의 액세스에서 SYSTEM으로 권한 상승을 시연합니다.
Mark Mallia 지음
오늘날의 하이브리드 클라우드 환경에서 사용자 상호 작용과 시스템 손상 사이의 경계는 그 어느 때보다 얇아졌습니다. 이 글에서는 처음에는 무해해 보이는 그래픽 결함인 CVE-2025-55226(Windows 그래픽 커널의 경쟁 조건)으로 시작하여 CVE-2025-54918(중대한 NTLM 인증 우회)을 통해 완전한 SYSTEM 수준 제어로 확대되는 실제 공격 체인을 살펴봅니다.
이 두 취약점은 공격자가 단 몇 단계만에 원격 코드 실행에서 권한 상승으로 전환할 수 있는 방법을 보여줍니다. 하지만 더 중요한 것은, 수석 DevOps 엔지니어가 자동화, CI/CD 통합, 그리고 Infrastructure-as-Code를 사용하여 이러한 위협을 탐지, 완화, 모니터링할 수 있는 방법을 보여준다는 점입니다.
출시일: 2025년 9월 16일 (패치 화요일)
Microsoft의 최신 보안 권고는 Windows 데스크톱 및 서버 에디션 모두에서 사용되는 핵심 그래픽 커널인 win32k.sys의 심각한 결함을 식별합니다. 이 약점은 취약한 드라이버가 실행 중인 모든 시스템에서 공격자가 원격 코드 실행(RCE)을 트리거할 수 있는 경쟁 조건입니다. 이 드라이버는 GDI(Graphics Device Interface)의 핵심에 위치하기 때문에 커널 모드에서 임의 코드를 실행하는 데 악용될 수 있으며, 이는 전체 시스템을 손상시킬 수 있는 권한 수준입니다.
이것이 중요한 이유:
- 일반 사무용 컴퓨터부터 고성능 서버에 이르기까지 모든 그래픽 사용자 인터페이스를 구동하는 핵심 하위 시스템을 대상으로 합니다.
- 화요일에 출시된 패치는 즉각적인 수정을 제공하지만, 관리자가 적시에 이를 발견, 배포 및 모니터링하는 방법을 알고 있는 경우에만 가능합니다.
다음 스니펫은 레지스트리에서 현재 win32k.sys 버전을 가져와 패치된 버전과 비교하고 불일치를 CSV 파일에 기록하여 Excel 또는 Tableau로 가져올 수 있도록 합니다.
# DetectWin32k.ps1 – 취약한 win32k.sys 확인
$target = 'Microsoft-Windows-GraphicsKernel'
$patchVersion = '6.0.22.7' # 예상 패치 버전
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$target"
$currentVer = Get-ItemProperty $regPath | Select-Object -ExpandProperty ImagePath
$kernelFile = Join-Path $env:SystemRoot \System32\win32k.sys
$fileVersion = (Get-ChildItem $kernelFile).VersionInfo.FileVersion
if ($fileVersion -ne $patchVersion) {
Write-Output "vulnerable: $currentVer (actual=$fileVersion, expected=$patchVersion)" | Out-File -Encoding ascii .\report.csv
}
작동 방식:
다음 YAML 파일은 Ansible에게 win32k.sys 업데이트를 적용하고 모든 대상 호스트에서 GDI 서비스를 다시 시작하도록 지시합니다.
---
- name: Deploy Windows graphics kernel patch
hosts: windows_servers
gather_facts: yes
tasks:
- name: Copy new win32k.sys
copy:
src: /tmp/patches/win32k.sys
dest: C:\Windows\System32\
mode: '0644'
force: yes
- name: Restart GDI service
win_service:
name: w32k
state: restarted
작동 방식:
windows_servers)에 푸시합니다.시간 경과에 따른 GDI 개체 테이블 사용량을 시각화하는 간단한 패널을 만듭니다.
# grafana-dashboard.yml
apiVersion: 1
dashboard:
title: “GDI Usage”
panels:
- name: “Objects in use”
type: graph
targets:
- query: "SELECT timestamp, gdi_objects FROM win32k_stats WHERE $__timeFilter()"
작동 방식:
win32k_stats)에서 메트릭을 가져와 Grafana 패널에 표시합니다. 사용량이 임계값을 초과할 때 알림을 설정할 수 있습니다. 이는 드라이버 회귀의 조기 지표입니다.Jenkins 또는 GitHub Actions 파이프라인에 경량 도구(예: wdfuzz)로 win32k.sys를 퍼징하여 패치를 테스트하는 단계를 추가합니다.
# .github/workflows/cve55226.yml
name: CVE-2025-55226 CI
on:
push:
branches:
- main
jobs:
test_and_deploy:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Run fuzzer
run: |
wdfuzz.exe -t win32k.sys -c config.yaml
if ($LASTEXITCODE -eq 0) { Write-Host "Fuzz passed" }
- name: Deploy patch
uses: ansible/[email protected]
with:
playbook: DetectWin32k.ps1
작동 방식:
main 브랜치에 변경 사항이 있을 때마다 코드 베이스를 체크아웃합니다.그래픽 엔진의 단일 결함에서 시작됩니다. 공격자는 위에서 시연된 것처럼 Windows 커널의 경쟁 조건을 악용하여 방어를 뚫고 원격으로 코드를 실행할 수 있는 방법을 찾습니다. 그것이 CVE-2025-55226입니다. 그러나 실제 위험은 NTLM 인증의 약점인 CVE-2025-54918과 결합할 때 드러납니다. 갑자기 공격자는 침입하는 것을 넘어 제어권을 가지게 됩니다.
그래픽 버그로 시작된 것이 완전한 권한 상승으로 발전하여 SYSTEM 수준 액세스를 제공합니다. 이 일련의 사건은 단지 이론에 불과하지 않습니다. 오늘날의 하이브리드 환경에서 취약점은 거의 고립되어 존재하지 않는다는 것을 상기시켜 줍니다.
게시일: 2025년 9월 9일 (패치 화요일)
CVSS v3.1 점수: 8.8 (높음)
벡터: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-287 – 부적절한 인증
영향을 받는 구성 요소: Windows NTLM (New Technology LAN Manager)
이 결함은 NTLM이 인증 데이터를 검증하는 방식의 논리 오류입니다. 최소한의 권한으로도 네트워크를 통해 호스트에 도달할 수 있는 공격자는 시스템을 속여 SYSTEM 수준의 권한을 부여하도록 할 수 있습니다. 이는 워크스테이션이나 도메인 컨트롤러를 손상시킨 후 공격자가 애플리케이션을 설치하고, 기밀 파일을 유출하며, 새 관리자 계정을 생성할 수 있음을 의미합니다. 이는 본질적으로 대상에 대한 완전한 제어권을 가지게 됩니다.
이 취약점은 2025년에 증가하는 패턴의 일부입니다. 이미 두 개의 다른 NTLM 버그(CVE-2025-53778, CVE-2025-21311)가 보고되었습니다. 이 문제에 대한 Microsoft의 패치는 특정 해시 값을 잘못 수락하는 부정확한 비교 루틴을 수정합니다.
# 취약한 NTLM 설정이 있는 호스트 찾기
$target = "dc01.company.local"
Invoke-Command -ComputerName $target -ScriptBlock {
Get-WmiObject -Class Win32_OperatingSystem |
Select-Object CSName, Version, BuildNumber
} | Out-File -FilePath C:\temp\nlm_detection.txt
# NTLM 정책 값 확인
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon" |
Select-Object "LmCompatibilityLevel"
# 빠른 검토를 위해 CSV로 내보내기
$report = @()
foreach ($item in Get-WmiObject -Class Win32_Service | Where { $_.Name -eq "netlogon"}) {
$report += [pscustomobject]@{
Service = $item.Name
LmCompat = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon").LmCompatibilityLevel
}
}
$report | Export-Csv -Path C:\temp\nlm_report.csv -NoTypeInformation
이 스크립트는 현재 OS 빌드를 가져오고 Netlogon 키가 Microsoft에서 권장하는 값(3)으로 설정되었는지 확인한 후 결과를 쉽게 사용할 수 있는 CSV로 기록합니다.
---
- name: Patch NTLM for Windows servers
hosts: windows_dc01, windows_dc02, windows_dc03
gather_facts: true
tasks:
- name: Enable Netlogon compatibility level
win_regedit:
path: HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon
key: LmCompatibilityLevel
value: 3
datatype: dword
- name: Install Microsoft patch KB5000000
win_updates:
category_name: Security
search_keyword: KB5000000
reboot_after: true
모든 도메인 컨트롤러에 플레이북을 배포합니다. 이 작업은 정책이 올바르게 설정되고 최신 보안 업데이트가 설치되도록 하여 동일한 논리 오류가 더 이상 악용되지 않도록 합니다.
Responder와 Impacket을 사용하여 실제 NTLM 릴레이 공격을 모방할 수 있습니다.
secretsdump.py**는 인증 데이터를 캡처합니다.# 공격 박스에서 Responder 시작
responder -i eth0 -f
# 피해자로부터 자격 증명 덤프
python3 impacket/secretsdump.py <victim-ip> <domain-admin-username>
# 대상에 해시 재전송
python3 impacket/ntlmrelay.py <victim-ip> <target-ip>
통제된 환경에서 스크립트를 실행하고 SYSTEM 수준 액세스 권한을 받는지 확인하세요.
파이프라인에 NTLM 강화 작업을 추가합니다.
- name: Validate Netlogon compatibility level
win_regedit:
path: HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon
key: LmCompatibilityLevel
value: 3
datatype: dword
state: present
# 새 패치가 적용될 때 트리거
- name: Reboot if required and restart services
win_reboot:
reboot_timeout_sec: 120
이 작업은 새 패치 빌드에 의해 파이프라인이 트리거될 때마다 자동으로 실행됩니다.
취약한 해시 패턴과 일치하는 NTLM 인증으로 호스트가 로그인할 때 트리거되는 알림을 생성합니다.
input {
beats {
type => "winlogbeat"
}
}