OceanLotus: aggiornamento del malware per macOS

Nel marzo 2019, un nuovo campione di malware per macOS del gruppo cyber OceanLotus è stato caricato su VirusTotal, un popolare servizio online di scansione. Il file eseguibile del backdoor ha le stesse capacità della precedente versione di malware per macOS che abbiamo esaminato, ma la sua struttura è cambiata rendendola più difficile da rilevare. Purtroppo, non siamo riusciti a trovare il dropper associato a questo campione, quindi non conosciamo ancora il vettore di infezione.

Recentemente abbiamo pubblicato un post su OceanLotus e su come gli operatori tentano di garantire la persistenza, accelerare l'esecuzione del codice e minimizzare le tracce della loro presenza nei sistemi Windows. È noto anche che questo gruppo cyber ha un componente per macOS. In questo post descriviamo in dettaglio le modifiche nella più recente versione del malware per macOS rispetto alla precedente (descritta da Trend Micro), e spieghiamo come è possibile automatizzare la decriptazione delle stringhe durante l'analisi utilizzando l'API IDA Hex-Rays.

OceanLotus: aggiornamento del malware per macOS

Analisi

Nelle seguenti tre parti, analizziamo un campione con hash SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. Il file si chiama flashlightd, e i prodotti antivirus ESET lo rilevano come OSX/OceanLotus.D.

Anti-debugging e protezione dalle sandbox

Come tutti i binari macOS di OceanLotus, il campione è impacchettato con UPX, ma la maggior parte degli strumenti di identificazione degli impacchettatori non lo riconosce come tale. Probabilmente perché contengono principalmente una firma che dipende dalla presenza della stringa “UPX”, inoltre, le firme Mach-O sono meno comuni e non vengono aggiornate così spesso. Questa caratteristica rende difficile il rilevamento statico. È interessante notare che, dopo il deimpacchettamento, il punto di ingresso si trova all'inizio della sezione __cfstring nel segmento .TEXT. In questa sezione sono presenti attributi flag, come mostrato nell'immagine qui sotto.

OceanLotus: aggiornamento del malware per macOS
Figura 1. Attributi della sezione MACH-O __cfstring

Come mostrato nella figura 2, le posizioni del codice nella sezione __cfstring possono ingannare alcuni strumenti di disassemblaggio, visualizzando il codice come stringhe.

OceanLotus: aggiornamento del malware per macOS
Figura 2. Il codice del backdoor è identificato da IDA come dati

Dopo l'esecuzione, il file binario crea un thread come mezzo di protezione contro il debugging, il cui unico scopo è controllare continuamente la presenza di un debugger. A tal fine, il thread:

— Cerca di staccare qualsiasi debugger, invocando ptrace con PT_DENY_ATTACH come parametro della richiesta
— Controlla se alcune porte eccezionali sono aperte, invocando la funzione task_get_exception_ports
— Controlla se il debugger è connesso, come mostrato nell'immagine sottostante, verificando la presenza di un flag P_TRACED nel processo corrente

OceanLotus: aggiornamento del malware per macOS
Figura 3. Verifica della connessione del debugger tramite la funzione sysctl

Se lo schema di sorveglianza rileva la presenza di un debugger, viene richiamata la funzione exit. Inoltre, il campione verifica quindi l'ambiente eseguendo due comandi:

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

Dopo di che, il campione controlla il valore restituito rispetto a un elenco codificato di stringhe di sistemi di virtualizzazione noti: acle, vmware, virtualbox o parallels. Infine, il seguente comando verifica se la macchina è uno dei seguenti "MBP", "MBA", "MB", "MM", "IM", "MP" e "XS". Questi sono codici del modello di sistema, ad esempio, "MBP" sta per MacBook Pro, "MBA" – MacBook Air, ecc.

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

Integrazioni principali

Sebbene i comandi del backdoor non siano cambiati dai tempi dello studio di Trend Micro, abbiamo notato alcune altre modifiche. I server C&C utilizzati in questo campione sono piuttosto nuovi, con data di creazione del 22.10.2018.

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

L'URL della risorsa è cambiato in /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Il primo pacchetto inviato al server C&C contiene più informazioni sulla macchina host, inclusi tutti i dati raccolti dai comandi nella tabella qui sotto.

OceanLotus: aggiornamento del malware per macOS

Oltre a questo, le modifiche di configurazione, il campione utilizza per il filtraggio di rete non la libreria libcurl, ma una libreria esterna. Per trovarla, il backdoor tenta di decrittare ogni file nella directory corrente, utilizzando AES-256-CBC con una chiave gFjMXBgyXWULmVVVzyxy, completata con zeri. Ogni file viene decrittato e salvato come /tmp/store, e un tentativo di caricarlo come libreria viene effettuato utilizzando la funzione dlopen. Quando il tentativo di decrittazione porta a una chiamata riuscita dlopen, il backdoor estrae le funzioni esportate Boriry e ChadylonV, che apparentemente sono responsabili dell'interazione di rete con il server. Non abbiamo il dropper o altri file dalla posizione originale del campione, quindi non possiamo analizzare questa libreria. Inoltre, poiché il componente è crittografato, la regola YARA basata su queste stringhe non corrisponderà al file trovato sul disco.

Come descritto nell'articolo sopra citato, viene creato cliendID. Questo identificatore è un hash MD5 del valore restituito da uno dei seguenti comandi:

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}' (ottenere l'indirizzo MAC)
— comando sconosciuto («x1ex72x0a«), utilizzato nei campioni precedenti

Prima dell'hashing, al valore restituito viene aggiunto un carattere «0» o «1» che indica la presenza di privilegi di root. Questo clientID è memorizzato in /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, se il codice è eseguito come root o in ~\/Library\/SmartCardsServices\/Technology\/PlugIns\/drivers\/snippets.ecgML in tutti gli altri casi. Il file è solitamente nascosto tramite la funzione _chflags, il suo timestamp viene modificato tramite il comando touch –t con un valore casuale.

Decodifica delle stringhe

Come nei casi precedenti, le stringhe sono cifrate usando AES-256-CBC (chiave esadecimale: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 completato con zeri, e l'IV riempito di zeri) tramite la funzione CCCrypt. La chiave è stata modificata rispetto alle versioni precedenti, ma poiché il gruppo utilizza ancora lo stesso algoritmo di cifratura delle stringhe, la decrittazione può essere automatizzata. Oltre a questo post, rilasciamo uno script IDA che utilizza l'API Hex-Rays per decrittare le stringhe presenti nel file binario. Questo script può aiutare in future analisi di OceanLotus e nell'analisi di campioni esistenti che non siamo ancora riusciti a ottenere. Alla base dello script c'è un metodo universale per ottenere gli argomenti passati alla funzione. Inoltre, cerca le assegnazioni dei parametri. Il metodo può essere riutilizzato per ottenere un elenco di argomenti della funzione e poi passare al callback.

Conoscendo il prototipo della funzione decrypt, lo script trova tutti i riferimenti incrociati a questa funzione, tutti gli argomenti, quindi decritta i dati e inserisce il testo in chiaro all'interno di un commento all'indirizzo del riferimento incrociato. Affinché lo script funzioni correttamente, deve essere impostato un alfabeto personalizzato utilizzato dalla funzione di decodifica base64, e deve essere definita una variabile globale che contenga la lunghezza della chiave (in questo caso DWORD, vedere la figura 4).

OceanLotus: aggiornamento del malware per macOS
Figura 4. Definizione della variabile globale key_len

Nella finestra Funzione, puoi fare clic con il tasto destro del mouse per richiamare la funzione di decrittazione e selezionare "Estrai e decritta gli argomenti". Lo script deve inserire le stringhe decrittate nei commenti, come mostrato nella figura 5.

OceanLotus: aggiornamento del malware per macOS
Figura 5. Testo decrittato inserito nei commenti

In questo modo, le stringhe decrittate sono comodamente collocate insieme nella finestra IDA xrefs per questa funzione, come mostrato nella figura 6.

OceanLotus: aggiornamento del malware per macOS
Figura 6. Xrefs alla funzione f_decrypt

La versione finale dello script può essere trovata su Repository Github.

Conclusione

Come già detto, OceanLotus continua a perfezionare e aggiornare il proprio set di strumenti. Questa volta, il gruppo di cyber ha migliorato il malware per gli utenti Mac. Il codice non è cambiato molto, ma poiché molti utenti Mac ignorano i prodotti di sicurezza, la protezione del malware dalla rilevazione è di secondaria importanza.

I prodotti ESET avevano già rilevato questo file al momento della ricerca. Poiché la libreria di rete utilizzata per la comunicazione C&C è ora crittografata sul disco, il protocollo di rete esatto utilizzato dagli attaccanti non è ancora noto.

Indicatori di compromissione

Gli indicatori di compromissione e gli attributi MITRE ATT&CK sono anche disponibili su GitHub.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster