Obejście BitLocker i wydobycie kluczy z pamięci w Windows 11
Zespół Clapkey ponownie natknął się na ciekawostkę ze świata IT i przetłumaczył dla Was artykuł.
Wstęp
W tym artykule pokażę, jak można obejść szyfrowanie BitLocker w Windows 11 (wersja 24H2) i wydobyć z pamięci klucze szyfrowania woluminu (full volume encryption key, FVEK) za pomocą mojego narzędzia Memory-Dump-UEFI.
Krótkie wprowadzenie
Jeśli napastnik ma fizyczny dostęp do urządzenia, to potencjalnie może uzyskać dostęp, gwałtownie ponownie uruchamiając komputer i wykonując zrzut RAM z instancji Windows, które niedawno działały. Zrzut pamięci można przeanalizować, aby znaleźć poufne informacje, na przykład klucze FVEK. Ta technika nie działa gwarantowanie, ponieważ po wyłączeniu zasilania zawartość RAM szybko degraduje się.
Istnieje wiele technik spowalniania tej degradacji pamięci, na przykład fizyczne chłodzenie RAM lub użycie zewnętrznych źródeł zasilania w celu podtrzymania dostawy energii. Do mojego demo zewarłem styki resetu na płycie głównej urządzenia, co wymusza gwałtowne wyłączenie systemu bez utraty zasilania.
Kolejny potencjalny problem stanowi secure boot - standard bezpieczeństwa, który ogranicza to, co może być wykonywane podczas uruchamiania systemu. Ta ochrona ma własne ograniczenia i była już obchodzona za pomocą shim oraz wielu innych sposobów, które dla naszego demo są nieistotne.
Etap 1: tworzymy rozruchowy nośnik USB
Do tego etapu będziemy potrzebować nośnika USB o pojemności większej niż ilość RAM systemu docelowego. Dla uproszczenia tego etapu napisałem skrypt flashimage.sh.
Skorzystaj z instrukcji dotyczącej tworzenia i stosowania aplikacji rozruchowej.
Etap 2: gwałtowny restart systemu docelowego
Ten etap można zrealizować na wiele różnych sposobów; naszym głównym celem jest zminimalizowanie przedziału czasowego, w którym zasilanie komputera jest całkowicie wyłączone. Z mojego doświadczenia, maksymalny sukces można osiągnąć, ponownie uruchamiając system, gdy Windows wciąż się ładuje, ale nie dotarł jeszcze do ekranu logowania; przynajmniej jest to prawdziwe w przypadku poszukiwania kluczy FVEK.
Etap 3: uruchamiamy się z nośnika USB
Natychmiast wykonujemy uruchomienie Memory-Dump-UEFI z nośnika USB. Znajdziemy się w powłoce UEFI, w której można wykonać app.efi. Więcej o tym, jak to zrobić, można przeczytać w pliku README programu. Ilość potrzebnego czasu zależy od ilości zrzucanego RAM i szybkości nośnika USB. Zalecam na tym etapie odłączenie wszystkich innych urządzeń USB, aby program przypadkowo nie zapisał danych na niewłaściwy nośnik.
Na zrzucie ekranu pokazano, jak powinno wyglądać udane wejście do powłoki. Zrzut pamięci zacznie generować pliki dampu, dopóki nie skończy mu się pamięć. Po zakończeniu można spokojnie wyłączyć komputer w zwykły sposób.
Etap 4: analiza zrzutów
Przygotowanie
Prawdopodobnie aplikacja utworzy wiele zrzutów. Jest to spowodowane ograniczeniem 4 GB na rozmiar pliku, narzucanym przez system plików FAT32. Aby spełnić specyfikację UEFI, konieczne jest użycie tego systemu plików. Dla wygody dodałem do folderu narzędzi program concatDumps, który w porządku chronologicznym łączy wiele zrzutów w jeden. Zrzut będzie się składał z surowych danych, które były w pamięci w momencie jego utworzenia, dlatego dla wygody odczytu zalecam skorzystanie z narzędzia typu xxd. Aby ułatwić wyszukiwanie w zrzutach, napisałem program searchMem, który pozwala wyszukiwać w zrzucie wzorce szesnastkowe. Znajduje on przesunięcia wystąpień takich wzorców szesnastkowych, do których można następnie przejść za pomocą polecenia xxd -s <offset> <zrzut> . (zamienić ukraińskie litery na angielskie)
Pool Tag
Pool tag to 4-znakowe identyfikatory wskazujące, gdzie znajdują się pule pamięci jądra Windows. Pule są przydzielane przez jądro Windows, jest to doskonałe miejsce do poszukiwania poufnych informacji. Istnieje wiele takich pool tag; sporządziłem plik tekstowy pooltag.txt zawierający listę wszystkich pool tag i szczegóły ich przeznaczenia.
Zanim przejdziemy dalej, chciałbym podziękować Microsoftowi za to, że jasno określił, gdzie w pamięci znajdują się klucze kryptograficzne. W Windows 7 do odzyskania klucza wystarczyło znaleźć pool tag FVEc, odpowiadający kryptograficznym alokacjom fvevol.sys. W Windows 8.1 i 10 klucz można znaleźć w puli pamięci oznaczonej Cngb; odpowiada ona modułowi ksecdd.sys. W trakcie badania zrzutu pamięci Windows 11 nie udało mi się znaleźć klucza w żadnym z tych miejsc, ale znalazłem go w dwóch innych.
Odzyskiwanie klucza FVEK
Pierwsze miejsce lokalizacji klucza FVEK znajdowało się za pool tag dFVE, oznaczającym alokację pamięci dumpfve.sys, który należy do filtra awaryjnego zrzutu szyfrowania woluminu dla szyfrowania dysku BitLocker. Ten pool tag jest zaznaczony na niebiesko, a klucz FVEK - na czerwono. Było to najprostsze znalezione przeze mnie miejsce lokalizacji klucza; ponadto poprzedza go wzorzec 0x0480, oznaczający typ używanego szyfrowania (w moim przypadku jest to XTS-AES-128).
Drugie miejsce znajduje się pod pool tag None, odpowiadającym wywołaniom procedury ExAllocatePool. Tym razem pierwsza połowa klucza występuje dwukrotnie, a druga - jednokrotnie.
Dalsze kroki
Ważne jest, aby zaznaczyć, że przed uzyskanym kluczem musi znajdować się oznaczenie zastosowanego algorytmu. Czyli jeśli klucz ma postać b2cbcc06071931b7cc50b59f878789571f4dd815c2008e93c02d5c6cd98c83ef54b, to należy dodać na początek klucza 0x8004 (lub oznaczenie innego algorytmu) w formacie little endian:
0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b
Następnie trzeba zapisać tę wartość szesnastkową do pliku. Można to zrobić tak:
echo «0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b» | xxd -r -p > output.fvek
Zdecydowanie zalecam użycie zestawu narzędzi dislocker do określenia potrzebnego algorytmu/wartości i odblokowania dysku. Jeśli wszystko zrobisz poprawnie, będziesz mógł użyć output.fvek do odblokowania chronionej partycji BitLocker i dostępu do dowolnych danych w woluminie.
Wnioski
Optymalnym rozwiązaniem jest zrozumienie, jak Microsoft zaimplementował BitLocker, wykonując debugowanie na poziomie jądra za pomocą windbg. Jest to dość łatwe do zrobienia za pomocą maszyn wirtualnych lub kabla crossover USB 3.0 A/A. Znalezienie klucza przede wszystkim stało się możliwe dzięki krokowemu wykonywaniu procesu uruchamiania Windows i obserwacji działań BitLocker. Microsoft podejmuje wysiłki w celu usuwania kluczy za pomocą funkcji typu SymCryptSessionDestroy, ale nie udaje mu się zniszczyć wszystkich kluczy, co widać po tym, że są one obecne w stercie.
Odnośniki
https://tribalchicken.net/recovering-bitlocker-keys-on-windows-8-1-and-10/
https://github.com/Aorimn/dislocker
https://github.com/microsoft/SymCrypt
https://github.com/libyal/libbde
https://github.com/zodiacon/PoolMonX/blob/master/res/pooltag.txt
https://techcommunity.microsoft.com/blog/askperf/an-introduction-to-pool-tags/372983
A zabezpieczyć Twój serwer czy komputer stacjonarny możesz, zwracając się do nas poprzez przejście pod odnośnik: https://clapkey.com/contact-us


