HTB Sherlock - Lockpick2.0 Writeup

HTB Sherlock - Lockpick2.0 Writeup

Scenariusz Zadania

Zostaliśmy ponownie zaatakowani przez oprogramowanie ransomware, ale tym razem sprawca wydaje się być bardziej zaawansowany. Ponownie udało im się zaszyfrować dużą liczbę naszych plików. Zgodnie z naszą polityką, NIE negocjujemy z przestępcami. Proszę odzyskać pliki, które zostały zaszyfrowane - nie mamy innej opcji! Niestety, nasz dyrektor generalny jest na urlopie i nie można się z nim skontaktować.

Ostrzeżenie: To ostrzeżenie, że Sherlock zawiera oprogramowanie, które będzie wchodzić w interakcje z Twoim komputerem i plikami. To oprogramowanie zostało celowo dołączone w celach edukacyjnych i NIE jest przeznaczone do uruchamiania ani innego wykorzystania. Zawsze obsługuj takie pliki w izolowanych, kontrolowanych i bezpiecznych środowiskach. Po rozpakowaniu archiwum Sherlock.zip znajdziesz plik DANGER.txt. Proszę go przeczytać, aby kontynuować.

(ang. We’ve been hit by Ransomware again, but this time the threat actor seems to have upped their skillset. Once again a they’ve managed to encrypt a large set of our files. It is our policy NOT to negotiate with criminals. Please recover the files they have encrypted - we have no other option! Unfortunately our CEO is on a no-tech retreat so can’t be reached.

Warning This is a warning that this Sherlock includes software that is going to interact with your computer and files. This software has been intentionally included for educational purposes and is NOT intended to be executed or used otherwise. Always handle such files in isolated, controlled, and secure environments. Once the Sherlock zip has been unzipped, you will find a DANGER.txt file. Please read this to proceed.)

Artefakty

Do rozwiązania zadania otrzymujemy następujące pliki (Rys 1):

  • DANGER.txt - zawiera ostrzeżenie oraz hasło do rozpakowania archiwum malware.zip,
  • share - katalog z plikami zaszyfrowanymi przez ransomware oraz notatkę zostawioną przez atakujących,
  • malware.zip - malware, które mamy przenalizować w celu rozwiązania zadania.

Rys. 1. Pobrane artefakty.
Rys. 1. Pobrane artefakty.

W katalogu share znajdują się trzy pliki. Plik countdown.txt zawiera informacje pozostawione przez atakującego, w tym notatkę dotyczącą okupu. Znajduje się tam adres portfela Bitcoin oraz wysokość kwoty, którą należy zapłacić za odszyfrowanie plików. Pozostałe dwa pliki z rozszerzeniem .24bes są zaszyfrowane przez złośliwe oprogramowanie i będą musiały zostać odszyfrowane w dalszej części zadania (Rys. 2).

Rys. 2. Zawartość katalogu <code>share</code>.
Rys. 2. Zawartość katalogu share.

Po rozpakowaniu katalogu malware.zip otrzymujemy plik update. Po sprawdzeniu poleceniem file okazuje się, że jest to plik ELF, czyli plik wykonywalny dla systemów Linux (Rys. 3).
Rys. 3. Zawartość katalogu <code>malware.zip</code> oraz typ pliku.
Rys. 3. Zawartość katalogu malware.zip oraz typ pliku.
Pierwszym krokiem, który wykonałem w celu analizy malware, było sprawdzenie, co podpowie mi VirusTotal. Niestety, nie znalazłem w nim za wielu informacji poza tym, że jest to złośliwe oprogramowanie. Jednak moją uwagę zwróciło to, że VirusTotal wskazał, iż oprogramowanie jest spakowane za pomocą UPX (Rys. 4).
Rys. 4. Analiza oprogramowania za pomocą Virustotal.
Rys. 4. Analiza oprogramowania za pomocą Virustotal.
Dla pewności użyłem polecenia strings, aby sprawdzić, jakie łańcuchy znaków znajdują się w pliku. Uzyskałem jednoznaczne potwierdzenie, że plik został spakowany za pomocą UPX (Rys. 5). Tym samym otrzymałem odpowiedź na pytanie 8 ale też rozpocząłem poszukiwania dotyczące sposobów na jego rozpakowanie.
Rys. 5. Wynik polecenia strings dla pliku <code>update</code>.
Rys. 5. Wynik polecenia strings dla pliku update.
Okazało się, że plik można rozpakować tym samym narzędziem, którym został spakowany. Z repozytorium pobrałem upx, a następnie za pomocą polecenia ./upx -d ../update rozpakowałem plik. Po sprawdzeniu typu pliku za pomocą polecenia file, okazało się, że plik nie jest stripped, co oznacza, że wszystkie informacje debugowe są dostępne w binarce. Dzięki temu analiza pliku będzie prostsza (Rys 6).
Rys. 6. Wypakowanie pliku za pomocą narzędzia <code>upx</code>.
Rys. 6. Wypakowanie pliku za pomocą narzędzia upx.

Od tego momentu mogłem uruchomić dekompilator IDA i przejść do dalszej analizy.

Pierwszym pytaniem na liście było ustalenie, jaki rodzaj szyfrowania jest wykorzystywany przez złośliwe oprogramowanie. Po załadowaniu pliku do IDA skupiłem się na znalezieniu odpowiedzi na to pytanie. Dzięki temu, że oprogramowanie nie było stripped, mogłem łatwo przeglądać funkcje napisane przez atakującego. Podczas analizy zauważyłem funkcję encrypt_file, a po uzyskaniu pseudokodu w linii 23 natrafiłem na wywołanie funkcji EVP_aes_256_cbc. Oznacza to, że oprogramowanie szyfruje pliki za pomocą symetrycznego szyfru blokowego (AES 256 w trybie CBC). Po odnalezieniu klucza używanego przez atakującego do szyfrowania, będzie można bez problemu odszyfrować pliki (Rys. 7).

Rys. 7. Rodzaj szyfrowania stosowanego przez złośliwe oprogramowanie.
Rys. 7. Rodzaj szyfrowania stosowanego przez złośliwe oprogramowanie.

Trzeba było tylko znaleźć klucz. Aby dowiedzieć się, skąd atakujący go pozyskuje, wróciłem do funkcji main. Tam w linii 16 zauważyłem funkcję get_key_from_url (Rys. 8).

Rys. 8. Funkcja pobierająca klucz z zewnętrznego zasobu.
Rys. 8. Funkcja pobierająca klucz z zewnętrznego zasobu.
Podczas analizy tej funkcji odkryłem, że zanim ustawiony zostanie adres, z którego ma zostać pobrany klucz (linia 22), najpierw wykonywana jest operacja XOR (linia 20) (Rys. 9).
Rys. 9. Analiza funkcji pobierającej klucz z zewnętrznego zasobu.
Rys. 9. Analiza funkcji pobierającej klucz z zewnętrznego zasobu.
Stwierdziłem, że szybciej będzie pozyskać klucz za pomocą analizy dynamicznej (tak, wiem, że XOR jest bardzo prosty, ale nie jestem zbyt biegły w korzystaniu z narzędzia IDA). Dlatego uruchomiłem update za pomocą gdb-peda. Następnie ustawiłem breakpoint na wywołanie funkcji curl_easy_setopt (b curl_easy_setopt), która według mojej analizy jest wywoływana jako pierwsza po uruchomieniu programu i wykonaniu operacji XOR. Po wykonaniu polecenia run od razu uzyskałem adres, z którego pobierany jest klucz do szyfrowania plików (Rys. 10).
Rys. 10. Analiza funkcji pobierającej klucz z zewnętrznego zasobu za pomocą gdb-peda.
Rys. 10. Analiza funkcji pobierającej klucz z zewnętrznego zasobu za pomocą gdb-peda.
Plik pobrany z tego adresu miał nazwę updater, co pozwoliło mi odpowiedzieć na zadanie nr 4, a po wykonaniu polecenia md5 updater uzyskałem odpowiedź na zadanie nr 5 (Rys. 11). W tym momencie myślałem, że mam już prawie wszystko. Pozostało tylko zdobyć iv.
Rys. 11. Pozyskany klucz oraz jego skrót md5.
Rys. 11. Pozyskany klucz oraz jego skrót md5
Klucz użyty do szyfrowania był w formacie binarnym, dlatego zakodowałem go do postaci Base64 za pomocą polecenia cat updater | base64. Następnie przygotowałem konfigurację w CyberChef w celu odszyfrowania plików. Po skonfigurowaniu CyberChef zauważyłem, że zgłasza on błąd dotyczący długości klucza. Klucz, który otrzymałem na początku, miał długość 48 bajtów, podczas gdy, zgodnie z wcześniejszymi informacjami, szyfrowanie wykorzystuje AES-256, co oznacza, że klucz powinien mieć długość 32 bajtów (Rys. 12).
Rys. 12. Nieprawidłowa długość klucza zgłaszana przez Cyberchef.
Rys. 12. Nieprawidłowa długość klucza zgłaszana przez Cyberchef.
Ponownie przeanalizowałem funkcję get_key_from_url i zauważyłem, że klucz kopiowany jest do parametru wyjściowego za pomocą funkcji memcpy, której długość jest ustawiona w hex na 0x20, co odpowiada 32 bajtom. Oznacza to, że funkcja memcpy kopiuje tylko początkowe 32 bajty klucza (Rys. 13).
Rys. 13. Długość klucza kopiowana za pomocą polecenia <code>memcpy</code>.
Rys. 13. Długość klucza kopiowana za pomocą polecenia memcpy.
Wróciłem do CyberChef i usunąłem niepotrzebne bajty, aby uzyskać klucz o oczekiwanej długości. W teorii miałem już prawidłowy klucz. Wybrałem pierwszy plik, który chciałem odszyfrować, zamieniłem jego postać na Base64, a następnie wkleiłem do CyberChef. Pozostało mi tylko pozyskać IV. IV w AES jest wartością opcjonalną, dlatego zanim wróciłem do kodu, aby go znaleźć, ustawiłem wartość IV na same zera. Okazało się, że jest to oczekiwana wartość IV i udało mi się odszyfrować plik. W ten sposób miałem już mechanizm umożliwiający odszyfrowanie pozostałych plików (Rys. 14).
Rys. 14. Prawidłowo zdeszyfrowany plik.
Rys. 14. Prawidłowo zdeszyfrowany plik.

W tym momencie miałem już wszystkie potrzebne informacje i mogłem przystąpić do odpowiadania na pytania.

Rozwiązanie

Zadanie 1

Jakiego rodzaju szyfrowania użyto do zaszyfrowania dostarczonych plików?

(ang. What type of encryption has been utilised to encrypt the files provided?)

Odpowiedź na to pytanie znalazłem podczas wstępnej analizy pliku. W funkcji encrypt_file, w linii 22 (Rys. 15).

Rys. 15. Rodzaj szyfrowania stosowanego przez złośliwe oprogramowanie.
Rys. 15. Rodzaj szyfrowania stosowanego przez złośliwe oprogramowanie.

Odpowiedź: AES

Zadanie 2

Na jaki rynek nasz dyrektor generalny planuje ekspansję? (Proszę odpowiedzieć sformułowaniem użytym w PDF)

(ang. Which market is our CEO planning on expanding into? (Please answer with the wording utilised in the PDF))

Po zdekodowaniu plików za pomocą opisanej powyżej metody, najpierw spróbowałem otworzyć zdeszyfrowany plik za pomocą domyślnej przeglądarki PDF dostępnej w systemie. Ku mojemu zdziwieniu otrzymałem komunikat o błędzie (Rys. 16).

Rys. 16. Błąd podczas próby otwarcia zdeszyfrowanego pliku pdf za pomocą domyślnej przeglądarki pdf.
Rys. 16. Błąd podczas próby otwarcia zdeszyfrowanego pliku pdf za pomocą domyślnej przeglądarki pdf.
Deszyfrowanie przebiegło pomyślnie, a po sprawdzeniu nagłówka pliku wszystko wyglądało w porządku. Dlatego postanowiłem spróbować otworzyć plik za pomocą innego narzędzia. Wybór padł na przeglądarkę Firefox, która poprawnie wyświetliła plik i umożliwiła mi uzyskanie odpowiedzi na pytanie (Rys. 17).
Rys. 17. Podgląd pliku za pomocą Firefox.
Rys. 17. Podgląd pliku za pomocą Firefox.

Odpowiedź: Australian Market

Zadanie 3

Proszę potwierdzić nazwę banku, który nasz dyrektor generalny chciałby przejąć?

(ang. Please confirm the name of the bank our CEO would like to takeover?)

Po zdeszyfrowaniu pliku DOCX, otworzył się on bez żadnych problemów. Już w pierwszych liniach listu odnalazłem odpowiedź na pytanie (Rys. 18).

Rys. 18. Nazwa banku z pliku docx.
Rys. 18. Nazwa banku z pliku docx.

Odpowiedź: Notionwide

Zadanie 4

Jaka jest nazwa pliku z kluczem użytym przez napastnika?

(ang. What is the file name of the key utlised by the attacker?)

Odpowiedź na pytanie uzyskałem podczas analizy złośliwego oprogramowania (Rys. 19).

Rys. 19. Pozyskany klucz oraz jego skrót md5.
Rys. 19. Pozyskany klucz oraz jego skrót md5

Odpowiedź: updater

Zadanie 5

Jaki jest skrót pliku klucza używanego przez napastnika?

(ang. What is the file hash of the key utilised by the attacker?)

Odpowiedź na pytanie uzyskałem podczas analizy złośliwego oprogramowania (Rys. 19).

Odpowiedź: 950efb05238d9893366a816e6609500f

Zadanie 6

Jaki jest adres portfela BTC, na który TA prosi o dokonanie płatności?

(ang. What is the BTC wallet address the TA is asking for payment to?)

W katalogu share, oprócz zaszyfrowanych plików, znajduje się plik countdown.txt, który jest notatką pozostawioną przez atakującego. Po jej przeczytaniu odnalazłem informacje na temat adresu portfela BTC, na który powinien zostać przelany okup (Rys. 20).

Rys. 20. Adres portfela BTC.
Rys. 20. Adres portfela BTC.

Odpowiedź: 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2

Zadanie 7

Jaką kwotę TA żąda?

(ang. How much is the TA asking for?)

W tej samej notatce znajduje się również informacja na temat wysokości okupu (Rys. 21).

Rys. 21. Kwota okupu.
Rys. 21. Kwota okupu.

Odpowiedź: £1000000

Zadanie 8

Co zostało użyte do spakowania złośliwego oprogramowania?

(ang. What was used to pack the malware?)

Na samym początku analizy złośliwego oprogramowania znalazłem odpowiedź na to pytanie (Rys. 22).

Rys. 22. Wynik polecenia strings dla pliku <code>update</code>.
Rys. 22. Wynik polecenia strings dla pliku update.

Odpowiedź: upx