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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
WHFB-PinCapture — LogonUI.exe에 DLL을 주입하여 NgcSerializeConvenienceCredential에 CPU 하드웨어 브레이크포인트를 설정함으로써 입력 시점에 Windows Hello PIN을 캡처하며, WHFB/NGC/TPM 열거기도 포함합니다. | Kitploit
도구/GitHubGitHub/ivancabrera02/whfb-pincapture
Privilege EscalationMemory ForensicsPassword AttacksReverse EngineeringDebuggersInformation GatheringPost-ExploitationRed Teaming
GitHubivancabrera02/whfb-pincapture

WHFB-PinCapture

LogonUI.exe에 DLL을 주입하여 NgcSerializeConvenienceCredential에 CPU 하드웨어 브레이크포인트를 설정함으로써 입력 시점에 Windows Hello PIN을 캡처하며, WHFB/NGC/TPM 열거기도 포함합니다.

저장소 보기
621610일 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

WHFB-PinCapture

TL;DR

Windows Hello가 VBS/VSM(VTL1의 격리된 NgcIso 컨테이너) + TPM으로 보호되는 호스트에서는 PIN이 오프라인으로 복구 불가능하며, 온라인 무차별 대입은 보안 커널 트러스트릿에 의해 차단됩니다. 신뢰할 수 있는 유일한 경로는 입력 시점 캡처입니다.

이 프로젝트는 LogonUI.exe 내부에서 입력된 PIN을 패키징하는 함수에 CPU 하드웨어 브레이크포인트를 설정하고, Vectored Exception Handler에서 트랩된 스레드 컨텍스트로부터 인자를 읽은 뒤, 원본의 수정되지 않은 명령어를 실행하도록 하여 PIN 로그인이 정상적으로 성공하도록 함으로써 PIN을 캡처합니다.

또한 전체 WHFB/NGC/TPM 열거 및 키 자료 수집기인 Get-WHFBKeys.ps1도 함께 제공합니다.

Intel fTPM 2.0과 VBS가 실행 중인 Windows 11 26200 (Home) 에서 엔드투엔드로 검증되었습니다.

여기서 오프라인 공격이 통하지 않는 이유

관찰된 보호결과
VBS / VSM 실행 중 (Win32_DeviceGuard VBS 상태 = 2, LsaIso.exe 존재)키 계층이 VTL1(보안 커널)에 존재하며, VTL0의 SYSTEM에서 접근 불가
NgcIso 컨테이너 (Container.json의 NgcIsoHeader_… / NgcSvc에 로드된 보호자 블롭 NgcIsoCtnr.dll)PIN 비밀은 일반 사용자 모드가 아닌 트러스트릿 내부에서 언실됨
TPM으로 봉인된 마스터 자료 (Container.json의 srk, impl 키 유형)디스크에 평문 키 없음, 언실에는 TPM 필요
안티 해머링 (Protectors.json의 softLockoutAttemptLimit = 5, sealedLockoutAuth)온라인 추측 시 잠금 발생, 카운터는 디스크에서 재설정 불가능한 VTL1에 의해 강제됨

평문 PIN이 존재하는 위치

잠금 화면 / 로그인 시, PIN은 LogonUI.exe가 호스팅하는 NGC 자격 증명 공급자에 입력됩니다(SYSTEM으로 실행되며, PPL이 아니고, 필요 시 생성됨). 공급자는 입력된 PIN을 ngckeyenum.dll!NgcSerializeConvenienceCredential에 전달하며, 이 함수의 arg1 (RCX) 은 다음을 가리킵니다:

struct {                 // arg1
    uint64_t type;       // 1  (convenience-PIN credential)
    void*    buffer;     // -> ASCII PIN, e.g. 0x32 0x30 0x30 0x32 = "2002" example PIN
    uint32_t length;     // digit count (e.g. 4)
};
// arg2 = full NGC key name  "S-1-5-...-1001/<container-guid>//<key-guid>"
// arg3 = username, arg4 = computername, arg5 = SID, arg6 = "Negotiate"

핵심 통찰: 침입형 후킹은 PIN 로그인을 깨뜨린다

NgcSerializeConvenienceCredential(또는 NgcPackAuthBuffer)에 대한 고전적인 인라인/트램펄린 후킹은 직렬화된 로그온 자격 증명을 손상시킨다. 증상은 불쾌하고 조용하다: 로그인 화면이 오류 없이 그저 다시 로드되고, 올바른 PIN이 거부되며, 반복된 거부는 PIN을 소프트 잠금시킨다(비밀번호 로그인을 강제함). NgcSvc를 강제 종료하는 것도 마찬가지로 컨테이너를 방해한다.

우리는 대상 함수의 코드 한 바이트나 제어 흐름을 변경하지 않고 인자를 읽는 캡처 프리미티브가 필요하다.

기법: 하드웨어 브레이크포인트 캡처

ngccap.dll(참조: src/ngccap.c)은 LogonUI.exe에 주입되어 다음을 수행한다:

  1. CPU 하드웨어 실행 브레이크포인트를 설정한다. ngckeyenum!NgcSerializeConvenienceCredential을 확인한 다음, 프로세스의 모든 스레드에 대해 DR0 = 대상 및 DR7 = L0 | exec | len-1을 설정한다(CreateToolhelp32Snapshot → OpenThread → SuspendThread → GetThreadContext / SetThreadContext(CONTEXT_DEBUG_REGISTERS 사용) → ResumeThread 경유).

  2. 벡터 예외 처리기(Vectored Exception Handler)에서 트랩을 처리한다. 함수에 진입하면 CPU는 명령어를 실행하기 전에 EXCEPTION_SINGLE_STEP을 발생시킨다. VEH는 ContextRecord->Rip == target을 확인하고, Rcx → {buffer, length}를 읽어 ASCII PIN을 복사한 다음:

    • 브레이크포인트가 즉시 다시 발생하지 않도록 EFlags에 **재개 플래그(Resume Flag, RF)**를 설정하고,
    • **EXCEPTION_CONTINUE_EXECUTION**을 반환한다.
  3. 원래 명령어가 수정 없이 실행된다. 코드가 패치되지 않았고 트램펄린이나 추가 스택 프레임이 도입되지 않았기 때문에, NgcSerializeConvenienceCredential은 원래대로 정확히 실행된다. 자격 증명이 올바르게 생성되고, LSA가 이를 수락하며, PIN 로그인이 정상적으로 성공한다.

  4. 스스로 정리한다. 첫 캡처 후 DLL은 모든 스레드에서 DR0/DR7을 지우고 VEH를 제거하여 프로세스를 원래 상태로 남긴다.

저장소 구조

WHFB-PIN-Capture/
├─ README.md
├─ Get-WHFBKeys.ps1        # WHFB/NGC/TPM enumerator + key-material harvester
└─ src/
   ├─ ngccap.c             # HW-breakpoint capture DLL
   ├─ build.bat            # cl.exe build (MSVC 2022 Build Tools)
   └─ logonui_watch.ps1    # injects ngccap.dll into LogonUI on sight

요구 사항

  • Windows Hello 편의 PIN이 등록된 Windows 10/11.
  • 상승된 관리자 (인젝터가 SeDebugPrivilege를 활성화함). LogonUI는 SYSTEM으로 실행되지만 PPL이 아니므로, 상승된 관리자 토큰으로 열고 주입할 수 있음.

빌드 및 실행

:: 1) build the capture DLL
cd src
build.bat

:: 2) start the injector (elevated admin PowerShell)
powershell -ExecutionPolicy Bypass -File .\logonui_watch.ps1
3) Lock the workstation (Win+L) and sign back in with your PIN, it works normally.
4) Read the captured PIN:
     type C:\Windows\Temp\pin_capture.log
   -> >>> PIN CAPTURED = "1234"

경로는 구성 가능합니다: ngccap.c 상단의 LOGPATH와 logonui_watch.ps1의 $plog가 일치해야 합니다(기본값 C:\Windows\Temp\pin_capture.log).

열거 도구

Get-WHFBKeys.ps1는 TPM 상태, 장치 조인 / NGC 프로비저닝, WHFB 정책, 디스크상의 NGC 컨테이너 저장소(컨테이너 → 보호자 → 키, SYSTEM으로 자체 권한 상승), NCrypt 키 (Passport KSP / Platform Crypto Provider / 공개 키 내보내기를 지원하는 Software KSP), 그리고 생체 인식 등록 정보를 보고하며, JSON 보고서를 출력합니다. 이 도구는 절대 개인 키를 추출하지 않으며(TPM으로 봉인되어 내보낼 수 없음), 공개 키, 메타데이터 및 디스크상의 보호자 blob을 덤프합니다.

powershell -ExecutionPolicy Bypass -File .\Get-WHFBKeys.ps1 -DumpBlobs -OutDir .\out

오프라인 및 무차별 대입 경로는 닫혀 있는 것으로 확인되었으며, PIN은 소유자가 올바른 PIN으로 정상 로그인하는 동안 하드웨어 중단점 DLL을 사용하여 캡처되었습니다.

라이선스

교육 및 승인된 보안 연구 목적으로만 사용하십시오. 보증은 제공되지 않습니다.

도구 다운로드