HTB Sherlock - Subatomic Writeup

HTB Sherlock - Subatomic Writeup

Scenariusz Zadania

Forela potrzebuje Twojej pomocy. Została poinformowana przez pracownika, że ich konto Discord zostało użyte do wysłania wiadomości z linkiem do pliku, który podejrzewają o bycie złośliwym oprogramowaniem. Wiadomość brzmiała: “Cześć! Pracowałem nad nową grą, która może Cię zainteresować. Łączy ona w sobie kilka gier, które lubimy razem grać, sprawdź to!”. Użytkownik Forela próbował zabezpieczyć swoje konto na Discordzie, ale mimo to wiadomości nadal są wysyłane i potrzebuje Twojej pomocy, aby zrozumieć to złośliwe oprogramowanie i odzyskać kontrolę nad swoim kontem! Ostrzeżenie, Sherlock zawiera oprogramowanie, które będzie współpracować z Twoim komputerem i plikami. To oprogramowanie zostało celowo dołączone w celach edukacyjnych i NIE jest przeznaczone do uruchamiania ani używania w inny sposób. Zawsze obsługuj takie pliki w izolowanych, kontrolowanych i bezpiecznych środowiskach. Po rozpakowaniu pliku Sherlock.zip znajdziesz plik DANGER.txt. Przeczytaj go, aby kontynuować.

(ang. Forela is in need of your assistance. They were informed by an employee that their Discord account had been used to send a message with a link to a file they suspect is malware. The message read: “Hi! I’ve been working on a new game I think you may be interested in it. It combines a number of games we like to play together, check it out!”. The Forela user has tried to secure their Discord account, but somehow the messages keep being sent and they need your help to understand this malware and regain control of their account! 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. One the Sherlock zip has been unzipped, you will find a DANGER.txt file. Please read this to proceed.)

Artefakty

Po rozpakowaniu pliku ZIP znajdujemy dwa pliki: DANGER.txt oraz malware.zip. W pliku DANGER.txt ponownie umieszczono ostrzeżenie dotyczące zawartości pliku ZIP oraz hasło niezbędne do rozpakowania malware.zip. Po rozpakowaniu malware.zip otrzymujemy plik nsis-installer.exe, będący złośliwym oprogramowaniem, które musimy przeanalizować w celu rozwiązania zadań (Rys. 1).

Rys. 1. Zawartość pobranego pliku zip po rozpakowaniu.
Rys. 1. Zawartość pobranego pliku zip po rozpakowaniu.

Rozwiązanie

Zadanie 1

Jaki jest Imphash tego instalatora złośliwego oprogramowania?

(ang. What is the Imphash of this malware installer?)

Pierwszym krokiem, który podjąłem w celu analizy złośliwego oprogramowania, było skorzystanie z serwisu VirusTotal. W zakładce “Details” znalazłem odpowiedź na pierwsze pytanie (Rys. 2).

Rys. 2. Imphash.
Rys. 2. Imphash.

Odpowiedź: b34f154ec913d2d2c435cbd644e91687

Zadanie 2

Złośliwe oprogramowanie zawiera podpis cyfrowy. Jaka jest nazwa programu określona w strukturze danych SpcSpOpusInfo?

(ang. The malware contains a digital signature. What is the program name specified in the SpcSpOpusInfo Data Structure?)

Również odpowiedź na to pytanie znalazłem na VirusTotal (Rys. 3).

Rys. 3. Sekcja <code>SpcSpOpusInfo</code> w Virustotal.
Rys. 3. Sekcja SpcSpOpusInfo w Virustotal.

Odpowiedź: Windows Update Assistant

Zadanie 3

Złośliwe oprogramowanie używa unikalnego GUID podczas instalacji, jaki jest ten GUID?

(ang. The malware uses a unique GUID during installation, what is this GUID?)

Na początku próbowałem przeanalizować zawartość pliku za pomocą PE-bear, jednak nie przyniosło to żadnych rezultatów. Wróciłem więc do analizy na VirusTotal. Tam zauważyłem, że jest to „samorozpakowujące się archiwum instalatora Nullsoft”. Korzystając z tego artykułu, dowiedziałem się, że jest to archiwum, które można rozpakować za pomocą 7z. Na początku spróbowałem użyć 7z dostępnego na stronie producenta (Rys. 4).

Rys. 4. Podgląd zawartości pliku <code>nsis-installer.exe</code>, brak pliku z rozszerzeniem .nsi.
Rys. 4. Podgląd zawartości pliku nsis-installer.exe, brak pliku z rozszerzeniem .nsi.
Okazało się, że mogłem podejrzeć zawartość archiwum, ale brakowało w nim pliku z rozszerzeniem .nsi. Był to pewien postęp, jednak nadal nie uzyskałem pełnych rezultatów. W końcu dowiedziałem się, że wsparcie dla rozpakowywania plików NSIS zostało w 7z wyłączone już dawno temu (art). Rozwiązaniem okazało się skorzystanie z FlareVM. Instalacja FlareVM dostarczyła wersję 7z, która umożliwiła pełny wgląd w zawartość archiwum (Rys. 5).
Rys. 5. Podgląd zawartości pliku <code>nsis-installer.exe</code>, z wykorzystaniem 7zip dostępnym w FlareVM.
Rys. 5. Podgląd zawartości pliku nsis-installer.exe, z wykorzystaniem 7zip dostępnym w FlareVM.
Analizując plik [NSIS].nsi, odpowiedzialny za kroki wykonywane podczas instalacji złośliwego oprogramowania, znalazłem poszukiwany GUID (Rys. 6).
Rys. 6. Znaleziony GUID w pliku <code>[NSIS].nsi</code>.
Rys. 6. Znaleziony GUID w pliku [NSIS].nsi.

Odpowiedź: cfbc383d-9aa0-5771-9485-7b806e8442d5

Zadanie 4

Złośliwe oprogramowanie zawiera plik package.json z metadanymi związanymi z nim. Jaka jest ‘Licencja’ przypisana do tego złośliwego oprogramowania?

(ang. The malware contains a package.json file with metadata associated with it. What is the ‘License’ tied to this malware?)

W katalogu $PLUGINSDIR znalazłem kolejne archiwum app-32.7z (Rys. 7).

Rys. 7. Zawartość katalogu <code>$PLUGINSDIR</code>.
Rys. 7. Zawartość katalogu $PLUGINSDIR.
Po jego rozpakowaniu rozpocząłem poszukiwania od pliku package.json. Plik package.json jest używany przez menedżer pakietów npm, co zasugerowało mi, że szukam czegoś związanego z JavaScriptem. Zazwyczaj pliki związane z JavaScriptem są umieszczane w osobnych katalogach, takich jak resources lub static. W tym przypadku w archiwum znalazłem katalog resources (Rys. 8).
Rys. 8. Zawartość archiwum <code>app-32.7z</code>, katalog resources.
Rys. 8. Zawartość archiwum app-32.7z, katalog resources.
W nim znajdowały się dwa pliki: elevate.exe oraz app.asar. Po wyszukaniu w Google okazało się, że pliki z rozszerzeniem .asar to kolejny format archiwum, który działa podobnie do tar (link). Za pomocą polecenia npm install --engine-strict @electron/asar, dostępnego w pliku Readme.md tego pakietu, zainstalowałem oprogramowanie asar. Następnie, używając polecenia asar e app.asar ./resources/, wypakowałem wszystkie pliki z archiwum (Rys. 9).
Rys. 9. Zawartość archiwum <code>app.asar</code>.
Rys. 9. Zawartość archiwum app.asar
Po otwarciu pliku package.json uzyskałem odpowiedź (Rys. 10).
Rys. 10. Zawartość pliku <code>package.json</code>.
Rys. 10. Zawartość pliku package.json.

Odpowiedź: ISC

Zadanie 5

Złośliwe oprogramowanie łączy się z adresem C2 podczas wykonywania. Jaka domena jest używana dla C2?

(ang. The malware connects back to a C2 address during execution. What is the domain used for C2?)

Odpowiedź na to pytanie uzyskałem już podczas wstępnej analizy przy użyciu VirusTotal (Rys. 11).

Rys. 11. Domena używana przez C2.
Rys. 11. Domena używana przez C2.

Odpowiedź: illitmagnetic.site

Zadanie 6

Złośliwe oprogramowanie próbuje uzyskać publiczny adres IP zainfekowanego systemu. Jaki jest pełny adres URL używany do uzyskania tej informacji?

(ang. The malware attempts to get the public IP address of an infected system. What is the full URL used to retrieve this information?)

Plik zawierający złośliwy kod znajduje się w pliku app.js. Cały plik jest obfuskowany i trudny do odczytania (Rys. 12). Na początku próbowałem manualnej deobfuskacji, a także korzystałem z pomocy ChatGPT, jednak obie metody okazały się nieskuteczne. W związku z tym zdecydowałem się na analizę dynamiczną.

Rys. 12. Obfuskowana zawartość pliku app.js.
Rys. 12. Obfuskowana zawartość pliku app.js.
Warto tutaj podkreślić, że system, którego używam do analizy złośliwego oprogramowania, działa na maszynie wirtualnej odciętej od internetu, z wyłączonym współdzieleniem plików i schowka. Przed rozpoczęciem analizy wykonałem również snapshot maszyny wirtualnej. Złośliwy kod otworzyłem w programie VSCode, który jest domyślnie dostępny w FlareVM. Pierwsza próba uruchomienia skryptu w trybie debugowania zakończyła się niepowodzeniem. Pomimo rozpakowania wszystkich plików, skrypt miał problem z pakietem primno/dpapi (Rys. 13).
Rys. 13. Pierwsza próba debugowania <code>app.js</code>.
Rys. 13. Pierwsza próba debugowania app.js.
Znalazłem katalog primno w folderze node_modules i ponownie zainstalowałem pakiet za pomocą polecenia npm install @primno/dpapi. Niestety, kolejna próba uruchomienia skryptu również nie powiodła się. Tym razem problem dotyczył zależności sqlite3 (Rys. 14). Wykonałem ten sam krok co poprzednio, usuwając katalog sqlite3 z node_modules, a następnie ponownie instalując zależność przy użyciu polecenia npm install sqlite3.
Rys. 14. Druga próba debugowania <code>app.js</code>.
Rys. 14. Druga próba debugowania app.js.
Po ponownym uruchomieniu skryptu w trybie debugowania, skrypt uruchomił się poprawnie. W sekcji “Loaded Scripts” w lewym dolnym rogu, w eval, znalazłem zdeobfuskowany skrypt app.js (Rys. 15).
Rys. 15. Zdeobfuskowany złośliwy skrypt.
Rys. 15. Zdeobfuskowany złośliwy skrypt.
Odnalezienie funkcji odpowiedzialnej za pobieranie publicznego adresu IP było stosunkowo proste, ponieważ z wstępnej analizy przy użyciu VirusTotal wiedziałem, że muszę szukać odwołania do domeny ipinfo.io (Rys. 16).
Rys. 16. Wykryty URL użyty do pozyskania publicznego adresu IP zainfekowanego systemu.
Rys. 16. Wykryty URL użyty do pozyskania publicznego adresu IP zainfekowanego systemu.

Odpowiedź: https://ipinfo.io/json

Zadanie 7

Złośliwe oprogramowanie poszukuje konkretnej ścieżki, aby połączyć się z powrotem. Jaki jest pełny adres URL używany do C2 tego złośliwego oprogramowania?

(ang. The malware is looking for a particular path to connect back on. What is the full URL used for C2 of this malware?)

Po uzyskaniu zdeobfuskowanej zawartości skryptu app.js, odpowiedź na to pytanie znajduje się w 14. linii (Rys. 17).

Rys. 17. URL C2 wykorzystywany przez złośliwe oprogramowanie.
Rys. 17. URL C2 wykorzystywany przez złośliwe oprogramowanie.

Odpowiedź: https://illitmagnetic.site/api/

Zadanie 8

Złośliwe oprogramowanie ma skonfigurowany user_id, który jest wysyłany do C2 w nagłówkach lub treści każdego żądania. Jaka jest nazwa klucza lub zmiennej wysyłanej, która zawiera wartość user_id?

(ang. The malware has a configured user_id which is sent to the C2 in the headers or body on every request. What is the key or variable name sent which contains the user_id value?)

Po uzyskaniu zdeobfuskowanej zawartości skryptu app.js, odpowiedź na to pytanie znajduje się w 45. linii (Rys. 18).

Rys. 18. Skonfigurowany user_id wysyłany w nagłówku.
Rys. 18. Skonfigurowany user_id wysyłany w nagłówku.

Odpowiedź: duvet_user

Zadanie 9

Złośliwe oprogramowanie sprawdza kilka nazw hostów podczas wykonywania, a jeśli którąkolwiek znajdzie, zakończy działanie. Jakiej nazwy hosta szuka, która zaczyna się od arch?

(ang. The malware checks for a number of hostnames upon execution, and if any are found it will terminate. What hostname is it looking for that begins with arch?)

Wykorzystując funkcję wyszukiwania w pliku, znalazłem tylko jedno wystąpienie słowa arch (Rys. 19).

Rys. 19. Poszukiwana nazwa hosta zaczynająca się od <code>arch</code>.
Rys. 19. Poszukiwana nazwa hosta zaczynająca się od arch.

Odpowiedź: archibaldpc

Zadanie 10

Złośliwe oprogramowanie sprawdza kilka procesów, aby upewnić się, że nie działa na maszynie wirtualnej; jednak autor złośliwego oprogramowania błędnie sprawdza ten sam proces dwa razy. Jaka jest nazwa tego procesu?

(ang. The malware looks for a number of processes when checking if it is running in a VM; however, the malware author has mistakenly made it check for the same process twice. What is the name of this process?)

Funkcja checkVM za pomocą polecenia tasklist pobiera listę procesów, a następnie sprawdza, czy którykolwiek z poniższej listy występuje na tej liście. Po dokładniejszym przyjrzeniu się zauważyłem, że powtarzającą się wartością jest vmwaretray (Rys. 20).

Rys. 20. Zduplikowana nazwa procesu.
Rys. 20. Zduplikowana nazwa procesu.

Odpowiedź: vmwaretray

Zadanie 11

Złośliwe oprogramowanie ma specjalną funkcję, która sprawdza, czy plik C:\Windows\system32\cmd.exe istnieje. Jeśli nie, zapisze plik z serwera C2 w nietypowej lokalizacji na dysku przy użyciu zmiennej środowiskowej USERPROFILE. Gdzie zostanie zapisany plik?

(ang. The malware has a special function which checks to see if C:\Windows\system32\cmd.exe exists. If it doesn’t it will write a file from the C2 server to an unusual location on disk using the environment variable USERPROFILE. What is the location it will be written to?)

Ponownie wykorzystując funkcję wyszukiwania w pliku, rozpocząłem od wyszukania wszystkich wystąpień cmd.exe. W ten sposób znalazłem funkcję checkCmdInstalation. Funkcja ta sprawdza, czy plik cmd.exe istnieje w lokalizacji C:\Windows\system32\cmd.exe. Jeżeli plik nie istnieje, pobiera go i zapisuje w lokalizacji %USERPROFILE%\Documents\cmd.exe (Rys. 21).

Rys. 21. Funkcja sprawdzająca istnienie cmd.exe.
Rys. 21. Funkcja sprawdzająca istnienie cmd.exe.

Odpowiedź: %USERPROFILE%\Documents\cmd.exe

Zadanie 12

Wydaje się, że złośliwe oprogramowanie celuje zarówno w przeglądarki, jak i Discord. Jakie polecenie jest uruchamiane w celu zlokalizowania plików cookie Firefox na systemie?

(ang. The malware appears to be targeting browsers as much as Discord. What command is run to locate Firefox cookies on the system?)

Korzystając z wyszukiwania w pliku, odnalazłem funkcję getFirefoxCookies. W linii 496 wykonywane jest polecenie systemowe odpowiedzialne za wyszukiwanie plików zawierających cookies dla przeglądarki Firefox (Rys. 22).

Odpowiedź: where /r . cookies.sqlite

Zadanie 13

Aby ostatecznie pozbyć się złośliwego oprogramowania, Forela potrzebuje, abyś dowiedział się, który moduł Discord został zmodyfikowany przez złośliwe oprogramowanie, aby mogła go wyczyścić. Jaki moduł Discord został zainfekowany przez to złośliwe oprogramowanie i jaka jest nazwa zainfekowanego pliku?

(ang. To finally eradicate the malware, Forela needs you to find out what Discord module has been modified by the malware so they can clean it up. What is the Discord module infected by this malware, and what’s the name of the infected file?)

Tak jak w poprzednich przypadkach, najpierw skorzystałem z wyszukiwania w pliku. W ten sposób znalazłem funkcję discordInjection. Funkcja ta skanuje system w poszukiwaniu zainstalowanych wersji Discorda, a następnie lokalizuje i modyfikuje plik index.js w katalogu (module) discord_desktop_core-1 (Rys. 23).

Rys. 23. Funkcja odpowiedzialna za modyfikacje Discord.
Rys. 23. Funkcja odpowiedzialna za modyfikacje Discord.

Odpowiedź: discord_desktop_core-1, index.js