# Config Extractor per DanaBot (PARTE 1) **[malverse.it/costruiamo-un-config-extractor-per-danabot-parte-1](https://malverse.it/costruiamo-un-config-extractor-per-danabot-parte-1)** ## Introduzione Ciao a tutti, oggi volevo analizzare la sfida bi-settimanale lanciata di Daniel di Zero2Auto che consiste questa volta nel scrivere un Config Extractor che funzioni per le diverse versioni di **DanaBot, un malware scritto in Delphi.** Da [Malpedia:](https://malpedia.caad.fkie.fraunhofer.de/details/win.danabot) _Proofpoints describes DanaBot as the latest example of malware focused on_ _persistence and stealing useful information that can later be monetized rather than_ _demanding an immediate ransom from victims. The social engineering in the low-_ _volume DanaBot campaigns we have observed so far has been well-crafted, again_ _pointing to a renewed focus on “quality over quantity” in email-based threats._ _DanaBot’s modular nature enables it to download additional components, increasing_ _the flexibility and robust stealing and remote monitoring capabilities of this banker._ Ci vengono forniti questi quattro link, che ci permettono di ottenere diverse versioni del sample: [Logicamente possiamo ottenere altri sample classificati come Danabot, ad esempio qui e](https://tria.ge/s/family:danabot) [qui.](https://any.run/malware-trends/danabot) In particolare, in questo post analizzeremo tre sample (MD5: **6b448c6851f3235c9b3d0c24353c480f, 5c0be4a5273dec6b3ebb180a90f337f2,** **611c2bf7aa7bb62e90f3a92f3682c0b5), realizzando un semplice script per estrarre gli IP del** ----- C&C; nei prossimi post analizzeremo come avviene la comunicazione con il C&C, indentificheremo le funzioni di cifratura, estrarremo la chiave RSA e realizzeremo lo script finale che funziona sui diversi sample forniti. Partiremo da analizzare il primo sample, si tratta del Main Component di DanaBot, successivamente analizzeremo dei sample più complessi che contengono al loro interno il Main Component. ## Analisi Main Component Danabot Partiamo analizzando il primo sample (MD5: 6b448c6851f3235c9b3d0c24353c480f); si tratta del Main Component di DanaBot, sviluppato in Delphi ed esporta diverse funzioni (f0, f1, …, f9): DIE rileva che si tratta di una DLL scritta in Delphi ----- Funzioni esportate dalla DLL Analizzando la funzione F0, dopo la decifratura di diverse stringhe e la creazione di un altro thread, troviamo la creazione di un thread che contiene diverse chiamate per effettuare operazioni con i socket (per chi volesse maggiori informazioni sul funzionamento dei socket [può consultare questa ottima guida); tracciando i parametri passati a queste funzioni,](http://www.lia.deis.unibo.it/Courses/RetiLA/RetiLA_06-07/materiale/lezioni/sockcx2.pdf) riusciamo ad ottenere dove effettivamente avviene la creazione del config. Creazione del Thread principale che si occupa di comunicare con il C&C La funzione che ci interessa attualmente è inet_addr, essendo che ha come parametro l’IP in formato dotted-decimal; in realtà non troveremo l’IP direttamente in questo formato, ma l’IP in formato decimale verrà prima convertito con una semplice funzione che ho rinominato **IntToIP e poi passato a inet_addr:** ----- Operazioni con i socket e conversione dell’IP da int Il primo parametro della funzione IntToIP è un parametro a sua volta della funzione padre, quindi analizzo le chiamate a questa funzione (solo una) e traccio tale valore; viene referenziato solo in due funzioni e in particolare una è interessante perché come parametro ha una variabile globale: Funzione che accede in scrittura al Config ----- Questa variabile è acceduta da diverse funzioni, in particolare una di queste effettua la scrittura in questa zona di memoria; essendo che non contiene dati, viene quindi popolata in runtime, avvio quindi il debugger e confermo che questa zona di memoria contiene proprio il config (inizia con 3C e termina con 4E): Config ottenuto con il debugger Confermata che fosse questa la funzione che costruisce il config, trovo infatti a un certo punto una variabile globale che contiene i diversi IP: IP in formato int Vediamo quindi un primo script specifico per questo sample, che poi verrà generalizzato per supportare i vari sample. In questo caso ho effettuato una regex sullo specifico move nella funzione di Config Builder per ottenere l’indirizzo specifico che contiene i diversi IP del C&C. ----- ``` import pefile, ipaddress, binascii, re, struct pe = None imageBase = None def GetRVA(va): return pe.get_offset_from_rva(va - imageBase) def GetVA(raw): return imageBase + pe.get_rva_from_offset(raw) def main(): global pe, imageBase filename = "sample3" with open(filename, 'rb') as sample: data = bytearray(sample.read()) pe = pefile.PE(filename) imageBase = pe.OPTIONAL_HEADER.ImageBase copy_operation = b'\xa1\x68\x57\x54\x00' for m in re.compile(copy_operation).finditer(data): addrStart = int(hex(struct.unpack("