OceanLotus: aktualizacja złośliwego oprogramowania dla macOS

W marcu 2019 roku do VirusTotal, popularnej usługi skanowania online, przesłano nowy próbkę złośliwego oprogramowania dla macOS od grupy cybernetycznej OceanLotus. Plik wykonywalny backdoora posiada te same możliwości, co poprzednio badana wersja malware dla macOS, ale jego struktura się zmieniła i stało się trudniejsze do wykrycia. Niestety nie udało nam się znaleźć droppera związanego z tym próbką, dlatego na razie nie wiemy, jak wygląda wektor infekcji.

Niedawno opublikowaliśmy post na temat OceanLotus oraz o tym, jak operatorzy starają się zapewnić trwałość, przyspieszyć wykonanie kodu i zminimalizować ślady swojej obecności w systemach Windows. Wiadomo również, że ta grupa cybernetyczna ma komponent dla macOS. W tym poście szczegółowo opisano zmiany w najnowszej wersji malware dla macOS w porównaniu do poprzedniej wersji (opisanej przez Trend Micro), a także omawia, jak podczas analizy można zautomatyzować dekodowanie ciągów za pomocą IDA Hex-Rays API.

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS

Analiza

W następnych trzech częściach opisany zostanie proces analizy próbki o haszu SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. Plik nazywa się flashlightd, a produkty antywirusowe ESET wykrywają go jako OSX/OceanLotus.D.

Antydebugging i ochrona przed piaskownicami

Jak wszystkie binarka macOS OceanLotus, próbka jest spakowana za pomocą UPX, ale większość narzędzi identyfikacyjnych nie rozpoznaje go jako takiego. Prawdopodobnie dlatego, że zazwyczaj zawierają one podpis uzależniony od obecności ciągu “UPX”, ponadto sygnatury Mach-O są rzadziej spotykane i nie tak często aktualizowane. Ta cecha utrudnia statyczne wykrywanie. Ciekawe, że po rozpakowaniu punkt wejściowy znajduje się na początku sekcji __cfstring w segmencie .TEXT. W tej sekcji znajdują się atrybuty flag, jak pokazano na poniższym rysunku.

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS
Rysunek 1. Atrybuty sekcji MACH-O __cfstring

Jak pokazano na rysunku 2, lokalizacje kodu w sekcji __cfstring pozwalają oszukać niektóre narzędzia dezasemblujące, wyświetlając kod w postaci ciągów.

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS
Rysunek 2. Kod backdoora zdefiniowany przez IDA jako dane

Po uruchomieniu pliku wykonywalnego tworzy on wątek jako środek ochrony przed debugowaniem, którego jedynym celem jest ciągłe sprawdzanie obecności debuggera. W tym celu wątek:

— Próbuje odłączyć jakiegokolwiek debuggera, wywołując ptrace z PT_DENY_ATTACH jako parametr żądania
— Sprawdza, czy nie są otwarte niektóre wyjątkowe porty, wywołując funkcję task_get_exception_ports
— Sprawdza, czy debugger jest podłączony, jak pokazano na poniższym rysunku, poprzez weryfikację obecności flagi P_TRACED w bieżącym procesie

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS
Rysunek 3. Sprawdzenie połączenia debuggera za pomocą funkcji sysctl

Jeśli schemat nadzorujący wykryje obecność debuggera, wywoływana jest funkcja exit. Następnie próbka sprawdza środowisko, wykonując dwa polecenia:

ioreg -l | grep -e "Manufacturer" i sysctl hw.model

Po tym próbka sprawdza wartość zwracającą według twardo zakodowanej listy znanych systemów wirtualizacji: acle, vmware, virtualbox lub parallels. Na koniec następne polecenie sprawdza, czy maszyna jest jednym z poniższych modeli „MBP”, „MBA”, „MB”, „MM”, „IM”, „MP” i „XS”. To są kody modeli systemu, na przykład „MBP” oznacza MacBook Pro, „MBA” – MacBook Air itp.

system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'

Główne dodatki

Pomimo że polecenia backdoora nie zmieniły się od czasu badania Trend Micro, zauważyliśmy kilka innych modyfikacji. Serwery C&C używane w tej próbce są dość nowe, ich data utworzenia to 22.10.2018.

daff.faybilodeau[.]com
sarc.onteagleroad[.]com
au.charlineopkesston[.]com

Adres URL zasobu zmienił się na /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Pierwszy pakiet wysyłany do serwera C&C zawiera więcej informacji o maszynie gospodarza, w tym wszystkie dane zbierane przez polecenia z poniższej tabeli.

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS

Ponadto, w zmianach konfiguracyjnych próbka korzysta do filtracji sieciowej nie z biblioteki libcurl, lecz z zewnętrznej biblioteki. Aby ją znaleźć, backdoor próbuje odszyfrować każdy plik w bieżącym katalogu, korzystając z AES-256-CBC z kluczem gFjMXBgyXWULmVVVzyxy, uzupełnionym zerami. Każdy plik jest odszyfrowywany i zapisywany jako /tmp/store, a próba jego załadowania jako biblioteki jest realizowana za pomocą funkcji dlopen. Kiedy próba odszyfrowania prowadzi do pomyślnego wywołania dlopen, backdoor wyciąga eksportowane funkcje Boriry i ChadylonV, które, jak się wydaje, odpowiadają za interakcję sieciową z serwerem. Nie mamy droppera ani innych plików z oryginalnej lokalizacji próbki, więc nie możemy przeanalizować tej biblioteki. Co więcej, ponieważ komponent jest zaszyfrowany, reguła YARA oparta na tych linijkach nie będzie pasować do pliku znalezionego na dysku.

Jak opisano w wyżej wspomnianym artykule, tworzony jest cliendIDTen identyfikator jest hashem MD5 zwracaną wartością jednej z następujących komend:

ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, """); printf("%s", line[4]); }'
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, """); printf("%s", line[4]); }'
ifconfig en0 | awk '/ether /{print $2}' (pobierz adres MAC)
— nieznana komenda ("x1ex72x0a"), która jest używana w poprzednich przykładach

Przed haszowaniem do zwracanej wartości dodawany jest znak „0” lub „1”, wskazujący na obecność uprawnień root. Ten clientID jest przechowywany w /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, jeśli kod jest uruchamiany jako root lub w ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML w pozostałych przypadkach. Plik jest zazwyczaj ukryty za pomocą funkcji _chflags, jego znacznik czasu jest zmieniany za pomocą polecenia touch –t z losową wartością.

Deszyfrowanie łańcuchów

Jak w poprzednich wersjach, ciągi są szyfrowane za pomocą AES-256-CBC (szesnastkowy klucz: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 uzupełniony zerami, a IV wypełniony zerami) za pomocą funkcji CCCrypt. Klucz został zmieniony w porównaniu do wcześniejszych wersji, ale ponieważ grupa nadal używa tego samego algorytmu szyfrowania ciągów, dezyfracja może być zautomatyzowana. Poza tym wpisem wydajemy skrypt IDA korzystający z API Hex-Rays do dekodowania ciągów obecnych w pliku binarnym. Ten skrypt może pomóc w przyszłej analizie OceanLotus i analizie istniejących próbek, których jeszcze nie udało się pozyskać. Podstawą skryptu jest uniwersalna metoda uzyskiwania argumentów przekazywanych do funkcji. Ponadto przeszukuje ono przypisania parametrów. Metoda może być używana wielokrotnie, aby uzyskać listę argumentów funkcji, a następnie przekazać je do wywołania zwrotnego.

Znając prototyp funkcji decrypt, skrypt znajduje wszystkie wzmianki tej funkcji, wszystkie argumenty, następnie dezyfruje dane i umieszcza czysty tekst wewnątrz komentarza pod adresem wzmianki. Aby skrypt działał poprawnie, musi być zainstalowany niestandardowy alfabet wykorzystywany przez funkcję dekodowania base64 i musi być zdefiniowana globalna zmienna zawierająca długość klucza (w tym przypadku DWORD, patrz rysunek 4).

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS
Rysunek 4. Definicja globalnej zmiennej key_len

W oknie Function można kliknąć prawym przyciskiem myszy na funkcję deszyfracji i wybrać „Wyodrób i zdeszyfruj argumenty”. Skrypt powinien umieszczać zdeszyfrowane ciągi w komentarzach, jak pokazano na rysunku 5.

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS
Rysunek 5. Zdeszyfrowany tekst umieszczony w komentarzach

W ten sposób zdeszyfrowane ciągi są wygodnie umieszczone razem w oknie IDA xrefs dla tej funkcji, jak pokazano na rysunku 6.

OceanLotus: aktualizacja złośliwego oprogramowania dla macOS
Rysunek 6. Xrefs do funkcji f_decrypt

Ostateczną wersję skryptu można znaleźć na repozytorium GitHub.

Wnioski

Jak już wspomniano, OceanLotus nieustannie doskonali i aktualizuje swój zestaw narzędzi. Tym razem grupa cybernetyczna ulepszyła złośliwe oprogramowanie do pracy z użytkownikami Mac. Kod nie zmienił się znacząco, ale ponieważ wielu użytkowników Mac ignoruje produkty zabezpieczające, ochrona przed wykryciem malware'u ma drugorzędne znaczenie.

Produkty ESET już wykrywały ten plik w momencie badania. Ponieważ biblioteka sieciowa używana do komunikacji C&C jest teraz zaszyfrowana na dysku, dokładny protokół sieciowy używany przez atakujących pozostaje obecnie nieznany.

Wskaźniki kompromitacji

Wskaźniki kompromitacji, a także atrybuty MITRE ATT&CK są również dostępne w GitHub.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster