W dzisiejszym artykule opiszemy różne metody pozwalające wykonać zrzut z pamięci procesu lsass.exe, który na końcu posłuży nam do dekodowania listy haseł użytkowników zalogowanych do systemu Windows. Pokażemy także kawałek niewykrywalnego przez zabezpieczenia Microsoft kodu w C++ umożliwiającego wykonanie takiego zrzutu.

O procesie lsass.exe, jego zabezpieczeniu i roli, jaka pełni w systemie Windows pisaliśmy sporo w artykule tutaj. Dzisiaj natomiast opiszemy co może nas czekać, jeśli z jakiś powodów zabezpieczenia zawiodą lub będą wyłączone i będziemy mogli wykonać taki zrzut z pamięci, potocznie zwany dump’em.


Metody wykonania memory dump’a w Windows

Pamięć systemu Windows kryje w sobie wiele ciekawych artefaktów bezpieczeństwa w tym ten najciekawszy – hasła użytkowników. Udowodnił to sam autor narzędzia Mimikatz Benjamin Delpy, który w 2011 roku pokazał sposób ich przechowywania przez Microsoft w pamięci komputera w postaci czystego tekstu, działający już od Windows XP. Jednak od tego momentu wiele się zmieniło zarówno od strony samego narzędzia jak i zabezpieczeń systemowych. Dzisiaj mimikatz’a potrafi wykryć większość z rozwiązań antywirusowych w tym sam Defender wbudowany w Windows, pod warunkiem, że jego kod nie zostanie zaciemniony i odpowiednio zmodyfikowany. W nowszych jego wersjach pojawiły się sposoby obejścia blokad zastosowanych w Windows takich jak Credential Guard czy RunAsPPL w postaci załadowania do pamięci specjalnego sterownika. Wykrywalność malware zależy też od rodzaju użytego oprogramowania do bezpieczeństwa. Zatem stosowanie alternatywnych metod na poznania haseł, różnych od narzędzia Mimikatz z pewnością będzie znacznie ciekawsze, dlatego postanowiliśmy je opisać.
Pierwszym warunkiem jaki musimy spełnić w celu wykonania dump’a procesu jest zdobycie wymaganych uprawnień w systemie. W tym celu musimy pozyskać uprawnienia administratora lokalnego bądź SYSTEM. Sposoby na zdobycie takich uprawnień są różne – opisywaliśmy je w kilku artykułach na Kapitanie, w tym w ostatnim tutaj. Kiedy zdobędziemy uprawnienia możemy spróbować użyć jednej z kilku poniższych metod.


Metoda 1 – wykonanie zrzutu z Task Manager’a

W polu Uruchom wpisujemy „taskmgr.exe”. Przechodzimy do zakładki procesy i prawym przyciskiem myszy klikamy na proces lsass.exe i wybieramy opcję „Create Dump File”.

Wynik:


Metoda 2 – użycie narzędzia ProcDump

Jeśli mamy odrobinę szczęścia i możemy skopiować lub odnaleźć na komputerze legalne narzędzie z paczki sysinternals (może je używać administrator) – ProcDump.exe. W tym celu musimy wykonać następującą komendę do wykonania dump’a procesu lsass.exe

procdump.exe -accepteula -ma lsass.exe c:\temp\lsass.dmp

Wynik:


Metoda 3 – wykorzystanie wbudowanej w Windows biblioteki comsvcs.dll

Załadowanie przez wbudowane w Windows narzędzie „rundll32.exe” i wykonanie natywnej biblioteki comsvcs.dll znajdującej się w katalogu „C:\Windows\system32” umożliwi nam również wykonanie dump’a procesu lsass.exe. Przed jej wywołaniem musimy znać jedynie identyfikator procesu w systemie. Najlepiej pobrać go w PowerShell używając funkcji „Get-Process lsass”, a następnie przekazać do wywołania w rundll32.exe

Poniżej komenda:

rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 656 C:\temp\lsass.dmp full

Wynik:


Metoda 4 – napisane własnego kodu

Jeśli wszystkie z powyższych metod zawiodą, bo są wykrywalne przez zabezpieczenia możemy napisać własny kod w aplikacji. Poniższy kod używa natywnego wywołania funkcji Windows API MiniDumpWriteDump w celu wykonania zrzutu pamięci dla wskazanego procesu (w naszym przypadku jest to lsass.exe). Funkcja ta jest dostępna w bibliotece Windows dbghelp.dll.

Po kompilacji i uruchomieniu narzędzia lsassDump.exe w linii komend powinniśmy otrzymać zrzut.


Analiza pliku *.dmp i poznanie haseł użytkowników

W celu wykonania analizy wykonanego wcześniej pliku zrzutu „lsass.dmp” użyjemy mimikatz’a na niezabezpieczonej stacji. Wystarczy przekopiować plik *.dmp na taki komputer i odpalić na nim następujące komendy

sekurlsa::minidump C:\Temp\lsass.dmp sekurlsa::logonpasswords

Wynik

Oczywiście powyższa procedura dekodowania haseł z pliku *.dmp nie zadziała, jeśli wcześniej na Windows mieliśmy włączonego Windows Defender Credential Guard.


Co jeśli narzędzia security/EDR blokują możliwość wykonania zrzutu?

Może się zdarzyć sytuacja, że zainstalowane w systemie oprogramowanie antywirusowe zainstalowane na komputerze blokuje wywołanie funkcji MiniDumpWriteDump. W zależności od typu konkretnego oprogramowania do bezpieczeństwa użytego na stacji roboczej możemy zastosować starą metodę tzw.Hooking opisaną dokładniej tutaj.

W wielkim skrócie, metodę odpięcia interfejsu API (hooking) można porównać do serwera proxy sieci Web, w której wszystkie wywołania interfejsu API (w tym ich argumenty), które wykonuje aplikacja (np. CreateFile, ReadFile, OpenProcess itp.) są przechwytywane i sprawdzane przez oprogramowanie AV / EDR. Następnie AV/EDR decyduje, czy działanie programu nosi złośliwy zamiar, czy nie.
Sposób, w jaki dostawcy EDR przechwytują w interfejsie użytkownika takie złośliwe wywołania funkcji polega na przejmowaniu/modyfikowaniu definicji funkcji (API) znajdujących się w bibliotekach DLL systemu Windows, takich jak kernel32 / kernelbase i ntdll. Do obejścia EDR przydatna będzie wiedza z zakresu Assemblera.
W tym przypadku musimy zastosować specjalistyczny kod, który obejdzie funkcję wywołania EDR (instrukcję JMP w Assembler), lecz wiedza o tym wykracza poza zakres tego artykułu i postaramy się ją opisać w osobnym.


Jak sobie radzić z problemem?

Przede wszystkim powinniśmy zaimplementować w naszych systemach wszystkie zalecenia Microsoft dotyczące ochrony przechowywania haseł użytkowników w pamięci (WDigest i RunAsPPL). Implementacja Windows Credential Guard pozwoli nam uchronić się przed kradzieżą haseł (w pewnym stopniu), ale niestety jest implementowana w wersjach Enterprise Windows i może być nieosiągalna dla większości firm. Oczywiście powyższe zmiany w systemie wymagają testów i najlepiej je wcześniej sprawdzić, czy nie zakłócą działania w pracy innych aplikacji.

Monitorowanie malware pod kątem zagrożeń w systemie (wstrzykiwania do pamięci sterowników, monitorowanie procesów itp.) wydaje się być na obecny czas najbardziej skuteczną metodą pozwalająca dowiedzieć się o tego typu przypadkach.
W przypadku użycia metody nr 4 warto monitorować użycie w systemie biblioteki dbghelp.dll, ponieważ to w niej znajduje się zaimplementowana w naszym kodzie funkcja MiniDumpWriteDump.
Również monitorowanie systemu plików pod kątem pojawiania się rozszerzeń plików *.dmp. będzie cenna wskazówką, czy w systemie nie zadziałało się coś złego.


Podsumowanie

Wykonanie dump’a procesu lsass.exe w niezabezpieczonym środowisku IT prowadzi do powstania poważnego incydentu bezpieczeństwa. Niezastosowanie się do powyższych porad może narazić organizację lub nasz komputer na duże ryzyko. Metody jakie opisaliśmy powyżej pozwolą sprawdzić, czy ochrona działa i spełnia swoje założenia. Pamiętajcie też, że nie ma 100% metody zabezpieczenia się przed tymi incydentami, ale zawsze jest szansa zarządzenia ryzykiem. Zachęcamy do udostępniania artykułu wśród znajomych i do odwiedzenia naszego profilu na portalach społecznościowych na LinkedIn oraz Facebook.