Sekurak Cyberstarter 2025 już 15 maja! 6 ścieżek, 40+ prelekcji

Jak skutecznie i lokalnie zaszyfrować cały dysk – studium przypadku ransomware MAKOP

12 maja 2025, 13:11 | W biegu | 0 komentarzy

Makop to rodzina ransomware tworzona jako Ransomware as a Service (“RaaS”) szeroko wykorzystywane w kampaniach skierowanych przeciwko przeróżnym organizacjom, w tym z sektora krytycznego. Niedawno miałem okazję przyjrzeć się jednemu z jego nowszych wariantów oraz dokonać dość szczegółowej analizy działania.

Analiza statyczna pliku wykonywalnego

Sama binarka ma niewielki rozmiar, bo zaledwie 42 KB. Przeglądając kod źródłowy od razu można zauważyć, że złośliwe oprogramowanie bazuje w całości na windowsowym API (w tym do szyfrowania plików). Wnioski te potwierdza przejrzenie wartości w Import Address Table. Na podstawie tego, można założyć odgórnie co malware będzie wykonywać i jakich efektów się spodziewać.

Przyglądając się poszczególnym sekcjom widać również, że jedna z nich – ndata wyróżnia się na tle innych wysoką entropią oraz relatywnie dużą wielkością względem pliku sugerując, że malware trzyma tam używane dane w formie zaszyfrowanej.

W samym kodzie źródłowym można także znaleźć jeden z używanych kluczy. Służy on do odszyfrowania danych znajdujących się w wcześniej wspomnianej sekcji. Znajdziemy tam m.in klucz publiczny używany później w procesie szyfrowania plików.

Analiza dynamiczna

Analiza dynamiczna ujawnia flow aplikacji. Widać jak wygląda proces szyfrowania pliku. Za każdym razem generowana jest nowa wartość losowa – Initialisation Vector (IV), a używany klucz pozostaje ten sam.

Sam klucz używany do szyfrowania plików generowany jest na początku działania ransomware. Jest on całkowicie losowy oraz nie polega na żadnych podanych zmiennych – jest po prostu wynikiem funkcji losowej.

Proces szyfrowania

W poprzednich akapitach była mowa o losowym generowaniu klucza szyfrującego oraz wektora IV, a dodatkowo w pliku zaszyty był klucz publiczny.  jaki sposób to się ze sobą łączy? Ransomware w całym procesie używa dwóch algorytmów szyfrowania – AES oraz RSA. W trakcie inicjalizacji złośliwego oprogramowania generowany jest losowy klucz służący do szyfrowania plików algorytmem AES, następnie wygenerowany klucz szyfrowany jest z użyciem algorytmu RSA, gdzie używany jest klucz publiczny cyberprzestępców. Zaszyfrowany klucz AES umieszczany jest w każdym zaszyfrowanym pliku wraz z wygenerowanym IV. Końcowo każdy “zaszyfrowany” plik, zawiera dodatkowe dane, które potrzebne są do jego odszyfrowania. Wykorzystywana logika pozwala na efektywnie szyfrowanie plików, użycie losowego klucza (do szyfrowania pliku) za każdym uruchomieniem. Daje również możliwość skutecznego zaszyfrowania systemu ofiary bez dostępu do sieci oraz prostą możliwość odzyskania klucza użytego do szyfrowania bez podawania klucza prywatnego. Jeśli atakujący otrzyma przykładowy zaszyfrowany plik, jest w stanie wydobyć klucz użyty do zaszyfrowania właściwych plików i zwrócić go ofierze (po okupie). Oczywiście jeśli dla każdej ofiary tworzony jest nowy zestaw kluczy to ta funkcjonalność jest zbędna. Sam proces szyfrowania nie jest bez wad – jeśli ofiara ataku stworzy zrzut pamięci w trakcie procesu szyfrowania to będzie w stanie wydobyć klucz użyty do zaszyfrowania, dzięki czemu może odzyskać swoje pliki. Jeśli sam klucz nie zostanie w żaden sposób przechwycony (np. z zrzutu pamięci) to ofiara nie ma żadnej realnej możliwości na odzyskanie swoich danych. Jedyną możliwością odszyfrowania danych jest znajomość klucza prywatnego RSA cyberprzestępców.

Struktura pliku

Wynikiem szyfrowania przez ransomware jest plik nazwany w formacie [Nazwa-pliku].[Rozszerzenie].[8-Znakowe-ID].[E-Mail].mkp. Jego struktura została przedstawiona w poniższej tabeli:

Rozmiar (byte) Zawartość
Oryginalny zaszyfrowany plik
6Padding – 0xFF
Zaszyfrowane informacje o pliku źródłowych – Nazwa, długość oraz suma kontrolna
4Rozmiar poprzedniej sekcji
16Initialisation Vector użyty dla konkretnego pliku w algorytmie AES
128Zaszyfrowany klucz użyty w algorytmie AES zaszyfrowany kluczem publicznym RSA cyberprzestępców
4Metadane
4Metadane

Finalny plik poza zaszyfrowanym plikiem źródłowym zawiera kilka dodatkowych danych. Pierwszą z nich są zaszyfrowane informacje o pliku źródłowym, które zawierają m.in oryginalną nazwę pliku, jego długość czy sumę kontrolną. Kolejną z nich jest Initialisation Vector (“IV”), który został wygenerowany dla tego pliku oraz użyty podczas szyfrowania algorytmem AES. Ostatnią i najważniejszą informacją jest klucza AES zaszyfrowany kluczem publicznym cyberprzestępców.

Odwrócenie procesu szyfrowania

W celu upewnienia się, że cała analiza oraz jej wnioski są poprawne cały proces szyfrowania został odwrócony. Niestety nie posiadamy klucza prywatnego atakujących, dlatego też użyto własnej pary kluczy RSA. Klucz publiczny w binarce został podmieniony na własny, co dało możliwość sprawdzenia oraz odwrócenia całego procesu. Pierwszym krokiem było stworzenie prostych plików tekstowych na hoście. Następnie włączono ransomware, który zaszyfrował wszystkie pliki. Wcześniej stworzony plik .txt wyglądał następująco:

Jako, że Windows CryptoAPI używa systemu Little-Endian, a OpenSSL Big-Endian to musimy również odwrócić kolejność bajtów. W tym celu użyjemy prostego skryptu w napisanego w Pythonie:

Wyciągamy więc nasz zaszyfrowany klucz AES oraz odwracamy jego kolejność bajtów. Następnie używając biblioteki OpenSSL deszyfrujemy posiadany ciphertext. Wynikiem procesu jest otrzymanie klucza użytego do zaszyfrowania naszych plików w formacie Windowsowego CryptoAPI:

Otrzymany klucz jest w formacie Windowsowego CryptoAPI, więcpierwsze 8 bajtów to dane dotyczące samego klucza na potrzeby CryptoAPI. Pozostałe bajty to nasz właściwy klucz RSA. Kolejnym krokiem jest pobranie IV z zaszyfrowanego pliku. Mając wiedzę o strukturze pliku (opisane akapit wyżej) nie stanowi to większego problemu. Ostatni krok to deszyfracja danych. Posłużymy się więc narzędziem CyberChef, gdzie szybko możemy sprawdzić czy udało się odtworzyć cały proces. Podajemy wszystkie potrzebne dane tj. zaszyfrowany plik źródłowy, klucz oraz IV. Jak widać plik został pomyślnie odszyfrowany:

Wnioski końcowe

Infekcje ransomware na podstawie uruchomienia złośliwego załącznika zdarzają się stosunkowo często. Idealną radą jest by nie uruchamiać plików co do których mamy wątpliwości. Nie żyjemy jednak w idealnym świecie. Jeśli padliśmy ofiarą ransomware to należy:

  • Niezwłocznie odłączyć zainfekowany system od sieci, ale bez wyłączania komputera (traci się wtedy dostęp do zasobów pamięci RAM)
  • Jeśli jesteśmy w stanie wykonać zrzut pamięci to należy go wykonać. Alternatywnie można również przełączyć system w tryb hibernacji. Należy to również uczynić po wykonaniu zrzutu pamięci. Kluczowym elementem jest NIE wyłącznie zasilania, ponieważ pamięć urządzenia może zawierać kluczowe informacje np. klucz użyty do szyfrowania danych oraz pozwoli na dokładną analizę powłamaniową.
  • Zgłosić zaistniały incydent osobom odpowiedzialnym za bezpieczeństwo w firmie. Jeśli atak dotyczył naszego prywatnego sprzętu incydent można również zgłosić do CSIRT NASK pod adresem https://incydent.cert.pl.
  • Nie należy również płacić okupu za odszyfrowanie danych. Zapłacanie okupu nie gwarantuje nigdy odzyskania danych oraz finansuje dalszą aktywność cyberprzestępców.

Lepiej zapobiegać niż leczyć, dlatego warto pamiętać o regularnym wykonywanie kopii zapasowych danych oraz o posiadaniu aktualnego oprogramowania antywirusowego. W środowiskach firmowych warto posiadać systemy SIEM, które mogą ograniczyć czy nawet zapobiec atakowi ransomware.

~Kamil Szczurowski & Robert “ProXy” Kruczek

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz