Nel marzo 2019, un nuovo campione di malware per macOS del gruppo cyber OceanLotus è stato caricato su VirusTotal, un popolare servizio di scansione online. Il file eseguibile del backdoor ha le stesse capacità della versione precedente che abbiamo studiato, ma la sua struttura è cambiata rendendolo più difficile da rilevare. Purtroppo, non siamo riusciti a trovare il dropper associato a questo campione, quindi al momento non sappiamo quale sia il vettore di infezione.
Recentemente abbiamo pubblicato e su come gli operatori cercano di garantire persistenza, accelerare l'esecuzione del codice e ridurre al minimo le tracce della loro presenza nei sistemi Windows. È noto anche che questo gruppo cyber ha un componente per macOS. In questo post vengono dettagliati i cambiamenti nella versione più recente del malware per macOS rispetto alla versione precedente (), e viene spiegato come nell'analisi si possa automatizzare la decodifica delle stringhe utilizzando l'API IDA Hex-Rays.

Analisi
Nelle prossime tre parti viene descritto l'analisi di un campione con hash SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. Il file si chiama flashlightd, i prodotti antivirus ESET lo rilevano come OSX/OceanLotus.D.
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 dei packer non lo riconosce come tale. Probabilmente perché contengono principalmente una firma che dipende dalla presenza della stringa "UPX"; inoltre, le firme Mach-O si trovano meno frequentemente e non vengono aggiornate così spesso. Questa caratteristica rende difficile la rilevazione statica. È interessante notare che, dopo l'estrazione, il punto di ingresso si trova all'inizio della sezione __cfstring nella sezione .TEXT. Questa sezione contiene attributi flag, come mostrato nell'immagine sottostante.

Figura 1. Attributi della sezione MACH-O __cfstring
Come mostrato nella Figura 2, le posizioni del codice nella sezione __cfstring consentono di ingannare alcuni strumenti di disassemblaggio, visualizzando il codice come stringhe.

Figura 2. Il codice del backdoor viene identificato da IDA come dati
Dopo l'avvio, il file binario crea un thread come mezzo di protezione contro il debugging, il cui scopo principale è quello di controllare costantemente la presenza di un debugger. Per fare ciò, il thread:
— Cerca di staccare qualsiasi debugger, inviando ptrace con PT_DENY_ATTACH come parametro di richiesta
— Controlla se alcune porte eccezionali sono aperte, chiamando la funzione task_get_exception_ports
— Verifica se il debugger è connesso, come mostrato nell'immagine sottostante, controllando la presenza del flag P_TRACED nel processo corrente

Figura 3. Verifica della connessione del debugger tramite la funzione sysctl
Se lo schema di sorveglianza rileva la presenza di un debugger, viene chiamata 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 hardcoded 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 di modello di sistema, ad esempio, “MBP” significa MacBook Pro, “MBA” – MacBook Air, ecc.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'
Componenti principali
Sebbene i comandi del backdoor non siano cambiati dai tempi della ricerca di Trend Micro, abbiamo notato alcune altre modifiche. I server C&C utilizzati in questo campione sono relativamente nuovi, con data di creazione – 22.10.2018.
— daff.faybilodeau[.]com
— sarc.onteagleroad[.]com
— au.charlineopkesston[.]com
L'URL della risorsa è stato modificato in /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Il primo pacchetto inviato al server C&C contiene ulteriori informazioni sulla macchina host, inclusi tutti i dati raccolti dai team nella tabella sottostante.

Oltre a ciò, la configurazione modificata utilizza per il filtraggio di rete non la libreria , ma una libreria esterna. Per trovarla, il backdoor tenta di decriptare ogni file nella directory corrente usando AES-256-CBC con la chiave gFjMXBgyXWULmVVVzyxy, completata con zeri. Ogni file è decriptato e salvato come /tmp/store, e si tenta di caricarlo come libreria utilizzando la funzione . Quando il tentativo di decrittazione porta a una chiamata riuscita dlopen, il backdoor estrae le funzioni esportate Boriry e ChadylonV, che apparentemente sono responsabili per l'interazione di rete con il server. Non abbiamo il dropper o altri file dalla posizione sorgente del campione, quindi non possiamo analizzare questa libreria. Inoltre, poiché il componente è crittografato, la regola YARA basata su queste righe 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 negli esempi 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 negli altri casi. Il file è generalmente nascosto tramite la funzione , il cui timestamp viene modificato tramite il comando touch –t con un valore casuale.
Decrittazione delle stringhe
Come nelle versioni precedenti, le stringhe sono cifrate utilizzando AES-256-CBC (chiave esadecimale: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 riempita di zeri e l'IV riempito di zeri) tramite la funzione . La chiave è stata modificata rispetto alle versioni precedenti, ma poiché il gruppo utilizza ancora lo stesso algoritmo di crittografia delle stringhe, la decrittazione può essere automatizzata. Oltre a questo post, stiamo rilasciando uno script IDA che utilizza l'API Hex-Rays per decrittare le stringhe presenti nel file binario. Questo script può essere utile per future analisi di OceanLotus e l'analisi di campioni esistenti che non abbiamo ancora ottenuto. Alla base dello script c'è un metodo universale per ottenere gli argomenti passati a una funzione. Inoltre, cerca le assegnazioni dei parametri. Il metodo può essere riutilizzato per ottenere un elenco degli argomenti della funzione e poi passarli al callback.
Sapendo 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 semplice all'interno del 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 contenente la lunghezza della chiave (in questo caso DWORD, vedi figura 4).

Figura 4. Definizione della variabile globale key_len
Nella finestra Function è possibile fare clic destro sulla funzione di decrittazione e selezionare «Estrai e decrittare argomenti». Lo script deve posizionare le righe decrittate nei commenti, come mostrato nella figura 5.

Figura 5. Testo decrittato posizionato nei commenti
In questo modo le righe decrittate sono comodamente collocate insieme nella finestra IDA xrefs per questa funzione, come mostrato nella figura 6.

Figura 6. Xrefs alla funzione f_decrypt
La versione finale dello script può essere trovata su .
Risultato
Come già detto, OceanLotus perfeziona costantemente e aggiorna il proprio set di strumenti. Questa volta, il gruppo 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 da rilevamento è 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 su disco, il protocollo di rete esatto utilizzato dagli attaccanti rimane sconosciuto.
Indicatori di compromissione
Indicatori di compromissione, così come gli attributi MITRE ATT&CK, sono disponibili su .
Fonte: habr.com
