W poście opowiemy, jak grupa cyberprzestępcza OceanLotus (APT32 i APT-C-00) niedawno wykorzystała jedno z publicznie dostępnych exploitów do , luki w zabezpieczeniach dotyczącej usuwania pamięci w Microsoft Office, oraz jak złośliwe oprogramowanie tej grupy zapewnia trwałość w skompromitowanych systemach, nie pozostawiając śladów. Następnie opiszemy, jak od początku 2019 roku grupa korzystała z samorozpakowujących się archiwów do uruchamiania kodu.
OceanLotus specjalizuje się w cyberwywiadzie, a jej główne cele to kraje Azji Południowo-Wschodniej. Napastnicy fałszują dokumenty, które przyciągają uwagę potencjalnych ofiar, aby przekonać je do uruchomienia backdoora, a także pracują nad rozwojem narzędzi. Metody, jakie wykorzystują do tworzenia przynęt, różnią się w różnych atakach – od plików z "podwójnym rozszerzeniem", samorozpakowujących się archiwów, dokumentów z makrami po znane exploity.

Wykorzystanie exploita w Microsoft Equation Editor
Pod koniec 2018 roku OceanLotus przeprowadziła kampanię z wykorzystaniem luki CVE-2017-11882. Jeden z złośliwych dokumentów tej grupy został przeanalizowany przez specjalistów z 360 Threat Intelligence Center (), włączając dokładny opis exploita. W poniższym poście – przegląd podobnego złośliwego dokumentu.
Pierwszy etap
Dokument FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3) jest analogiczny do wspomnianego w powyższym badaniu. Jest interesujący, ponieważ jest ukierunkowany na użytkowników interesujących się kambożyjską polityką (CNRP – Partia Narodowego Zbawienia Kambodży, rozwiązana pod koniec 2017 roku). Pomimo rozszerzenia .doc, dokument ma format RTF (zobacz rysunek poniżej), zawiera zbędny kod oraz jest zniekształcony.

Rysunek 1. "Zbędne" w RTF
Pomimo obecności zniekształconych elementów, Word pomyślnie otwiera ten plik RTF. Jak widać na rysunku 2, znajduje się tutaj struktura EQNOLEFILEHDR z przesunięciem 0xC00, po której następuje nagłówek MTEF, a następnie zapis MTEF (rysunek 3) dla fontu.

Rysunek 2. Wartości zapisu FONT

Rysunek 3.
Możliwe przepełnienie w polu name, ponieważ jego rozmiar nie jest sprawdzany przed kopiowaniem. Zbyt długie imię uruchamia lukę. Jak widać z zawartości pliku RTF (przesunięcie 0xC26 na rysunku 2), bufor jest wypełniany shellcode'em, po którym następuje fałszywe polecenie (0x90) oraz adres powrotu 0x402114. Adres jest elementem dialogowym w EQNEDT32.exe, wskazującym na instrukcję RET. To prowadzi do tego, że EIP wskazuje na początek pola name, zawierającego shellcode.

Rysunek 4. Początek shellcode'a exploit
Adres 0x45BD3C przechowuje zmienną, która jest dereferencjonowana, aż osiągnie wskaźnik na aktualną załadowaną strukturę MTEFData. Tutaj znajduje się reszta shellcode'a.
Celem shellcode'a jest wykonanie drugiego fragmentu shellcode'a, wbudowanego w otwarty dokument. Najpierw oryginalny shellcode próbuje znaleźć uchwyt pliku otwartego dokumentu, przeszukując wszystkie uchwyty systemu (NtQuerySystemInformation z argumentem SystemExtendedHandleInformation) i sprawdzając, czy odpowiadają PID uchwytu i PID www.iphones.ru/iNotes/sravnenie-apple-pencil-1-i-apple-pencil-2-chto-izmenilos-11-13-2018 WinWord i czy dokument został otwarty z maską dostępu – 0x12019F.
Aby potwierdzić, że znaleziono prawidłowy uchwyt (a nie uchwyt innego otwartego dokumentu), zawartość pliku jest mapowana przy użyciu funkcji CreateFileMapping, a shellcode sprawdza, czy ostatnie cztery bajty dokumentu to „yyyy» (metoda Egg Hunting). Gdy zostanie wykryta zgodność, dokument jest kopiowany do folderu tymczasowego (GetTempPath) jako ole.dll. Następnie odczytywane są ostatnie 12 bajtów dokumentu.
![]()
Rysunek 5. Wskaźniki końca dokumentu
32-bitowa wartość między wskaźnikami AABBCCDD i yyyy – to przesunięcie następnego shellcode'a. Jest on wywoływany przy użyciu funkcji CreateThread. Wykorzystano ten sam shellcode, który wcześniej stosowała grupa OceanLotus. , który wydaliśmy w marcu 2018 roku, wciąż działa dla zrzutu drugiego etapu.
Drugi etap
Ekstrakcja komponentów
Nazwy plików i katalogów są wybierane dynamicznie. Kod losowo wybiera nazwę pliku wykonywalnego lub pliku DLL w C:\Windowssystem32. Następnie żąda swoich zasobów i wyciąga pole FileDescription do wykorzystania jako nazwa folderu. Jeśli to nie działa, kod losowo wybiera nazwę folderu z katalogów %ProgramFiles% lub C:\Windows z GetWindowsDirectoryW). Unika używania nazw, które mogą kolidować z istniejącymi plikami i dba o to, aby nie zawierały następujących słów: windows, Microsoft, desktop, system, system32 lub syswow64. Jeśli katalog już istnieje, do nazwy dodawane jest „NLS_{6 znaków}”.
Zasób 0x102 jest analizowany i pliki są zrzucane do %ProgramFiles% lub %AppData%, w folderze wybranym losowo. Czas utworzenia jest zmieniany, aby miał te same wartości, co kernel32.dll.
Na przykład, oto folder i lista plików stworzonych poprzez wybór pliku wykonywalnego C:Windowssystem32TCPSVCS.exe jako źródła danych.

Rysunek 6. Ekstrakcja różnych komponentów
Struktura zasobu 0x102 w dropperze jest dość skomplikowana. W skrócie, zawiera:
— Nazwy plików
— Rozmiar i zawartość plików
— Format kompresji (COMPRESSION_FORMAT_LZNT1, używany przez funkcję RtlDecompressBuffer)
Pierwszy plik jest usuwany jako TCPSVCS.exe, który jest legalny AcroTranscoder.exe (zgodnie z FileDescription, SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).
Być może zauważyłeś, że rozmiar niektórych plików DLL przekracza 11 MB. Wynika to z faktu, że duży ciągły bufor danych losowych jest umieszczony wewnątrz pliku wykonywalnego. Może to być sposób na uniknięcie wykrycia przez niektóre produkty zabezpieczające.
Zabezpieczenie trwałości
Zasób 0x101 w dropperze zawiera dwie 32-bitowe liczby całkowite, które określają, w jaki sposób zapewnić trwałość. Wartość pierwsza wskazuje, jak złośliwe oprogramowanie będzie zachowywać trwałość bez uprawnień administratora.

Tabela 1. Mechanizm trwałości bez uprawnień administratora
Wartość drugiej liczby całkowitej wskazuje, jak złośliwe oprogramowanie powinno zapewnić trwałość, działając z prawami administratora.

Tabela 2. Mechanizm trwałości z prawami administratora
Nazwa usługi to nazwa pliku bez rozszerzenia; wyświetlana nazwa to nazwa folderu, ale jeśli już istnieje, dodawany jest do niej ciąg “Revision 1” (numer zwiększa się, aż znajdzie się nieużywana nazwa). Operatorzy zadbali o to, aby trwałość przez usługę była stabilna – w przypadku awarii usługa musi być ponownie uruchomiona po 1 sekundzie. Następnie wartość WOW64 nowego klucza rejestru usługi przyjmuje wartość 4, co wskazuje, że jest to 32-bitowa usługa.
Zadanie planowane jest tworzone przez kilka interfejsów COM: ITaskScheduler, ITask, ITaskTrigger, IPersistFile i ITaskScheduler. W istocie, złośliwe oprogramowanie tworzy ukrytą zadanie, ustawia informacje o koncie razem z informacjami o bieżącym użytkowniku lub administratorze, a następnie ustawia wyzwalacz.
To codzienne zadanie o czasie trwania 24 godziny i przerwach między dwoma wykonaniami wynoszących 10 minut, co oznacza, że będzie wykonywane nieprzerwanie.
Złośliwy bit
W naszym przykładzie plik wykonywalny TCPSVCS.exe (AcroTranscoder.exe) jest legalnym oprogramowaniem, które ładował DLL, które są z nim związane. W tym przypadku interesuje nas Flash Video Extension.dll.
Jego funkcja DLLMain po prostu wywołuje inną funkcję. Obecne są pewne nieostre predykaty:

Rysunek 7. Nieostre predykaty
Po tych wprowadzających w błąd kontrolach kod uzyskuje sekcję .text pliku TCPSVCS.exe, zmieniając jego zabezpieczenia na PAGE_EXECUTE_READWRITE i zapisuje go ponownie, dodając fikcyjne instrukcje:

Rysunek 8. Sekwencja instrukcji
Na końcu do adresu funkcji FLVCore::Uninitialize(void), eksportowanej Flash Video Extension.dll, dodawana jest instrukcja CALL. Oznacza to, że po załadowaniu złośliwej DLL, gdy środowisko uruchomieniowe wywołuje WinMain do TCPSVCS.exe, wskaźnik instrukcji będzie wskazywał na NOP, co spowoduje wywołanie FLVCore::Uninitialize(void), następnego etapu.
Funkcja po prostu tworzy mutex, zaczynający się od {181C8480-A975-411C-AB0A-630DB8B0A221}, po którym następuje aktualna nazwa użytkownika. Następnie odczytuje zrzut pliku z rozszerzeniem *.db3, który zawiera kod niezależny od lokalizacji, i używa CreateThread do wykonania zawartości.
Zawartość pliku *.db3 to kod powłoki, który zwykle wykorzystuje grupa OceanLotus. Znów pomyślnie rozpakowaliśmy jego ładunek, używając skryptu emulatora, który opublikowaliśmy .
Skrypt wyodrębnia końcowy etap. Ten komponent to backdoor, który już analizowaliśmy w . Można to określić po GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} plik binarny. Konfiguracja złośliwego oprogramowania wciąż jest zaszyfrowana w zasobach PE. Ma mniej więcej taką samą konfigurację, ale serwery C&C różnią się od poprzednich:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
Grupa OceanLotus ponownie demonstruje połączenie różnych technik, aby unikać wykrycia. Powrócili z 'ulepszoną' schemą procesu infekcji. Wybierając losowe nazwy i wypełniając pliki wykonywalne losowymi danymi, zmniejszają liczbę wiarygodnych IoC (na podstawie haszy i nazw plików). Ponadto dzięki wykorzystaniu zewnętrznego ładowania DLL, atakujący muszą tylko usunąć legalny plik binarny AcroTranscoder.
Samorozpakowujące archiwa
Po plikach RTF zespół przeszedł do samorozpakowujących (SFX) archiwów z popularnymi ikonami dokumentów, aby jeszcze bardziej zmylić użytkownika. O tym pisał Threatbook (). Po uruchomieniu rozpakowują się samorozpakowujące się pliki RAR i wykonują DLL z rozszerzeniem .ocx, ostateczny ładunek, który wcześniej został udokumentowany {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. Od połowy stycznia 2019 roku OceanLotus ponownie wykorzystuje tę technikę, ale z biegiem czasu zmienia niektóre konfiguracje. W tej sekcji omówimy technikę i zmiany.
Tworzenie przynęty
Dokument THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) po raz pierwszy znaleziono w 2018 roku. Ten plik SFX został stworzony z myślą – w opisie (Version Info) podano, że jest to obraz JPEG. Skrypt SFX wygląda następująco:

Rysunek 9. Komendy SFX
Złośliwe oprogramowanie rozpakowuje {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC), a także obrazek 2018 thich thong lac.jpg.
Obrazek-przynęta wygląda następująco:

Rysunek 10. Obrazek-przynęta
Możliwe, że zauważyłeś, że pierwsze dwie linijki w skrypcie SFX dwukrotnie wywołują plik OCX, ale to nie jest błąd.
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)
Kontrola przepływu pliku OCX bardzo przypomina inne komponenty OceanLotus – wiele sekwencji komend JZ/JNZ i PUSH/RET, przeplatane kodem śmieciowym.

Rysunek 11. Obfuskowany kod
Po przefiltrowaniu kodu śmieciowego eksport DllRegisterServer, wywoływany regsvr32.exe, wygląda następująco:

Rysunek 12. Główny kod instalatora
W zasadzie, przy pierwszym wywołaniu DllRegisterServer eksport ustawia wartość rejestru HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model na zaszyfrowany offset w DLL (0x10001DE0).
Kiedy funkcja jest wywoływana po raz drugi, odczytuje tę samą wartość i wykonuje się pod tym adresem. Stąd odczytywany jest i wykonywany zasób i wiele działań w pamięci operacyjnej.
Shellcode – ten sam loader PE, który był używany w poprzednich kampaniach OceanLotus. Można go emulować za pomocą . W wyniku tego rozpakowuje db293b825dcc419ba7dc2c49fa2757ee.dll, ładuje go do pamięci i wykonuje DllEntry.
DLL wyodrębnia zawartość swojego zasobu, odszyfrowuje (AES-256-CBC) i dekompresuje (LZMA) go. Zasób ma specyficzny format, który łatwo zdekompilować.

Rysunek 13. Struktura konfiguracji instalatora (KaitaiStruct Visualizer)
Konfiguracja została zadeklarowana w sposób jawny – w zależności od poziomu uprawnień dane binarne będą zapisywane w %appdata%IntellogsBackgroundUploadTask.cpl lub %windir%System32BackgroundUploadTask.cpl (lub SysWOW64 dla systemów 64-bitowych).
Dalsza persystencja jest zapewniana poprzez utworzenie zadania o nazwie BackgroundUploadTask[junk].job, gdzie [junk] reprezentuje zbiór bajtów 0x9D i 0xA0.
Nazwa aplikacji zadania %windir%System32control.exe, a wartość parametru to ścieżka do wyeksportowanego pliku binarnego. Ukryte zadanie uruchamia się codziennie.
Konstrukcyjnie plik CPL jest DLL z wewnętrzną nazwą ac8e06de0a6c4483af9837d96504127e.dll, który eksportuje funkcję CPlApplet. Ten plik odszyfrowuje swój jedyny zasób {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, następnie ładuje tę DLL i wywołuje jej jedyny eksport DllEntry.
Plik konfiguracyjny backdoora
Konfiguracja backdoora jest zaszyfrowana i wbudowana w jego zasoby. Struktura pliku konfiguracyjnego jest bardzo podobna do poprzedniej.

Rysunek 14. Struktura konfiguracji backdoora (KaitaiStruct Visualizer)
Mimo podobnej struktury, wartości wielu pól zostały zaktualizowane w porównaniu z danymi przedstawionymi w .
Pierwszy element binarnej tablicy zawiera DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759), . Jednak ponieważ nazwa eksportu została usunięta z pliku binarnego, hashe się nie zgadzają.
Dodatkowe badania
Podczas zbierania próbek zauważyliśmy pewne cechy. Opisany właśnie próbka pojawiła się około lipca 2018 roku, a inne podobne jej – całkiem niedawno, w połowie stycznia – na początku lutego 2019 roku. Jako wektor zakażenia użyto archiwum SFX, które zrzuca legalny dokument przynętę oraz złośliwy plik OCX.
Mimo że OceanLotus używa fałszywych znaczników czasu, zauważyliśmy, że znaczniki czasu plików SFX i OCX są zawsze takie same (0x57B0C36A (08/14/2016 @ 7:15pm UTC) i 0x498BE80F (02/06/2009 @ 7:34am UTC) odpowiednio). Prawdopodobnie wskazuje to na to, że autorzy mają jakiś „kreator”, który używa tych samych szablonów i po prostu zmienia niektóre cechy.
Wśród dokumentów, które badaliśmy od początku 2018 roku, pojawiały się różne nazwy, wskazujące na zainteresowane kraje ataków:
— Nowe dane kontaktowe kambodżańskich mediów (Nowe).xls.exe
— 李建香 (个人简历).exe (fałszywy dokument pdf CV)
— feedback, Rally w USA w dniach 28-29 lipca 2018.exe
Od momentu wykrycia backdoora {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll i opublikowania jego analizy przez kilku badaczy zauważyliśmy pewne zmiany w danych konfiguracyjnych złośliwego oprogramowania.
Po pierwsze, autorzy zaczęli usuwać nazwy z pomocniczych DLL (DNSprov.dll i dwie wersje HttpProv.dll). Następnie operatorzy przestali pakować trzecią DLL (druga wersja HttpProv.dll), wybierając tylko jedną integrację.
Po drugie, wiele pól konfiguracyjnych backdoora zostało zmienionych, prawdopodobnie w celu uniknięcia wykrycia, ponieważ wiele IoCs stało się dostępnych. Wśród ważnych pól zmienionych przez autorów znajdują się następujące:
- zmieniona sekcja rejestru AppX (zob. IoCs)
- ciąg kodowania mutexu („def”, „abc”, „ghi”)
- numer portu
Na koniec, we wszystkich nowych analizowanych wersjach pojawiły się nowe C&C, wymienione w sekcji IoCs.
Wnioski
OceanLotus nadal się rozwija. Grupa cybernetyczna skupia się na udoskonalaniu i rozszerzaniu narzędzi oraz wabików. Autorzy maskują złośliwe ładunki za pomocą zauważalnych dokumentów, których tematy są aktualne dla rzekomych ofiar. Opracowują nowe schematy, a także wykorzystują ogólnodostępne narzędzia, takie jak exploit Equation Editor. Ponadto doskonalą narzędzia, aby zredukować liczbę artefaktów pozostających na maszynach ofiar, tym samym zmniejszając szansę na wykrycie przez oprogramowanie antywirusowe.
Wskaźniki kompromitacji
Wskaźniki kompromitacji, a także atrybuty MITRE ATT&CK są dostępne i .
Źródło: habr.com
