Nel marzo 2019, un nuovo campione di malware per macOS proveniente dal cybergruppo OceanLotus è stato caricato su VirusTotal, un popolare servizio di scansione online. Il file eseguibile backdoor ha le stesse funzionalità della versione precedente del malware macOS che abbiamo studiato, ma la sua struttura è cambiata ed è diventato più difficile da rilevare. Purtroppo non siamo riusciti a trovare un contagocce associato a questo campione, quindi non conosciamo ancora il vettore dell'infezione.
Abbiamo recentemente pubblicato
analisi
Le tre parti seguenti descrivono l'analisi di un campione con un hash SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2
. Il file viene chiamato torcia elettrica, i prodotti antivirus ESET lo rilevano come OSX/OceanLotus.D.
Protezione anti-debug e sandbox
Come tutti i file binari di OceanLotus per macOS, l'esempio è fornito con UPX, ma la maggior parte degli strumenti di identificazione dei pacchetti non lo riconoscono 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 funzionalità rende difficile il rilevamento statico. È interessante notare che, dopo aver disimballato, il punto di ingresso si trova all'inizio della partizione __cfstring
nel segmento .TEXT
. Questa sezione ha attributi flag come mostrato nell'immagine seguente.
Figura 1. Attributi della sezione MACH-O __cfstring
Come mostrato nella Figura 2, le posizioni dei codici nella sezione __cfstring
consente ad alcuni strumenti di disassemblaggio di essere ingannati visualizzando il codice come stringhe.
Figura 2. Il codice backdoor è definito da IDA come dati
Una volta eseguito, il binario crea un thread come protezione del debug il cui unico scopo è verificare costantemente la presenza di un debugger. Per questo flusso:
- Tenta di sganciare qualsiasi debugger chiamando ptrace
с PT_DENY_ATTACH
come parametro di richiesta
- Controlla se alcune porte esclusive sono aperte chiamando la funzione task_get_exception_ports
- Controlla se è collegato un debugger, come mostrato nella figura seguente, controllando la presenza di un flag P_TRACED
nel processo attuale
Figura 3. Controllo della connessione del debugger utilizzando la funzione sysctl
Se il watchdog rileva la presenza di un debugger, viene richiamata la funzione exit
. Inoltre, l'esempio controlla l'ambiente eseguendo due comandi:
ioreg -l | grep -e "Manufacturer" и sysctl hw.model
L'esempio controlla quindi il valore restituito rispetto a un elenco hardcoded di stringhe provenienti da sistemi di virtualizzazione noti: acle, vmware, virtualbox o paralleli. Infine, il seguente comando controlla se la macchina è una delle seguenti “MBP”, “MBA”, “MB”, “MM”, “IM”, “MP” e “XS”. Questi sono codici modello di sistema, ad esempio "MBP" significa MacBook Pro, "MBA" significa MacBook Air, ecc.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}
Aggiunte di base
Anche se i comandi backdoor non sono cambiati rispetto alla ricerca di Trend Micro, abbiamo notato alcune altre modifiche. I server C&C utilizzati in questo esempio sono abbastanza nuovi, essendo stati creati il 22.10.2018/XNUMX/XNUMX.
- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- au.charlineopkesston[.]com
URL della risorsa cambiato 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 comandi nella tabella seguente.
Inoltre, a seguito delle modifiche alla configurazione, l'esempio utilizza una non libreria per il filtraggio della rete gFjMXBgyXWULmVVVzyxy
, riempito con zeri. Ogni file viene decrittografato e salvato come /tmp/store
ed è stato effettuato un tentativo di caricarlo come libreria utilizzando la funzione dlopen
, la backdoor recupera le funzioni esportate Boriry
и ChadylonV
, che, a quanto pare, sono responsabili della comunicazione di rete con il server. Non abbiamo il contagocce o altri file dalla posizione del campione originale, quindi non possiamo analizzare questa libreria. Inoltre, poiché il componente è crittografato, una regola YARA basata su queste stringhe non corrisponderà al file trovato su disco.
Come descritto nell'articolo precedente, crea Identificativo cliente. Questo identificatore è l'hash MD5 del valore restituito di 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}'
(ottieni l'indirizzo MAC)
- squadra sconosciuta ("x1ex72x0a
"), utilizzato nei campioni precedenti
Prima dell'hashing, al valore restituito viene aggiunto il carattere "0" o "1", che indica la presenza dei privilegi di root. Questo Identificativo cliente immagazzinato /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
, se il codice viene eseguito come root o in ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML in tutti gli altri casi. Il file viene solitamente nascosto con la funzione touch –t
con un valore casuale.
Decrittazione delle stringhe
Come nelle opzioni precedenti, le stringhe vengono crittografate utilizzando AES-256-CBC (chiave esadecimale: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92
riempito con zeri e IV riempito con zeri) tramite la funzione
Conoscere il prototipo della funzione decifrare, lo script trova tutti i riferimenti incrociati a questa funzione, tutti gli argomenti, quindi decodifica i dati e inserisce testo semplice all'interno del commento all'indirizzo del riferimento incrociato. Affinché lo script funzioni correttamente, è necessario impostarlo sull'alfabeto personalizzato utilizzato dalla funzione di decodifica base64 e definire una variabile globale per contenere la lunghezza della chiave (in questo caso un DWORD, vedere la Figura 4).
Figura 4. Definizione della variabile globale key_len
Nella finestra Funzione, puoi fare clic con il pulsante destro del mouse sulla funzione di decrittografia e fare clic su Estrai e decodifica argomenti. Lo script dovrebbe inserire le righe decrittografate nei commenti, come mostrato nella Figura 5.
Figura 5. Testo decifrato inserito nei commenti
In questo modo, le stringhe decriptate vengono comodamente raggruppate nella finestra IDA. xrif per questa funzione, come mostrato nella Figura 6.
Figura 6. Xrif alle funzioni f_decrypt
La versione finale dello script può essere trovata su
conclusione
Come già accennato, OceanLotus migliora e aggiorna costantemente il proprio set di strumenti. Questa volta il cybergroup ha perfezionato il malware per colpire gli utenti Mac. Il codice non è cambiato molto, ma poiché molti utenti Mac ignorano i prodotti di sicurezza, proteggere il malware dal rilevamento è di secondaria importanza.
I prodotti ESET hanno già rilevato questo file al momento dell'indagine. Poiché la libreria di rete utilizzata per la comunicazione C&C è ora crittografata su disco, non è ancora noto l'esatto protocollo di rete utilizzato dagli aggressori.
Indicatori di compromesso
Sono disponibili anche indicatori di compromesso e attributi MITRE ATT&CK
Fonte: habr.com