I mars 2019 laddades en ny prov av skadlig kod för macOS frÄn cyberspiongruppen OceanLotus upp till VirusTotal, en populÀr online-skanningstjÀnst. Den körbara filen för bakdörren har samma funktioner som den tidigare versionen av skadlig programvara för macOS som vi studerat, men dess struktur har Àndrats vilket gör den svÄrare att upptÀcka. TyvÀrr kunde vi inte hitta droppern kopplad till detta prov, sÄ vi vet Ànnu inte infektionsvektorn.
Nyligen publicerade vi och hur operatörerna försöker sÀkerstÀlla persistens, snabba upp kodens exekvering och minimera spÄren av deras nÀrvaro i Windows-system. Det Àr ocksÄ kÀnt att denna cyberspiongrupp har ett komponent för macOS. Detta inlÀgg beskriver i detalj förÀndringarna i den senaste versionen av skadlig programvara för macOS jÀmfört med den tidigare versionen (), och hur man kan automatisera avkodningen av strÀngar under analysen med hjÀlp av IDA Hex-Rays API.

Analys
I de följande tre delarna beskrivs analysen av ett prov med SHA-1-hash E615632C9998E4D3E5ACD8851864ED09B02C77D2. Filen heter flashlightd, antivirusprodukter frÄn ESET kÀnner igen den som OSX/OceanLotus.D.
Anti-debugging och skydd mot sandlÄdor
Som alla macOS-binaryer av OceanLotus Ă€r provet packat med UPX, men de flesta verktyg för att identifiera packare kĂ€nner inte igen det som sĂ„dant. Troligtvis eftersom de mestadels innehĂ„ller en signatur som beror pĂ„ nĂ€rvaron av strĂ€ngen âUPXâ, dessutom förekommer Mach-O-signaturer mer sĂ€llan och uppdateras inte sĂ„ ofta. Denna egenskap gör statisk upptĂ€ckning svĂ„r. Det Ă€r intressant att efter uppackning ligger ingĂ„ngspunkten i början av sektionen __cfstring i segmentet .TEXT. I den hĂ€r sektionen finns flagg-attribut, som visas i bilden nedan.

Bild 1. Attribut i MACH-O-sektionen __cfstring
Som visas i bild 2 gör placeringen av koden i sektionen __cfstring att lura vissa disassembleringsverktyg genom att visa koden som strÀngar.

Bild 2. Bakdörrens kod identifieras av IDA som data
Efter att ha körts skapar den körbara filen en trÄd som ett skydd mot debugging, vars enda syfte Àr att kontinuerligt kontrollera om en debugger finns. För detta försöker trÄden:
â Att avmontera eventuell debugger genom att kalla pĂ„ ptrace med PT_DENY_ATTACH som en parameter
â Kontrollerar om nĂ„gra speciella portar Ă€r öppna genom att kalla pĂ„ funktionen task_get_exception_ports
â Kontrollerar om en debugger Ă€r ansluten, som visas i bilden nedan, genom att kontrollera flaggan P_TRACED i den aktuella processen

Bild 3. Kontroll av debuggeranslutning via funktionen sysctl
Om vaktschemat upptÀcker att en debugger Àr nÀrvarande, anropas funktionen exit. Dessutom kontrollerar provet sedan miljön genom att köra tvÄ kommandon:
ioreg -l | grep -e "Manufacturer" och sysctl hw.model
Efter detta kontrollerar provet det returnerade vĂ€rdet mot en hĂ„rdkodad lista med strĂ€ngar av kĂ€nda virtualiseringssystem: acle, vmware, virtualbox eller parallels. Slutligen kontrollerar följande kommando om maskinen Ă€r en av följande "MBP", "MBA", "MB", "MM", "IM", "MP" och "XS". Dessa Ă€r systemmodellkoder, till exempel betyder "MBP" MacBook Pro, "MBA" â MacBook Air etc.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'
Huvudkomplement
Trots att bakdörrskommandona inte har förÀndrats sedan Trend Micros undersökning, har vi observerat flera andra modifieringar. C&C-servrarna som anvÀnds i detta prov Àr ganska nya, skapade den 22.10.2018.
â daff.faybilodeau[.]com
â sarc.onteagleroad[.]com
â au.charlineopkesston[.]com
Resurs URL har Àndrats till /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Den första paketet som skickas till C&C-servern innehÄller mer information om vÀrdmaskinen, inklusive alla data som samlas in av kommandona frÄn tabellen nedan.

Utöver detta anvÀnder provet för nÀtverksfiltrering inte biblioteken , utan ett externt bibliotek. För att hitta det försöker bakdörren att dekryptera varje fil i den aktuella katalogen med AES-256-CBC med nyckeln gFjMXBgyXWULmVVVzyxy, kompletterat med nollor. Varje fil dekrypteras och sparas som /tmp/store, och ett försök att ladda den som ett bibliotek görs med hjÀlp av funktionen . NÀr dekrypteringsförsöket resulterar i ett framgÄngsrikt anrop dlopen, extraherar bakdörren de exporterade funktionerna Boriry och ChadylonV, som uppenbarligen ansvarar för nÀtverksinteraktion med servern. Vi har varken dropper eller andra filer frÄn det ursprungliga lÀget av provet, sÄ vi kan inte analysera detta bibliotek. Dessutom, eftersom komponenten Àr krypterad, kommer en YARA-regel baserad pÄ dessa strÀngar inte att matcha filen som hittas pÄ disken.
Som beskrivs i den ovan nÀmnda artikeln, skapas cliendIDDetta identifierare Àr en MD5-hash av returvÀrdet för ett av följande kommandon:
â 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}' (fĂ„ MAC-adressen)
â okĂ€nt kommando ("x1ex72x0a", som anvĂ€nds i tidigare exempel
Innan hashningen lĂ€ggs en symbol "0" eller "1" till returat vĂ€rde, för att indikera om det finns root-behörigheter. Denna clientID lagras i /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, om koden körs som root eller i ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML i alla andra fall. Filen Ă€r vanligtvis dolt med hjĂ€lp av funktionen , dess tidsstĂ€mpel Ă€ndras med kommandot touch ât med ett slumpmĂ€ssigt vĂ€rde.
Avkodning av strÀngar
Som i de tidigare versionerna Àr strÀngarna krypterade med AES-256-CBC (hexadecimalt nyckel: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 kompletterad med nollor, och IV fylls med nollor) via funktionen . Nyckeln har Àndrats jÀmfört med tidigare versioner, men eftersom gruppen fortfarande anvÀnder samma algoritm för att kryptera strÀngarna, kan avkryptering automatiseras. Förutom detta inlÀgg slÀpper vi ett IDA-skript som anvÀnder API:et Hex-Rays för att avkryptera strÀngarna som finns i den binÀra filen. Detta skript kan hjÀlpa till med framtida analys av OceanLotus och studier av existerande prover som vi inte har kunnat erhÄlla. I grunden av skriptet finns en universell metod för att fÄ argumenten som skickas till funktionen. Dessutom letar det efter anvÀndningar av parametrarna. Metoden kan ÄteranvÀndas för att fÄ en lista över funktionens argument och sedan skicka det som en callback.
Genom att kÀnna till funktionsprototypen decrypt, hittar skriptet alla korsreferenser till denna funktion, alla argument, avkrypterar sedan data och placerar den ren text inuti kommentarerna vid korsreferensens adress. För att skriptet ska fungera korrekt mÄste en anpassad alfabet som anvÀnds av base64 avkodningsfunktionen vara installerad och en global variabel som innehÄller lÀngden pÄ nyckeln (i detta fall DWORD, se bild 4) mÄste definieras.

Bild 4. Definition av global variabel key_len
I fönstret Function kan du högerklicka pÄ avkodningsfunktionen och klicka pÄ "Extrahera och avkoda argumenten". Skriptet ska placera de avkodade raderna i kommentarerna, som visas pÄ bild 5.

Bild 5. Den avkodade texten placerad i kommentarerna
PÄ sÄ sÀtt placeras de avkodade raderna bekvÀmt tillsammans i IDA-fönstret xrefs för denna funktion, som visas pÄ bild 6.

Bild 6. Xrefs till funktionen f_decrypt
Den slutliga versionen av skriptet kan hittas pÄ .
Utdata
Som redan nÀmnts förbÀttrar OceanLotus stÀndigt och uppdaterar sin verktygssats. Denna gÄng har cybersyndikatet förbÀttrat skadlig programvara för att arbeta med Mac-anvÀndare. Koden har inte förÀndrats mycket, men eftersom mÄnga Mac-anvÀndare ignorerar sÀkerhetsprodukter, Àr skyddet mot upptÀckten av skadlig programvara av sekundÀr betydelse.
ESETs produkter har redan detekterat denna fil vid tidpunkten för undersökningen. Eftersom det nÀtverksbibliotek som anvÀnds för C&C-kommunikation nu Àr krypterat pÄ disk, Àr den exakta nÀtverksprotokollen som angriparna anvÀnder för nÀrvarande okÀnd.
Indikatorer pÄ kompromiss
Indikatorer pÄ kompromettering samt MITRE ATT&CK-attribut Àr ocksÄ tillgÀngliga pÄ .
KĂ€lla: habr.com
