Jeśli masz odrobinę szczęścia lub „odpowiednie umiejętności” i potrafisz zdobyć lokalne uprawnienia administracyjne na Twoim komputerze w firmie lub zaliczasz się do grona tych szczęściarzy, którzy pracują na komputerze na koncie z lokalnymi uprawnieniami administratora, to z tego artykułu dowiesz się co zrobić, aby poznać hasło administratora lub innych kont, które logują się do Twojego komputera.

Czy kiedykolwiek zastanawiałeś się, czy administrator wchodzi na Twój komputer w firmie, co na nim robi lub czy ktoś inny loguje się do Twojego kompa? Opisywaliśmy ten przypadek w artykule tutaj wskazywaliśmy jakie informacje można wydobyć z logów Security. Co byłoby gdybyś oprócz informacji, kto loguje się do komputera mógłbyś się dowiedzieć jakie ma hasło? W tym momencie zapala nam się czerwona lampka i mówimy stop! Wkraczamy w strefę bezpieczeństwa i na pewno Twoje zabezpieczenia na komputerze w firmie na to nie pozwolą. Co będzie, jeśli jednak tak się nie stanie? Pokazanie hasła, jak to w ogóle jest możliwe? Odpowiadamy – jest możliwe, z zastosowaniem odpowiednich kroków, bez hakowania, bez keyloggera, a metodę pokażemy poniżej. Opisany przez nas sposób jest też dobry do sprawdzenia bieżących zabezpieczeń jakie posiadacie. Istnieje też zagrożenie, że atakujący będzie mógł wykonać to w Waszej infrastrukturze.

Na Kapitanie Hacku opisywaliśmy wiele metod, za pomocą których cyberprzestępcy mogą zdobyć poświadczenia użytkowników w środowisku Microsoft. Głównie były to skróty haseł (hashe NTLM), czyli zaszyfrowane hasła użytkowników, które można było wykorzystywać do ataków Pass-the-Hash. Jednak poznanie ich i złamanie, wymagałoby zastosowania specjalnych narzędzi (np. Hashcat) i szybkiego sprzętu do ich zdekodowania.
Zanim przejdziemy do pokazania sposobu i scenariusza – najpierw trochę teorii.


Strażnicy bezpieczeństwa w Windows

Za bezpieczeństwo mechanizmu uwierzytelniania użytkowników w systemie Windows odpowiedzialny jest dostawca usługi zabezpieczeń systemu Windows (Windows Security Support Provider) oraz pakiety uwierzytelniania (Authentication Packages), które występują w postaci bibliotek DLL wprowadzanych do procesu LSASS.exe podczas uruchamiania systemu lub dynamicznie za pośrednictwem interfejsu API „AddSecurityPackage”. Celowo nie będziemy wyjaśniać zasady działania SSP oraz AP, ponieważ informacje o nich możesz znaleźć na Wikipedii, czy w Internecie. Nie jest to także temat niniejszego artykułu. To co nas interesuje w tych mechanizmach to metoda, w jaki sposób możemy wpłynąć na proces LSASS.exe, aby można było z niego pobrać hasła użytkowników w formacie tekstowym? Odpowiedź jest prosta – wystarczy załadować bibliotekę do SSP i zarejestrować ją jako legalny pakiet zabezpieczeń systemu Windows AP. Jak to wykonać, pokażemy później.

Pisząc o strażnikach bezpieczeństwa w Windows nie sposób nie wspomnieć o innych zabezpieczeniach takich jak antywirus (Windows Defender) oraz inne oprogramowanie antywirusowe firm trzecich. Nasze testy skupią się jedynie na wbudowanym Defenderze i napisany przez nas kod w C++ pozwoli ominąć jego funkcje detekcji.


Pakiety uwierzytelniania w Windows

Pierwszy krok jaki wykonamy, to sprawdzenie pakietów uwierzytelniania jakie mamy skonfigurowane w systemie Windows. W celu wylistowania pakietów uwierzytelniana w Windows musimy wykonać następująca komendę odpytującą określony wpis w rejestrze systemowym Windows (wymaga uprawnień administratora).

reg query hklm\system\currentcontrolset\control\lsa\ /v “Security Packages”

Wynik powyższej komendy na Windows 10 wygląda następująco:

Jak widać powyżej wartość klucza „Security Packages” jest w naszym przypadku pusta. Wynika to z tego, że nie mamy w naszym systemie skonfigurowanych żadnych dodatkowych modułów albo Microsoft jakoś je ukrył w Windows 10. W niektórych konfiguracjach i wersjach Windows można w nim spotkać następujące wartości:

  • Kerberos
  • msv1_0
  • schannel
  • wdigest
  • tspkg
  • pku2u

Poniżej zamieściliśmy wynik komendy na Windows 7.

Wartości tych pakietów (Security Packages) odpowiadają nazwom poszczególnych bibliotek DLL, których źródła znajdują się w katalogu systemowym „c:\Windows\system32” np. „wdigest.dll”.
Jeśli moglibyśmy stworzyć własną bibliotekę, którą udałoby się dodać w podobny sposób jak te istniejące, wówczas Windows załadowałby ją za nas do pamięci komputera. To idealna szansa na umieszczenie w ten sposób kodu w pamięci komputera, który moglibyśmy wykorzystać do podpięcia się do procesu LSASS.exe. W tym przypadku postanowiliśmy nie odkrywać na nowo koła i wykorzystać gotowe narzędzie MimiKatz autorstwa Benjamina Delpy. Benjamin stworzył nawet pod ten scenariusz specjalną bibliotekę o nazwie „mimilib.dll”. To co musimy z nią zrobić, to przegrać ją do katalogu „C:\Windows\System32” dodać jej nazwę „mimilib” do powyższego klucza w rejestrze i zrestartować komputer. W zamian za to po restarcie będziemy mogli w zewnętrznym pliku tekstowym „kiwissp.log” otrzymywać wszystkie hasła użytkowników, którzy zalogują się do naszego systemu!
Wszystko byłoby pięknie, ale jest tylko jeden problem. W czasie pisania artykułu przegranie biblioteki na zaktualizowanym Windows 10 skutkuje jej zablokowaniem i wykryciem przez większość z programów antywirusowych, w tym Windows Defendera.

Musieliśmy zatem znaleźć sposób jak zmienić jej kod, aby pozostał niewykryty.
W tym celu przerobiliśmy kod „mimilib.dll”. Kawałek kodu przedstawia poniższy listing.

W wyniku działania biblioteki otrzymamy hasła logowania zapisywane w pliku „c:\temp\user-passwors.txt”
Po kompilacji w C++ powyższego kodu do biblioteki „kapitanhack.dll” i testach jej niewykrywalności na Windows Defender, będziemy ją mogli załadować do pamięci komputera.


Scenariusz – załadowanie do pamięci własnej biblioteki DLL

Poniższe eksperymenty z wyciąganiem haseł z procesu LSASS.EXE i omijaniem AV wykonaliśmy na najnowszym Windows 10 1903 v2.

W celu załadowania przygotowanej przez nas biblioteki „kapitanhack.dll” mamy dwie możliwości:

  • Dodanie biblioteki do klucza rejestru „Security Packages” – ta metoda będzie wymagać restartu komputera,
  • Napisanie własnego kodu programu, którym ręcznie załadujemy do pamięci naszą bibliotekę. Ta metoda nie wymaga restartu komputera, lecz działa do momentu jego restartu, bądź wyłączenia.

Po zarejestrowaniu pakietu bezpieczeństwa plik „kapitanhack.dll” zostanie załadowany do pamięci procesu lsass.exe i przechwyci wszystkie hasła logowania, gdy ktoś zaloguje się do systemu lub uwierzytelni w inny sposób, np. używając komendy „runas.exe”.


Sposób 1 – Dodanie biblioteki do klucza rejestru „Security Packages”

W systemie operacyjnym musimy najpierw skopiować nasza bibliotekę do katalogu „c:\Windows\system32”. Możemy to wykonać poleceniem (wymagane uprawnienia administracyjne):

copy kapitanhack.dll c:\windows\system32

Następnie musimy dodać do rejestru wartość klucza (jeśli we wcześniejszym listingu był pusty):

reg add “hklm\system\currentcontrolset\control\lsa\” /v “Security Packages” /d “kapitanhack” /t REG_MULTI_SZ

Jeśli klucz „Security Providers” posiadał jakikolwiek wartości, w celu uniknięcia niestabilności, najlepiej skopiować jego poprzednią wartość i dodać na jej końcu nazwę „kapitanhack”.

reg add “hklm\system\currentcontrolset\control\lsa\” /v “Security Packages” /d “kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0kapitanhack” /t REG_MULTI_SZ

Po restarcie komputera będziemy mogli w pliku „lsass-paswords.txt w katalogu „c:\temp” zobaczyć hasła wszystkich użytkowników, którzy się uwierzytelnią do naszego systemu.


Sposób 2 – Napisanie własnego kodu programu

Istnieje możliwość obejścia powyższego kroku i konieczności restartu komputera. W tym celu nie będziemy dodawać biblioteki to rejestru systemowego, a utworzymy kod, który ją załaduje.
Poniżej przedstawiamy listing kodu umożliwiający dodanie biblioteki do pamięci komputera:

Po powyższego kompilacji kodu uruchamiamy narzędzie Loader.exe (wymagane uprawnienia administratora).
W tym przypadku po uruchomieniu programu „Loader.exe” nie musimy restartować komputera. W narzędziu „Process Hacker” widzimy na poniższym ekranie załadowaną bibliotekę „kapitanhack.dll” we właściwościach procesu Lsass.exe. Widzimy także hasło użytkownika dostępne w pliku „user-passwords.txt”


Demo

Poniżej możesz obejrzeć demo ze scenariusza nr 2.


Jak sobie radzić z problemem?

Udało nam się pokazać scenariusz, w którym możemy wykonać złośliwy kod na zabezpieczonym i zaktualizowanym komputerze z Windows 10 (wydanie 1903 v2) i dzięki temu poznać hasła logujących się użytkowników.
W celu zabezpieczenia się w przyszłości przed tego typu działaniami możemy skorzystać z następujących wskazówek:

  • Warto monitorować zmiany w pakietach bezpieczeństwa (wartość klucza rejestru):
    “hklm\system\ currentcontrolset \control\lsa\”
  • Naszą bibliotekę „kapitanhack.dll”można zaobserwować na liście bibliotek DLL ładowanych przez lsass.exe. W celu wykrycia nowych/innych niestandardowych bibliotek możemy ustalić białą listę podstawowych bibliotek DLL, jakie ładują się do procesu lsass i monitorować go pod kątem wszelkich nowych, podejrzanych bibliotek DLL
  • Wdrożyć SYSMON do monitorowania procesów.
  • Wdrożyć dobrego antywirusa (najlepiej z funkcją EDR).