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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-24990_POC — Proof of Concept CVE-2025-24990 (Agere Systems 드라이버) | Kitploit
도구/GitHubGitHub/moiz-2x/cve-2025-24990_poc
Privilege EscalationExploit FrameworksVulnerability AnalysisExploitationBinary Exploitation
GitHubmoiz-2x/cve-2025-24990_poc

CVE-2025-24990_POC

Proof of Concept CVE-2025-24990 (Agere Systems 드라이버)

저장소 보기
59139개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Windows Agere Modem 드라이버(ltmdm64.sys). 이 드라이버는 매우 오래되었으며 테스트 머신에서 기본적으로 로드되지 않으므로 BYOVD 시나리오에서 악용하겠습니다. 흥미롭게도 제 조사에 따르면 이 드라이버는 Windows 7부터 존재했으며 최소한 하나의 버그가 있습니다. 여기

당시 MSRC는 아무 조치도 취하지 않았습니다 🤡

취약점

이 드라이버 내 일부 IOCTL은 METHOD_NEITHER를 사용하지만 호출자가 제공한 주소 버퍼가 사용자 모드인지 커널 모드인지 확인하지 않습니다. OSR로 디코딩한 IOCTL 코드 예시는 다음과 같습니다:

즉, DeviceIoControl API에 커널 주소를 제공할 수 있으며 드라이버는 이를 정상적으로 처리합니다.

커널 주소를 유출하려면 먼저 kASLR을 우회해야 합니다. EnumDeviceDrivers를 사용하겠습니다 (Windows 24h2에서는 이를 위해 SeDebugPriv가 필요합니다).

널 역참조

문제는 IOCTL 0x802b200f (ud_response)에 있습니다. 다시 말하지만, 이 IOCTL 디스패치는 사용자 모드에서 제공하는 주소를 검증하지 않지만, 나중에 이를 활용하겠습니다.

**ud_response**는 **ll_load_diagnostics**를 호출하며, 다음 코드에 도달하게 됩니다:

시작 시 전역 변수 **eeprom**이 초기화되지 않아 NULL을 포함합니다. 이를 트리거하는 간단한 코드는 다음과 같습니다.

이를 나중에 활용하겠습니다.

익스플로잇 진입점 0x802b2003

이 IOCTL은 드라이버 버전 문자열 "8.36"을 숫자 0x836 (DWORD)로 변환하고 호출자가 제공한 주소에 기록합니다 (METHOD_NEITHER 덕분에). 기술적으로 이 4바이트(36 08 00 00)를 임의의 커널 주소에 쓸 수 있습니다. 이를 활용하여 드라이버의 전역 변수를 덮어쓰고 실행 흐름을 변경하겠습니다.

이 0x802b2003을 IOCTL_GET_VERSION이라고 부르겠습니다.

익스플로잇

임의 1바이트 널:

널 역참조 사례로 돌아가서, VirtualAlloc API를 사용하여 고정 주소(0x083600000000)를 할당합니다. 그런 다음 IOCTL_GET_VERSION을 사용하여 *(eeprom + 4)에 위에서 설명한 4바이트를 기록합니다. 드라이버가 나중에 eeprom을 역참조하면 제가 할당한 주소에서 읽습니다.

널 역참조를 수정한 후, IOCTL은 버퍼 크기에 따라 사용자 모드에서 제공한 주소에 문자열을 기록합니다.

이 코드는 위에서 설명한 내용을 단순히 보여줍니다. 버퍼를 할당하고 0xAA로 채운 다음 널 역참조를 수정하고 드라이버를 호출합니다. 11바이트를 할당하지만 드라이버에는 버퍼 크기 10만 제공하여 동작 방식을 확인합니다.

크기를 10만 제공했음에도 불구하고 버퍼에 고정된 바이트 시퀀스를 기록한 다음 마지막 바이트(11번째)를 널로 만듭니다. 버퍼의 마지막 0xAA를 0x00으로 대체합니다. 이는 크기를 0으로 제공해도 드라이버가 대상 주소에 단일 0x00 바이트를 기록함을 나타냅니다.

임의 감소

이제 널과 고정 4바이트 임의 쓰기가 있으니 다른 프리미티브를 만들어 보겠습니다.

이 IOCTL은 전역 LtMsgEvent를 사용자 버퍼로 설정한 다음 WDM이 널인지 확인하고 다시 0으로 설정합니다.

그런 다음 0x802b2207에서 ObfReferenceObject API를 호출합니다.

초기 상태에서 WDM은 널이지만 IOCTL_GET_VERSION의 도움으로 WDM을 0x36으로 설정할 수 있고(크기는 1바이트뿐) LtMsgEvent는 여전히 제 버퍼입니다. 그런 다음 WDM을 널로 만들고 0x802b2207을 호출합니다. 마지막으로 ObfReferenceObject에 도달합니다. 이 두 IOCTL을 IOCTL_SET_LtMsgEvent 및 IOCTL_DEREF_LtMsgEvent라고 부르겠습니다.

ObfReferenceObject를 사용하는 익스플로잇 기법은 KTHREAD의 PreviousMode를 UserMode에서 KernelMode로 변경합니다. 자세한 내용은 여기에서 읽을 수 있습니다. 그러나 Windows는 이 익스플로잇을 수정했으므로 사용할 수 없습니다.

하지만 ObfReferenceObject의 프리미티브는 여전히 존재합니다. API는 제공한 주소에서 0x30을 빼고 결과를 8바이트 정수로 캐스팅한 다음 1을 뺍니다.

    *(signed long long)(LtMsgEvent-0x30) -= 1

문제는 다음 값이 0인지 또는 현재 값이 < 1인지(8바이트 부호 있는 정수로 해석) 확인한다는 것입니다. 두 조건 중 하나가 참이면 KeBugCheckEx로 점프하여 시스템이 충돌합니다.

임의 쓰기

임의 감소를 확보했으니 0xFF 바이트를 쓸 다른 위치를 찾은 다음 원하는 바이트로 감소시켜야 합니다. 이 IOCTL 0x802b2243을 찾았습니다:

flip 분기에 집중하겠습니다. pbVar5는 사용자 모드에서 제공하는 주소이며 선택한 모든 대상 주소가 될 수 있습니다. DAT_TARGET_EX에 0x0C 바이트를 기록하고(IOCTL_GET_VERSION 및 임의 감소 프리미티브의 도움으로) 대상 주소에서 1바이트를 널로 만듭니다. 이 IOCTL에 대한 첫 번째 호출은 대상 주소에 0xC0을 설정하며, 이후 0xBF로 감소됩니다. 두 번째 호출은 대상 주소에 0xFF를 설정합니다(0xBF | 0xC0 = 0xFF). 대상에 0xFF가 포함되면 원하는 값으로 감소시키기만 하면 됩니다.

한 번에 한 바이트씩 기록하고 ObfReferenceObject의 KeBugCheckEx에 주의하겠습니다.

임의 읽기

읽기 프리미티브의 경우 여기 (@carrot_c4k3)에 설명된 기법을 사용합니다. 커널의 UNICODE_STRING 객체(ExpManufacturingInformation)를 덮어쓴 다음 NtQuerySystemInformation을 호출하기만 하면 됩니다. ObfReferenceObject가 KeBugCheckEx를 호출하므로 ExpManufacturingInformation에 인접한 8바이트를 널로 만들겠습니다.

이제 임의 R/W가 있으므로 이러한 프리미티브를 사용하여 많은 작업을 수행할 수 있습니다. 드라이버는 기본적으로 로드되지 않으므로 BYOVD 시나리오에서 악용하고 프로세스의 PPL을 설정하겠습니다.

Windows 11 22H2+에서의 익스플로잇:

위에서 설명한 익스플로잇은 모든 Windows 버전에서 작동하지만 KeBugCheckEx로 인해 불안정합니다. 그러나 Windows 11 22h2+에는 ioring이라는 기법이 있습니다. 이 기법은 단순히 ioring->Buffer를 제어 가능한 주소로 덮어씁니다. 구체적으로 ioring->Buffer와 그 크기를 각각 0x083600000000 및 0x836으로 덮어쓸 수 있습니다(IOCTL_GET_VERSION 사용). 이 기법을 사용하면 쓰기를 2번만 수행한 다음 R/W 프리미티브를 매우 안정적으로 사용합니다. 이 접근 방식에는 커널 주소 유출이 필요합니다.

익스플로잇 실행

Windows는 기본 상태에서 드라이버를 로드하지 않습니다. 따라서 수동으로 로드해야 합니다. ltmdm64.sys 파일은 C:\Windows\System32\DriverStore\...\ltmdm64.sys에 있으며, 관리자로 다음 명령을 실행하고 익스플로잇을 실행하세요:

sc create ltmdm64_srv binPath="C:\Windows\System32\DriverStore...\ltmdm64.sys" type=kernel && sc start ltmdm64_srv

익스플로잇은 ioring 기법을 사용하여 lsass.exe의 PPL을 끄고 데이터 전용 기법을 사용하여 notepad.exe에 PPL을 설정합니다 (win 11 24h2에서는 SeDebugPriv가 enabled여야 함)

https://github.com/user-attachments/assets/05a35b38-d26c-484f-9fb7-137f8fe8c079

CVE 작성자

이 버그를 ZDI에 보고했습니다. 그러나 Fabian Mosch와 Jordan Jay의 MSRC 제출과 중복된 것으로 보입니다. 따라서 이 PoC는 버그를 보여줄 뿐이며 그들의 작업에 감사드립니다. 거의 제 첫 CVE였습니다 😍

도구 다운로드