Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-30051 — CVE-2024-30051에 대한 상세 기술 분석 및 개념 증명(PoC) 익스플로잇으로, Windows DWM Core Library의 힙 기반 버퍼 오버플로우를 악용하여 무결성 시스템(Integrity System) 수준으로의 로컬 권한 상승을 가능하게 합니다. | Kitploit
도구/GitHubGitHub/fortra/cve-2024-30051
Privilege EscalationVulnerability AnalysisExploitationReverse EngineeringLearning & EducationBinary Exploitation
GitHubfortra/cve-2024-30051

CVE-2024-30051

CVE-2024-30051에 대한 상세 기술 분석 및 개념 증명(PoC) 익스플로잇으로, Windows DWM Core Library의 힙 기반 버퍼 오버플로우를 악용하여 무결성 시스템(Integrity System) 수준으로의 로컬 권한 상승을 가능하게 합니다.

저장소 보기
12636162년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Windows DWM Core Library 권한 상승 취약점 (CVE-2024-30051) (2024년 8월 15일 게시)

이 블로그 게시물에서는 Core Impact용 익스플로잇을 개발할 당시 분석했던 Microsoft Windows DWM Core 라이브러리의 취약점에 대해 설명합니다. 이 취약점은 권한이 없는 공격자가 Integrity System 권한을 가진 DWM 사용자로 코드를 실행할 수 있게 합니다 (CVE-2024-30051).

당시 익스플로잇을 개발하기에 충분한 공개 정보가 없어서 리버싱을 많이 해야 했습니다. 그래서 여기서는 IDA PRO를 사용하여 Windows 23H2용 KB5037771 패치를 리버싱하는 방법을 보여드리고, BINDIFF를 사용하여 dwmcore.dll 버전 10.0.22621.3447과 버전 10.0.22621.3593 간의 바이너리 디핑(binary diffing)을 수행하는 방법을 설명하겠습니다. 또한 힙 오버플로가 어떻게 발생하는지 보여주고, 권한을 상승시켜 이를 익스플로잇한 다음 마지막으로 작동하는 PoC를 만들겠습니다.

색인:

[Windows DWM Core Library 권한 상승 취약점 (CVE-2024-30051) 1](#windows-dwm-core-library-elevation-of-privilege-vulnerability-cve-2024-30051)

[취약점 세부 정보: 2](#vulnerability-details)

[버그를 찾기 위한 Diffing: 3](#diffing-to-find-the-bug)

[CVE-2024-30051을 익스플로잇하는 PoC 분석: 8](#analysis-of-the-poc-exploiting-cve-2024-30051)

[1) 초기화 8](#initialization)

[2) 후킹 8](#hooking)

[3) 창 생성 16](#creating-the-window)

[4) 디바이스 생성 16](#create-device)

[5) 팩토리 생성 22](#create-factory)

[6) 디바이스 컨텍스트 생성 28](#create-a-device-context)

[7) 컴포지션 디바이스 생성 29](#create-a-composition-device)

[8) hook3 함수 호출 31](#calling-dcompositioncreatedevice-function)

[9) HWND 대상 생성 32](#creating-a-target-for-handle-hwnd)

[10) Surface 생성 33](#creating-surface)

[11) BeginDraw, EndDraw, CreateVisual 호출 34](#calling-begindraw-enddraw-and-createvisual)

[11) Visual SetContent 호출 36](#calling-visual-setcontent)

[12) 개체 해제 38](#release-objects)

[13) 컴포지션 디바이스 커밋 38](#commit-composition-device)

[14) hook2 호출 39](#calling-hook2)

[15) hook 호출 39](#remember-that-the-vulnerable-function-can-be-reached-using-some-methods-of-the-cprimitivegroup-class.-at-this-point-it-creates-a-heap-then-hook2-captures-and-saves-the-corresponding-heaphandle.)

[16) hook4 호출 41](#calling-the-function-hook4)

[17) 힙 스프레이 수행 49](#performing-heap-spray)

[18) 전송 전 base chunk 수정 51](#modifying-the-base-chunk-before-send)

[19) DWM 프로세스 디버깅 52](#debugging-the-dwm-process)

[20) 권한을 Integrity System 수준으로 상승 62](#elevating-privileges-to-integrity-system-level)

취약점 세부 정보:

Windows DWM Core Library 권한 상승 취약점 CVE-2024-30051

출시: 2024년 5월 14일

CNA 지정: Microsoft CVE-2024-30051

영향: 권한 상승

최대 심각도: 중요

약점:

CWE-122: 힙 기반 버퍼 오버플로

CVSS: 3.1 7.8 / 7.2

이 취약점은 dwmcore.dll이라고 하는 Windows DWM 메인 라이브러리 내 정수 나눗셈의 크기 계산 오류로 인해 발생합니다. 로컬 사용자는 dwmcore.dll의 CCommandBuffer::Initialize 메서드에서 힙 버퍼 오버플로를 유발하고 Integrity System 권한을 가진 DWM 사용자로 임의 코드를 실행할 수 있습니다. 익스플로잇은 DWM 프로세스에서 힙 스프레이(Heap Spray)를 수행하여 메모리를 준비하고, 최종적으로 dwmcore.dll에 힙 오버플로를 발생시킵니다. 이 힙 오버플로는 힙 스프레이의 특정 부분을 해제할 때 트리거됩니다.

익스플로잇이 성공하면 DWM 프로세스는 우리가 만든 DLL을 로드하여, Integrity System 권한을 가진 DWM 사용자로 우리의 코드 또는 실행 파일(이 경우 CMD)을 실행합니다.

이 취약점을 살펴보면서 어떻게 Integrity Level SYSTEM을 가진 DWM 사용자로 실행할 수 있게 되는지 알아보겠습니다. 이 사용자는 Administrator 그룹에 속하지 않으므로 일부 권한 제한이 있습니다.

버그를 찾기 위한 Diffing:

Windows 11 23H2용 패치는 다음에서 다운로드할 수 있습니다:

https://www.catalog.update.microsoft.com/Search.aspx?q=KB5037771

windows11.0-kb5037771-x64_19a3f100fb8437d059d7ee2b879fe8e48a1bae42.msu

취약한 버전의 dwmcore.dll: 10.0.22621.3447

패치된 버전의 dwmcore.dll: 10.0.22621.3593

변경된 함수들을 분석해 보면, 패치된 CCommandBuffer::Initialize 버전에는 블록이 많이 추가되어 패치 전 버전과 상당히 다르게 보인다는 것을 알 수 있습니다.

해당 함수를 정적 리버싱한 결과, CD2DSharedBuffer::GetBufferSize에 대한 호출이 두 번 있습니다.

첫 번째 호출은 new에서 할당할 크기(size) 를 가져오고, 두 번째 호출은 memcpy를 위해 동일한 크기를 가져옵니다.

처음에는 모든 것이 올바른 것처럼 보입니다. 그러나 할당 전에 크기로 몇 가지 연산을 수행합니다.

동일한 CD2DSharedBuffer::GetBufferSize 함수를 호출하여 buffer_size와 buffer_size2를 얻으며, 둘 다 같은 값을 반환합니다. 그러나 new에서는 사전 연산으로 buffer_size를 0x90으로 정수 나눗셈한 다음 0x90을 곱하는 반면, memcpy에서는 반환된 buffer_size2를 연산 없이 사용합니다.

이러한 연산을 통해 new에서 최종 사용되는 크기와 memcpy에서 사용되는 크기가 달라질 수 있음을 발견했습니다.

buffer_size = buffer_size2 (반환된 크기)

size_new= buffer_size/0x90 x 0x90 =0x90

size_memcpy= buffer_size2= 0x91

예를 들어 buffer_size가 0x91인 경우

buffer_size = buffer_size2=0x91

size_new= buffer_size/0x90 x 0x90 =0x90

size_memcpy= buffer_size2= 0x91

이 예는 힙 오버플로가 발생함을 입증합니다. 할당된 바이트보다 더 많은 바이트를 복사하며, 그 크기는 제어할 수 있습니다.

예를 들어 POC에서 사용한 것처럼 buffer_size가 0x23f인 경우입니다.

buffer_size = buffer_size2=0x23F

size_new= buffer_size/0x90 x 0x90 =0x1b0

size_memcpy== buffer_size2=0x23f

취약한 함수를 분석한 후, 취약한 함수 CCommandBuffer::Initialize에 도달하는 방법을 확인하고 싶었습니다. 여기서부터 상황이 복잡해지기 시작합니다.

이 함수에 대한 참조를 다시 살펴보면, CPrimitiveGroup 클래스의 메서드에서 도달하는 것처럼 보입니다:

이러한 메서드는 CPrimitiveGroup 개체의 vftable에서 접근할 수 있습니다:

이 클래스에는 생성자가 있습니다:

그리고 다음과 같은 방식으로 도달합니다:

처음 이 과정을 진행하면서 PDF "The Lost World of DirectComposition: Hunting Windows Desktop Window Manager Bugs"를 읽는 시간을 가졌고 Direct Composition의 세계에 깊이 들어가 보았습니다. 이것은 제 첫 PoC를 만드는 데 도움이 되었습니다.

또한 win32ksys를 리버싱해야 했고 다음 함수들을 통해 패키지를 보내려고 시도했습니다:

  • NtDCompositionCreateChannel

  • NtDCompositionProcessChannelBatchBuffer

  • NtDCompositionCommitChannel

첫 번째 PoC는 CPrimitiveGroup 생성자에 도달했습니다. 그러나 많은 리버싱 끝에도 이 함수들을 사용한 ALPC 호출을 통해 vftable 메서드 호출을 처리하여 취약한 함수에 직접 도달하는 방법을 찾지 못했습니다.

도구 다운로드