HTB Sherlock - Einladen Writeup

HTB Sherlock - Einladen Writeup

Scenariusz Zadania

Nasz personel niedawno otrzymał zaproszenie do niemieckiej ambasady na pożegnanie ambasadora Niemiec. Uważamy, że to zaproszenie było próbą phishingu, ponieważ po otrzymaniu tego maila na narzędziach SIEM naszej organizacji pojawiły się alerty. Udostępniliśmy szeroką gamę artefaktów, w tym liczne pliki binarne, zrzut sieci, pliki DLL z systemu hosta oraz plik .hta. Prosimy o przeanalizowanie ich i odpowiedzenie na poniższe pytania!

⚠️ Ostrzeżenie: To jest ostrzeżenie, że ten Sherlock zawiera oprogramowanie, które będzie oddziaływać na Twój komputer i pliki. Oprogramowanie to 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 archiwum Sherlock znajdziesz plik DANGER.txt. Przeczytaj go, aby kontynuować.

(ang. Our staff recently received an invite to the German embassy to bid farewell to the Germany Ambassador. We believe this invite was a phishing email due to alerts that fired on our organisation’s SIEM tooling following the receipt of such mail. We have provided a wide variety of artifacts inclusive of numerous binaries, a network capture, DLLs from the host system and also a .hta file. Please analyse and complete the questions detailed below!

⚠️ 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

Po rozpakowaniu pliku ZIP znajdujemy w nim pliki DANGER.txt oraz malware.zip. W pliku DANGER.txt znajduje się ponownie ostrzeżenie dotyczące zawartości pliku ZIP oraz hasło potrzebne do rozpakowania malware.zip. Po rozpakowaniu malware.zip otrzymujemy katalog suspicious_files, w którym znajdują się pliki niezbędne do rozwiązania zadania. Łącznie po rozpakowaniu malware.zip dostępne mamy 12 plików (Rys. 1).

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

Rozwiązanie

Zadanie 1

Ofiara odwiedziła stronę internetową. Plik HTML tej strony został dostarczony jako plik próbny downloader.html. Strona internetowa pobiera plik ZIP o nazwie Invitation_Farewell_DE_EMB.zip. Jaki jest skrót SHA-256 tego pliku ZIP?

(ang. The victim visited a web page. The HTML file of the web page has been provided as downloader.html sample file.The web page downloads a ZIP file named ‘Invitation_Farewell_DE_EMB.zip’. What is the SHA-256 hash of the ZIP file?)

W katalogu suspicious_files znajduje się plik Invitation_Farewell_DE_EMB.zip. Za pomocą polecenia shasum -a 256 Invitation_Farewell_DE_EMB.zip uzyskuję poszukiwany skrót (Rys 2).

Rys. 2. Skrót SHA-256 dla pliku <code>Invitation_Farewell_DE_EMB.zip</code>.
Rys. 2. Skrót SHA-256 dla pliku Invitation_Farewell_DE_EMBzip

Odpowiedź: 5D4BF026FAD40979541EFD2419EC0B042C8CF83BC1A61CBCC069EFE0069CCD27

Zadanie 2

Pobrany plik ZIP zawiera plik HTA, który tworzy wiele plików. Jeden z tych plików jest podpisany przez Microsoft Corporation. W pliku HTA, jaka wartość zmiennej była zawartością tego podpisanego pliku?

(ang. The downloaded ZIP file contains a HTA file, which creates multiple files. One of those files is a signed by Microsoft Corporation. In HTA file, which variable’s value was the content of that signed file?)

Aby upewnić się co do zawartości pliku Invitation_Farewell_DE_EMB.zip, najpierw podejrzałem jego zawartość za pomocą polecenia zipinfo -m Invitation_Farewell_DE_EMB.zip. W środku znajdował się plik Invitation_Farewell_DE_EMB.hta, który wyglądał identycznie jak ten dostępny w głównym katalogu zadania. Po przeanalizowaniu jego zawartości zauważyłem, że we wszystkich miejscach, gdzie skrypt tworzy pliki, pojawia się fraza f.GetFolder. Wykonując polecenie grep, otrzymałem listę plików tworzonych przez skrypt (Rys. 3).

Rys. 3. Zawartość pliku zip, lista plików tworzona przez skrypt HTA.
Rys. 3. Zawartość pliku zip, lista plików tworzona przez skrypt HTA.

Ponieważ podpowiedź w HTB informowała, że poszukiwany plik kończy się na literę v, moje podejrzenia od razu padły na plik msoev.exe. Dla potwierdzenia zweryfikowałem jeszcze podpis tego pliku w systemie Windows (Rys. 4).
Rys. 4. Podpis cyfrowy dla pliku <code>msoev.exe</code>.
Rys. 4. Podpis cyfrowy dla pliku msoev.exe.

Odpowiedź: msoev

Zadanie 3

Złośliwy aktor podszywał się pod ambasadę jakiego kraju?

(ang. The threat actor was acting as an embassy of a country. Which country was that?)

Odpowiedź na to pytanie znalazłem jako pierwszą. Wskazówka była ukryta w logo zadania, gdzie można dostrzec flagę kraju. :) Dodatkowo, na późniejszym etapie, znalazłem tę samą odpowiedź w pliku Invitation.pdf (Rys. 5).

Rys. 5. Zaproszenie otrzymane przed ofiarę.
Rys. 5. Zaproszenie otrzymane przed ofiarę.

Odpowiedź: Germany

Zadanie 4

Złośliwe oprogramowanie komunikowało się z domeną platformy czatu. Jaka jest nazwa domeny (wraz z subdomeną), z którą łączy się to oprogramowanie?

(ang. The malware communicated with a chatting platform domain. What is the domain name (inclusive of sub domain) the malware connects to?)

W katalogu suspicious_files znajduje się plik pcap o nazwie msoev.pcapng. Z nazwy pliku można wnioskować, że jest to zrzut komunikacji nawiązanej przez złośliwe oprogramowanie. Po otwarciu pliku w Wireshark i zastosowaniu filtru DNS, zauważyłem, że jedyną domeną posiadającą w chat w nazwie jest toyy.zulipchat.com (Rys. 6).

Rys. 6. Wykryta domena, z którą łączyło się oprogramowanie msoev.exe.
Rys. 6. Wykryta domena, z którą łączyło się oprogramowanie msoev.exe.

Odpowiedź: toyy.zulipchat.com

Zadanie 5

Ile rekordów DNS A znaleziono dla tej domeny?

(ang. How many DNS A records were found for that domain?)

W odpowiedzi na zapytanie z pakietu 69 otrzymujemy 6 rekordów A dla subdomeny toyy.zulipchat.com (Rys. 7).

Rys. 7. Adresy IP przypisane do <code>toyy.zulipchat.com</code>.
Rys. 7. Adresy IP przypisane do toyy.zulipchat.com

Odpowiedź: 6

Zadanie 6

Wygląda na to, że usługa czatu działała na bardzo znanej usłudze chmurowej, używając pełnej nazwy domeny (FQDN), gdzie FQDN zawiera adres IP domeny czatu w odwróconym formacie. Jaka jest ta pełna nazwa domeny (FQDN)?

(ang. It seems like the chatting service was running on a very known cloud service using a FQDN, where the FQDN contains the IP address of the chatting domain in reversive format somehow. What is the FQDN?)

Analizując plik pcap z zastosowaniem filtru DNS, otrzymujemy zaledwie 28 rekordów. Wśród tych wyników bardzo łatwo dostrzec FQDN powiązany z “bardzo znaną” usługą chmurową (Rys. 8).

Rys. 8. Wykryty FQDN.
Rys. 8. Wykryty FQDN.

Odpowiedź: ec2-35-171-197-55.compute-1.amazonaws.com

Zadanie 7

Jaki był nadrzędny PID (PPID) złośliwego oprogramowania?

(ang. What was the parent PID (PPID) of the malware?)

Na początku sądziłem, że PPID, podobnie jak inne informacje, będą łatwo dostępne w pliku pcap. Okazało się jednak, że cała komunikacja z serwerem jest szyfrowana. Bez klucza prywatnego nic nie mogę zdziałać. W katalogu suspicious_files znajdował się jednak jeszcze jeden plik, który mógł zawierać odpowiedź na zadane pytanie – Logfile.PML. Plik ten zawiera informacje zarejestrowane przez program Process Monitor. Po otwarciu pliku odpowiedź była już widoczna w pierwszym wierszu (Rys. 9).

Rys. 9. Proces Monitor i PPID.
Rys. 9. Proces Monitor i PPID.

Odpowiedź: 4156

Zadanie 8

Jaka była nazwa komputera ofiary?

(ang. What was the computer name of the victim computer?)

Po najechaniu kursorem myszy na informacje dodatkowe, znalazłem odpowiedź na to pytanie (Rys. 10).

Rys. 10. Nazwa komputera ofiary.
Rys. 10. Nazwa komputera ofiary.

Odpowiedź: DESKTOP-O88AN4O

Zadanie 9

Jaka była nazwa użytkownika na komputerze ofiary?

(ang. What was the username of the victim computer?)

W systemie Windows nazwa użytkownika odpowiada nazwie katalogu domowego (Rys. 11).

Rys. 11. Nazwa użytkownika na komputerze ofiary.
Rys. 11. Nazwa użytkownika na komputerze ofiary.

Odpowiedź: TWF

Zadanie 10

Ile razy klucze rejestru systemu Windows zostały ustawione z wartością danych?

(ang. How many times were the Windows Registry keys set with a data value?)

Po odfiltrowaniu zdarzeń związanych z ustawianiem wartości rejestru w ProcMon otrzymałem odpowiedź (Rys. 12).

Rys. 12. Liczba zdarzeń dotyczących ustawiania wartości w rejestrze systemu Windows.
Rys. 12. Liczba zdarzeń dotyczących ustawiania wartości w rejestrze systemu Windows.

Odpowiedź: 11

Zadanie 11

Czy złośliwy plik mso.dll został pomyślnie załadowany przez wykonywalny plik złośliwego oprogramowania?

(ang. Did the malicious mso.dll load by the malware executable successfully?)

Tym razem odfiltrowałem wszystkie zdarzenia, które w ścieżce zawierały plik mso.dll. Wszystkie operacje widoczne na rysunku 12 zakończyły się sukcesem (Rys. 13).

Rys. 13. Załadowanie złośliwego pliku mso.dll
Rys. 13. Załadowanie złośliwego pliku mso.dll.

Odpowiedź: yes

Zadanie 12

Jaką nazwę pliku (nazwa+rozszerzenie) próbuje zapisać plik JavaScript, próbując utworzyć plik .bat?

(ang. The JavaScript file tries to write itself as a .bat file. What is the .bat file name (name+extension) it tries to write itself as?)

Na początku postanowiłem ręcznie przeprowadzić deobfuskację pliku unc.js (Rys. 14).

Rys. 14. Zawartość pliku <code>unc.js</code>.
Rys. 14. Zawartość pliku unc.js.

Jednak podczas tego procesu, który zajął mi chwilę, popełniłem błąd, przez co nazwa pliku BAT nie była prawidłowa. Muszę przyznać, że trochę się na siebie zirytowałem, prawdopodobnie pomyliłem jedną lub dwie litery podczas zamiany znaków. Przy drugim podejściu postanowiłem spróbować wykorzystać platformę any.run. Ponieważ nie mam subskrypcji, skorzystałem z darmowej wersji. Instancję z uruchomienia skryptu możecie znaleźć tutaj. Po uruchomieniu skryptu stwierdziłem, że była to bardzo dobra decyzja i bardzo szybko znalazłem prawidłową odpowiedź na pytanie (Rys. 15).
Rys. 15. Uruchomienie złośliwego pliku <code>unc.js</code> w środowisku any.run.
Rys. 15. Uruchomienie złośliwego pliku unc.js w środowisku any.run.

Odpowiedź: richpear.bat

Zadanie 13

Plik JavaScript zawiera duży tekst zakodowany w Base64. Jeśli zdekodujesz ten tekst Base64 i zapiszesz jego zawartość jako plik EXE, jaki będzie skrót SHA256 tego pliku EXE?

(ang. The JavaScript file contains a big text which is encoded as Base64. If you decode that Base64 text and write its content as an EXE file. What will be the SHA256 hash of the EXE?)

Kod base64 w pliku unc.js znajduje się w 28. linii (Rys. 16).

Rys. 16. Kod base64 w pliku <code>unc.js</code>.
Rys. 16. Kod base64 w pliku unc.js.
Skopiowałem go i zapisałem w osobnym pliku unc.b64.js. Następnie za pomocą polecenia cat unc.b64.js | base64 -d > unc.js.exe zdekodowałem plik i zapisałem go jako plik exe. Podczas sprawdzania skrótu SHA256 zauważyłem, że jest on dokładnie taki sam jak dla pliku EmpireClient.exe (Rys. 16).
Rys. 17. Skróty SHA256 dla zdekodowanego pliku pochodzącego z <code>unc.js</code> oraz <code>EmpireClient.exe</code>.
Rys. 17. Skróty SHA256 dla zdekodowanego pliku pochodzącego z unc.js oraz EmpireClient.exe.

Odpowiedź: db84db8c5d76f6001d5503e8e4b16cdd3446d5535c45bbb0fca76cfec40f37cc

Zadanie 14

Złośliwe oprogramowanie zawiera klasę Client.Settings, która ustawia różne konfiguracje. Ma ona zmienną Ports, której wartość jest zakodowana w Base64. Wartość ta jest odszyfrowywana za pomocą Aes256.Decrypt. Jaka będzie jej wartość po odszyfrowaniu (odszyfrowana wartość będzie w cudzysłowie)?

(ang. The malware contains a class Client.Settings which sets different configurations. It has a variable Ports where the value is Base64 encoded. The value is decrypted using Aes256.Decrypt. After decryption, what will be its value (the decrypted value will be inside double quotation)?)

Nauczony doświadczeniem z zadania 12, zdecydowałem, że szybciej będzie przeprowadzić analizę dynamiczną niż statyczną. Najpierw zweryfikowałem typ pliku EmpireClient.exe za pomocą polecenia file EmpireClient.exe. Okazało się, że plik został stworzony przy użyciu technologii .Net, co mnie bardzo ucieszyło, ponieważ technologia ta jest łatwa do dekompilacji (Rys 18). Jeśli nie zastosowano obfuskacji, kod będzie czytelny i stosunkowo łatwy do analizy.

Rys. 18. Wykryty typ pliku <code>EmpireClient.exe</code>.
Rys. 18. Wykryty typ pliku EmpireClient.exe.
Do analizy dynamicznej wykorzystałem dnSpy. Wiedziałem, że muszę odnaleźć klasę Client.Settings i zmienną Ports. W linii 21 przypisywana jest wartość po odszyfrowaniu. Ustawiłem na tej linii breakpoint, a następnie uruchomiłem debugger. Po zatrzymaniu debuggera wykonałem krok przez (step over), a w dolnym oknie Locals, zgodnie z informacjami zawartymi w zadaniu, uzyskałem odpowiedź (Rys. 19).
Rys. 19. Debugowanie złośliwego pliku <code>EmpireClient.exe</code> za pomocą dnSpy.
Rys. 19. Debugowanie złośliwego pliku EmpireClient.exe za pomocą dnSpy.

Odpowiedź: 666,777,111,5544

Zadanie 15

Złośliwe oprogramowanie wysyła żądanie HTTP i sprawdza kod kraju lub nazwę kraju komputera ofiary. Do jakiego URI złośliwe oprogramowanie wysyła to żądanie?

(ang. The malware sends a HTTP request to a URI and checks the country code or country name of the victim machine. To which URI does the malware sends request for this?)

Mając już zdekompilowane złośliwe oprogramowanie, zacząłem przeglądać jego kod. Podczas analizy natrafiłem na przestrzeń nazw Client.Helper i klasę Antisng, która odpowiada za wykrywanie kraju pochodzenia ofiary. W metodach GetCountryName oraz GetCountryCode znalazłem URI http://ip-api.com/json/, które na podstawie adresu IP zwraca informacje, takie jak kraj i miasto, z którego łączy się klient (Rys. 20).

Rys. 20. URI wykorzystane przez atakującego do sprawdzania nazwy kraju ofiary.
Rys. 20. URI wykorzystane przez atakującego do sprawdzania nazwy kraju ofiary.

Odpowiedź: http://ip-api.com/json/

Zadanie 16

Po uzyskaniu kodu kraju lub nazwy kraju komputera ofiary, złośliwe oprogramowanie sprawdza niektóre kody krajów oraz nazwę kraju. Jeśli nazwa kraju pasuje do nazwy kraju komputera ofiary, złośliwe oprogramowanie samo się kończy. Jaka jest nazwa kraju, którą sprawdza złośliwe oprogramowanie w porównaniu z systemem ofiary?

(ang. After getting the country code or country name of the victim machine, the malware checks some country codes and a country name. In case of the country name, if the name is matched with the victim machine’s country name, the malware terminates itself. What is the country name it checks with the victim system?)

W tej samej klasie, na samym początku, znalazłem metodę GetSNG, w której znajdowały się kody oraz nazwa kraju, dla którego oprogramowanie kończy swoje działanie (Rys. 21).

Rys. 21. Nazwa kraju, dla którego oprogramowanie kończy swoje działanie.
Rys. 21. Nazwa kraju, dla którego oprogramowanie kończy swoje działanie.

Odpowiedź: Russia

Zadanie 17

W ramach funkcji antydebuggingu złośliwe oprogramowanie sprawdza, czy w systemie działa jakiś proces, którego nazwa jest nazwą debuggera. Jaką nazwę debuggera próbuje sprawdzić, czy jest uruchomiona?

(ang. As an anti-debugging functionality, the malware checks if there is any process running where the process name is a debugger. What is the debugger name it tries to check if that’s running?)

Od razu zwróciła moją uwagę przestrzeń nazw Client.Anty_Analisys. W linii 17 znalazłem odpowiedź na pytanie (o ironio, analizuję teraz tę binarkę właśnie tym narzędziem :)) (Rys. 22).

Rys. 22. Wykryta nazwa debuggera.
Rys. 22. Wykryta nazwa debuggera

Odpowiedź: dnSpy

Zadanie 18

Aby uzyskać trwałość, złośliwe oprogramowanie zapisuje klucz rejestru, który jest zakodowany w złośliwym oprogramowaniu w odwróconym formacie. Jaki jest ten klucz rejestru po odwróceniu?"

(ang. For persistence, the malware writes a Registry key where the registry key is hardcoded in the malware in reversed format. What is the registry key after reversing?)

Kod EmpireClient.exe jest napisany bardzo przejrzyście, dlatego znalezienie przestrzeni nazw odpowiedzialnej za persystencję nie sprawiło żadnego problemu. W przestrzeni nazw Client.Install w linii 54 znalazłem odwróconą nazwę rejestru. Było to jedyne takie wystąpienie, więc bardzo łatwo było je namierzyć (Rys. 23).

Rys. 23. Wykryta nazwa debuggera.
Rys. 23. Wykryta nazwa debuggera

Odpowiedź: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\

Zadanie 19

Złośliwe oprogramowanie ustawia zaplanowane zadanie. Jaki jest poziom uruchamiania (Run Level) dla zaplanowanego zadania/pracy, które ustawia?

(ang. The malware sets a scheduled task. What is the Run Level for the scheduled task/job it sets?)

W tej samej klasie, kilka linii wyżej (linia 42), znalazłem odpowiedź (Rys. 24).

Rys. 24. Wykryta nazwa debuggera.
Rys. 24. Wykryta nazwa debuggera

Odpowiedź: highest