Credential Stealery cz.2 – Jak kraść hasła zapisane w przeglądarce Microsoft Edge?

Dzisiejszy wpis będzie kontynuacją poprzedniego, w którym omawiałem działanie Credential Stealerów. Dowiemy się jak malware kradnie hasła z przeglądarki Edge i innych przeglądarek korzystających z DPAPI. Działanie tego typu oprogramowania regularnie obserwujemy podczas analizy działań grup cyebrprzestępczych oraz zaawansowanych grup hakerskich (APT).

Credential Stealer – odczyt haseł z przeglądarki Firefox

W poprzednim wpisie przedstawiłem dosyć ogólną i prostą zasadę działania stealera, który odczytuje dane zapisane w przeglądarkach i wysyła je na serwer Discord za pomocą mechanizmu webhook.

Udało nam się zrealizować ten cel w zakresie przeglądarki Firefox, w której zadanie ograniczało się do uzyskania dostępu do dwóch plików:

  • logins.json – plik, w którym Firefox przechowuje informacje o zapisanych hasłach oraz same hasła w formie zaszyfrowanej
  • key4.db – plik, który przechowuje klucz do szyfrowania haseł w logins.json.

Szczegóły działania tego fragmentu programu znajdują się w poprzednim wpisie.

Jak ukraść dane z przeglądarki Microsoft Edge?

Microsoft Edge (a także przeglądarka Chrome, z którą Edge współdzieli silnik Chromium) wykorzystuje do szyfrowania danych mechanizm DPAPI.

Jak działa DPAPI?

DPAPI (Data Protection API) to specjalny interfejs systemu Windows, który umożliwia ochronę danych poprzez ich szyfrowanie w sposób transparentny dla danego użytkownika, ale niemożliwy (w teorii) do odczytania przez innego użytkownika systemu. Z punktu widzenia programisty – wykorzystanie DPAPI jest banalnie proste i ogranicza się po prostu do wykorzystania gotowych funkcji.

W jaki sposób skorzystać z DPAPI w Powershellu?

Przykład szyfrowania danych za pomocą DPAPI

Jak odszyfrować dane?

Odszyfrowanie danych za pomocą DPAPI

DPAPI jest interfejsem, co oznacza, że może z niego korzystać dowolna aplikacja. DPAPI po prostu dostarcza pewną funkcjonalność. Do czego wykorzystywane jest DPAPI w systemach Windows?

  • Szyfrowanie haseł w przeglądarkach Edge i Chrome
  • Przechowywanie certyfikatów i kluczy prywatnych w magazynach certyfikatów Windows
  • Przechowywanie poświadczeń do Zdalnego Pulpitu (jeżeli wybierzemy opcje zapisania hasła)
  • Szyfrowanie klucza, który szyfruje wiadomości w aplikacji Signal Desktop
  • Tokeny uwierzytelniające do NordVPNa
  • Poświadczenia do Outlooka, Dropboxa, OpenVPNa i wiele wiele innych

Wewnętrzne mechanizmy działania DPAPI są poza zakresem tego wpisu i zdecydowanie zasługują na oddzielny artykuł.

Gdzie Microsoft Edge przechowuje hasła?

Podobnie jak w przypadku Firefoxa, niezbedne dane do odzyskania haseł w Microsoft Edge znajdziemy w dwóch plikach:

  • Local State – przechowuje zaszyfrowany za pomocą DPAPI klucz, który szyfruje hasła
  • Login Data – plik SqlLite (baza danych), która przechowuje informacje o zapisanych hasłach i hasła w formie zaszyfrowanej
Porównanie plików przeglądarki Edge i Firefox

W jaki sposób odczytać hasła z Microsoft Edge?

W celu odczytania haseł z przeglądarki Microsoft Edge przygotowałem plan składający się z trzech kroków:

  1. Uzyskanie dostępu do pliku Local State i wyodrębnienie z niego zaszyfrowanego klucza służącego do szyfrowania haseł
  2. Odszyfrowanie klucza za pomocą DPAPI
  3. Odszyfrowanie haseł z pliku Login Data za pomocą odszyfrowanego klucza
Schemat odzyskania haseł z programu Microsoft Edge

Wyodrębnienie zaszyfrowanego klucza z pliku Local State

Proces wydrębnienia zaszyfrowanego pliku jest bardzo prosty i ogranicza się do sparsowania pliku „Local State” i uzyskania dostępu do „encrypted_key”. Do parsowania dokumentów JSON wykorzystałem bibliotekę „System.Text.Json”.

Wyodrębnienie zaszyfrowanego klucza

Odszyfrowanie zaszyfrowanego klucza za pomocą DPAPI

Wspominałem już, że korzystanie z interfejsu DPAPI dla programisty jest banalnie proste? Do odszyfrowania klucza wystarczy wykorzystanie funkcji „Unprotect”.

Odszyfrowanie klucza za pomocą DPAPI

Odszyfrowanie haseł z bazy danych SqlLite

Hasła w bazie danych SqlLite przechowywane są w tabeli logins. Interesują nas trzy kolumny:

  • origin_url – ta kolumna przechowuje URL dla którego zapisane jest hasło
  • username_value – ta kolumna przechowuje login
  • password_value – ta kolumna przechowuje zaszyfrowane hasło

Hasło szyfrowane jest za pomocą algorytmu AES, z wykorzystaniem trybu GCM. Niestety, .NET Framework nie wspiera natywnie tego trybu. W związku z tym, byłem zmuszony zainstalować bibliotekę BouncyCastle, która udostępnia niezbędne funkcje. Funkcja deszyfrująca przyjmuje dwa argumenty:

  • encryptedBytes – bajty zaszyfrowanego hasła
  • key – bajty klucza

oraz zwraca decryptedBytes, czyli odszyfrowane bajty.

Funkcja deszyfrująca

Mając funkcję deszyfrującą, nie pozostało nic innego jak połączyć się z bazą danych (w pliku), wykonać proste polecenie SQL i odszyfrować hasła.

Funkcja do odszyfrowania haseł

Czy to w ogóle działa?

Po skompilowaniu programu na kanale Discord uzyskałem wiadomość od bota zawierającego odszyfrowane hasło z przeglądarki Microsoft Edge.

Odzyskane hasła z przeglądarki Edge na Discord

Świetnie! Po wielu dniach spędzonych na napisaniu tego programu udało mi się doprowadzić go do działania. Już niedługo zamierzam opublikować kolejny wpis, który rozszerza działanie stealera o inne sekrety, takie jak hasła z innych przeglądarek, hasła zapisane w PuTTy czy w walletach. Stay tuned!

Jak widać, sam proces działania Credential Stealera jest w miarę prosty. Najwięcej trudności sprawiło napisanie funkcji DecryptAesGcm, ponieważ wykorzystałem zewnętrzną bibliotekę zamiast natywnych funkcji .NET Framework. Jeżeli piszecie program w .NET Core – mam dla Was dobrą wiadomość, .NET Core wspiera natywnie szyfrowanie AES GCM, więc nie trzeba korzystać z zewnętrznych zależności.

Uwaga #1

W poprzednim wpisie udało mi się ominąć detekcję Microsoft Defendera oraz ESETa. Na szczęście, programy antywirusowe dość szybko się uczą, ponieważ po dwóch tygodniach ten sam Malware był już prawidłowo flagowany przez te same rozwiązania jako złośliwy. Pokazuje to, że mimo pewnych uwag co do działania Microsoft Defendera, program ten na bieżąco uczy się i aktualizuje swoje bazy sygnatur i zachowań. Brawa dla Defendera!

Uwaga #2

Tekst ma charakter czysto edukacyjny. Przedstawione w nim koncepcje powinny służyć tylko dobrym celom, takim jak testowanie zabezpieczeń w organizacji, działania Red Team, Purple Team, testowania odporności oprogramowania AV/EDR, budowania świadomości zagrożeń. Jako osoba od wielu lat zaangażowana w poprawę bezpieczeństwa cyfrowego nie zgadzam się na wykorzystywanie tej wiedzy w nielegalnych działaniach.

Dodaj komentarz


The reCAPTCHA verification period has expired. Please reload the page.