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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-30088 — CVE-2024-30088에 대한 개념 증명(PoC) 익스플로잇으로, AuthzBasepCopyoutInternalSecurityAttributes의 Windows 커널 TOCTOU 취약점을 통해 경쟁 조건(race condition)으로 임의 쓰기가 가능해져 권한 상승을 유발합니다. | Kitploit
도구/GitHubGitHub/tykawaii98/cve-2024-30088
Privilege EscalationVulnerability AnalysisExploitationBinary Exploitation
GitHubtykawaii98/cve-2024-30088

CVE-2024-30088

CVE-2024-30088에 대한 개념 증명(PoC) 익스플로잇으로, AuthzBasepCopyoutInternalSecurityAttributes의 Windows 커널 TOCTOU 취약점을 통해 경쟁 조건(race condition)으로 임의 쓰기가 가능해져 권한 상승을 유발합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2024-30088

버그:

  • 버그는 커널이 현재 토큰 객체의 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION 을 사용자 모드로 복사할 때 AuthzBasepCopyoutInternalSecurityAttributes 함수 내부에 있으며, 구조체는 다음과 같습니다:
root@kitploit:~
//0x30 bytes (sizeof)
struct _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION
{
    ULONG SecurityAttributeCount;                                           //0x0
    struct _LIST_ENTRY SecurityAttributesList;                              //0x8
    ULONG WorkingSecurityAttributeCount;                                    //0x18
    struct _LIST_ENTRY WorkingSecurityAttributesList;                       //0x20
}; 
  • SecurityAttributesList 를 복사할 때, 커널은 SecurityAttribute 구조체의 목록을 사용자가 제공한 포인터에 *직접* 설정합니다. 그 후, RtlCopyUnicodeString 과 AuthzBasepCopyoutInternalSecurityAttributeValues 함수를 호출하여 SecurityAttribute 구조체의 이름과 값을 복사하므로, 이 함수에서 여러 번의 TOCTOU가 발생합니다.

  • RtlCopyUnicodeString 이 호출되기 전에 [*] 속성 이름의 Buffer 포인터를 수정하는 간단한 경쟁 스레드만으로도, 고정된 값과 제어된 크기로 임의 주소 쓰기를 쉽게 달성할 수 있습니다.

  • 이를 악용할 수 있는 다른 방법들도 있지만, 제 경우에는 RtlCopyUnicodeString 을 활용하는 방법을 선택했습니다.

버그 트리거:

  • 이 버그는 NtQueryInformationToken 을 TokenAccesInformation 클래스로 호출하여 쉽게 트리거할 수 있습니다.

패치:

  • 패치는 시스템 호출이 사용자 모드에서 발생한 경우, 사용자 버퍼에 다시 쓰기 전에 보안 속성의 이름을 복사하기 위해 커널 스택의 지역 변수(아래 코드 블록의 v18)를 버퍼로 사용합니다.
root@kitploit:~
    [...]
        p_SecurityAttributesList = &a1->SecurityAttributesList;
        Flink = a1->SecurityAttributesList.Flink;
        if ( Flink == p_SecurityAttributesList )
          return (unsigned int)inserted;
        v13 = a2 + 0x98;
        while ( 1 )
        {
          if ( (unsigned int)Feature_2516935995__private_IsEnabledDeviceUsage() )
          {
            inserted = AuthzBasepProbeAndInsertTailList(a2 + 8, v13 - 0x68);
            if ( inserted < 0 )
              goto LABEL_24;
          }
          else
          {
            [...]
          }
          ++*(_DWORD *)a2;
          *(_WORD *)(v13 - 56) = Flink[3].Flink;
          *(_DWORD *)(v13 - 52) = HIDWORD(Flink[3].Flink);
          *(_QWORD *)(v13 - 24) = v13 - 32;
          *(_QWORD *)(v13 - 32) = v13 - 32;
          *(_QWORD *)v13 = v13 - 8;
          *(_QWORD *)(v13 - 8) = v13 - 8;
          *(_QWORD *)(v13 - 48) = 0i64;
          *(_DWORD *)(v13 - 40) = 0;
          *(_DWORD *)(v13 - 16) = 0;
          Flink_low = LOWORD(Flink[2].Flink);
          v19 = Flink_low;
          v17 = (wchar_t *)((v10 + 1) & 0xFFFFFFFFFFFFFFFEui64);
          v15 = (unsigned __int64)v17 + Flink_low;
          if ( (unsigned __int64)v17 + Flink_low > v6 )
            break;
          if ( (unsigned int)Feature_3391791421__private_IsEnabledDeviceUsage() )
          {
            *(_QWORD *)&v18.Length = 0i64;
            v18.MaximumLength = Flink_low;
            v18.Buffer = v17;
            RtlCopyUnicodeString(&v18.Length, (unsigned __int16 *)&Flink[2]);
            *(_UNICODE_STRING *)(v13 - 0x48) = v18;
          }
          else
          {
            [...]
          }
          inserted = AuthzBasepCopyoutInternalSecurityAttributeValues(
                       (__int64)Flink,
                       v13 - 104,
                       v15,
                       (int)v6 - (int)v15,
                       &v19);
    [...]
  • 디버그 세션에서 패치 후 rcx 가 커널 주소인 것을 확인할 수 있습니다:
root@kitploit:~
5: kd> 
nt!AuthzBasepCopyoutInternalSecurityAttributes+0x1aa:
fffff803`5dbcf14a e8810fa5ff      call    nt!RtlCopyUnicodeString (fffff803`5d6200d0)
5: kd> r
rax=0000025a81d006a0 rbx=0000025a81d00590 rcx=ffffe20697c4f778
rdx=ffffa609c7a101a0 rsi=0000025a81d00598 rdi=0000025a81d00628
rip=fffff8035dbcf14a rsp=ffffe20697c4f740 rbp=0000025a81d006c0
 r8=0000000000000003  r9=0000025a81d00590 r10=ffffa609c816ef78
r11=ffffe20697c4f7d0 r12=0000000000000a70 r13=ffffa609ca9b1118
r14=ffffa609c7a10180 r15=0000025a81d01000
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040202
nt!AuthzBasepCopyoutInternalSecurityAttributes+0x1aa:
fffff803`5dbcf14a e8810fa5ff      call    nt!RtlCopyUnicodeString (fffff803`5d6200d0)

POC:

  • https://youtu.be/y5LnlHjzA64
도구 다운로드