Na Kapitanie Hack’u dużo piszemy o bezpieczeństwie, zwłaszcza jeśli dotyczy ono haseł użytkowników. Poznanie haseł jest jednym z największych priorytetów cyberprzestępców. W dzisiejszym, nowym artykule kampanii CYBER KILL CHAIN pokażemy inny, nieopisywany jeszcze przez nas sposób na kradzież poświadczeń (haseł) przechowywanych w aplikacjach w systemie operacyjnym Windows przy wykorzystaniu mechanizmu DPAPI (programowalnego interfejsu dla aplikacji w celu ochrony danych).


Krótko o DPAPI

Dla tych, którzy jeszcze nie słyszeli o DPAPI wyjaśniamy, że DPAPI to skrót od „Data Protection API” i został stworzony, w celu pomocy programistom, którzy posiadają małą wiedzę o kryptografii i chcieliby ulepszyć swoje programy w zakresie zabezpieczania danych użytkowników.
DPAPI na Windows szyfruje poświadczenia użytkowników takie, jak hasła do Wi-Fi, VPN, IE, Chrome, RDP itp. Jest przezroczysty dla użytkowników końcowych – programy (takie jak np. Chrome używają dwóch interfejsów API) z kluczem głównym użytkownika, który jest oparty na faktycznym haśle logowania. Skoro DPAPI jest ściśle powiązane z hasłem użytkownika, stanowi ciekawy kąsek dla researcherów bezpieczeństwa oraz cyberprzestępców, którzy coraz częściej pogłębiają swoją wiedzę na temat jego architektury i implementują narzędzia pozwalające wyłuskać z aplikacji hasła.
W Internecie możemy znaleźć kilka ciekawych opisów przypadków wyciągania haseł użytkowników z aplikacji takich jak KeePass, RDP, czy przeglądarki Chrome. Nie będziemy dzisiaj ich wszystkich opisywać, lecz uświadomić, że jeśli przechowujecie w tych aplikacjach zapamiętane hasła, to istnieje sposób na ich wyciągnięcie! W tym artykule pokażemy, jak przy użyciu DPAPI przechwycić i rozszyfrować hasło użytkownika używając do tego dwóch narzędzi: wbudowanego w Windows języka skryptowego PowerShell oraz „scyzoryka szwajcarskiego” do przechwytywania poświadczeń na Windows – Mimikatz.


Ach ten PowerShell…

Jeśli jeszcze nie zablokowałeś PowerShell’a na stacjach roboczych w swojej firmie (bądź na własnym komputerze) lub go nie monitorujesz, to radzimy zrobić to jak najszybciej (oczywiście z rozwagą), bo jak się poniżej przekonasz za jego pomocą cyberprzestępcy mogą zdobić dużo złego. Skrypty PowerShell są wykorzystywane prawie w 90% przypadkach infekcji malwarem komputerów poprzez mechanizmy takie jak phishing oraz w innych atakach na użytkowników w firmie wykonywanych od środka. Dlaczego? Odpowiedź jest prosta- jest wbudowany w system operacyjny i bardzo dużo można za jego pomocą „zmajstrować”. Lecz jak się okazuje wyłączenie PowerShell’a nie zawsze wyleczy nas z zagrożeń podobnie jak posiadanie na komputerze tylko antywirusa bez innych, specjalistycznych rozwiązań do bezpieczeństwa. Mogliśmy się o tym przekonać w naszym artykule tutaj. W naszym opisywanym przypadku użyjemy również PowerShell’a, ponieważ dzięki niemu będziemy mogli oszukać użytkownika i poprosić go o podanie poświadczeń w specjalnie wywołanym oknie.


Przejęcie z DPAPI zaszyfrowanych poświadczeń użytkownika i rozszyfrowanie z nich hasła

Poniżej przedstawiamy sposób, jak za pomocą jednej linijki kodu PowerShell będzie można przejąć wprowadzane w oknie dialogowym Windows poświadczenia użytkownika, wyeksportować je do pliku XML, a następnie zdekodować używając narzędzia Mimikatz.


Krok.1. Wykonanie kodu PowerShell i zapisanie poświadczeń do pliku.

W pierwszym kroku będziemy chcieli zachęcić użytkownika do podania loginu i hasła. Wykonać to możemy odpalając na komputerze poniższą linijkę kodu w PowerShell, która spowoduje pojawienie się specjalnego okna dialogowego na pulpicie Windows, a użytkownik będzie musiał w nim wpisać swoje do poświadczenia. Możemy do tego celu użyć polecenia PowerShell „Get-Credential”, lecz oferuje ono ograniczone możliwości personalizowania okna poświadczeń w kontekście prezentowanej na nim wiadomości i tytułu.

W takiej sytuacji lepiej nie wzbudzać podejrzeń i zmienić komunikat oraz tytuł okna na jakiś bardziej sensowny do sytuacji 🙂 Zagwarantuje to nam większą skuteczność w zdobyciu zaufania użytkownika. W naszym przykładzie użyliśmy następującego kodu, który modyfikuje oba teksty okna:

Aby jeszcze bardziej nie rzucać się w oczy powyższy kod możemy wywołać w trybie cichym (w tle) z wiersza linii poleceń używając specjalnego przełącznika „-WindowsStyle hidden”. Dzięki temu użytkownik nie zorientuje się, że wykonywana jest jakakolwiek komenda.
W tym celu odpalamy wiersz poleceń (cmd.exe) i wklejamy poniższą linijkę.

powershell.exe -w h -c “$Credential = $host.ui.PromptForCredential(‘Kontrola konta użytkownika.’, ‘Podaj proszę login i hasło w celu weryfikacji Twojej osoby.’, ”, ‘Domena’) | Export-Clixml -Path ‘c:\temp\credentials.xml'”

Wynik wykonania powyższej linii kodu pokazaliśmy na ekranie poniżej.

Oprócz tego, że skrypt uruchomia na pulpicie okno do wprowadzenia poświadczeń, to czeka na ich prowadzenie przez użytkownika i na końcu zapisuje je w pliku credentials.XML pod wskazaną lokalizacją na dysku (w naszym przypadku w katalogu c:\temp). Zapisany plik wygląda następująco:

W tym momencie w pliku mamy zapisane poświadczenia użytkownika w sekcji . Widzimy w niej login i zakodowane hasło użytkownika, które będziemy mogli poznać w następnym kroku, dekodując je w narzędziu Mimikatz.

Pamiętajmy, że powyższy kod PowerShell może być wykorzystany w innym skrypcie PowerShell lub w makro w Excelu. Możliwości mamy naprawdę dużo! Dlatego uważajmy, gdzie wpisujemy nasze hasło!


Krok 2. Dekodowanie hasła z pliku przy użyciu Mimikatz.

W drugim kroku zajmiemy się dekodowaniem hasła zapisanego w powyższym pliku Credentials.XML. Dekodowanie możemy wykonać na tym samym komputerze lub kopiując plik „.XML” z zapisanymi poświadczeniami użytkownika na inny komputer w sieci. W celu zdekodowania hasła na innym komputerze potrzebny nam będzie klucz master z kontrolera domeny oraz klucz prywatny użytkownika znajdujących się w jego profilu na komputerze w katalogu „C:\Users\\AppData\Roaming\Microsoft\Protect”.

Najpierw zajmijmy się pierwszym przypadkiem – zdekodowaniem hasła na tym samym komputerze.

W celu zdekodowanie hasła na tym samym komputerze musimy uruchomić narzędzie Mimikatz i wpisać w nim następujące polecenie wskazując ścieżkę do naszego pliku XML:

Dpapi::ps /in:c:\sciezka_do_pliku_xml /unprotect

Powyżej widzimy zdekodowane hasło użytkownika kapitan! Ciekawe jest to, że do zdekodowania hasła nie musimy posiadać uprawnień administratora!

Jeśli chcielibyśmy zdekodować hasło kopiując plik na inny komputer musielibyśmy dodatkowo skopiować z profilu użytkownika pliki znajdujące się w katalogu Protect, a konkretniej masterkey – klucz główny użytkownika oraz skraść klucz zapasowy DPAPI z kontrolera domeny tzw. backupkey. Jako, że kopiowanie pierwszego klucza na inny komputer nie powinno stanowić problemu, to już uzyskanie backupkey nie będzie takie proste, ponieważ musielibyśmy użyć technik opisanych w naszej kampanii CYBER KILL CHAIN – w celu zdobycia poświadczeń admina. Wyodrębnienie kluczy zapasowych DPAPI (backupkey) z kontrolera domeny pozwoli nam odszyfrować klucz główny dowolnego użytkownika, co z kolei pozwoli nam odszyfrować zaszyfrowane hasła użytkowników.

W dużym skrócie, jeśli zdobędziemy poświadczenia admina domeny i będziemy mogli wykonać poniższe polecenie w mimikatz na kontrolerze domeny – zdobędziemy masterkey.

lsadump::backupkeys /system:nazwa_fqdn_kontolera_domeny /export

Kiedy już mamy backupkey i go skopiowaliśmy możemy wykonać dekodowanie hasła na innym komputerze:

dpapi::masterkey /in:”C:\temp\nazwa_klucza_prywatnego_użytkownika” /pvk: nazwa_klucza_prywatnego_z_kontrolera_domeny.pvk

A następnie ponownie wykonać komendę w celu podejrzenia hasła dpapi::ps /in:”c:\temp\credentials.xml” /unprotect

Również i w tym przypadku udało nam się poznać hasło.


Jak sobie radzić z problemem?

Od strony infrastruktury IT w firmie oraz komputera lokalnego powinniśmy się zabezpieczyć przed tego typu atakiem stosując poniższe porady:

  1. Zaktualizować antywirusa o aktualne szczepionki – na pewno wykryje Mimikatza, choć są sposoby na obejście, o których pisaliśmy tutaj.
  2. Zastosować system EDR lub monitorować logi SYSMON’a oraz PowerShell’a.
  3. Wyłączyć na komputerach w rejestrze możliwość uruchamiania dodatkowego okna z poświadczeniami. Można to wykonać poniższym poleceniem PowerShell.
    Set-ItemProperty “HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds” -Name ConsolePrompting -Value $true
    Polecenie tworzy wpis do rejestru ConsolePrompting i ustawia jego wartość na True. Aby uruchomić to polecenie, uruchom PowerShell z opcją „Uruchom jako administrator”. Polecenie wymusza na użytkowniku podawanie loginu i hasła w wierszu linii komend.
    W celu możliwości użycia z powrotem okna dialogowego należy ustawić wartość klucza ConsolePrompting na false ($false) lub użyć polecenia cmdlet Remove-ItemProperty, aby go usunąć.
  4. Dodać do monitorowania wywołanie w PowerShell funkcji: Get-Credentials, Export-clixml oraz PromptForCredential
  5. Najlepiej zablokować używanie PowerShell na stacjach klienckich.
  6. Chronić kontrolery Domeny Active Directory przed kradzieżą masterkey.
  7. Wydzielić komputery w sieci do zarządzania i łączenia się do kontrolerów domeny na poświadczeniach administracyjnych.

Podsumowanie

Jak widać na podstawie powyższego przykładu Microsoft’owe DPAPI nie gwarantuje nam należytego bezpieczeństwa. Dlatego powinniśmy uważać, gdzie wpisujemy oraz zapamiętujemy nasze hasło, ponieważ może być ono przechwycone przez cyberprzestępcę. Wszelkie nagle wyskakujące okienka dialogowe proszące o potwierdzenie loginu i hasła z pewnością powinny wzbudzać nasze podejrzenia i lepiej nie wprowadzać do nich jakichkolwiek haseł – chyba, że złych w celu zmylenia cyberprzestępcy i poznania co się wydarzy dalej. Pamiętajmy też, że przechowywanie haseł w aplikacjach wykorzystujących mechanizm zabezpieczania DPAPI (np. RDP, KeePass i inne) nie gwarantuje nam należytego bezpieczeństwa, dlatego powinniśmy za każdym razem sprawdzać aplikacje, które wymagają od nas wprowadzania poświadczeń i zapamiętywania ich. Warto sprawdzić, czy architektura takiej aplikacji jest odpowiednio zabezpieczona lub poprawiona pod względem ewentualnie wykrytej podatności. Cyberprzestępcy zrobią wszystko, aby móc zdekodować hasło, jeśli je tylko w jakiś sposób zdobędą. O bezpieczeństwie haseł pisaliśmy tutaj oraz o sposobie ich łamania tutaj.