În această postare, vom discuta cum grupul cibernetic OceanLotus (APT32 și APT-C-00) a folosit recent una dintre vulnerabilitățile publice privind , o vulnerabilitate de corupție a memoriei în Microsoft Office, și cum malware-ul grupului asigură persistența în sistemele compromise, fără a lăsa urme. Ulterior, vom descrie cum, începând cu 2019, grupul a folosit arhive auto-extractibile pentru a lansa cod.
OceanLotus se specializează în spionaj cibernetic, având ca ținte priorități țările din Asia de Sud-Est. Atacatorii falsifică documente pentru a atrage atenția victimelor potențiale, convingându-le să execute un backdoor, și de asemenea lucrează la dezvoltarea uneltelor. Metodele utilizate pentru a crea momeli variază în diferite atacuri – de la fișiere cu „extensii duale”, arhive auto-extractibile, documente cu macrocomenzi până la exploatarea vulnerabilităților cunoscute.

Utilizarea exploatării în Microsoft Equation Editor
În mijlocul anului 2018, OceanLotus a desfășurat o campanie folosind vulnerabilitatea CVE-2017-11882. Unul dintre documentele dăunătoare ale grupului cibernetic a fost analizat de specialiștii de la 360 Threat Intelligence Center (), incluzând o descriere detaliată a exploatării. În postarea de mai jos – o revizuire a unui astfel de document dăunător.
Prima etapă
Documentul FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3) este similar cu cel menționat în cercetarea de mai sus. Este interesant prin faptul că vizează utilizatorii interesați de politica din Cambodgia (CNRP – Partidul Salvării Naționale a Cambodgiei, desființat la sfârșitul anului 2017). În ciuda extensiei .doc, documentul are format RTF (vezi figura de mai jos), conține cod nestructurat, precum și variante distorsionate.

Figura 1. „Deșeuri” în RTF
În ciuda prezenței elementelor distorsionate, Word reușește să deschidă cu succes acest fișier RTF. Așa cum se vede în figura 2, aici se află structura EQNOLEFILEHDR cu offset-ul 0xC00, urmată de un header MTEF și apoi o înregistrare MTEF (figura 3) pentru font.

Figura 2. Valoarea înregistrării FONT

Figura 3.
Posibilitatea de overflow în câmpul name, deoarece dimensiunea sa nu este verificată înainte de copiere. Un nume prea lung activează vulnerabilitatea. Așa cum se vede din conținutul fișierului RTF (offset 0xC26 în figura 2), bufferul este umplut cu shellcode, urmat de o comandă falsă (0x90) și o adresă de retur 0x402114. Adresa este un element din dialog în EQNEDT32.exe, indicând instrucțiunea RET. Acesta determină ca EIP să indice începutul câmpului name, care conține cod shell.

Figura 4. Începutul codului shell al exploit-ului
Adresa 0x45BD3C păstrează o variabilă care este dereferentiată până ajunge la un pointer la structura încărcată curent MTEFData. Aici se află restul codului shell.
Scopul codului shell este de a executa o a doua bucată de cod shell, înglobată în documentul deschis. La început, codul shell original încearcă să găsească descriptorul fișierului documentului deschis, iterând prin toate descriptoarele sistemului (NtQuerySystemInformation cu argumentul SystemExtendedHandleInformation) și verificând dacă sunt conforme cu PID descriptorului și PID procesului WinWord și dacă documentul a fost deschis cu masca de acces – 0x12019F.
Pentru a confirma descoperirea descriptorului corect (și nu al unui descriptor pentru un alt document deschis), conținutul fișierului este mapat folosind funcția CreateFileMapping, iar codul shell verifică dacă ultimele patru bytes ale documentului sunt „yyyy” (metoda Egg Hunting). Odată ce s-a descoperit o potrivire, documentul este copiat în folderul temporar (GetTempPath) ca ole.dll. Apoi, ultimele 12 bytes ale documentului sunt citite.
![]()
Figura 5. Marcaje pentru sfârșitul documentului
valoare pe 32 de biți între marcaje AABBCCDD și yyyy – este offset-ul următorului cod shell. Acesta este apelat folosind funcția CreateThread. A fost extras același cod shell folosit anterior de grupul OceanLotus. , pe care l-am lansat în martie 2018, funcționează în continuare pentru dump-ul etapei a doua.
A doua etapă
Extracția componentelor
Numele fișierelor și directoarelor sunt selectate dinamic. Codul alege aleatoriu un nume de fișier executabil sau DLL în C:Windowssystem32. Apoi trimite o cerere către resursele sale și extrage câmpul FileDescription pentru a fi folosit ca nume de folder. Dacă acest lucru nu funcționează, codul alege aleatoriu un nume de folder din directoarele %ProgramFiles% sau C:Windows (din GetWindowsDirectoryW). Evită utilizarea unui nume care ar putea intra în conflict cu fișierele existente și se asigură că nu conține următoarele cuvinte: windows, de Microsoft, desktop, sistem, system32. sau syswow64. Dacă directorul există deja, numelui i se adaugă „NLS_{6 caractere}”.
Resursă 0x102 analizat și fișierele sunt descărcate în %ProgramFiles% sau %AppData%, în folderul ales aleatoriu. Timpul de creare este modificat pentru a avea aceleași valori ca și kernel32.dll.
De exemplu, iată folderul și lista de fișiere create prin alegerea fișierului executabil C:Windowssystem32TCPSVCS.exe ca sursa de date.

Figura 6. Extracția diferitelor componente
Structura resursei 0x102 în dropper este destul de complexă. Pe scurt, conține:
— Numele fișierelor
— Dimensiunea și conținutul fișierelor
— Formatul de compresie (COMPRESSION_FORMAT_LZNT1, utilizat de funcția RtlDecompressBuffer)
Primul fișier este resetat ca TCPSVCS.exe, care este legitim AcroTranscoder.exe (conform FileDescription, SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).
Probabil ați observat că dimensiunea unora dintre fișierele DLL depășește 11 MB. Acest lucru se datorează faptului că un buffer mare continuu de date aleatorii este plasat în interiorul fișierului executabil. Nu este exclus ca aceasta să fie o metodă de a evita detectarea de către unele produse de securitate.
Asigurarea persistenței
Resursă 0x101 în dropper conține două numere întregi de 32 de biți, care definesc modul în care ar trebui asigurată persistența. Valoarea primului indică modul în care malware-ul va păstra persistența fără drepturi de administrator.

Tabela 1. Mecanismul de persistență fără drepturi de administrator
Valoarea celui de-al doilea număr întreg indică modul în care malware-ul ar trebui să asigure persistența, funcționând cu drepturi de administrator.

Tabela 2. Mecanismul de persistență cu drepturi de administrator
Numele serviciului este numele fișierului fără extensie; numele afișat este numele folderului, dar dacă acesta există deja, îi este adăugată o etichetă "Revizia 1" (numărul crește până când se găsește un nume neutilizat). Operatorii s-au asigurat că persistența prin serviciu este stabilă – în caz de eșec, serviciul trebuie să fie repornit în termen de 1 secundă. Apoi, valoarea WOW64 a noii chei de registru a serviciului primește valoarea 4, ceea ce indică faptul că este un serviciu de 32 de biți.
O sarcină programată este creată prin intermediul mai multor interfețe COM: ITaskScheduler, ITask, ITaskTrigger, IPersistFile și ITaskScheduler. Practic, malware-ul creează o sarcină ascunsă, stabilește informațiile contului împreună cu informațiile despre utilizatorul curent sau administrator și apoi setează un declanșator.
Aceasta este o sarcină zilnică cu o durată de 24 de ore și intervale între două execuții de 10 minute, ceea ce înseamnă că va fi executată constant.
Bitul malițios
În exemplul nostru, fișierul executabil TCPSVCS.exe (AcroTranscoder.exe) este un software legitim care încarcă DLL-uri care sunt resetate împreună cu acesta. În acest caz, este interesant Flash Video Extension.dll.
Funcția sa DLLMain pur și simplu apelează o altă funcție. Există câteva predicate vagi:

Figura 7. Predicate vagi
După aceste verificări înșelătoare, codul obține secțiunea .text fișiere. TCPSVCS.exe, îi modifică protecția la PAGE_EXECUTE_READWRITE și îl rescrie, adăugând instrucțiuni false:

Figura 8. Secvența de instrucțiuni
La final, la adresa funcției FLVCore::Uninitialize(void), exportată Flash Video Extension.dll, se adaugă instrucțiunea CALL. Aceasta înseamnă că, după încărcarea DLL-ului malițios, când mediul de execuție apelează WinMain în TCPSVCS.exe, pointerul de instrucțiune va indica spre NOP, provocând astfel FLVCore::Uninitialize(void), etapa următoare.
Funcția pur și simplu creează un mutex început cu {181C8480-A975-411C-AB0A-630DB8B0A221}, urmat de numele utilizatorului curent. Apoi, citește fișierul resetat cu extensia *.db3, care conține cod pozițional-independent și folosește CreateThread pentru a executa conținutul.
Conținutul fișierului *.db3 este un shellcode folosit de obicei de grupul OceanLotus. Am reușit din nou să-i despachetăm încărcătura utilă folosind un script emulator, pe care l-am publicat .
Scriptul extrage etapa finală. Acest component este un backdoor pe care l-am analizat deja în . Acesta poate fi definit prin GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} al fișierului binar. Configurarea malware-ului este încă criptată în resursa PE. Are o configurație similară, dar serverele C&C sunt diferite de cele anterioare:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
Grupul OceanLotus demonstrează din nou o combinație de tehnici pentru a evita detectarea. Au revenit cu un plan „îmbunătățit” pentru procesul de infecție. Alegând nume aleatorii și umplând fișierele executabile cu date aleatorii, reduc numărul de IoC de încredere (pe baza hash-urilor și numelui fișierelor). Mai mult, datorită utilizării încărcărilor DLL externe, atacatorii trebuie doar să elimine binarul legitim AcroTranscoder.
Arhive auto-extrăgătoare
După fișierele RTF, grupul a trecut la arhive auto-extrăgătoare (SFX) cu pictograme comune de documente pentru a confuza și mai mult utilizatorul. Despre asta a scris Threatbook (). După lansare, fișierele RAR auto-extractibile sunt resetate și DLL-urile cu extensia .ocx sunt executate, încărcătura finală a căror a fost documentată anterior {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. Începând din ianuarie 2019, OceanLotus reîntrebuințează această tehnică, dar pe parcurs își modifică unele configurații. În această secțiune, vom discuta despre tehnică și modificările sale.
Crearea unei capcane
Documentul THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) a fost găsit pentru prima dată în 2018. Acest fișier SFX a fost creat cu grijă – în descriere (Informații despre versiune) se menționează că acesta este un fișier imagine JPEG. Scriptul SFX este structurat astfel:

Figura 9. Comenzile SFX
Programul malware resetează {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC), precum și o imagine 2018 thich thong lac.jpg.
Imaginea capcană arată astfel:

Figura 10. Imaginea capcană
Probabil ați observat că primele două linii din scriptul SFX apelează de două ori fișierul OCX, dar aceasta nu este o eroare.
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)
Fluxul de control al fișierului OCX este foarte asemănător cu alte componente OceanLotus – multe secvențe de comenzi JZ/JNZ și PUSH/RET, alternându-se cu cod inutil.

Figura 11. Cod obfuscat
După filtrarea codului inutil, exportul DllRegisterServer, apelat regsvr32.exe, arată astfel:

Figura 12. Codul principal al installerului
Practic, la prima apelare DllRegisterServer exportul setează valoarea registrului HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model pentru offset-ul criptat în DLL (0x10001DE0).
Când funcția este apelată a doua oară, aceasta citește aceeași valoare și se execută la această adresă. De acolo sunt citite și executate resursele și multe acțiuni în memorie.
Shellcode-ul este același loader PE folosit în campaniile anterioare OceanLotus. Poate fi emulat cu ajutorul . Ca urmare, acesta resetează db293b825dcc419ba7dc2c49fa2757ee.dll, îl încarcă în memorie și îl execută DllEntry.
DLL-ul extrage conținutul resursei sale, o decriptează (AES-256-CBC) și o decompresează (LZMA). Resursa are un format specific, care este ușor de decompilat.

Figura 13. Structura de configurare a installerului (KaitaiStruct Visualizer)
Configurarea este definită explicit – în funcție de nivelul de privilegii, datele binare vor fi scrise în %appdata%IntellogsBackgroundUploadTask.cpl sau %windir%System32BackgroundUploadTask.cpl (sau SysWOW64 pentru sistemele de 64 de biți).
Apoi, persistența este asigurată prin crearea unei sarcini cu numele BackgroundUploadTask[junk].job, unde [junk] reprezintă un set de octeți 0x9D și 0xA0.
Numele aplicației sarcinii %windir%System32control.exe, iar valoarea parametrului este calea către fișierul binar descărcat. Sarcina ascunsă se pornește în fiecare zi.
Constructiv, fișierul CPL este o DLL cu un nume intern ac8e06de0a6c4483af9837d96504127e.dll, care exportă funcția CPlApplet. Acest fișier decriptează singura sa resursă {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, apoi încarcă această DLL și îi apelează singurul export DllEntry.
Fișierul de configurare a backdoor-ului
Configurația backdoor-ului este criptată și încorporată în resursele sale. Structura fișierului de configurare seamănă foarte mult cu cea anterioară.

Figura 14. Structura configurației backdoor-ului (KaitaiStruct Visualizer)
În ciuda structurii similare, valorile multor câmpuri au fost actualizate în comparație cu datele prezentate în .
Primul element din matricea binară conține DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759), . Dar, deoarece numele exportului a fost eliminat din fișierul binar, hash-urile nu coincid.
Cercetări suplimentare
În timp ce colectam mostre, am observat anumite caracteristici. Mostra descrisă mai sus a apărut aproximativ în iulie 2018, iar altele asemănătoare au apărut recent, la mijlocul lui ianuarie - începutul lui februarie 2019. Ca vector de infecție a fost folosit un arhiv SFX, care descarcă un document legitim de atragere și un fișier malițios OCX.
Deși OceanLotus utilizează timestamp-uri false, am observat că timestamp-urile fișierelor SFX și OCX sunt întotdeauna aceleași (0x57B0C36A (08/14/2016 @ 7:15pm UTC) și 0x498BE80F (02/06/2009 @ 7:34am UTC) respectiv). Probabil, aceasta indică faptul că autorii au un fel de „constructor”, care folosește aceleași șabloane și schimbă pur și simplu anumite caracteristici.
Printre documentele pe care le-am studiat începând din 2018, se întâlnesc diferite denumiri care indică țările de interes pentru atacatori:
— The New Contact Information Of Cambodia Media(New).xls.exe
— 李建香 (个人简历).exe (document PDF fals al unui CV)
— feedback, Rally in USA from July 28-29, 2018.exe
De la descoperirea backdoor-ului {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll și publicarea analizei sale de către mai mulți cercetători, am observat anumite schimbări în datele de configurare ale programelor malițioase.
În primul rând, autorii au început să elimine numele din DLL-urile auxiliare DLLs (DNSprov.dll și două versiuni HttpProv.dll). Apoi, operatorii au încetat să ambaleze al treilea DLL (a doua versiune HttpProv.dll), alegând să integreze doar unul.
În al doilea rând, multe câmpuri de configurare ale backdoor-ului au fost modificate, probabil pentru a evita detectarea, deoarece multe IoC-uri au devenit disponibile. Printre câmpurile importante, modificate de autori, se numără următoarele:
- modificarea secțiunii din registrul AppX (vezi IoC-uri)
- șirul de codificare al mutexului („def”, „abc”, „ghi”)
- numărul portului
În final, toate versiunile noi analizate au adus noi C&C, enumerate în secțiunea IoC-uri.
Conclusions
OceanLotus continuă să se dezvolte. Grupul cibernetic se concentrează pe îmbunătățirea și extinderea instrumentarului și capcanelor. Autorii maschează sarcinile malițioase cu documente atrăgătoare, subiectul cărora este relevant pentru victimele vizate. Ei dezvoltă noi scheme și utilizează instrumente publice, cum ar fi exploit-ul Equation Editor. Mai mult, își îmbunătățesc instrumentele pentru a reduce numărul de artefacte care rămân pe mașinile victimelor, diminuând astfel șansa de detectare de către software-ul antivirus.
Indicatori de compromitere
Indicatorii de compromitere, precum și atributele MITRE ATT&CK sunt disponibile și .
Sursa: habr.com
