HTB Sherlock - BOughT Writeup

HTB Sherlock - BOughT Writeup

Scenariusz Zadania

Niedawno klient niezwiązany z technologią zakupił używany komputer do użytku osobistego od nieznajomego, którego spotkał online. Od momentu nabycia komputera, klient korzystał z niego bez wprowadzania żadnych zmian, w szczególności bez instalowania ani odinstalowywania jakiegokolwiek oprogramowania. Jednakże zaczął napotykać problemy związane z łącznością z internetem. Obejmuje to otrzymywanie komunikatów o błędach, takich jak ‘Serwer nie został znaleziony’ oraz trudności ze strumieniowaniem wideo. Pomimo tych problemów, sprawdzenie za pomocą narzędzia Windows Network Troubleshooter wskazuje, że nie ma problemów z samym połączeniem internetowym. Klient dostarczył obraz pamięci oraz artefakty z dysku do zbadania, aby ustalić, czy istnieją jakieś ukryte problemy powodujące te trudności.

(ang. A non-technical client recently purchased a used computer for personal use from a stranger they encountered online. Since acquiring the computer, the client has been using it without making any changes, specifically not installing or uninstalling any software. However, they have begun experiencing issues related to internet connectivity. This includes receiving error messages such as “Server Not Found” and encountering difficulties with video streaming. Despite these problems, checks with the Windows Network Troubleshooter indicate no issues with the internet connection itself. The client has provided a memory image and disk artifacts for investigation to determine if there are any underlying issues causing these problems.)

Artefakty

Po rozpakowaniu otrzymanego archiwum ZIP otrzymujemy dwa pliki (Rys 1):

  • Files.ad1 - zawiera logiczne kopie dowodów cyfrowych, takie jak wybrane foldery, pliki lub partycje z systemów komputerowych, które zostały zebrane podczas procesu śledczego. W przeciwieństwie do pełnych obrazów dysków, pliki .ad1 mogą zawierać jedynie wybrane fragmenty danych, co pozwala na bardziej efektywne przechowywanie i analizę określonych dowodów bez konieczności kopiowania całego dysku,
  • memdump.mem - zrzut pamięci RAM pochodzący ze skompromitowanego komputera; z takimi plikami często miałem do czynienia podczas rozwiązywania Sherlocków.

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

Rozwiązanie

Zadanie 1

Jaki jest najlepszy profil Volatility pasujący do obrazu pamięci?

(ang. What is the best volatility profile match for the memory image?)

Za pomocą polecenia python vol.py -f ../htb/memdump.mem imageinfo uzyskuję podstawowe informacje o dostarczonym obrazie pamięci. Wśród danych znajdują się wykryty profil oraz czas rejestracji obrazu (Rys 2).

Rys. 2. Wykryty profil obrazu pamięci.
Rys. 2. Wykryty profil obrazu pamięci.

Odpowiedź: Win10x64_19041

Zadanie 2

Kiedy obraz został zarejestrowany w czasie UTC?

(ang. When was the image captured in UTC?)

Odpowiedź uzyskałem, rozwiązując zadanie nr 1, w wyniku tego samego polecenia (Rys. 3).

Rys. 3. Czas zarejestrowania obrazu.
Rys. 3. Czas zarejestrowania obrazu.

Odpowiedź: 2023-08-07 21:28:13

Zadanie 3

Sprawdź działające procesy i potwierdź nazwę podejrzanego procesu.

(ang. Check running processes and confirm the name of the suspicious running process.)

Za pomocą polecenia python vol.py -f ../htb/memdump.mem --profile=Win10x64_19041 pstree wylistowałem procesy uruchomione podczas tworzenia zrzutu pamięci. Przeglądając je kolejno, zauważyłem podejrzany proces o nazwie SecurityCheck, który uruchamiał podproces conhost.exe (Rys. 4).

Rys. 4. Wykryty podejrzany proces.
Rys. 4. Wykryty podejrzany proces.

Odpowiedź: SecurityCheck

Zadanie 4

Jaka jest pełna ścieżka do złośliwego procesu?

(ang. What is the full path of malicious process?)

Znając nazwę złośliwego procesu, użyłem polecenia python vol.py -f ../htb/memdump.mem --profile=Win10x64_19041 cmdline | grep SecurityCheck, aby znaleźć ścieżkę, z której został uruchomiony (Rys. 5).

Rys. 5. Pełna ścieżka do złośliwego procesu.
Rys. 5. Pełna ścieżka do złośliwego procesu.

Odpowiedź: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\SecurityCheck.exe

Zadanie 5

Jaka jest wartość SHA256 dla złośliwego oprogramowania?

(ang. What is the sha256 value of the malware?)

Zamiast próbować ekstrakcji złośliwego oprogramowania ze zrzutu pamięci, postanowiłem najpierw wyeksportować ten plik z Files.ad1. Do otwarcia pliku użyłem oprogramowania FTK Imager. Znając lokalizację pliku, łatwo było go znaleźć (Rys. 6).

Rys. 6. Eksport złośliwego oprogramowania z pliku <code>Files.ad1</code> za pomocą FTK Imager.
Rys. 6. Eksport złośliwego oprogramowania z pliku Files.ad1 za pomocą FTK Imager.
Po poprawnym wyeksportowaniu pliku, użyłem polecenia shasum -a 256 SecurityCheck.exe do obliczenia jego sumy kontrolnej (Rys. 7).
Rys. 7. Suma SHA256 dla złośliwego oprogramowania.
Rys. 7. Suma SHA256 dla złośliwego oprogramowania.

Odpowiedź: 4062963405cc71c032ca51ffd409e832120fcfd496969f4ef548774323c72413

Zadanie 6

Jaki jest znacznik czasu kompilacji złośliwego oprogramowania?

(ang. What is the compilation timestamp for the malware?)

W celu dalszej analizy złośliwego oprogramowania, skorzystałem z portalu VirusTotal. Tam znalazłem między innymi odpowiedź na to pytanie (Rys. 8).

Rys. 8. Czas kompilacji złośliwego oprogramowania.
Rys. 8. Czas kompilacji złośliwego oprogramowania.

Odpowiedź: 2037-09-03 08:20:55

Zadanie 7

Jaka jest nazwa mutexu, który tworzy złośliwe oprogramowanie?

(ang. What is the name of the mutex that the malware creates?)

Odpowiedź na to pytanie również znalazłem, korzystając z VirusTotal (Rys. 9).

Rys. 9. Nazwa mutexu tworzona przez złośliwe oprogramowanie.
Rys. 9. Nazwa mutexu tworzona przez złośliwe oprogramowanie.

Odpowiedź: config_m2

Zadanie 8

Na początku funkcji głównej, jaka funkcja anty-debuggingowa jest używana?

(ang. At the top of main function which anti-debugging function is being used?)

Do analizy pliku SecurityCheck.exe użyłem Ghidra. Przyznam, że treść pytania była nieco myląca, ponieważ sugerowała, że funkcja znajduje się bezpośrednio w wywołaniu głównej funkcji programu. Jednak po zlokalizowaniu funkcji entry okazało się, że rozgałęzia się ona na inne podfunkcje. Szybszym podejściem do znalezienia nazwy funkcji anty-debugowej było sprawdzenie, jakie biblioteki oraz funkcje importuje program. Przeglądając importy, zauważyłem, że program importuje funkcję IsDebuggerPresent z biblioteki kernel32.dll. Następnie upewniłem się, że funkcja ta jest wywoływana w kodzie (Rys. 10).

Rys. 10. Nazwa wykorzystanej funkcji anty-debuggowej.
Rys. 10. Nazwa wykorzystanej funkcji anty-debuggowej.

Odpowiedź: IsDebuggerPresent

Zadanie 9

Ile minut złośliwe oprogramowanie czeka przed wywołaniem powyższej funkcji anty-debuggingowej?

(ang. How many minutes does the malware sleep before calling above anti- debugging function?)

Na rysunku 10, w linii 31, przed wywołaniem funkcji IsDebuggerPresent, wywoływana jest funkcja sleep ustawiona na 900 000 milisekund, co po przeliczeniu odpowiada 15 minutom.

Odpowiedź: 15

Zadanie 10

To złośliwe oprogramowanie używa DGA. Ile unikalnych domen C2 w sumie jest w stanie wygenerować to DGA?

(ang. This malware uses DGA, how many unique C2 domains in total is this DGA capable of generating?)

Ponieważ na co dzień nie zajmuję się analizą złośliwego oprogramowania, musiałem najpierw dowiedzieć się, co oznacza skrót DGA. DGA (Domain Generation Algorithm) to algorytm stosowany przez złośliwe oprogramowanie do generowania dużej liczby potencjalnych nazw domen (C2, czyli Command and Control) na podstawie określonych reguł. Domeny te są następnie używane przez złośliwe oprogramowanie do komunikacji z serwerami kontrolującymi, takich jak wydawanie poleceń, kradzież danych czy aktualizacje.

Po zaznajomieniu się z powyższą definicją, wiedziałem, czego szukać. Po krótkich poszukiwaniach znalazłem funkcję for odpowiedzialną za generowanie domen. W celu ułatwienia analizy, podmieniłem kilka nazw zmiennych (Rys. 11). Pętla for zaczyna się od 0 i ma warunek stopu mniejszy niż 6, co oznacza, że wykona się 6 razy (linia 35). W linii 39 wywoływana jest funkcja zwracająca wartość pseudolosową, a następnie w linii 41 wykonywana jest operacja modulo 9. Oznacza to, że losowana jest liczba od 0 do 8. Aby sytuacja była bardziej złożona, w linii 43 znajduje się warunek if (tmp_i == 2), który wybiera stałą wartość. Podsumowując, funkcja losuje tylko 5 miejsc z 6 możliwych. Całość można sprowadzić do prostego równania: (95 = 59049).

Rys. 11. Algorytm DGA.
Rys. 11. Algorytm DGA.

Odpowiedź: 59049

Zadanie 11

Ile unikalnych domen C2 zaczyna się od „rb”?

(ang. How many unique C2 domains start with “rb”?)

Znając już algorytm generowania DGA, wystarczy poprawić warunek. Wiem, że dodatkowo dwie litery są stałe, dlatego po uwzględnieniu tego faktu i zmniejszeniu potęgi o 2, otrzymałem prawidłowy wynik: (9(5-2) = 729).

Odpowiedź: 729

Zadanie 12

Ile unikalnych domen C2 kończy się na „rla”?

(ang. How many unique C2 domains end with “rla”?)

Podobnie w tym przypadku, mając trzy znaki stałe, zmniejszam bazową potęgę o 3, co daje wynik (9(5-3) = 81).

Odpowiedź: 81

Zadanie 13

Który plik jest używany do przechowywania aktywnej domeny C2?

(ang. Which file is being used to store active C2 domain?)

W głównej funkcji złośliwego oprogramowania znajdują się dwie ścieżki do plików, z których oprogramowanie wczytuje konfigurację (Rys. 12).

Rys. 12. Ścieżki do plików używanych przez złośliwe oprogramowanie do przechowywania konfiguracji.
Rys. 12. Ścieżki do plików używanych przez złośliwe oprogramowanie do przechowywania konfiguracji.
Aby upewnić się, który z nich jest używany, zdecydowałem się na skrót i sprawdziłem, czy w pliku Files.ad1 znajdują się te pliki wraz z konfiguracją. Okazało się, że oba są dostępne. Informacja zapisana w pliku win.ini potwierdziła, że to właśnie w tym pliku przechowywana jest aktualna wartość domeny C2 (Rys. 13).
Rys. 13. Aktywna domena C2 zapisana w pliku konfiguracyjnym na komputerze ofiary.
Rys. 13. Aktywna domena C2 zapisana w pliku konfiguracyjnym na komputerze ofiary.

Odpowiedź: C:\Users\Public\Documents\win.ini

Zadanie 14

Który plik jest używany do przechowywania poleceń z serwera C2?

(ang. Which file is being used to store commands from the C2 server?)

Podczas rozwiązywania zadania nr 13 sprawdziłem oba pliki. Okazało się, że drugi plik zawierał polecenia otrzymane z C2 (Rys. 12).

Odpowiedź: C:\Users\Public\config.ini

Zadanie 15

Jaki był aktywny FQDN C2 w momencie zbierania artefaktów?

(ang. What was the active C2 FQDN at the time of artifact collection?)

Nazwa aktywnej domeny zapisana w pliku konfiguracyjnym została znaleziona podczas realizacji zadania nr 13 (Rys. 13).

Odpowiedź: http://cl0lr8.xyz

Zadanie 16

Ile rodzajów ataków DDoS może wykonać to złośliwe oprogramowanie?

(ang. How many kinds of DDoS attacks can this malware perform?)

Analizując oprogramowanie, natknąłem się na funkcję, w której zdefiniowane są dwa typy ataków. Pierwszy typ, oznaczony jako typ 1, jest realizowany za pomocą polecenia systemowego PING. Drugi typ ataku polega na wysyłaniu żądań HTTP GET. Na poniższym zrzucie ekranu poprawiłem nazwy niektórych zmiennych oraz wywołań funkcji, aby zwiększyć czytelność (Rys 14).

Rys. 14. Funkcja odpowiedzialna za przeprowadzanie ataków.
Rys. 14. Funkcja odpowiedzialna za przeprowadzanie ataków.

Odpowiedź: 2

Zadanie 17

Jaki był FQDN docelowej strony internetowej?

(ang. What is the FQDN of the target website.)

Podczas rozwiązywania zadania nr 13 znalazłem plik konfiguracyjny odpowiedzialny za przechowywanie poleceń otrzymanych z serwera. Informacje zawarte w tym pliku były zakodowane w base64 (Rys 15).

Rys. 15. Zakodowane polecenia w formacie base64, otrzymane z serwera C2.
Rys. 15. Zakodowane polecenia w formacie base64, otrzymane z serwera C2.
Po zdekodowaniu za pomocą CyberChef otrzymałem odpowiedź (Rys 16).
Rys. 16. Zdekodowane polecenia za pomocą Cyberchef.
Rys. 16. Zdekodowane polecenia za pomocą Cyberchef.

Odpowiedź: http://nbscl231sdn.mnj

Zadanie 18

Jaka była data wygaśnięcia aktywnego ataku w momencie zbierania artefaktów (w czasie UTC)?

(ang. What was the expiration date for the active attack at the time of artifact collection in UTC?)

W zdekodowanym pliku konfiguracyjnym, w ostatniej linii, znajduje się znacznik czasu 1693482358. Przekonwertowałem go na datę za pomocą tej strony.

Odpowiedź: 2023-08-31 11:45:58

Zadanie 19

Ile żądań GET wykonuje złośliwe oprogramowanie na docelowej domenie, zanim zrobi przerwę?

(ang. How many GET requests does the malware perform against target domain before sleeping for a while?)

W tej samej funkcji, w której zidentyfikowałem typy ataków, znajduje się pętla for, która wykonuje się 20 razy. Wewnątrz tej pętli wywoływana jest funkcja send_get_request, która, po dokładnej analizie, wysyła żądanie GET tylko raz. Po zakończeniu pętli for następuje wywołanie funkcji sleep (Rys 17).

Rys. 17. Pętla <code>for</code>, odpowiedzialna za wywoływanie funkcji HTTP GET.
Rys. 17. Pętla for, odpowiedzialna za wywoływanie funkcji HTTP GET.

Odpowiedź: 20

Zadanie 20

Wygląda na to, że istnieje inna metoda ataku z użyciem żądań ICMP. Ile tych żądań może wysłać złośliwe oprogramowanie, zanim zrobi przerwę?

(ang. There seems to be another attack method with ICMP requests. How many of these requests can the malware send before sleeping for a while?)

Po wybraniu typu ataku nr 1 można zauważyć wywołanie funkcji strcat, która służy do łączenia łańcuchów znaków. Po połączeniu wszystkich fragmentów uzyskuje się polecenie ping -n 16 %s. To polecenie jest następnie przekazywane do funkcji system, która wykonuje je na systemie operacyjnym (Rys 18).

Rys. 18. Część kodu odpowiedzialna za wysyłanie pakietów ICMP.
Rys. 28. Część kodu odpowiedzialna za wysyłanie pakietów ICMP.

Odpowiedź: 16

Zadanie 21

Czy to złośliwe oprogramowanie jest podatne na przejęcie przez Botnet?

(ang. Is this malware prone to Botnet hijacking?)

Patrząc na sposób komunikacji oprogramowania z serwerem C2 i na sposób, w jaki zapisuje pliki konfiguracyjne, uważam, że złośliwe oprogramowanie jest zdecydowanie podatne na przejęcie. :)

Odpowiedź: yes