Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
NativeDump — NTAPI関数のみを使用してMinidumpファイルを手作りすることでlsassをダンプする (MiniDumpWriteDumpを使用せず!!!) | Kitploit
ツール/GitHubGitHub/ricardojoserf/nativedump
メモリフォレンジックポストエクスプロイトレッドチーミング
GitHubricardojoserf/nativedump

NativeDump

NTAPI関数のみを使用してMinidumpファイルを手作りすることでlsassをダンプする (MiniDumpWriteDumpを使用せず!!!)

リポジトリを見るウェブサイト
7451043日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

NativeDump

NativeDump は、NTAPI のみを使用して lsass プロセスをダンプし、Mimikatz や Pypykatz などのツールで解析するために必要なストリーム (SystemInfo、ModuleList、Memory64List ストリーム) のみを含む Minidump ファイルを生成します。

esquema

  • NTOpenProcessToken と NtAdjustPrivilegeToken を使用して "SeDebugPrivilege" 特権を取得
  • RtlGetVersion を使用してオペレーティングシステムのバージョン詳細 (メジャーバージョン、マイナーバージョン、ビルド番号) を取得。これは SystemInfo ストリームに必要
  • NtQueryInformationProcess と NtReadVirtualMemory を使用して lsasrv.dll のアドレスを取得。これは ModuleList ストリームに必要な唯一のモジュール
  • NtOpenProcess を使用して lsass プロセスのハンドルを取得
  • NtQueryVirtualMemory と NtReadVirtualMemory を使用してメモリ領域をループし、可能なすべての領域をダンプ。同時に Memory64List ストリームを構築

プログラムには出力ファイルのオプション引数が 1 つあり、デフォルトのファイル名は "proc_<PID>.dmp" です:

root@kitploit:~
NativeDump.exe [DUMP_FILE]

poc

このツールは最新の Windows バージョンと最も一般的なセキュリティソリューション (Microsoft Defender for Endpoints、CrowdStrike など) でテストされており、問題なく動作しますが、ステルス性は選択する「フレーバー」に依存します。最良の結果を得るには、あまり一般的でない言語を使用し、バイナリをカスタマイズしてください。ただし、PPL が有効な場合や PEB 構造が読み取れない場合 は機能しません。更新: 現在は PEB を読み取らずにプログラムを実行することが可能です。peb-unreadable ブランチ を確認してください :)

この手法の利点は次のとおりです:

  • よく知られた dbghelp!MinidumpWriteDump 関数を使用しない
  • Ntdll.dll の関数のみを使用するため、ライブラリの再マッピングにより API フックを回避可能
  • Minidump ファイルをディスクに書き込む必要がなく、バイト列を (エンコードまたは暗号化して) リモートマシンに転送できる

プロジェクトはさまざまな「フレーバー」(言語) で利用できます:

  • 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 - Rust 実装 (by @safedv)

  • 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 ファイルに必要な、ヘッダー、ストリームディレクトリ、および 3 つのストリーム (SystemInfo、ModuleList、Memory64List) のみを含む有効なファイルの作成に焦点を当てます。


A. ヘッダー

ヘッダーは 32 バイトの構造体で、C# では次のように定義できます:

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、ファイルに必要な 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 ストリーム

最初のストリームは SystemInformation ストリーム (ID 7) です。サイズは 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 ストリーム

2 番目のストリームは ModuleList ストリーム (ID 4) です。SystemInformation ストリームの後のオフセット 124 (0x7C) に配置され、サイズも固定で 112 バイトです。解析を正しく行うために必要な唯一のモジュール "lsasrv.dll" のエントリを 1 つだけ含みます。

このストリームの一般的な構造は、4 バイトのエントリ数と、各モジュールの 108 バイトのエントリです:

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

モジュールが 1 つだけのため、次のように簡略化されます:

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" 文字列の Unicode 文字列構造体

E. Memory64List ストリーム

3 番目のストリームは Memory64List ストリーム (ID 9) です。ModuleList ストリームと Unicode 文字列の後のオフセット 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 ストリームのエントリを構築し、バイトをファイルに追加
    • ベースアドレスが lsasrv.dll のベースアドレスと一致する場合、メモリ内の lsasrv.dll のサイズ計算に使用
  • ntdll!NtReadVirtualMemory: その領域のバイトを Memory64List ストリームの後に Minidump ファイルに追加

G. Minidump ファイルの作成

上記の手順で Minidump ファイルの作成に必要なすべての情報が揃います。ファイルをローカルに作成するか、事前にエンコードや暗号化を施してリモートマシンにバイト列を送信できます。これらの一部の可能性は delegates ブランチ で実装されており、ローカルに作成されたファイルを XOR でエンコードできます。また、remote ブランチ では、リモートマシンに送信する前にファイルを XOR でエンコードできます。



TrickDump

Minidump ファイルを作成しない代替アプローチについては、TrickDump を参照してください。3 つの 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