Nel post parleremo di come il gruppo di cybercrime OceanLotus (APT32 e APT-C-00) abbia recentemente sfruttato una delle vulnerabilità pubblicamente disponibili di , una vulnerabilità di corruzione della memoria in Microsoft Office, e di come il malware del gruppo assicuri persistenza nei sistemi compromessi senza lasciare tracce. Successivamente, descriveremo come dal inizio del 2019 il gruppo abbia utilizzato archivi autoestraenti per eseguire codice.
OceanLotus è specializzato in cyber spionaggio, con obiettivi prioritari nei paesi del Sud-Est asiatico. Gli attaccanti falsificano documenti che attirano l'attenzione delle potenziali vittime per convincerle a eseguire un backdoor, e lavorano anche allo sviluppo di strumenti. I metodi utilizzati per creare esche variano in base agli attacchi, da file con "doppia estensione", archivi autoestraenti, documenti con macro a noti exploit.

Utilizzo dell'exploit nell'Editor di Equation di Microsoft
A metà del 2018, OceanLotus ha condotto una campagna utilizzando la vulnerabilità CVE-2017-11882. Uno dei documenti dannosi del gruppo di cybercrime è stato analizzato dagli esperti del 360 Threat Intelligence Center (), inclusa una descrizione dettagliata dell'exploit. Nel post seguente - una panoramica di un documento dannoso simile.
Primo stadio
Documento FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3) è simile a quanto menzionato nello studio precedente. È interessante poiché è rivolto a utenti interessati alla politica cambogiana (CNRP - Partito di salvezza nazionale della Cambogia, sciolto alla fine del 2017). Nonostante l'estensione .doc, il documento è in formato RTF (vedi figura seguente), contiene codice spazzatura e presenta distorsioni.

Figura 1. 'Spazzatura' in RTF
Nonostante la presenza di elementi distorti, Word apre con successo questo file RTF. Come si vede nella figura 2, qui si trova la struttura EQNOLEFILEHDR con offset 0xC00, seguita dall'intestazione MTEF e poi dalla registrazione MTEF (figura 3) per il font.

Figura 2. Valori della registrazione FONT

Figura 3.
Potenziale overflow nel campo name, poiché la sua dimensione non viene verificata prima della copia. Un nome troppo lungo attiva la vulnerabilità. Come si vede dal contenuto del file RTF (offset 0xC26 nella figura 2), il buffer è riempito con shell code, seguito da un comando fittizio (0x90) e dall'indirizzo di ritorno 0x402114. L'indirizzo è un elemento di dialogo in EQNEDT32.exe, che punta a un'istruzione RET. Questo porta a far sì che l'EIP punti all'inizio di un campo name, contenente codice shell.

Figura 4. Inizio del codice shell dell'exploit
Indirizzo 0x45BD3C memorizza una variabile che viene dereferenziata fino a raggiungere un puntatore alla struttura attualmente caricata MTEFData. Qui si trova il resto del codice shell.
Lo scopo del codice shell è eseguire il secondo frammento di codice shell incorporato nel documento aperto. Inizialmente, il codice shell cerca di trovare il descrittore del file del documento aperto, esaminando tutti i descrittori del sistema (NtQuerySystemInformation con argomento SystemExtendedHandleInformation) e verificando se corrispondono PID del descrittore e PID del processo WinWord e se il documento è stato aperto con una maschera di accesso – 0x12019F.
Per confermare il rilevamento del descrittore corretto (e non di un descrittore di un altro documento aperto), il contenuto del file viene visualizzato utilizzando la funzione CreateFileMapping, e il codice shell verifica se gli ultimi quattro byte del documento sono "yyyy" (metodo Egg Hunting). Non appena viene trovata una corrispondenza, il documento viene copiato in una cartella temporanea (GetTempPath) come ole.dll. Vengono letti gli ultimi 12 byte del documento.
![]()
Figura 5. Marcatori di fine documento
Valore a 32 bit tra i marcatori AABBCCDD e yyyy – è lo spostamento del prossimo shellcode. Viene invocato tramite la funzione CreateThread. È stato estratto lo stesso shellcode utilizzato in precedenza dal gruppo OceanLotus. , rilasciato a marzo 2018, continua a funzionare per l'estrazione della seconda fase.
Seconda fase
Estrazione dei componenti
I nomi dei file e delle cartelle sono selezionati in modo dinamico. Il codice sceglie casualmente il nome di un file eseguibile o DLL in C:Windowssystem32. Poi fa una richiesta alle sue risorse ed estrae il campo FileDescription da utilizzare come nome della cartella. Se non funziona, il codice sceglie casualmente un nome di cartella da %ProgramFiles% o C:Windows (da GetWindowsDirectoryW). Evita di utilizzare un nome che possa entrare in conflitto con file esistenti e si assicura che non contenga le seguenti parole: windows, Microsoft, desktop, sistema, system32 o syswow64. Se la cartella esiste già, viene aggiunto "NLS_{6 caratteri}" al nome.
Risorsa 0x102 analizzato e i file vengono scaricati in %ProgramFiles% o %AppData%, in una cartella scelta casualmente. La data di creazione è stata modificata per avere gli stessi valori di kernel32.dll.
Ad esempio, ecco una cartella e un elenco di file creati selezionando l'eseguibile C:Windowssystem32TCPSVCS.exe come sorgente di dati.

Figura 6. Estrazione di componenti diversi
Struttura delle risorse 0x102 nel dropper è abbastanza complessa. In sintesi, contiene:
— Nomi dei file
— Dimensioni e contenuto dei file
— Formato di compressione (COMPRESSION_FORMAT_LZNT1, utilizzato dalla funzione RtlDecompressBuffer)
Il primo file viene rilasciato come TCPSVCS.exe, che è legittimo AcroTranscoder.exe (secondo FileDescription, SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).
Potresti aver notato che la dimensione di alcuni file DLL supera gli 11 MB. Questo è dovuto al fatto che un grande buffer continuo di dati casuali è posizionato all'interno dell'eseguibile. Non è escluso che questo sia un modo per evitare il rilevamento da parte di alcuni prodotti di sicurezza.
Garantire la persistenza
Risorsa 0x101 Il dropper contiene due numeri interi a 32 bit che definiscono come garantire la persistenza. Il valore del primo indica come il malware manterrà la persistenza senza diritti di amministratore.

Tabella 1. Meccanismo di persistenza senza diritti di amministratore
Il valore del secondo numero intero indica come il malware deve garantire la persistenza operando con diritti di amministratore.

Tabella 2. Meccanismo di persistenza con diritti di amministratore
Il nome del servizio è il nome del file senza estensione; il nome visualizzato è il nome della cartella, ma se esiste già, viene aggiunta la stringa “Revisione 1” (il numero aumenta finché non viene trovato un nome inutilizzato). Gli operatori si sono assicurati che la persistenza attraverso il servizio fosse stabile: in caso di guasto, il servizio deve essere riavviato dopo 1 secondo. Poi, al valore WOW64 del nuovo valore della chiave di registro del servizio viene assegnato 4, indicando che si tratta di un servizio a 32 bit.
Il compito pianificato viene creato tramite diverse interfacce COM: ITaskScheduler, ITask, ITaskTrigger, IPersistFile e ITaskScheduler. In sostanza, il malware crea un'attività nascosta, imposta le informazioni sull'account insieme alle informazioni sull'utente corrente o sull'amministratore e quindi imposta un trigger.
Si tratta di un'attività quotidiana della durata di 24 ore, con intervalli di 10 minuti tra le due esecuzioni, il che significa che verrà eseguita costantemente.
Malware bit
Nel nostro esempio, il file eseguibile TCPSVCS.exe (AcroTranscoder.exe) è un software legittimo che carica DLL che vengono rimosse insieme ad esso. In questo caso, ciò che ci interessa è Flash Video Extension.dll.
La sua funzione DLLMain chiama semplicemente un'altra funzione. Sono presenti alcuni predicati sfocati:

Figura 7. Predicati sfocati
Dopo queste verifiche fuorvianti, il codice ottiene la sezione .text file TCPSVCS.exe, cambia la sua protezione in PAGE_EXECUTE_READWRITE e lo sovrascrive, aggiungendo istruzioni fittizie:

Figura 8. Sequenza di istruzioni
Alla fine, all'indirizzo della funzione FLVCore::Uninitialize(void), esportata Flash Video Extension.dll, viene aggiunta un'istruzione CALL. Ciò significa che dopo aver caricato la DLL malevola, quando il runtime chiama WinMain in TCPSVCS.exe, il puntatore all'istruzione indicherà NOP, causando così chiamate. FLVCore::Uninitialize(void), il passaggio successivo.
La funzione crea semplicemente un mutex che inizia con {181C8480-A975-411C-AB0A-630DB8B0A221}, seguito dal nome utente corrente. Quindi legge il file ripristinato con estensione *.db3, che contiene codice indipendente dalla posizione, e usa CreateThread per eseguire il contenuto.
Il contenuto del file *.db3 è un codice shell comunemente utilizzato dal gruppo OceanLotus. Lo abbiamo nuovamente estratto con successo usando uno script emulatore che abbiamo pubblicato .
Lo script estrae la fase finale. Questo componente è una backdoor che abbiamo già analizzato in . Questo può essere identificato dal GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} del file binario. La configurazione del malware è ancora crittografata nelle risorse PE. Ha una configurazione simile, ma i server C&C sono diversi da quelli precedenti:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
Il gruppo OceanLotus dimostra nuovamente una combinazione di diverse tecniche per eludere il rilevamento. Sono tornati con uno schema 'migliorato' del processo di infezione. Scegliendo nomi casuali e riempiendo i file eseguibili con dati casuali, riducono il numero di IoC affidabili (basati su hash e nomi di file). Inoltre, grazie all'uso di DLL caricate da terzi, gli aggressori devono solo rimuovere il binario legittimo. AcroTranscoder.
Archivi autoestraenti
Dopo i file RTF, il gruppo è passato ad archivi autoestraenti (SFX) con icone documentali comuni, per confondere ulteriormente l'utente. Ne hanno parlato su Threatbook (). Dopo il lancio, vengono estratti file RAR autoestraenti e vengono eseguite DLL con estensione .ocx, il payload finale di cui era stato precedentemente documentato. {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. Dalla metà di gennaio 2019, OceanLotus riutilizza questa tecnica, ma nel tempo modifica alcune configurazioni. In questa sezione parleremo della tecnica e delle modifiche.
Creazione dell'esca
Documento THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) trovato per la prima volta nel 2018. Questo file SFX è creato con intelligenza – nella descrizione (Informazioni sulla versione) è specificato che questa è un'immagine JPEG. Lo script SFX è strutturato come segue:

Figura 9. Comandi SFX
Il malware scarica {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC), così come l'immagine 2018 thich thong lac.jpg.
L'immagine esca appare come segue:

Figura 10. Immagine esca
Potresti notare che le prime due righe dello script SFX chiamano due volte il file OCX, ma non si tratta di un errore.
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)
Il flusso di controllo del file OCX è molto simile ad altri componenti di OceanLotus – molte sequenze di comandi JZ/JNZ e PUSH/RET, alternate con codice spazzatura.

Figura 11. Codice offuscato
Dopo la filtrazione del codice spazzatura, l'esportazione DllRegisterServer, invocato da regsvr32.exe, appare nel modo seguente:

Figura 12. Codice principale dell'installatore
In sostanza, alla prima invocazione DllRegisterServer l'esportazione imposta il valore del registro HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model per l'offset cifrato nella DLL (0x10001DE0).
Quando la funzione viene chiamata per la seconda volta, legge lo stesso valore ed esegue all'indirizzo corrispondente. Da qui leggono ed eseguono le risorse e molte operazioni in memoria.
Il codice shell è lo stesso loader PE utilizzato nelle precedenti campagne OceanLotus. Può essere emulato utilizzando . Alla fine, scarica db293b825dcc419ba7dc2c49fa2757ee.dll, lo carica in memoria ed esegue DllEntry.
La DLL estrae il contenuto della sua risorsa, lo decripta (AES-256-CBC) e lo decomprime (LZMA). La risorsa ha un formato specifico che è facile da decompilare.

Figura 13. Struttura di configurazione dell'installer (KaitaiStruct Visualizer)
La configurazione è esplicita – a seconda del livello di privilegi, i dati binari verranno scritti in %appdata%IntellogsBackgroundUploadTask.cpl o %windir%System32BackgroundUploadTask.cpl (o SysWOW64 per sistemi a 64 bit).
In seguito, la persistenza è garantita dalla creazione di un'attività denominata BackgroundUploadTask[junk].job, dove [junk] rappresenta un insieme di byte 0x9D e 0xA0.
Il nome dell'applicazione dell'attività %windir%System32control.exe, e il valore del parametro è il percorso del file binario caricato. L'attività nascosta viene eseguita ogni giorno.
Strutturalmente, il file CPL è una DLL con un nome interno ac8e06de0a6c4483af9837d96504127e.dll, che esporta la funzione CPlApplet. Questo file decripta la sua unica risorsa {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, quindi carica questo DLL e chiama la sua unica esportazione DllEntry.
Il file di configurazione del backdoor
La configurazione del backdoor è crittografata e incorporata nelle sue risorse. La struttura del file di configurazione è molto simile a quella precedente.

Figura 14. Struttura della configurazione del backdoor (Visualizer di KaitaiStruct)
Nonostante la struttura simile, i valori di molti campi sono stati aggiornati rispetto ai dati forniti nel .
Il primo elemento dell'array binario contiene il DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759), . Ma poiché il nome dell'esportazione è stato rimosso dal file binario, gli hash non corrispondono.
Ricerche aggiuntive
Raccogliendo campioni, abbiamo notato alcune caratteristiche. Il campione descritto è apparso circa a luglio 2018, mentre altri simili sono emersi recentemente, a metà gennaio – inizio febbraio 2019. È stato utilizzato un archivio SFX come vettore di infezione, che scarica un documento legittimo di esca e un file malevolo OCX.
Nonostante OceanLotus utilizzi timestamp falsi, abbiamo notato che i timestamp dei file SFX e OCX sono sempre gli stessi (0x57B0C36A (08/14/2016 @ 7:15pm UTC) e 0x498BE80F (02/06/2009 @ 7:34am UTC) di conseguenza). Probabilmente, ciò indica che gli autori hanno un certo «costruttore» che utilizza gli stessi modelli e semplicemente modifica alcune caratteristiche.
Tra i documenti che abbiamo esaminato dall'inizio del 2018, ci sono vari nomi che indicano l'interesse dei paesi attaccanti:
— The New Contact Information Of Cambodia Media(New).xls.exe
— 李建香 (Curriculum Vitae personale).exe (finto documento PDF di un CV)
— feedback, Rally negli USA dal 28 al 29 luglio 2018.exe
Dalla scoperta del backdoor {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll e dalla pubblicazione della sua analisi da parte di diversi ricercatori, abbiamo osservato alcune modifiche nei dati di configurazione del malware.
Innanzitutto, gli autori hanno iniziato a rimuovere i nomi dalle DLL ausiliarie (DNSprov.dll e due versioni HttpProv.dll). Poi gli operatori hanno smesso di impacchettare il terzo DLL (seconda versione HttpProv.dll), scegliendo di incorporare solo uno.
In secondo luogo, molti campi di configurazione del backdoor sono stati modificati, probabilmente per evitare il rilevamento, poiché molti IoCs sono diventati disponibili. Tra i campi importanti modificati dagli autori ci sono:
- sezione del registro AppX modificata (vedi IoCs)
- stringa di codifica del mutex («def», «abc», «ghi»)
- numero di porta
Finalmente, in tutte le nuove versioni analizzate sono apparsi nuovi C&C, elencati nella sezione IoCs.
Conclusioni
OceanLotus continua a evolversi. Il gruppo cyber si concentra sul miglioramento e sull'espansione degli strumenti e delle esche. Gli autori mascherano i payload dannosi utilizzando documenti che catturano l'attenzione, il cui tema è pertinente per le vittime previste. Sviluppano nuovi schemi e utilizzano anche strumenti di pubblico dominio, come l'exploit di Equation Editor. Inoltre, migliorano gli strumenti per ridurre il numero di artefatti lasciati sulle macchine delle vittime, abbassando così la probabilità di rilevamento da parte del software antivirus.
Indicatori di compromissione
Indicatori di compromissione e attributi MITRE ATT&CK disponibili e .
Fonte: habr.com
