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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2023-21716-POC — CVE-2023-21716 Microsoft Word 힙 손상 개념 증명 | Kitploit
도구/GitHubGitHub/ronf98/cve-2023-21716-poc
Vulnerability AnalysisExploitationPapers & ResearchLearning & EducationBinary Exploitation
GitHubronf98/cve-2023-21716-poc

CVE-2023-21716-POC

CVE-2023-21716 Microsoft Word 힙 손상 개념 증명

저장소 보기
4221년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

역사

2023년 2월, Microsoft는 CVSS 점수 9.8의 심각한 취약점인 CVE-2023-21716을 패치했습니다. 이 취약점은 인증 없이 원격 코드 실행을 허용할 수 있습니다. 이 취약점은 Outlook 미리보기 창에도 영향을 미쳐, 파일을 미리 보기만 해도 트리거될 수 있습니다. Microsoft는 패치와 해결 방법을 발표했지만, 문제에 대한 세부 정보는 공개하지 않았습니다. 3월 6일, 이 버그를 발견한 연구원(Joshua J. Drake - @jduck)이 개념 증명(PoC)을 Twitter에 공유했습니다.

발생 원인

CVE-2023-21716은 Microsoft Word가 Rich Text Format (RTF) 파일, 특히 \fonttbl 제어 단어를 처리하는 방식에서 비롯됩니다. 이 제어 단어는 \f 형식을 사용하여 문서의 글꼴을 정의합니다. wwlib.dll 내부의 \fonttbl은 힙(Heap) 내에 일정 공간이 할당됩니다(이는 힙 할당이 일반적으로 동적 데이터(예: 입력에 따라 크기가 달라질 수 있는 글꼴 테이블과 같은 큰 구조를 구문 분석할 때)에 사용되기 때문입니다). 충돌은 글꼴 수가 한계(POC에 의해 32760으로 입증됨)를 초과할 때 버퍼 오버플로우로 인해 발생합니다. 할당된 힙 공간을 초과하면 반환 명령 포인터(RIP)를 덮어쓰게 되어 응용 프로그램이 충돌합니다.

영향을 받는 버전

  • Microsoft Office 2019
  • Microsoft Office Online Server
  • Microsoft Office LTSC 2021
  • Microsoft Office LTSC for Mac 2021
  • Microsoft Word 2013 Service Pack 1
  • Microsoft Word 2013 RT Service Pack 1
  • Microsoft Word 2016
  • Microsoft SharePoint Server 2019
  • Microsoft SharePoint Enterprise Server 2013 Service Pack 1
  • Microsoft SharePoint Enterprise Server 2016
  • Microsoft SharePoint Foundation 2013 Service Pack 1
  • Microsoft SharePoint Server Subscription Edition Language Pack
  • Microsoft SharePoint Server Subscription Edition
  • Microsoft Office Web Apps Server 2013 Service Pack 1
  • Microsoft 365 Apps for Enterprise

해결 방법

사용자는 Microsoft의 최신 보안 패치를 설치하는 것이 강력히 권장됩니다. 이 패치는 문제를 해결했습니다. 업그레이드할 수 없는 사용자를 위해 Microsoft는 몇 가지 해결 방법도 제공했습니다. 자세한 내용은 여기에서 확인할 수 있습니다: .

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-21716

CVE-2023-21716-POC

재현 단계

  1. 취약한 버전의 Microsoft Office를 설치합니다.
  2. RTF-creator 스크립트를 다운로드하여 실행합니다.
  3. 파일을 다시 생성하고 싶지 않다면 대신 malicious.rtf 파일을 사용할 수 있습니다. 이 파일에는 32761개의 글꼴이 포함되어 있어 버퍼 오버플로우를 트리거하여 서비스를 중단시킵니다.
  4. .rtf 파일을 이메일로 피해자에게 보냅니다. 피해자가 취약한 Office 버전을 사용하는 경우 취약점이 트리거됩니다.

배경 로직

WinDbg를 사용하여 충돌 원인을 더 자세히 살펴볼 수 있습니다. 과정은 다음과 같습니다:

  1. Microsoft Word를 실행합니다.
  2. WinDbg를 열고 WINWORD 프로세스에 연결합니다.
  3. Word를 사용하여 malicious.rtf 파일을 엽니다.

WinDbg는 충돌이 발생하면 자동으로 중단되어 추가 분석을 가능하게 합니다. 시작하려면 'k'를 입력하여 호출 스택을 확인할 수 있습니다:

root@kitploit:~
0:000> k
 # ChildEBP RetAddr      
00 012f5134 77a5feb5     ntdll!RtlReportCriticalFailure+0x4b       
01 012f5170 77a5dda9     ntdll!RtlpReportHeapFailure+0x2f
02 012f5170 77a66220     ntdll!RtlpHpHeapHandleError+0x89
03 012f5188 77a5dab7     ntdll!RtlpLogHeapFailure+0x43
04 012f51ec 779b400d     ntdll!RtlpAnalyzeHeapFailure+0x281
05 012f5348 779f806d     ntdll!RtlpFreeHeap+0x24d
06 012f53a4 779b3d66     ntdll!RtlpFreeHeapInternal+0x783
07 012f53c4 6ea4aa24     ntdll!RtlFreeHeap+0x46                       //The functions shown under ntdll relate to error handeling of the heap corruption
08 012f53d8 6ea4a9cb     mso20win32client!Ordinal1068+0xab
09 012f53e8 6ea4a995     mso20win32client!Ordinal1068+0x52
0a 012f53f4 6cccda52     mso20win32client!Ordinal1068+0x1c
0b 012f5410 03657fea     mso!Ordinal1387+0x24
0c 012f5424 03990115     wwlib!PTLS7::FsUpdateFinitePage+0x7e26f      //wwlib is in charge of handeling the font table
0d 012f5670 034ea593     wwlib!PTLS7::LsDestroyContext+0x245f90
0e 012f6f5c 033a68ef     wwlib!PTLS7::FsUpdateBottomlessPage+0x17494
0f 012f7484 035054ed     wwlib!PTLS7::LsAssert+0x2bd1c
10 012f888c 03503d3b     wwlib!PTLS7::FsUpdateBottomlessPage+0x323ee
11 012f8910 0400be52     wwlib!PTLS7::FsUpdateBottomlessPage+0x30c3c
12 012f9e9c 0390013a     wwlib!wdGetApplicationObject+0xdf8a0
13 012faf48 03ebf20e     wwlib!PTLS7::LsDestroyContext+0x1b5fb5
14 012faf90 0410ab2a     wwlib!DllCanUnloadNow+0xcc314
15 012fcfe0 03752fb4     wwlib!wdGetApplicationObject+0x1de578
16 012ff538 03385b93     wwlib!PTLS7::LsDestroyContext+0x8e2f
17 012ff578 75e6173b     wwlib!PTLS7::LsAssert+0xafc0
18 012ff5a4 75e57eaa     USER32!_InternalCallWinProc+0x2b
19 012ff68c 75e57e80     USER32!UserCallWinProcCheckWow+0x33a
1a 012ff6c4 75e57666     USER32!CallWindowProcAorW+0x7f
1b 012ff6dc 7500ae9d     USER32!CallWindowProcW+0x1b
.....
.....

우리의 두 주요 라이브러리는 wwlib.dll(글꼴, 텍스트, 레이아웃과 같은 문서 콘텐츠를 관리하는 핵심 Word 라이브러리)과 ntdll.dll(메모리 관리 및 오류 처리와 같은 저수준 시스템 작업을 처리)입니다. 충돌은 Word가 RTF 파일에서 많은 수의 글꼴을 처리할 때 발생합니다. ntdll.dll이 Word가 유효하지 않은 메모리(글꼴 오버플로우로 인해 손상되었을 가능성이 있음)에 액세스하거나 해제하려고 시도하는 것을 감지하면 힙 손상 오류를 발생시켜 충돌이 발생합니다.

더 깊이 들어가기 위해 wwlib 라이브러리의 마지막 부분에 중단점을 설정하여 글꼴이 메모리에 로드되는 방식을 확인하고 문제를 트리거한 원인을 이해할 수 있습니다:

bc * //delete all other breakpoints

bp wwlib!PTLS7::FsUpdateFinitePage+0x7e26f //create the breakpoint

이제 액세스 위반이 발생합니다:

root@kitploit:~
(ba4.1a14): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=004f1ce4 ebx=00000001 ecx=000004e4 edx=ffff7ffc esi=13474fe8 edi=00008002
eip=02b300d5 esp=004f1c3c ebp=004f1c48 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210206
wwlib!PTLS7::FsUpdateFinitePage+0x7635a:
02b300d5 66894c5604      mov     word ptr [esi+edx*2+4],cx ds:002b:13464fe4=????  //The break is happening here

프로그램을 일찍 중단했기 때문에, wwlib.dll이 처음으로 유효하지 않은 메모리에 액세스하거나 수정하려고 하는 시점(FsUpdateFinitePage)에서 초기 액세스 위반(메모리 손상을 유발)을 볼 수 있습니다. 이를 통해 ntdll.dll이 힙 손상 오류를 감지하기 전에 무엇이 잘못되었는지 검사할 기회를 얻을 수 있습니다.

더 정확히 말하면, 프로그램은 wwlib!PTLS7::FsUpdateFinitePage+0x7635a 함수 내의 mov word ptr [esi+edx2+4],cx 명령어에서 액세스 위반(코드 c0000005)으로 인해 중단되었습니다. 이 오류는 Word가 유효하지 않은 메모리 위치에 액세스하려고 시도했음을 나타냅니다. 특히 esi+edx2+4 위치의 메모리에 값(cx)을 저장하려고 할 때 발생합니다.

ESI 레지스터를 더 자세히 살펴보면 글꼴 데이터를 보유하고 있음을 알 수 있습니다: image image 리틀 엔디언 형식의 각 16비트 값(2바이트)은 \fA; 형식의 글꼴 항목을 나타냅니다.

ESI 내부에 표시된 마지막 값은 f8 7f이며, 이는 끝(29-00으로 표시됨)에 도달하기 전의 {\f32760A;}에 해당합니다. image

이제 글꼴 테이블이 ESI 레지스터가 가리키는 메모리 위치에 로드되었으며, 이렇게 많은 수의 글꼴이 처리됨에 따라 계산된 메모리 위치(esi + edx*2 + 4)가 글꼴 테이블에 할당된 메모리를 초과할 가능성이 높습니다. 이로 인해 **범위를 벗어난 쓰기(out-of-bounds write)**가 발생하여 액세스 위반 오류가 발생합니다. 액세스 위반은 메모리 관리 및 오류 보고를 처리하는 ntdll.dll에 의해 감지됩니다. 결과적으로 ntdll.dll은 힙 손상을 감지하는 함수를 호출하여 결국 응용 프로그램이 충돌하게 됩니다.

도구 다운로드