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).
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).
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).
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).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).Analizując plik [NSIS].nsi
, odpowiedzialny za kroki wykonywane podczas instalacji złośliwego oprogramowania, znalazłem poszukiwany GUID (Rys. 6).
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).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).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).Po otwarciu pliku package.json
uzyskałem odpowiedź (Rys. 10).
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).
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ą.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).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
.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).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).
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).
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).
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).
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).
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).
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).
Odpowiedź: discord_desktop_core-1, index.js