Przewiń do głównej treści

Malicious VBA analysis - LetsDefend

·1341 słów·7 min·
Blueteam Macro Phishing
CyberZgroza
Autor
CyberZgroza

Ostatnio siedzę sobie na platformie LetsDefend. To takie HTB, tylko dla blue team (niedawno stali się częścią tego drugiego przez wykupienie). I póki co naprawdę mi się podoba i sprawdza. Mają naprawdę sporo materiałów, z czego większość jest darmowa. Dla kogoś kogo interesuje praca w SOC, czy IR opcja na pewno do sprawdzenia. I moja ulubiona część, którą się dziś zajmę - analiza malware’u. Twórcy platformy udostępniają nam prawdziwe, złośliwe oprogramowanie do analizy statycznej i dynamicznej - oczywiście w celach edukacyjnych.

Dzisiaj będzie o złośliwych makrach VBA (Visual Basic for Applications) w ramach challenge’u “Malicious VBA”.

Opis
#

Jeden z pracowników otrzymał podejrzany dokument jako załącznik w mailu. Zostaje ci przekazany do dalszej analizy. Udaje ci się wyciągnąć z niego ciągi strings. Musimy je zdekodować i odpowiedzieć na pytania.

Analiza statyczna
#

Nazwa pliku: invoice.vb MD5: 36545FACF925FFA371FEC7578993DE79 SHA256: A9E02A6C316B3D7659B48621015D504820337F1F88DD588B75597DB95750D16E Narzędzie: FlareVM (W10)

Do analizy statycznej wykorzystam maszynę wirtualną W10 z nakładką FlareVM - stworzoną specjalnie do analizy malware’u. Sam plik można przesłać za pomocą SCP z maszyny wirtualnej LetsDefend na naszą. Po tym należy wyłączyć kartę sieciową, aby nie doszło do sytuacji w której malware zostanie przypadkowo uruchomiony i rozprzestrzeni się w sieci. Warto również utworzyć kopię pliku i nie pracować na oryginale, a także “rozbroić” malware zmieniając jego rozszerzenie na np. “.nerf”.

Z opisu wynika, że wstępna analiza została wykonana. Na pierwszy rzut oka wygląda to na skrypt w Visual Basic. Język ten jest używany w makrach, np. w dokumentach Worda.

Za pomocą narzędzia file, rozpoznajemy typ pliku.

LD1_1

Zwykły plik tekstowy, linie kończą się znakami Carriage Return + Line Feed (\r\n).

Weźmy plik pod lupę za pomocą edytora HEX - HxD. Zobaczymy, czy uda nam się rozpoznać sygnaturę pliku patrząc na pierwszy offset (00000000).

LD1_2

W tym przypadku nie ma specyficznej sygnatury. Dodatkowo wygląda na to, że plik zawiera wspomniane, zidentyfikowane makra wraz z komentarzami. Otworzymy plik w edytorze kodu - Visual Studio Code.

Poniżej fragment pliku invoice.vb.nerf

LD1_3

Włączymy rozpoznawanie kodu na Visual Basic, żeby mieć podświetlenie.

LD1_4

Od razu lepiej.

Kod został podzielony na kilka większych fragmentów. Pierwszy fragment to najpewniej wyciągnięte ciągi strings, bezpośrednio z dokumentu “.docm” (dokument Word z makrami). Typ dokumentu jest określony jako OpenXML - są to archiwa ZIP w którym znajdują się m.in. pliki XML, z których składają się dokumenty MS Office np. “.docx”, “.xlsx”, “.pptx” i opisują elementy takie jak użyty styl, czcionka, obrazy. Pliki “.docm” również do nich należą - litera “m” oznacza makra.

Widzimy, że zastosowano w kodzie metody obfuskacji. Po pierwsze, argumenty funkcji (pomarańczowe) są zakodowane w formacie heksadecymalnym np. “68747470733a2f2f74696e” lub “4d53584d4c322e”. Widzimy również powtarzające się ciągi znaków, będące zmiennymi np. “vxedylctlyqvkl”, czy funkcjami np. “hgmneqolwgxg”. Nie jest to żaden znany mi kod. Możliwe, że jest to losowy ciąg znaków, którym zastąpiono pierwotne nazwy funkcji, aby utrudnić analizę - na szczęście znamy ich kontekst w kodzie oraz pełne definicje. Po drugie, zmienne string zostały podzielone na części (string splitting) - wskazują na to znaki &, służące do konkatenacji. Zastosowane metody obfuskacji mają na celu: uniknięcie wykrycia przez narzędzia bezpieczeństwa np. sandboxy skanujące załączniki, jak Mimecast, a także utrudnienie analizy kodu.

Pierwszy fragment zaczyna się od słowa Private Sub. Sub to procedura, która wykonuje jakieś określone instrukcje i nie zwraca wartości. Słowo Private oznacza, że procedura jest dostępna tylko dla innych procedur w tym samym module. Więc trochę jak funkcja private void() w C++.

Następnie mamy deklarację zmiennych - string, obiekty (czyli taki ogólny, uniwersalny typ) oraz int. Zmieńmy nazwy sub-ów, zmiennych oraz funkcji na łatwiejsze do odczytania.

LD1_5

Po zdekodowaniu ciągów znaków za pomocą CyberChefa widzimy m.in. adres URL, skrócony za pomocą narzędzia TinyURL - najpewniej w celu obfuskacji prawdziwego, złośliwego adresu. Widoczna jest również nazwa pliku .EXE, która może sugerować, że pod nią zapisywany na systemie jest pobierany dodatkowy malware. Funkcja Environ odczytuje wartość zmiennej środowiskowej TEMP. Mamy prawdopodobnie do czynienia z downloaderem, czyli kategorią malware’u, którego głównymi zadaniami są uniknięcie wykrycia przez narzędzia jak AV oraz pobranie właściwego złośliwego oprogramowania, wykonującego główny cel.

LD1_6

Tworzony jest obiekt COM (Component Objecy Model, pozwala korzystać z komponentów systemu) MSXML2.ServerXMLHTTP.6.0 do wysyłania zapytań HTTP/HTTPS. W tym przypadku jest to żądanie GET ze spreparowanym User-Agentem. Pobrany payload jest zapisywany na dysk do pliku dropped.exe (object_2.SaveToFile string_2, 2). Ignorowany jest błąd certyfikatu SSL/TLS (object_1.setOption(2) = 13056). Pozwala to bezproblemowo połączyć się z serwerem C2, nawet jeśli certyfikat jest nieważny lub self-signed. Użyto obiektu ADODB[.]Stream (ActiveX Data Objects) do zapisu pliku binarnego. Kod wykonuje się automatycznie po otwarciu pliku Word (Sub AutoOpen())

LD1_7

To fragment VBA, który dekoduje ciąg znaków zapisany w HEX do tekstu (ASCII). Funkcja func_1(string_3) przechodzi po wejściowym stringu co 2 znaki (Step 2), wycina kolejne bajty za pomocą Mid$(), dodaje prefiks &H (format liczby szesnastkowej w VBA), konwertuje je na wartość liczbową przez Val(), a następnie zamienia na znak przy użyciu Chr$(). Wynik jest składany znak po znaku przez konkatenację.

LD1_8

Przechodzimy do jednego z makr VBA - cuabumrbh.bas.

Procedura sub_2 służy jako prosty launcher poleceń systemowych. Wewnątrz wykorzystywany jest obiekt COM WScript.Shell (uruchamianie poleceń systemowych), którego nazwa jest celowo ukryta przez podzielenie na dwa fragmenty i dekodowanie funkcją func_2, w identyczny sposób jak func_1. Następnie metoda .Run uruchamia przekazany argument string_4, a parametr 0 powoduje start procesu w ukrytym oknie.

LD1_9

Kolejne makro - cwzbjoiuq.bas.

W przypadku błędu uruchom procedurę sub_2 z argumentem string_6. W przypadku braku błędu uruchom func_3(string_6).

LD1_10

Makro lkxosgcqm.bas.

Funkcja func_3 - Utworzenie procesu (winmgmts:\\.\root\cimv2:Win32_Process) oraz dekodowanie - func_4, jak w przypadku func_1.

LD1_11

Timeline
#

  1. User otwiera dokument .docm zawierający makra VBA
  2. Tworzony jest Request GET pod adres hxxps://tinyurl[.]com/g2z2gh6f
  3. Pobierany jest malware i zapisywany na dysk w lokalizacji tymczasowej TEMP/dropped.exe
  4. Pobrany plik jest uruchamiany za pomocą polecenia WScript.Shell.Run. Jeśli to nie zadziała, uruchamiany jest za pomocą winmgmts:\\.\root\cimv2:Win32_Process TEMP/dropped.exe.

Podsumowując: mamy do czynienia z downloaderem. Jest to rodzaj malware’u, którego głównymi zadaniami są: uniknięcie wykrycia przez narzędzia bezpieczeństwa takie jak AV oraz pobranie i uruchomienie właściwego malware’u.

Analizując URL w VirusTotal mamy następujący wynik. Oznaczona jest jako złośliwa/związana ze złośliwą działalnością.

LD1_12

Za pomocą strony wheregoes[.]com udało się ustalić docelowy adres.

LD1_13

Analiza dynamiczna
#

Docelowy adres uruchomiono w sandboxie ANYRUN z nadzieją, że uda się uzyskać oryginalny malware, który miał być pobierany przez makro. Wygląda jednak na to, że link wygasł i został zablokowany przez TinyURL.

LD1_14

Próbowałem znaleźć zapis strony w Wayback Machine, ale zachował się jedynie jeden zapis, prowadzący do tej samej strony powyżej.

LD_19

Dalsza analiza
#

Przeanalizowałem z ciekawości badany plik invoice.vb sam w sobie - mimo, że zgodnie z opisem, to zawiera on tylko część zidentyfikowanych ciągów strings i nie jest pełnym dokumentem .docm, a co za tym idzie ma inny hash. Raport na VirusTotal zaznacza, że plik invoice.vb jest złośliwy.

LD1_15

Podsumowanie wykorzystywanych taktyk w MITRE ATT&CK.

LD1_17

W dalszej części analizy VT są wymienione domeny, z którymi makra miały się komunikować.

LD1_16

Udało mi się jednak znaleźć artykuł z lipca 2024, w którym wymieniono domenę fp2e7a[.]wpc[.]phicdn[.]net wykorzystywaną w kampanii ransomware rosyjskiej grupy CyberVolk - hxxps://detect[.]fyi/cybervolks-ransomware-ad38134b1b0a.

Na Wayback Machine udało mi się znaleźć zapis strony i nie uwieżycie…

Możliwe, że makra pobierały oprogramowanie ransomware z serwera webowego nginx.

LD1_18

Z tego miejsca wymagana jest głębsza analiza zespołu Threat Intelligence. Istotne są tu informacje czy jest to pierwszy tego typu atak na naszą organizację, czy jest to kampania wycelowana specyficznie w naszą firmę, czy szerszą grupę? Z jakiego serwera mailowego została wysłana wiadomość?

Pytania
#

Skoro mamy już zebrane informacje i IOC - przejdźmy do pytań.

Pytanie 1
#

The document initiates the download of a payload after the execution, can you tell what website is hosting it?

Odp. hxxps://tinyurl[.]com/g2z2gh6f

Pytanie 2
#

What is the filename of the payload (include the extension)?

Odp. dropped.exe

Pytanie 3
#

What method is it using to establish an HTTP connection between files on the malicious web server?

Odp. msxml2[.]serverxmlhttp

Pytanie 4
#

What user-agent string is it using?

Odp. mozilla/4.0 (compatible; msie 6.0; windows nt 5.0)

Pytanie 5
#

What object does the attacker use to be able to read or write text and binary files?

Odp. adodb[.]stream

Pytanie 6
#

What is the object the attacker uses for WMI execution? Possibly they are using this to hide the suspicious application running in the background.

Odp. winmgmts:\\.\root\cimv2:win32_process

Related

Hack The Box Sherlock - PhishNet
·830 słów·4 min
HTB DFIR Phishing
Analiza maila z incydentu phishingowego
Hack The Box Sherlock - meerkat
·1090 słów·6 min
HTB DFIR Wireshark
Powłamaniowa analiza ruchu sieciowego oraz CVE-2022-25237
Hack The Box Sherlock - i-like-to
·1684 słów·8 min
HTB DFIR Windows
Powłamaniowa analiza logów, CVE-2023-34362