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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
NativeDump — 수동으로 Minidump 파일을 작성하여 NTAPI 함수만으로 lsass를 덤프합니다 (MiniDumpWriteDump 사용 없이!!!) | Kitploit
도구/GitHubGitHub/ricardojoserf/nativedump
Memory ForensicsPost-ExploitationRed Teaming
GitHubricardojoserf/nativedump

NativeDump

수동으로 Minidump 파일을 작성하여 NTAPI 함수만으로 lsass를 덤프합니다 (MiniDumpWriteDump 사용 없이!!!)

저장소 보기웹사이트
7451043일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

NativeDump

NativeDump는 NTAPI만을 사용하여 lsass 프로세스를 덤프하고, Minidump 파일을 생성합니다. 이 파일은 Mimikatz나 Pypykatz 같은 도구가 파싱하는 데 필요한 스트림(SystemInfo, ModuleList, Memory64List Stream)만 포함합니다.

esquema

  • NTOpenProcessToken 및 NtAdjustPrivilegeToken을 사용하여 "SeDebugPrivilege" 권한 획득
  • RtlGetVersion을 사용하여 운영 체제 버전 세부 정보(주 버전, 부 버전, 빌드 번호) 획득. 이는 SystemInfo Stream에 필요
  • NtQueryInformationProcess 및 NtReadVirtualMemory를 사용하여 lsasrv.dll 주소 획득. 이는 ModuleList Stream에 필요한 유일한 모듈
  • NtOpenProcess를 사용하여 lsass 프로세스에 대한 핸들 획득
  • NtQueryVirtualMemory 및 NtReadVirtualMemory를 사용하여 메모리 영역을 반복하며 가능한 모든 영역 덤프. 동시에 Memory64List Stream 채움

이 프로그램은 출력 파일에 대한 선택적 인수를 하나 가지며, 기본 파일 이름은 "proc_<PID>.dmp"입니다:

root@kitploit:~
NativeDump.exe [DUMP_FILE]

poc

이 도구는 최신 Windows 버전과 가장 일반적인 보안 솔루션(Microsoft Defender for Endpoints, CrowdStrike 등)에서 테스트되었으며 잘 작동하지만, 은밀성은 선택한 "변형(flavour)"에 따라 달라집니다. 최상의 결과를 위해 비일반적인 언어를 사용하고 바이너리를 커스터마이징하세요! 그러나 PPL이 활성화되어 있거나 PEB 구조를 읽을 수 없는 경우 작동하지 않습니다. 업데이트: 이제 PEB를 읽지 않고도 프로그램을 실행할 수 있습니다. peb-unreadable 브랜치를 확인하세요 :)

이 기술의 장점은 다음과 같습니다:

  • 잘 알려진 dbghelp!MinidumpWriteDump 함수를 사용하지 않음
  • Ntdll.dll의 함수만 사용하므로 라이브러리 재매핑을 통해 API 후킹을 우회할 수 있음
  • Minidump 파일을 디스크에 쓸 필요 없이, 바이트(인코딩 또는 암호화)를 원격 머신으로 전송 가능

다양한 "변형(flavour)"(또는 언어)으로 프로젝트를 확인할 수 있습니다:

  • main - .NET 기본 구현 (이 브랜치)

  • python-flavour - Python 구현, 3가지 ntdll.dll 덮어쓰기 방법 + 원격 머신으로 유출

  • golang-flavour - Golang 구현, 3가지 ntdll.dll 덮어쓰기 방법 + 원격 머신으로 유출

  • c-flavour - C/C++ 구현, 3가지 ntdll.dll 덮어쓰기 방법

  • bof-flavour - BOF 파일, 3가지 ntdll.dll 덮어쓰기 방법

  • rust-flavour - @safedv의 Rust 구현

  • crystal-flavour - Crystal 구현, ntdll.dll 덮어쓰기 기능

  • nim-flavour - Nim 구현, ntdll.dll 덮어쓰기 기능

.NET을 사용하는 기타 흥미로운 브랜치:

  • remote - 원격 머신으로 유출 + 3가지 ntdll.dll 덮어쓰기 방법 + 동적 함수 해결 + 문자열 AES 암호화 + XOR-인코딩 Minidump 내용

  • all-modules - 모든 모듈(lsasrv.dll뿐만 아니라)에 대한 정보 획득

  • peb-unreadable - lsass의 PEB 구조를 읽지 않는 구현 + 3가지 ntdll.dll 덮어쓰기 방법



기술 상세: 최소한의 Minidump 파일 생성

Minidump의 문서화되지 않은 구조를 읽은 후, 그 구조는 다음과 같이 요약됩니다:

  • 헤더: 서명("MDMP"), 스트림 디렉터리 위치 및 스트림 수와 같은 정보
  • 스트림 디렉터리: 각 스트림에 대한 하나의 항목, 각각의 유형, 전체 크기 및 파일 내 위치 포함
  • 스트림: 각 스트림은 프로세스와 관련된 다양한 정보를 포함하며 고유한 형식을 가짐
  • 영역: 읽을 수 있는 각 메모리 영역의 프로세스 실제 바이트

estructure

도움이 될 수 있는 파싱 도구를 만들었습니다: MinidumpParser. Mimikatz/Pypykatz가 Minidump 파일을 파싱하는 데 필요한 헤더, 스트림 디렉터리 및 SystemInfo, ModuleList, Memory64List Stream의 세 가지 스트림만으로 유효한 파일을 생성하는 데 초점을 맞출 것입니다.


A. 헤더

헤더는 C#에서 다음과 같이 정의할 수 있는 32바이트 구조체입니다:

root@kitploit:~
public struct MinidumpHeader
{
    public uint Signature;
    public ushort Version;
    public ushort ImplementationVersion;
    public ushort NumberOfStreams;
    public uint StreamDirectoryRva;
    public uint CheckSum;
    public IntPtr TimeDateStamp;
}

필요한 값은:

  • Signature: 고정값 0x504d44d ("MDMP" 문자열)
  • Version: 고정값 0xa793 (Microsoft 상수 MINIDUMP_VERSION)
  • NumberOfStreams: 고정값 3, 파일에 필요한 세 가지 스트림
  • StreamDirectoryRVA: 고정값 0x20 또는 32바이트, 헤더 크기

B. 스트림 디렉터리

스트림 디렉터리의 각 항목은 12바이트 구조체이므로, 3개의 항목이 있으면 크기는 36바이트입니다. 항목에 대한 C# 구조체 정의는 다음과 같습니다:

root@kitploit:~
public struct MinidumpStreamDirectoryEntry
{
    public uint StreamType;
    public uint Size;
    public uint Location;
}

"StreamType" 필드는 정수 또는 ID로 스트림 유형을 나타냅니다. 가장 관련 있는 것들은 다음과 같습니다:


C. SystemInformation Stream

첫 번째 스트림은 ID 7의 SystemInformation Stream입니다. 크기는 56바이트이며, 스트림 디렉터리 다음인 오프셋 68(0x44)에 위치합니다. C# 정의는 다음과 같습니다:

root@kitploit:~
public struct SystemInformationStream
{
    public ushort ProcessorArchitecture;
    public ushort ProcessorLevel;
    public ushort ProcessorRevision;
    public byte NumberOfProcessors;
    public byte ProductType;
    public uint MajorVersion;
    public uint MinorVersion;
    public uint BuildNumber;
    public uint PlatformId;
    public uint UnknownField1;
    public uint UnknownField2;
    public IntPtr ProcessorFeatures;
    public IntPtr ProcessorFeatures2;
    public uint UnknownField3;
    public ushort UnknownField14;
    public byte UnknownField15;
}

필요한 값은:

  • ProcessorArchitecture: 64비트 Windows 시스템에서는 9, 32비트에서는 0
  • MajorVersion, MinorVersion 및 BuildNumber: 하드코딩하거나 kernel32!GetVersionEx 또는 ntdll!RtlGetVersion을 통해 획득 (후자를 사용)

D. ModuleList Stream

두 번째 스트림은 ID 4의 ModuleList Stream입니다. SystemInformation Stream 다음인 오프셋 124(0x7C)에 위치하며, 파싱이 올바르게 되도록 필요한 유일한 모듈인 "lsasrv.dll" 항목 하나만 포함하므로 크기도 112바이트로 고정됩니다.

이 스트림의 일반적인 구조는 항목 수를 포함하는 4바이트 값과 각 모듈에 대한 108바이트 항목으로 구성됩니다:

root@kitploit:~
public struct ModuleListStream
{
    public uint NumberOfModules;
    public ModuleInfo[] Modules;
}

하나만 있으므로 다음과 같이 단순화됩니다:

root@kitploit:~
public struct ModuleListStream
{
    public uint NumberOfModules;
    public IntPtr BaseAddress;
    public uint Size;
    public uint UnknownField1;
    public uint Timestamp;
    public uint PointerName;
    public IntPtr UnknownField2;
    public IntPtr UnknownField3;
    public IntPtr UnknownField4;
    public IntPtr UnknownField5;
    public IntPtr UnknownField6;
    public IntPtr UnknownField7;
    public IntPtr UnknownField8;
    public IntPtr UnknownField9;
    public IntPtr UnknownField10;
    public IntPtr UnknownField11;
}

필요한 값은:

  • NumberOfStreams: 고정값 1
  • BaseAddress: psapi!GetModuleBaseName 또는 ntdll!NtQueryInformationProcess와 ntdll!NtReadVirtualMemory 조합 사용 (후자를 사용)
  • Size: BaseAddress부터 크기가 4096바이트(0x1000)인 첫 번째 메모리 영역(다른 라이브러리의 .text 섹션)까지의 모든 메모리 영역 크기를 더하여 획득
  • PointerToName: 스트림 자체 다음인 오프셋 236(0xEC)에 위치하는 "C:\Windows\System32\lsasrv.dll" 문자열을 위한 유니코드 문자열 구조체

E. Memory64List Stream

세 번째 스트림은 ID 9의 Memory64List Stream입니다. ModuleList Stream과 유니코드 문자열 다음인 오프셋 298(0x12A)에 위치하며, 크기는 모듈 수에 따라 달라집니다.

root@kitploit:~
public struct Memory64ListStream
{
    public ulong NumberOfEntries;
    public uint MemoryRegionsBaseAddress;
    public Memory64Info[] MemoryInfoEntries;
}

각 모듈 항목은 16바이트 구조체입니다:

root@kitploit:~
public struct Memory64Info
{
    public IntPtr Address;
    public IntPtr Size;
}

필요한 값은:

  • NumberOfEntries: 메모리 영역 반복 후 획득한 메모리 영역 수
  • MemoryRegionsBaseAddress: 모든 16바이트 메모리 항목의 크기를 더한 후 계산된 메모리 영역 바이트의 시작 위치
  • Address 및 Size: 각 유효한 영역을 반복하면서 획득

F. 메모리 영역 반복

lsass.exe 프로세스의 메모리 영역을 반복하기 위한 전제 조건이 있으며, 이는 NTAPI만 사용하여 해결할 수 있습니다:

  1. "SeDebugPrivilege" 권한 획득. 일반적인 Advapi!OpenProcessToken, Advapi!LookupPrivilegeValue 및 Advapi!AdjustTokenPrivilege 대신 ntdll!NtOpenProcessToken, ntdll!NtAdjustPrivilegesToken 및 Luid에 대한 하드코딩된 값 20을 사용합니다(모든 최신 Windows 버전에서 일정함).
  2. 프로세스 ID 획득. 예를 들어, ntdll!NtGetNextProcess를 사용하여 모든 프로세스를 반복하고, ntdll!NtQueryInformationProcess로 PEB 주소를 얻은 후 ntdll!NtReadVirtualMemory를 사용하여 ProcessParameters 내의 ImagePathName 필드를 읽습니다. PoC를 단순화하기 위해 .NET의 Process.GetProcessesByName(<PROCESS_NAME>)을 사용합니다.
  3. 프로세스 핸들 열기. ntdll!OpenProcess를 PROCESS_QUERY_INFORMATION(0x0400) 권한으로 사용하여 프로세스 정보를 검색하고, PROCESS_VM_READ(0x0010)로 메모리 바이트를 읽습니다.

이를 통해 다음 호출로 프로세스 메모리를 순회할 수 있습니다:

  • ntdll!NtQueryVirtualMemory: 각 메모리 영역의 보호 유형, 상태, 기본 주소 및 크기를 포함하는 MEMORY_BASIC_INFORMATION 구조체 반환
    • 메모리 보호가 PAGE_NOACCESS(0x01)가 아니고 메모리 상태가 MEM_COMMIT(0x1000)인 경우, 즉 접근 가능하고 커밋된 경우 기본 주소와 크기가 Memory64List Stream의 항목을 채우고 바이트를 파일에 추가할 수 있음
    • 기본 주소가 lsasrv.dll 기본 주소와 같으면 lsasrv.dll의 메모리 내 크기를 계산하는 데 사용
  • ntdll!NtReadVirtualMemory: 해당 영역의 바이트를 Memory64List Stream 이후 Minidump 파일에 추가

G. Minidump 파일 생성

이전 단계 후 Minidump 파일을 만드는 데 필요한 모든 것을 갖추게 됩니다. 파일을 로컬에 생성하거나 바이트를 원격 머신으로 보낼 수 있으며, 그 전에 바이트를 인코딩하거나 암호화할 수도 있습니다. 이러한 가능성 중 일부는 delegates 브랜치(로컬로 생성된 파일을 XOR로 인코딩 가능)와 remote 브랜치(원격 머신으로 보내기 전에 파일을 XOR로 인코딩 가능)에서 코딩되었습니다.



TrickDump

Minidump 파일 생성을 피하는 대안적인 접근 방식은 TrickDump를 확인하세요: 세 개의 JSON 파일과 ZIP 아카이브를 생성하며, Minidump는 공격자의 머신에서 재구성됩니다. 이는 Minidump 생성 또는 유출을 모니터링하는 보안 솔루션을 회피하는 데 도움이 될 수 있습니다.

도구 다운로드
ID스트림 유형
0x00UnusedStream
0x01ReservedStream0
0x02ReservedStream1
0x03ThreadListStream
0x04ModuleListStream
0x05MemoryListStream
0x06ExceptionStream
0x07SystemInfoStream
0x08ThreadExListStream
0x09Memory64ListStream
0x0ACommentStreamA
0x0BCommentStreamW
0x0CHandleDataStream
0x0DFunctionTableStream
0x0EUnloadedModuleListStream
0x0FMiscInfoStream
0x10MemoryInfoListStream
0x11ThreadInfoListStream
0x12HandleOperationListStream
0x13TokenStream
0x16HandleOperationListStream