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

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

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

解析ツール MinidumpParser を作成しました。ここでは、Mimikatz/Pypykatz で解析可能な Minidump ファイルに必要な、ヘッダー、ストリームディレクトリ、および 3 つのストリーム (SystemInfo、ModuleList、Memory64List) のみを含む有効なファイルの作成に焦点を当てます。
ヘッダーは 32 バイトの構造体で、C# では次のように定義できます:
public struct MinidumpHeader
{
public uint Signature;
public ushort Version;
public ushort ImplementationVersion;
public ushort NumberOfStreams;
public uint StreamDirectoryRva;
public uint CheckSum;
public IntPtr TimeDateStamp;
}
必要な値:
ストリームディレクトリの各エントリは 12 バイトの構造体で、3 エントリあるためサイズは 36 バイトです。C# のエントリ定義は:
public struct MinidumpStreamDirectoryEntry
{
public uint StreamType;
public uint Size;
public uint Location;
}
"StreamType" フィールドはストリームタイプを整数 (ID) で表します。代表的なものは次のとおりです:
最初のストリームは SystemInformation ストリーム (ID 7) です。サイズは 56 バイトで、オフセット 68 (0x44) (ストリームディレクトリの後) に配置されます。C# 定義:
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;
}
必要な値:
2 番目のストリームは ModuleList ストリーム (ID 4) です。SystemInformation ストリームの後のオフセット 124 (0x7C) に配置され、サイズも固定で 112 バイトです。解析を正しく行うために必要な唯一のモジュール "lsasrv.dll" のエントリを 1 つだけ含みます。
このストリームの一般的な構造は、4 バイトのエントリ数と、各モジュールの 108 バイトのエントリです:
public struct ModuleListStream
{
public uint NumberOfModules;
public ModuleInfo[] Modules;
}
モジュールが 1 つだけのため、次のように簡略化されます:
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;
}
必要な値:
3 番目のストリームは Memory64List ストリーム (ID 9) です。ModuleList ストリームと Unicode 文字列の後のオフセット 298 (0x12A) に配置され、サイズはモジュール数に依存します。
public struct Memory64ListStream
{
public ulong NumberOfEntries;
public uint MemoryRegionsBaseAddress;
public Memory64Info[] MemoryInfoEntries;
}
各モジュールエントリは 16 バイトの構造体です:
public struct Memory64Info
{
public IntPtr Address;
public IntPtr Size;
}
必要な値:
lsass.exe プロセスのメモリ領域をループするには前提条件があり、NTAPI のみで解決できます:
これにより、次の関数を呼び出してプロセスメモリを走査できます:
上記の手順で Minidump ファイルの作成に必要なすべての情報が揃います。ファイルをローカルに作成するか、事前にエンコードや暗号化を施してリモートマシンにバイト列を送信できます。これらの一部の可能性は delegates ブランチ で実装されており、ローカルに作成されたファイルを XOR でエンコードできます。また、remote ブランチ では、リモートマシンに送信する前にファイルを XOR でエンコードできます。
Minidump ファイルを作成しない代替アプローチについては、TrickDump を参照してください。3 つの JSON ファイルと ZIP アーカイブを生成し、Minidump は攻撃者のマシン上で再構築されます。これにより、Minidump の作成や流出を監視するセキュリティソリューションを回避するのに役立ちます。
| ID | ストリームタイプ |
|---|
| 0x00 | UnusedStream |
| 0x01 | ReservedStream0 |
| 0x02 | ReservedStream1 |
| 0x03 | ThreadListStream |
| 0x04 | ModuleListStream |
| 0x05 | MemoryListStream |
| 0x06 | ExceptionStream |
| 0x07 | SystemInfoStream |
| 0x08 | ThreadExListStream |
| 0x09 | Memory64ListStream |
| 0x0A | CommentStreamA |
| 0x0B | CommentStreamW |
| 0x0C | HandleDataStream |
| 0x0D | FunctionTableStream |
| 0x0E | UnloadedModuleListStream |
| 0x0F | MiscInfoStream |
| 0x10 | MemoryInfoListStream |
| 0x11 | ThreadInfoListStream |
| 0x12 | HandleOperationListStream |
| 0x13 | TokenStream |
| 0x16 | HandleOperationListStream |