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 systemu 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 dzięki 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?

Jak odszyfrować dane?

DPAPI jest interfejsem, co oznacza, iż 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 dzięki 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

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:
- Uzyskanie dostępu do pliku Local State i wyodrębnienie z niego zaszyfrowanego klucza służącego do szyfrowania haseł
- Odszyfrowanie klucza dzięki DPAPI
- Odszyfrowanie haseł z pliku Login Data dzięki odszyfrowanego klucza

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”.

Odszyfrowanie zaszyfrowanego klucza dzięki DPAPI
Wspominałem już, iż korzystanie z interfejsu DPAPI dla programisty jest banalnie proste? Do odszyfrowania klucza wystarczy wykorzystanie funkcji „Unprotect”.

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 dzięki 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.

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.

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.

Ś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. o ile 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ść gwałtownie 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, iż 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 systemu 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.