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 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 (), a także omawia, jak podczas analizy można zautomatyzować dekodowanie ciągów za pomocą IDA Hex-Rays API.

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.

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.

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

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.

Ponadto, w zmianach konfiguracyjnych próbka korzysta do filtracji sieciowej nie z biblioteki , 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 . 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 , 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 . 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).

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.

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.

Rysunek 6. Xrefs do funkcji f_decrypt
Ostateczną wersję skryptu można znaleźć na .
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 .
Źródło: habr.com
