OceanLotus: actualizare malware pentru macOS

În martie 2019, un nou specimen de malware pentru macOS al grupului cibernetic OceanLotus a fost încărcat pe VirusTotal, un serviciu online popular de scanare. Fișierul executabil al backdoor-ului are aceleași capacități ca versiunea anterioară a malware-ului pentru macOS pe care am studiat-o, dar structura sa s-a schimbat și a devenit mai greu de detectat. Din păcate, nu am reușit să găsim dropper-ul asociat cu acest specimen, așa că nu știm încă vectorul de infecție.

Recent am publicat o postare despre OceanLotus și despre cum operatorii încearcă să asigure persistența, să accelereze execuția codului și să minimizeze urmele prezenței în sistemele Windows. De asemenea, se știe că acest grup cibernetic are și un component pentru macOS. În această postare, se detaliază schimbările din cea mai recentă versiune a malware-ului pentru macOS în comparație cu varianta anterioară (descrisă de Trend Micro), și se explică cum analiza poate automatiza decriptarea șirurilor folosind API-ul IDA Hex-Rays.

OceanLotus: actualizare malware pentru macOS

Analiză

În următoarele trei părți se va descrie analiza specimenului cu hash-ul SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. Fișierul se numește flashlightd, produsele antivirus ESET îl detectează ca OSX/OceanLotus.D.

Anti-debugging și protecția împotriva sandbox-urilor

Ca toate fișierele binare OceanLotus pentru macOS, specimenul este ambalat cu UPX, dar majoritatea instrumentelor de identificare a ambalatorilor nu îl recunosc ca atare. Probabil, din cauză că acestea conțin în principal o semnătură dependentă de prezența șirului “UPX”, în plus, semnăturile Mach-O apar mai rar și nu sunt actualizate atât de frecvent. Această caracteristică îngreunează detectarea statică. Interesant este că, după deambalare, punctul de intrare se află la începutul secțiunii __cfstring din segmentul .TEXT. Această secțiune are atribute flag, așa cum se arată în figura de mai jos.

OceanLotus: actualizare malware pentru macOS
Figura 1. Atributele secțiunii MACH-O __cfstring

Așa cum se arată în figura 2, locațiile codului din secțiune __cfstring permit păcălirea unor instrumente de disassemblare, afișând codul sub formă de șiruri.

OceanLotus: actualizare malware pentru macOS
Figura 2. Codul backdoor-ului este identificat de IDA ca date

După execuție, fișierul binar creează un threaad ca mijloc de protecție împotriva debugging-ului, singurul său scop fiind monitorizarea continuă a prezenței unui debugger. Pentru aceasta, thread-ul:

— Încearcă să detaseze orice debugger, apelând la ptrace de PT_DENY_ATTACH ca parametru de cerere
— Verifică dacă anumite porturi excepționale sunt deschise, apelând funcția task_get_exception_ports
— Verifică dacă debuggerul este conectat, așa cum este ilustrat în figura de mai jos, prin verificarea existentă a flagului P_TRACED în procesul curent

OceanLotus: actualizare malware pentru macOS
Figura 3. Verificarea conexiunii debuggerului prin funcția sysctl

Dacă schema de monitorizare detectează prezența debuggerului, este apelată funcția exit. În plus, apoi, mostrează verifică mediu, executând două comenzi:

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

După aceea, mostrează verifică valoarea returnată conform unei liste hardcodate de șiruri de sisteme de virtualizare cunoscute: acle, vmware, virtualbox sau parallels. În cele din urmă, următoarea comandă verifică dacă mașina este unul dintre următoarele „MBP”, „MBA”, „MB”, „MM”, „IM”, „MP” și „XS”. Acestea sunt codurile de model ale sistemului, de exemplu, „MBP” înseamnă MacBook Pro, „MBA” – MacBook Air etc.

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

Extensii principale

Cu toate că comenzile backdoor-ului nu s-au schimbat de la cercetarea Trend Micro, am observat câteva alte modificări. Serverele C&C folosite în această mostră sunt relativ noi, data lor de creare fiind 22.10.2018.

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

Resursa URL s-a schimbat în /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Primul pachet trimis la serverul C&C conține mai multe informații despre mașina gazdă, inclusiv toate datele colectate de comenzile din tabelul de mai jos.

OceanLotus: actualizare malware pentru macOS

În plus, modificările de configurare, mostra folosește pentru filtrarea rețelei nu biblioteca libcurl, ci o bibliotecă externă. Pentru a o găsi, backdoor-ul încearcă să decripteze fiecare fișier din directorul curent, folosind AES-256-CBC cu o cheie gFjMXBgyXWULmVVVzyxy, completată cu zerouri. Fiecare fișier este decriptat și salvat ca /tmp/store, iar încercarea de a-l încărca ca bibliotecă este efectuată folosind funcția dlopen. Atunci când încercarea de decriptare duce la un apel de succes dlopen, backdoor-ul extrage funcțiile exportate Boriry și ChadylonV, care aparent sunt responsabile pentru interacțiunea de rețea cu serverul. Nu avem dropperul sau alte fișiere din locația inițială a mostrei, astfel încât nu putem analiza această bibliotecă. Mai mult, deoarece componenta este criptată, regula YARA bazată pe aceste șiruri nu va corespunde fișierului găsit pe disc.

Așa cum este descris în articolul menționat anterior, se creează cliendIDAcest identificator este un hash MD5 al valorii returnate de una dintre următoarele comenzi:

— 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}' (obțineți adresa MAC)
— comandă necunoscută („x1ex72x0a„), care este folosită în exemplele anterioare

Înainte de a fi hashtuit, valorii returnate i se adaugă un simbol „0” sau „1”, indicând prezența privilegiilor de root. Acest clientID este stocat în /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, dacă codul este executat de root sau în ~\/Library\/SmartCardsServices\/Technology\/PlugIns\/drivers\/snippets.ecgML în toate celelalte cazuri. Fișierul este de obicei ascuns cu ajutorul funcției _chflags, timestamp-ul său este modificat cu comanda touch –t cu o valoare aleatorie.

Dezvăluirea string-urilor

La fel ca și în versiunile anterioare, string-urile sunt criptate folosind AES-256-CBC (cheie hexadecimală: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 umplut cu zerouri, iar IV-ul este umplut cu zerouri) prin funcția CCCrypt. Cheia a fost schimbată în comparație cu versiunile anterioare, dar, deoarece grupul folosește în continuare aceeași metodă de criptare a string-urilor, decriptarea poate fi automatizată. Pe lângă această postare, lansăm un script IDA care folosește API-ul Hex-Rays pentru a decripta string-urile prezente în fișierul binar. Acest script poate ajuta la analiza viitoare a OceanLotus și la analiza mostrelor existente, pe care încă nu am reușit să le obținem. La baza scenariului se află o metodă universală de obținere a argumentelor transmise funcției. În plus, caută asocierile parametrilor. Metoda poate fi reutilizată pentru a obține o listă de argumente pentru funcție și apoi a le transmite la callback.

Știind prototipul funcției decrypt, scriptul găsește toate referințele încrucișate la această funcție, toate argumentele, apoi decriptează datele și plasează textul simplu în comentarii la adresa referinței încrucișate. Pentru ca scriptul să funcționeze corect, trebuie să fie setat un alfabet personalizat folosit de funcția de decodare base64, iar o variabilă globală trebuie să fie definită, conținând lungimea cheii (în acest caz DWORD, vezi figura 4).

OceanLotus: actualizare malware pentru macOS
Figura 4. Definirea variabilei globale key_len

În fereastra Function, poți apela funcția de decriptare cu clic dreapta și selecta „Extrage și decriptează argumentele”. Scriptul trebuie să insereze șirurile decriptate în comentarii, așa cum este ilustrat în figura 5.

OceanLotus: actualizare malware pentru macOS
Figura 5. Textul decriptat este plasat în comentarii

Astfel, șirurile decriptate sunt convenabil plasate împreună în fereastra IDA xrefs pentru această funcție, așa cum este arătat în figura 6.

OceanLotus: actualizare malware pentru macOS
Figura 6. Xrefs pentru funcția f_decrypt

Varianta finală a scriptului poate fi găsită la Github repository.

Ieșire

Așa cum s-a menționat, OceanLotus își îmbunătățește și actualizează în mod constant setul de instrumente. De data aceasta, grupul cibernetic a îmbunătățit malware-ul pentru utilizatorii de Mac. Codul nu s-a schimbat semnificativ, dar, deoarece mulți utilizatori de Mac ignoră produsele de securitate, protecția malware-ului împotriva detectării devine secundară.

Produsele ESET au detectat deja acest fișier în momentul cercetării. Deoarece biblioteca de rețea utilizată pentru comunicațiile C&C este acum criptată pe disc, protocolul de rețea exact folosit de atacatori este în prezent necunoscut.

Indicatori de compromitere

Indicatorii de compromitere, precum și atributele MITRE ATT&CK sunt, de asemenea, disponibile la GitHub.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster