OceanLotus: pag-update ng malware para sa macOS

Noong Marso 2019, isang bagong sample ng macOS malware mula sa cyber group na OceanLotus ang na-upload sa VirusTotal, isang sikat na online scanning service. Ang backdoor executable file ay may parehong mga kakayahan tulad ng nakaraang bersyon ng macOS malware na aming pinag-aralan, ngunit ang istraktura nito ay nagbago at ito ay naging mas mahirap na matukoy. Sa kasamaang palad, hindi kami nakahanap ng dropper na nauugnay sa sample na ito, kaya hindi pa namin alam ang vector ng impeksyon.

Na-publish namin kamakailan post tungkol sa OceanLotus at kung paano sinusubukan ng mga operator na magbigay ng pagpupursige, pabilisin ang pagpapatupad ng code, at bawasan ang footprint sa mga Windows system. Alam din na ang cyber group na ito ay mayroon ding component para sa macOS. Ang post na ito ay nagdedetalye ng mga pagbabago sa pinakabagong bersyon ng malware para sa macOS kumpara sa nakaraang bersyon (inilarawan ni Trend Micro), at inilalarawan din kung paano mo ma-automate ang pag-decryption ng mga string sa panahon ng pagsusuri gamit ang IDA Hex-Rays API.

OceanLotus: pag-update ng malware para sa macOS

Pagsusuri

Inilalarawan ng susunod na tatlong bahagi ang pagsusuri ng isang sample na may SHA-1 hash E615632C9998E4D3E5ACD8851864ED09B02C77D2. Ang file ay tinatawag na flashlight, nakita ito ng mga produktong antivirus ng ESET bilang OSX/OceanLotus.D.

Anti-debugging at proteksyon ng sandbox

Tulad ng lahat ng macOS OceanLotus binary, ang sample ay nakabalot sa UPX, ngunit karamihan sa mga tool sa pagkilala sa packager ay hindi nakikilala ito bilang ganoon. Ito ay marahil dahil karamihan sa mga ito ay naglalaman ng isang lagda na nakadepende sa pagkakaroon ng "UPX" na string, bilang karagdagan, ang mga pirma ng Mach-O ay hindi gaanong karaniwan at hindi naa-update nang madalas. Ang tampok na ito ay nagpapahirap sa static na pagtuklas. Kapansin-pansin, pagkatapos i-unpack, ang entry point ay nasa simula ng seksyon __cfstring sa segment .TEXT. Ang seksyong ito ay may mga katangian ng bandila tulad ng ipinapakita sa larawan sa ibaba.

OceanLotus: pag-update ng malware para sa macOS
Figure 1. MACH-O __cfstring section attributes

Gaya ng ipinapakita sa Figure 2, ang mga lokasyon ng code sa seksyon __cfstring ay nagbibigay-daan sa iyong linlangin ang ilang mga tool sa disassembly sa pamamagitan ng pagpapakita ng code bilang mga string.

OceanLotus: pag-update ng malware para sa macOS
Figure 2. Backdoor code na nakita ng IDA bilang data

Sa sandaling naisakatuparan, ang binary ay gagawa ng isang thread bilang isang anti-debugger na ang tanging layunin ay upang patuloy na suriin ang pagkakaroon ng isang debugger. Para sa daloy na ito:

— Sinusubukang i-unhook ang anumang debugger, pagtawag ptrace с PT_DENY_ATTACH bilang parameter ng kahilingan
- Sinusuri kung ang ilang eksklusibong port ay bukas sa pamamagitan ng pagtawag sa isang function task_get_exception_ports
- Sinusuri kung nakakonekta ang debugger, tulad ng ipinapakita sa figure sa ibaba, sa pamamagitan ng pagsuri sa presensya ng flag P_TRACED sa kasalukuyang proseso

OceanLotus: pag-update ng malware para sa macOS
Figure 3. Sinusuri ang koneksyon ng debugger gamit ang sysctl function

Kung nakita ng asong tagapagbantay ang pagkakaroon ng isang debugger, ang function ay tinatawag exit. Bukod pa rito, sinusuri ng sample ang kapaligiran sa pamamagitan ng pagpapatakbo ng dalawang command:

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

Sinusuri ng sample ang return value laban sa isang hard-coded na listahan ng mga string mula sa mga kilalang virtualization system: acle, vmware, virtualbox o parallels. Sa wakas, susuriin ng susunod na command kung ang makina ay isa sa mga sumusunod na "MBP", "MBA", "MB", "MM", "IM", "MP" at "XS". Ito ang mga code ng modelo ng system, halimbawa, "MBP" ay nangangahulugang MacBook Pro, "MBA" ay nangangahulugang MacBook Air, atbp.

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

Pangunahing mga karagdagan

Habang ang mga utos sa backdoor ay hindi nagbago mula noong pananaliksik ng Trend Micro, napansin namin ang ilang iba pang mga pagbabago. Ang mga server ng C&C na ginamit sa sample na ito ay medyo bago at ginawa noong 22.10.2018/XNUMX/XNUMX.

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

Ang URL ng mapagkukunan ay nagbago sa /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Ang unang packet na ipinadala sa C&C server ay naglalaman ng higit pang impormasyon tungkol sa host machine, kasama ang lahat ng data na nakolekta ng mga command sa talahanayan sa ibaba.

OceanLotus: pag-update ng malware para sa macOS

Bilang karagdagan sa pagbabago ng configuration na ito, ang sample ay hindi gumagamit ng library para sa network filtering libcurl, ngunit isang panlabas na aklatan. Upang mahanap ito, sinusubukan ng backdoor na i-decrypt ang bawat file sa kasalukuyang direktoryo gamit ang AES-256-CBC gamit ang susi gFjMXBgyXWULmVVVzyxy, may palaman na mga zero. Ang bawat file ay decrypted at nai-save bilang /tmp/store, at isang pagtatangka na i-load ito bilang isang library ay ginawa gamit ang function dlopen. Kapag ang isang pagtatangka sa pag-decryption ay nagresulta sa isang matagumpay na tawag dlopen, kinukuha ng backdoor ang mga na-export na function Boriry и ChadylonV, na tila responsable para sa komunikasyon ng network sa server. Wala kaming dropper o iba pang mga file mula sa orihinal na lokasyon ng sample, kaya hindi namin ma-parse ang library na ito. Bukod dito, dahil naka-encrypt ang bahagi, hindi tutugma ang panuntunan ng YARA batay sa mga string na ito sa file na makikita sa disk.

Tulad ng inilarawan sa artikulo sa itaas, lumilikha ito ID ng kliyente. Ang ID na ito ay ang MD5 hash ng return value ng isa sa mga sumusunod na command:

- 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}' (kumuha ng MAC address)
- hindi kilalang koponan ("x1ex72x0a"), na ginagamit sa mga nakaraang sample

Bago ang pag-hash, isang "0" o "1" ang idinaragdag sa return value upang isaad ang mga pribilehiyo sa ugat. Ito ID ng kliyente naka-imbak sa /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, kung ang code ay tatakbo bilang ugat o sa ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML sa lahat ng iba pang mga kaso. Karaniwang nakatago ang file gamit ang function _chflags, binago ang timestamp nito gamit ang command touch –t na may random na halaga.

Pag-decode ng mga string

Tulad ng mga nakaraang opsyon, ang mga string ay naka-encrypt gamit ang AES-256-CBC (hexadecimal key: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 may palaman na may mga zero, at IV na puno ng mga zero) sa pamamagitan ng function CCCrypt. Ang susi ay nagbago mula sa mga nakaraang bersyon, ngunit dahil ang grupo ay gumagamit pa rin ng parehong string encryption algorithm, decryption ay maaaring automated. Bilang karagdagan sa post na ito, naglalabas kami ng script ng IDA na gumagamit ng Hex-Rays API upang i-decrypt ang mga string na nasa binary file. Maaaring makatulong ang script na ito sa hinaharap na pagsusuri ng OceanLotus at pagsusuri ng mga kasalukuyang sample na hindi pa namin nakukuha. Ang script ay batay sa isang unibersal na paraan para sa pagtanggap ng mga argumento na ipinasa sa isang function. Bukod pa rito, hinahanap nito ang mga takdang-aralin ng parameter. Ang pamamaraan ay maaaring magamit muli upang makakuha ng isang listahan ng mga argumento ng function at pagkatapos ay ipasa ito sa callback.

Pag-alam sa prototype ng function decrypt, hinahanap ng script ang lahat ng cross-reference sa function na ito, lahat ng argumento, pagkatapos ay i-decrypt ang data at inilalagay ang plain text sa loob ng isang komento sa cross-reference na address. Para gumana nang tama ang script, dapat itong itakda sa custom na alpabeto na ginagamit ng base64 decoding function, at dapat tukuyin ang isang global variable na naglalaman ng haba ng key (sa kasong ito ay isang DWORD, tingnan ang Figure 4).

OceanLotus: pag-update ng malware para sa macOS
Figure 4. Kahulugan ng global variable key_len

Sa window ng Function, maaari mong i-right-click ang function ng decryption at i-click ang "I-extract at i-decrypt ang mga argumento." Dapat ilagay ng script ang mga decrypted na linya sa mga komento, tulad ng ipinapakita sa Figure 5.

OceanLotus: pag-update ng malware para sa macOS
Figure 5. Ang decrypted text ay inilalagay sa mga komento

Sa ganitong paraan ang mga naka-decrypt na mga string ay maginhawang inilalagay nang magkasama sa window ng IDA xrefs para sa function na ito tulad ng ipinapakita sa Figure 6.

OceanLotus: pag-update ng malware para sa macOS
Figure 6. Xrefs sa f_decrypt function

Ang huling script ay matatagpuan sa Github repository.

Pagbubuhos

Gaya ng nabanggit na, patuloy na pinapabuti at ina-update ng OceanLotus ang toolkit nito. Sa pagkakataong ito, pinahusay ng cyber group ang malware para gumana sa mga user ng Mac. Ang code ay hindi masyadong nagbago, ngunit dahil maraming mga gumagamit ng Mac ang hindi pinapansin ang mga produkto ng seguridad, ang pagprotekta sa malware mula sa pagtuklas ay pangalawang kahalagahan.

Natukoy na ng mga produkto ng ESET ang file na ito sa panahon ng pananaliksik. Dahil ang network library na ginagamit para sa C&C na komunikasyon ay naka-encrypt na ngayon sa disk, ang eksaktong network protocol na ginagamit ng mga umaatake ay hindi pa alam.

Mga tagapagpahiwatig ng kompromiso

Ang mga tagapagpahiwatig ng kompromiso gayundin ang mga katangian ng MITRE ATT&CK ay available din sa GitHub.

Pinagmulan: www.habr.com

Magdagdag ng komento