Il ransomware di REvil Team: un’analisi più approfondita
Revil Sodinokibi
A seguito del recente attacco ransomware che ha interessato l’azienda americana Kaseya e, di conseguenza, numerose aziende ad essa collegate, il CERT-AGID ha voluto approfondire la conoscenza sul malware denominato REvil, anche noto come Sodinokibi, utilizzato dai criminali per cifrare i dati presenti su un consistente numero di macchine sparse in diversi paesi.
Dalle prime impressioni, REvil è molto simile a Netwalker. Il ransomware non presenta particolari tecniche di offuscamento se non per quanto riguarda le funzioni API importate e le stringhe. Queste ultime vengono estratte utilizzando un enorme buffer composto da una serie di coppie di chiavi RC4 e dei relativi dati cifrati.
Da quanto osservato nel corso dell’analisi, la prima azione compiuta dal ransomware è proprio quella di decifrare la propria configurazione: si tratta di una stringa JSON cifrata con RC4 tramite una chiave fissa ed in chiaro. Tra le informazioni contenute nel JSON, che riguardano principalmente le istruzioni tecniche (le estensioni, i processi da bloccare, etc.), è presente anche una lista di domini (C2) utilizzata dal malware per notificare che quella determinata macchina è stata compromessa con successo. I dati passati al C2 indicano anche se il target su cui si sta lavorando è da attaccare oppure no (chiave “bro“). È interessante notare che la lista dei C2, che si presume siano tutti domini compromessi, ne comprende 8 italiani.
Il ransomware raccoglie informazioni sulla macchina (nome utente, nome computer, dominio o gruppo di lavoro e legge lo spazio libero e i volumi presenti) e si disinnesca qualora il layout della tastiera o la lingua del sistema corrispondano ad un paese ex-URSS o alla Siria.
Dalle stringhe decodificate è stato possibile risalire ai parametri che possono essere passati al ransomware da riga di comando. Tra questi la possibilità di cifrare un percorso specifico sul disco o di evitare la cifratura delle cartelle condivise o ancora la modalità safeboot mode.
La modalità “Smode” (safeboot mode) si attiva con il parametro -smode, in tal caso il ransomware provvede ad impostare la password dell’utente corrente come DTrump4ever, configura l’auto-logon ed abilita la modalità provvisoria con rete prima di procedere con il riavvio del sistema.
Analisi tecnica
I packer
Il Ransomware vero è proprio è contenuto dentro due packer.
Il primo packer, agent.exe, si limita ad estrarre ed eseguire due risorse PE. Il secondo packer, leggermente più complesso, contiene uno shellcode cifrato che ha il compito di estrarre ed eseguire il ransomware vero e proprio.
agent.exe
Questo packer non è complesso, si notano subito le due risorse PE:
Il codice non presenza alcun tipo di offuscamento e sembra scritto in C puro.
Le risorse sono salvate in C:\Windows o, in alternativa in caso di errore, nella directory temporanea. La risorsa più grande, la 102, contiene il secondo packer ed è salvata in mpsvc.dll. L’altra risorsa viene salvata in MsMpEng.exe.
MsMpEng.exe è, come ormai ribadito da varie fonti, una copia legittima di un componente di Windows Defender. Questo ha tra le proprie dipendenze proprio mpsvc.dll.
Quando agent.exe esegue la copia appena salvata di MsMpEng.exe, quest’ultima carica mpsvc.dll e ne richiama la funzione ServiceCrtMain, dando avvio al secondo stadio di infezione.
mpsvc.dll
Questo packer è leggermente più complesso perchè il PE è estratto da uno shellcode che è cifrato con quello che riteniamo sia RC2 CFB64.
Una volta identificate le funzioni crittografiche, l’analisi statica rileva un codice pulito e leggibile.
Nell’immagine sopra sono riportate le prime istruzioni utili che vengono eseguite: prima viene creato un thread ed un ciclo di attesa. Nel primo blocco viene decodificata una chiave (chiamata buffer1 nell’immagine) e nel secondo blocco viene usata la chiave per decifrare lo shellcode.
La chiave è decodificata con un rolling xor leggermente modificato. Il codice in C è il seguente:
void decode_key(char* data, size_t len)
{
unsigned char key = data[0] ^ '$';
for (size_t i = 0; i < len; i++)
data[i] ^= (key ^ i);
}
Identificare l’algoritmo di crittografia usato per decifrare lo shellcode è meno immediato. Cercando nella catena delle chiamate qualche elemento distintivo, scopriamo che il packer è stato linkato staticamente con OpenSSL, come mostra l’immagine sotto.
Le funzioni EVP sono ben note e l’assert consente di identificare la funzione in cui si trova come, in questo caso, quella di decifratura. Un’analisi più approfondita rileva che la funzione è usabile per entrambe le operazioni: cifratura e decifratura.
Una volta identificata la funzione di decifratura, si intuisce che il primo parametro passato è il contesto EVP e che quindi qualche funzione prima lo deve necessariamente inizializzare con i parametri crittografici.
Infatti, seguendo il puntatore al contesto e ricordando che la funzione OpenSSL che inizializza tale contesto si aspetta un puntatore ad una struttura EVP_CIPHER, si trova agevolmente la struttura con i parametri di interesse.
La struttura EVP_CIPHER contiene l’identificato dell’algoritmo di cifratura e vari altri parametri. Cercando nel codice sorgente (in questo caso abbiamo trovato un’instanza di BoringSSL ma questa è compatibile con OpenSSL) il valore 0x27 corrisponde all’algoritmo RC2 CFB64.
Nota: Non abbiamo verificato che l’algoritmo usato sia effettivamente RC2 CFB64 tramite un test apposito.
Per analizzare lo shellcode abbiamo fatto ricorso all’analisi dinamica. Questa si può facilmente effettuare facendo eseguire il corpo di DllMain e poi impostando EIP all’inizio della funzione ServiceCrtMain, senza passare per il debug di MsMpEng.exe.
Lo shellcode è semplice ed utilizza il solito trucco di usare un’istruzione call per ottenere l’indirizzo assoluto di una porzione dei propri dati.
Una prima porzione di dati contiene le DLL e le API da importare – qui si notano le classiche API usate per mappare un PE -, la seconda porzione contiene il PE codificato, un algoritmo molto simile a quello trovato nel packer agent.exe (eccetto che l’indice di rolling è resettato a zero ogni 0xd2 bytes).
Una volta decodificato, il PE appare privo di firme MZ e PE e di nomi di sezioni, come mostrato sotto:
Tuttavia un occhio attento riconosce la bassa entropia dei dati e la reminiscenza con l’header PE.
E’ infatti facile verificare che si tratta effettivamente di un PE e rimesse le firme MZ e PE nei rispettivi header, il file è pronto per l’analisi.
Il packer procederà poi a mapparlo ed eseguirlo.
Il ransomware
Il ransomware non presenta tecniche di offuscamento se non per due aspetti:
- Le API importate
- Le stringhe
Decifrare le stringhe
Si notano varie chiamate ad una specifica funzione, tutte queste chiamate hanno in comune di avere sempre il solito buffer come primo parametro, gli altri parametri sono tre numeri e poi un puntatore.
Cercando le xref si nota che la funzione è chiamata innumerevoli volte, ciò fa pensare che sia la funzione di decodifica delle stringhe.
L’implementazione di decryptString è semplice: il secondo parametro (se consideriamo l’ultima chiamata nell’immagine, parliamo di 0x9d0) è aggiunto al primo (buffer) per ottenere un puntatore a quella che si rileverà una chiave RC4 specifica per la stringa. Il terzo parametro (5 nell’esempio) è la lunghezza della chiave. Il quarto parametro è la lunghezza dei dati cifrati (e anche della stringa, per come funzione RC4) e l’ultimo parametro è un puntatore che riceverà la stringa decifrata (è decifrata inplace).
Le stringhe cifrate quindi hanno un formato di questo tipo: un enorme buffer composto da una serie di coppie di chiavi RC4 ed i relativi dati cifrati. Lunghezza e posizione delle coppie sono codificate direttamente nelle chiamate.
Per procedere con l’analisi abbiamo quindi preparato uno script IDA Python per aggiungere un commento accanto ad ogni chiamata alla funzione di decifratura. Di seguito il codice:
import idautils, idc
def get_decrypt_func(name="decryptString"):
for ea, n in idautils.Names():
if n == name:
return ea
return None
def get_call_sites(ea):
return [x.frm for x in idautils.XrefsTo(ea)]
def get_push_value(inst):
mnem = idc.GetMnem(inst)
op_type = idc.GetOpType(inst, 0)
op_val = idc.GetOperandValue(inst, 0)
#push imm8/32
if mnem == "push" and op_type == 5:
return op_val
#push reg
if mnem == "push" and op_type == 1:
#print("push reg")
min_ea = idaapi.get_func(inst).start_ea
while inst >= min_ea:
inst = idc.PrevHead(inst)
mnem = idc.GetMnem(inst)
op_type1 = idc.GetOpType(inst, 0)
op_type2 = idc.GetOpType(inst, 1)
op_val1 = idc.GetOperandValue(inst, 0)
op_val2 = idc.GetOperandValue(inst, 1)
#mov r32, imm32
if mnem == "mov" and op_type1 == 1 and op_type2 == 5 and op_val1 == op_val:
return op_val2
#push imm
#pop reg32
if mnem == "pop" and op_type1 == 1 and op_val1 == op_val:
prev_inst = idc.PrevHead(inst)
mnem = idc.GetMnem(prev_inst)
op_type1 = idc.GetOpType(prev_inst, 0)
op_val1 = idc.GetOperandValue(prev_inst, 0)
if mnem == "push" and op_type1 == 5:
return op_val1
return None
def get_first_push_backward(ea):
min_ea = idaapi.get_func(ea).start_ea
while ea >= min_ea:
ea = idc.PrevHead(ea)
if idc.GetMnem(ea) == "push":
return ea
return None
def decrypt_string(params):
ptr = params["buffer"] + params["offset"]
key = idaapi.get_bytes(ptr, params["keylen"])
data = idaapi.get_bytes(ptr + params["keylen"], params["datalen"])
return rc4(data, key)
def rc4(data, key):
S = range(256)
j = 0
out = ""
#KSA Phase
for i in range(256):
j = (j + S[i] + ord( key[i % len(key)] )) % 256
S[i] , S[j] = S[j] , S[i]
#PRGA Phase
i = j = 0
for char in data:
i = ( i + 1 ) % 256
j = ( j + S[i] ) % 256
S[i] , S[j] = S[j] , S[i]
out += chr(ord(char) ^ S[(S[i] + S[j]) % 256])
return out.replace("\x00", "")
def get_params(sites):
params = []
names = ["buffer", "offset", "keylen", "datalen"]
for ea in sites:
instance = {}
valid = True
for i in range(4):
X = ea
ea = get_first_push_backward(ea) #, off_push, keylen_push, data_push = [ea = get_first_push_backward(ea) for _ in range(4)]
val = get_push_value(ea)
if val is None:
print(hex(ea) + " cannot find " + names[i] + " " + hex(X))
valid = False
break
else:
instance[names[i]] = val
if valid and instance["datalen"] <= 400:
params.append(instance)
elif valid and instance["datalen"] > 400:
print("too long: " + hex(ea) + ": " + str(instance))
return params
#idc.set_cmt(ea, comment, 1)
sites = get_call_sites(get_decrypt_func())
params = get_params(sites)
strings = [decrypt_string(p) for p in params]
print(strings)
Lo script mostra anche le stringhe decodificate a video, per l’utilità dell’analista interessato.
La decodifica delle API
Nel codice del ransomware si notano varie chiamate indirette verso indirizzi che contengono valori DWORD che non possono palesemente puntare a del codice.
Infatti, la prima azione compiuta dal codice del malware è quella di processare il buffer che contiene questi valori.
La funzione che processa ogni singolo elemento è un enorme switch. L’unico parametro in ingresso viene modificato per ottenere un valore a 11 bit che identifica la DLL che contiene l’API da importare.
Grazie alla decodifica delle stringhe possiamo risalire, dato un indice, alla DLL caricata (richiede un po’ di lavoro seguire i vari diramamenti). Un paio di DLL inoltre sono caricate direttamente dal PEB, si tratta di kernel32.dll e ntdll.dll tramite l’hashing che vedremo più avanti.
Una volta trovata la DLL, i 21 bit bassi del valore in input vengono usati per trovare la funzione da importare. La tecnica è consolidata: viene fatto un hash del nome e il valore confrontato con quanto passato in input.
Chiamiamo token il valore dato in input alla funzione che si occupa di importare una DLL. Le seguenti funzioni sono usate per ottenere l’indice della DLL e l’indice della funzione da importare. Inoltre è mostrata anche la corrispondenza tra indice di DLL e nome della DLL e la funzione usata per l’hashing dei nomi.
uint32_t token_decode_dll_index(uint32_t token)
{
return ((token << 0x10) ^ token ^ 0x99cd8ecd) >> 0x15;
}
uint32_t token_decode_dll_proc(uint32_t token)
{
return ((token << 0x10) ^ token ^ 0x99cd8ecd) & 0x1fffff;
}
apimod_t apis[] ={
{ 0x461, "ntdll.dll" },
{ 0x462, "ole32.dll" },
{ 0x493, "shell32.dll" },
{ 0x369, "advapi32.dll" },
{ 0x2ca, "gdi32.dll" },
{ 0x1d7, "netapi32.dll" },
{ 0x80, "kernel32.dll" },
{ 0x4b5, "winhttp.dll" },
{ 0x785, "oleaut32.dll" },
{ 0x77c, "crypt32.dll" },
{ 0x6eb, "rstrtmgr.dll" },
{ 0x61f, "mpr.dll" },
{ 0x60f, "shlwapi.dll" },
{ 0x51b, "winmm.dll" },
{ 0x519, "user32.dll" }
};
uint32_t hash_name(const char* str)
{
uint32_t s = 0x2b;
while (*str)
{
unsigned char c = (unsigned char)*str++;
s = s * 0x10f + c;
}
return s & 0x1fffff;
}
Come anticipato, due DLL sono recuperate tramite il PEB usando il classico trucco dell’hashing del nome. La funzione usata è simile, ma non identica (mette in minuscolo il nome ed usa diversa costante di xor finale). Non la riportiamo perchè di particolare interesse.
Abbiamo usato questo sorgente C per creare una stringa che contiene un array Python con la corrispondenza tra indirizzo del token e API usata: in questo modo con uno script IDA Python abbiamo rinominato ogni token con l’API che rappresenta.
Questo ci permette di vedere le API usate e quindi dare inizio all’analisi vera e propria.
La configurazione
La prima azione compiuta dal ransomware è quella di decifrare la propria configurazione. Si tratta di una stringa JSON cifrata con RC4 tramite una chiave fissa ed in chiaro:
La configurazione si presenta in questo modo:
{
"pk":"9/AgyLvWEviWbvuayR2k0Q140e9LZJ5hwrmto/zCyFM=",
"pid":"$2a$12$prOX/4eKl8zrpGSC5lnHPecevs5NOckOUW5r3s4JJYDnZZSghvBkq",
"sub":"8254",
"dbg":false,
"et":0,
"wipe":true,
"wht":{
"fld":[
"program files",
"appdata",
"mozilla",
"$windows.~ws",
"application data",
"$windows.~bt",
"google",
"$recycle.bin",
"windows.old",
"programdata",
"system volume information",
"program files (x86)",
"boot",
"tor browser",
"windows",
"intel",
"perflogs",
"msocache"
],
"fls":[
"ntldr",
"thumbs.db",
"bootsect.bak",
"autorun.inf",
"ntuser.dat.log",
"boot.ini",
"iconcache.db",
"bootfont.bin",
"ntuser.dat",
"ntuser.ini",
"desktop.ini"
],
"ext":[
"ps1",
"ldf",
"lock",
"theme",
"msi",
"sys",
"wpx",
"cpl",
"adv",
"msc",
"scr",
"bat",
"key",
"ico",
"dll",
"hta",
"deskthemepack",
"nomedia",
"msu",
"rtp",
"msp",
"idx",
"ani",
"386",
"diagcfg",
"bin",
"mod",
"ics",
"com",
"hlp",
"spl",
"nls",
"cab",
"exe",
"diagpkg",
"icl",
"ocx",
"rom",
"prf",
"themepack",
"msstyles",
"lnk",
"icns",
"mpa",
"drv",
"cur",
"diagcab",
"cmd",
"shs"
]
},
"wfld":[
"backup"
],
"prc":[
"encsvc",
"powerpnt",
"ocssd",
"steam",
"isqlplussvc",
"outlook",
"sql",
"ocomm",
"agntsvc",
"mspub",
"onenote",
"winword",
"thebat",
"excel",
"mydesktopqos",
"ocautoupds",
"thunderbird",
"synctime",
"infopath",
"mydesktopservice",
"firefox",
"oracle",
"sqbcoreservice",
"dbeng50",
"tbirdconfig",
"msaccess",
"visio",
"dbsnmp",
"wordpad",
"xfssvccon"
],
"dmn":"boisehosting.net;fotoideaymedia.es;dubnew.com;stallbyggen.se;koken-voor-baby.nl;juneauopioidworkgroup.org;vancouver-print.ca;zewatchers.com;bouquet-de-roses.com;seevilla-dr-sturm.at;olejack.ru;i-trust.dk;wasmachtmeinfonds.at;appsformacpc.com;friendsandbrgrs.com;thenewrejuveme.com;xn--singlebrsen-vergleich-nec.com;sabel-bf.com;seminoc.com;ceres.org.au;cursoporcelanatoliquido.online;marietteaernoudts.nl;tastewilliamsburg.com;charlottepoudroux-photographie.fr;aselbermachen.com;klimt2012.info;accountancywijchen.nl;creamery201.com;rerekatu.com;makeurvoiceheard.com;vannesteconstruct.be;wellplast.se;andersongilmour.co.uk;bradynursery.com;aarvorg.com;facettenreich27.de;balticdermatology.lt;artige.com;highlinesouthasc.com;crowd-patch.co.uk;sofavietxinh.com;jorgobe.at;danskretursystem.dk;higadograsoweb.com;supportsumba.nl;ruralarcoiris.com;projetlyonturin.fr;kidbucketlist.com.au;harpershologram.wordpress.com;ohidesign.com;international-sound-awards.com;krlosdavid.com;durganews.com;leather-factory.co.jp;coding-machine.com;i-arslan.de;caribbeansunpoker.com;mir-na-iznanku.com;ki-lowroermond.nl;promesapuertorico.com;kissit.ca;dezatec.es;cite4me.org;grelot-home.com;musictreehouse.net;hkr-reise.de;id-vet.com;gasolspecialisten.se;vyhino-zhulebino-24.ru;karacaoglu.nl;bayoga.co.uk;solhaug.tk;jadwalbolanet.info;ncid.bc.ca;bricotienda.com;boldcitydowntown.com;homecomingstudio.com;sojamindbody.com;castillobalduz.es;asgestion.com;dushka.ua;hiddencitysecrets.com.au;danubecloud.com;roadwarrior.app;newstap.com.ng;no-plans.com;schoolofpassivewealth.com;senson.fi;denifl-consulting.at;lmtprovisions.com;talentwunder.com;acomprarseguidores.com;myzk.site;theapifactory.com;midmohandyman.com;argos.wityu.fund;dinslips.se;kalkulator-oszczednosci.pl;wurmpower.at;drugdevice.org;foretprivee.ca;nurturingwisdom.com;funjose.org.gt;blgr.be;readberserk.com;lescomtesdemean.be;firstpaymentservices.com;malychanieruchomoscipremium.com;travelffeine.com;latribuessentielle.com;lusak.at;better.town;smessier.com;kafu.ch;ikads.org;id-et-d.fr;sanaia.com;prochain-voyage.net;edrcreditservices.nl;yassir.pro;gantungankunciakrilikbandung.com;moveonnews.com;bhwlawfirm.com;bigbaguettes.eu;edv-live.de;littlebird.salon;iyengaryogacharlotte.com;toponlinecasinosuk.co.uk;zonamovie21.net;caribdoctor.org;body-guards.it;calabasasdigest.com;elimchan.com;herbstfeststaefa.ch;thewellnessmimi.com;corola.es;pomodori-pizzeria.de;controldekk.com;lichencafe.com;lefumetdesdombes.com;seagatesthreecharters.com;copystar.co.uk;systemate.dk;alsace-first.com;webmaster-peloton.com;koko-nora.dk;jakekozmor.com;mousepad-direkt.de;iwelt.de;dirittosanitario.biz;precisionbevel.com;boulderwelt-muenchen-west.de;chatizel-paysage.fr;praxis-foerderdiagnostik.de;globedivers.wordpress.com;nosuchthingasgovernment.com;neuschelectrical.co.za;schmalhorst.de;mediaclan.info;ihr-news.jp;bunburyfreightservices.com.au;edelman.jp;backstreetpub.com;spsshomeworkhelp.com;lillegrandpalais.com;smithmediastrategies.com;enovos.de;loprus.pl;bsaship.com;importardechina.info;shhealthlaw.com;freie-baugutachterpraxis.de;maxadams.london;deprobatehelp.com;baylegacy.com;deltacleta.cat;financescorecard.com;maureenbreezedancetheater.org;plv.media;winrace.no;leoben.at;pawsuppetlovers.com;tuuliautio.fi;paradicepacks.com;1team.es;testcoreprohealthuk.com;broseller.com;iyahayki.nl;lorenacarnero.com;satyayoga.de;notmissingout.com;chavesdoareeiro.com;mezhdu-delom.ru;hugoversichert.de;jusibe.com;imaginado.de;craftleathermnl.com;sauschneider.info;atalent.fi;conexa4papers.trade;global-kids.info;serce.info.pl;agence-referencement-naturel-geneve.net;zimmerei-fl.de;augenta.com;fannmedias.com;villa-marrakesch.de;ulyssemarketing.com;x-ray.ca;schraven.de;bowengroup.com.au;sairaku.net;southeasternacademyofprosthodontics.org;modamilyon.com;pubweb.carnet.hr;alysonhoward.com;sahalstore.com;triactis.com;panelsandwichmadrid.es;xn--vrftet-pua.biz;adoptioperheet.fi;miriamgrimm.de;filmstreamingvfcomplet.be;kostenlose-webcams.com;deoudedorpskernnoordwijk.nl;live-your-life.jp;mardenherefordshire-pc.gov.uk;instatron.net;mirjamholleman.nl;euro-trend.pl;kojima-shihou.com;nuzech.com;basisschooldezonnewijzer.nl;quemargrasa.net;actecfoundation.org;gamesboard.info;podsosnami.ru;extensionmaison.info;retroearthstudio.com;polzine.net;hmsdanmark.dk;linnankellari.fi;schoellhammer.com;elpa.se;mooreslawngarden.com;rozemondcoaching.nl;lenreactiv-shop.ru;uranus.nl;advokathuset.dk;ora-it.de;love30-chanko.com;smartypractice.com;rebeccarisher.com;cafemattmeera.com;bargningavesta.se;www1.proresult.no;rhinosfootballacademy.com;polychromelabs.com;notsilentmd.org;makeflowers.ru;zimmerei-deboer.de;ccpbroadband.com;iwr.nl;wychowanieprzedszkolne.pl;greenpark.ch;bimnapratica.com;lachofikschiet.nl;memaag.com;parking.netgateway.eu;tanzschule-kieber.de;antiaginghealthbenefits.com;simulatebrain.com;digi-talents.com;hairnetty.wordpress.com;samnewbyjax.com;helikoptervluchtnewyork.nl;devlaur.com;cimanchesterescorts.co.uk;houseofplus.com;rushhourappliances.com;pelorus.group;kedak.de;lapmangfpt.info.vn;pivoineetc.fr;marchand-sloboda.com;anybookreader.de;markelbroch.com;celularity.com;rafaut.com;unim.su;latestmodsapks.com;thedresserie.com;bigasgrup.com;slimidealherbal.com;phantastyk.com;thailandholic.com;tophumanservicescourses.com;aakritpatel.com;navyfederalautooverseas.com;wien-mitte.co.at;forestlakeuca.org.au;sporthamper.com;psnacademy.in;michaelsmeriglioracing.com;jbbjw.com;colorofhorses.com;iqbalscientific.com;cleliaekiko.online;stemplusacademy.com;effortlesspromo.com;microcirc.net;mbfagency.com;theduke.de;drinkseed.com;troegs.com;peterstrobos.com;consultaractadenacimiento.com;huissier-creteil.com;geoffreymeuli.com;skanah.com;despedidascostablanca.es;alten-mebel63.ru;theadventureedge.com;profectis.de;mepavex.nl;rimborsobancario.net;pasvenska.se;tampaallen.com;symphonyenvironmental.com;videomarketing.pro;pickanose.com;licor43.de;aniblinova.wordpress.com;ventti.com.ar;hhcourier.com;buymedical.biz;oncarrot.com;nachhilfe-unterricht.com;mapawood.com;vox-surveys.com;milsing.hr;sotsioloogia.ee;nativeformulas.com;kirkepartner.dk;partnertaxi.sk;visiativ-industry.fr;transliminaltribe.wordpress.com;chefdays.de;cursosgratuitosnainternet.com;faronics.com;d2marketing.co.uk;lapinlviasennus.fi;miraclediet.fun;bristolaeroclub.co.uk;jameskibbie.com;songunceliptv.com;baronloan.org;idemblogs.com;eglectonk.online;christinarebuffetcourses.com;bastutunnan.se;blogdecachorros.com;finde-deine-marke.de;platformier.com;antenanavi.com;vanswigchemdesign.com;gporf.fr;pmc-services.de;atmos-show.com;danholzmann.com;itelagen.com;transportesycementoshidalgo.es;gymnasedumanagement.com;siluet-decor.ru;gasbarre.com;milltimber.aberdeen.sch.uk;tinkoff-mobayl.ru;expandet.dk;rumahminangberdaya.com;polymedia.dk;newyou.at;zenderthelender.com;artallnightdc.com;tomaso.gr;centrospgolega.com;sweering.fr;tux-espacios.com;ecopro-kanto.com;spacecitysisters.org;bierensgebakkramen.nl;all-turtles.com;coffreo.biz;tandartspraktijkheesch.nl;vietlawconsultancy.com;deko4you.at;tennisclubetten.nl;extraordinaryoutdoors.com;crowcanyon.com;classycurtainsltd.co.uk;apolomarcas.com;verytycs.com;manijaipur.com;veybachcenter.de;falcou.fr;associationanalytics.com;beautychance.se;pocket-opera.de;christ-michael.net;vdberg-autoimport.nl;4net.guru;finediningweek.pl;stampagrafica.es;naturalrapids.com;ussmontanacommittee.us;beaconhealthsystem.org;upplandsspar.se;tradiematepro.com.au;oneplusresource.org;maasreusel.nl;aodaichandung.com;campus2day.de;burkert-ideenreich.de;you-bysia.com.au;mediaacademy-iraq.org;xtptrack.com;eaglemeetstiger.de;mountaintoptinyhomes.com;stemenstilte.nl;noskierrenteria.com;ivfminiua.com;biapi-coaching.fr;art2gointerieurprojecten.nl;corendonhotels.com;ditog.fr;kadesignandbuild.co.uk;abogadosaccidentetraficosevilla.es;camsadviser.com;limassoldriving.com;worldhealthbasicinfo.com;kojinsaisei.info;schmalhorst.de;bigler-hrconsulting.ch;girlillamarketing.com;xn--rumung-bua.online;naturstein-hotte.de;agence-chocolat-noir.com;stormwall.se;collaborativeclassroom.org;baptisttabernacle.com;streamerzradio1.site;mooglee.com;smart-light.co.uk;fitovitaforum.com;c2e-poitiers.com;igrealestate.com;wari.com.pe;takeflat.com;logopaedie-blomberg.de;mrsplans.net;mooshine.com;humanityplus.org;otsu-bon.com;onlyresultsmarketing.com;interactcenter.org;ungsvenskarna.se;35-40konkatsu.net;zzyjtsgls.com;spectrmash.ru;tenacitytenfold.com;torgbodenbollnas.se;drnice.de;lightair.com;huesges-gruppe.de;promalaga.es;paulisdogshop.de;hotelsolbh.com.br;julis-lsa.de;myteamgenius.com;darnallwellbeing.org.uk;refluxreducer.com;educar.org;kuntokeskusrok.fi;truenyc.co;comparatif-lave-linge.fr;frontierweldingllc.com;autodemontagenijmegen.nl;spylista.com;allfortheloveofyou.com;ilso.net;corona-handles.com;micahkoleoso.de;fairfriends18.de;haremnick.com;ecoledansemulhouse.fr;blewback.com;macabaneaupaysflechois.com;osterberg.fi;surespark.org.uk;stupbratt.no;hokagestore.com;mirkoreisser.de;tomoiyuma.com;tigsltd.com;manifestinglab.com;glennroberts.co.nz;hardinggroup.com;zso-mannheim.de;yousay.site;dublikator.com;oneheartwarriors.at;pointos.com;kenhnoithatgo.com;ausbeverage.com.au;testzandbakmetmening.online;grupocarvalhoerodrigues.com.br;werkkring.nl;hotelzentral.at;vibethink.net;123vrachi.ru;allure-cosmetics.at;mrxermon.de;bloggyboulga.net;bouldercafe-wuppertal.de;sobreholanda.com;smogathon.com;beyondmarcomdotcom.wordpress.com;wraithco.com;bookspeopleplaces.com;montrium.com;webcodingstudio.com;lucidinvestbank.com;ncs-graphic-studio.com;stingraybeach.com;aglend.com.au;lecantou-coworking.com;tongdaifpthaiphong.net;solerluethi-allart.ch;coursio.com;otto-bollmann.de;madinblack.com;vibehouse.rw;bridgeloanslenders.com;erstatningsadvokaterne.dk;resortmtn.com;socstrp.org;pier40forall.org;ostheimer.at;quickyfunds.com;aminaboutique247.com;jobcenterkenya.com;jenniferandersonwriter.com;marcuswhitten.site;mediaplayertest.net;irinaverwer.com;stoeberstuuv.de;lebellevue.fr;the-virtualizer.com;outcomeisincome.com;gonzalezfornes.es;kunze-immobilien.de;myhealth.net.au;helenekowalsky.com;xn--fn-kka.no;withahmed.com;simplyblessedbykeepingitreal.com;havecamerawilltravel2017.wordpress.com;muamuadolls.com;balticdentists.com;mank.de;croftprecision.co.uk;jandaonline.com;datacenters-in-europe.com;gw2guilds.org;raschlosser.de;geekwork.pl;pv-design.de;opatrovanie-ako.sk;ausair.com.au;commonground-stories.com;parebrise-tla.fr;vloeren-nu.nl;conasmanagement.de;dlc.berlin;liveottelut.com;4youbeautysalon.com;lykkeliv.net;adultgamezone.com;hexcreatives.co;citymax-cr.com;portoesdofarrobo.com;patrickfoundation.net;tonelektro.nl;atozdistribution.co.uk;urclan.net;evergreen-fishing.com;body-armour.online;nsec.se;autopfand24.de;syndikat-asphaltfieber.de;yourobgyn.net;vihannesporssi.fi;new.devon.gov.uk;teczowadolina.bytom.pl;antonmack.de;dpo-as-a-service.com;pogypneu.sk;creative-waves.co.uk;htchorst.nl;xn--fnsterputssollentuna-39b.se;norpol-yachting.com;parkstreetauto.net;sloverse.com;candyhouseusa.com;tsklogistik.eu;smejump.co.th;diversiapsicologia.es;unetica.fr;drfoyle.com;cranleighscoutgroup.org;dekkinngay.com;n1-headache.com;amerikansktgodis.se;evangelische-pfarrgemeinde-tuniberg.de;fransespiegels.nl;coastalbridgeadvisors.com;qualitaetstag.de;kath-kirche-gera.de;alhashem.net;schutting-info.nl;2ekeus.nl;berlin-bamboo-bikes.org;minipara.com;blood-sports.net;milestoneshows.com;physiofischer.de;ontrailsandboulevards.com;babcockchurch.org;healthyyworkout.com;plantag.de;krcove-zily.eu;mylolis.com;fax-payday-loans.com;praxis-management-plus.de;smokeysstoves.com;longislandelderlaw.com;calxplus.eu;mountsoul.de;dubscollective.com;luckypatcher-apkz.com;epwritescom.wordpress.com;fundaciongregal.org;klusbeter.nl;jobmap.at;oldschoolfun.net;abl1.net;labobit.it;romeguidedvisit.com;carrybrands.nl;people-biz.com;blossombeyond50.com;theclubms.com;whittier5k.com;jolly-events.com;kisplanning.com.au;rostoncastings.co.uk;ravensnesthomegoods.com;nhadatcanho247.com;vetapharma.fr;hihaho.com;tulsawaterheaterinstallation.com;purposeadvisorsolutions.com;faizanullah.com;directwindowco.com;herbayupro.com;pay4essays.net;work2live.de;stoneys.ch;webhostingsrbija.rs;lange.host;baustb.de;psa-sec.de;hushavefritid.dk;lloydconstruction.com;ra-staudte.de;mbxvii.com;tecnojobsnet.com;starsarecircular.org;twohourswithlena.wordpress.com;stoeferlehalle.de;merzi.info;garage-lecompte-rouen.fr;hypozentrum.com;nestor-swiss.ch;thomasvicino.com;kmbshipping.co.uk;denovofoodsgroup.com;planchaavapor.net;dr-pipi.de;qlog.de;lynsayshepherd.co.uk;aco-media.nl;abogadoengijon.es;bestbet.com;liliesandbeauties.org;norovirus-ratgeber.de;thee.network;stacyloeb.com;bundabergeyeclinic.com.au;sandd.nl;americafirstcommittee.org;milanonotai.it;kevinjodea.com;easytrans.com.au;westdeptfordbuyrite.com;carriagehousesalonvt.com;operaslovakia.sk;corelifenutrition.com;hashkasolutindo.com;compliancesolutionsstrategies.com;edgewoodestates.org;mastertechengineering.com;pinkexcel.com;cnoia.org;aprepol.com;rieed.de;katketytaanet.fi;lascuola.nl;assurancesalextrespaille.fr;paymybill.guru;xoabigail.com;ligiercenter-sachsen.de;answerstest.ru;airconditioning-waalwijk.nl;pixelarttees.com;freie-gewerkschaften.de;dnepr-beskid.com.ua;eco-southafrica.com;dutchcoder.nl;iphoneszervizbudapest.hu;allentownpapershow.com;bingonearme.org;summitmarketingstrategies.com;completeweddingkansas.com;wolf-glas-und-kunst.de;employeesurveys.com;scenepublique.net;monark.com;seitzdruck.com;alvinschwartz.wordpress.com;knowledgemuseumbd.com;spd-ehningen.de;boosthybrid.com.au;launchhubl.com;revezlimage.com;dontpassthepepper.com;petnest.ir;associacioesportivapolitg.cat;12starhd.online;jerling.de;kaotikkustomz.com;sarbatkhalsafoundation.org;solinegraphic.com;skiltogprint.no;craigmccabe.fun;puertamatic.es;mylovelybluesky.com;run4study.com;pierrehale.com;cactusthebrand.com;101gowrie.com;nicoleaeschbachorg.wordpress.com;architekturbuero-wagner.net;mindpackstudios.com;vitavia.lt;bouncingbonanza.com;lukeshepley.wordpress.com;igfap.com;bockamp.com;levihotelspa.fi;exenberger.at;tinyagency.com;familypark40.com;alfa-stroy72.com;boompinoy.com;mdacares.com;architecturalfiberglass.org;slupetzky.at;sinal.org;qualitus.com;deepsouthclothingcompany.com;groupe-frayssinet.fr;synlab.lt;kamienny-dywan24.pl;ilcdover.com;humancondition.com;insigniapmg.com;arteservicefabbro.com;team-montage.dk;iviaggisonciliegie.it;austinlchurch.com;rehabilitationcentersinhouston.net;zervicethai.co.th;vickiegrayimages.com;ziegler-praezisionsteile.de;crediacces.com;comarenterprises.com;courteney-cox.net;trapiantofue.it;space.ua;odiclinic.org;noesis.tech;urmasiimariiuniri.ro;8449nohate.org;xltyu.com;kikedeoliveira.com;remcakram.com;degroenetunnel.com;strandcampingdoonbeg.com;haar-spange.com;pmcimpact.com;ceid.info.tr;gemeentehetkompas.nl;stopilhan.com;dareckleyministries.com;sportverein-tambach.de;ivivo.es;braffinjurylawfirm.com;pcprofessor.com;bordercollie-nim.nl;hrabritelefon.hr;ctrler.cn;makeitcount.at;foryourhealth.live;seproc.hn;ianaswanson.com;nijaplay.com;brandl-blumen.de;lubetkinmediacompanies.com;ouryoungminds.wordpress.com;micro-automation.de;apprendrelaudit.com;securityfmm.com;geisterradler.de;morawe-krueger.de;nmiec.com;sla-paris.com;figura.team;vitalyscenter.es;jvanvlietdichter.nl;crosspointefellowship.church;handi-jack-llc.com;femxarxa.cat;wsoil.com.sg;xlarge.at;groupe-cets.com;admos-gleitlager.de;liikelataamo.fi;sevenadvertising.com;nancy-informatique.fr;ateliergamila.com;stefanpasch.me;wacochamber.com;aurum-juweliere.de;hatech.io;centuryrs.com;ilive.lt;fensterbau-ziegler.de;zflas.com;thefixhut.com;goodgirlrecovery.com;botanicinnovations.com;saxtec.com;tips.technology;smalltownideamill.wordpress.com;pt-arnold.de;tarotdeseidel.com;bildungsunderlebnis.haus;brevitempore.net;imadarchid.com;sportiomsportfondsen.nl;digivod.de;darrenkeslerministries.com;smhydro.com.pl;echtveilig.nl;schlafsack-test.net;galserwis.pl;eraorastudio.com;faroairporttransfers.net;connectedace.com;pcp-nc.com;jyzdesign.com;suncrestcabinets.ca;offroadbeasts.com;teresianmedia.org;greenfieldoptimaldentalcare.com;thomas-hospital.de;embracinghiscall.com;ralister.co.uk;rosavalamedahr.com;quizzingbee.com;richard-felix.co.uk;sipstroysochi.ru;todocaracoles.com;shiftinspiration.com;campusoutreach.org;bodyforwife.com;katiekerr.co.uk;sportsmassoren.com;trystana.com;ino-professional.ru;slashdb.com;selfoutlet.com;personalenhancementcenter.com;proudground.org;walkingdeadnj.com;d1franchise.com;anthonystreetrimming.com;forskolorna.org;brawnmediany.com;uimaan.fi;journeybacktolife.com;pferdebiester.de;kao.at;asteriag.com;hvccfloorcare.com;parks-nuernberg.de;div-vertriebsforschung.de;centromarysalud.com;asiluxury.com;chrissieperry.com;verbisonline.com;onlybacklink.com;radaradvies.nl;daklesa.de;sagadc.com;waveneyrivercentre.co.uk;mytechnoway.com;fitnessbazaar.com;fibrofolliculoma.info;fayrecreations.com;maryloutaylor.com;whyinterestingly.ru;maratonaclubedeportugal.com;maineemploymentlawyerblog.com;kosterra.com;blumenhof-wegleitner.at;punchbaby.com;wmiadmin.com;bxdf.info;harveybp.com;vermoote.de;johnsonfamilyfarmblog.wordpress.com;plastidip.com.ar;autofolierung-lu.de;highimpactoutdoors.net;cwsitservices.co.uk;hairstylesnow.site;mymoneyforex.com;victoriousfestival.co.uk;farhaani.com;web.ion.ag;simoneblum.de;carolinepenn.com;blacksirius.de;trackyourconstruction.com;naturavetal.hr;heliomotion.com;rollingrockcolumbia.com;judithjansen.com;poultrypartners.nl;mirjamholleman.nl;baumkuchenexpo.jp;insidegarage.pl;irishmachineryauctions.com;intecwi.com;porno-gringo.com;penco.ie;jacquin-maquettes.com;anteniti.com;hebkft.hu;ftlc.es;dutchbrewingcoffee.com;behavioralmedicinespecialists.com;socialonemedia.com;cirugiauretra.es;c-a.co.in;nokesvilledentistry.com;chandlerpd.com;aunexis.ch;gmto.fr;berliner-versicherungsvergleich.de;jsfg.com;vesinhnha.com.vn;joyeriaorindia.com;greenko.pl;cerebralforce.net;rota-installations.co.uk;presseclub-magdeburg.de;yamalevents.com;renergysolution.com;roygolden.com;verifort-capital.de;delawarecorporatelaw.com;jiloc.com;icpcnj.org;1kbk.com.ua;noixdecocom.fr;entopic.com;hellohope.com;flexicloud.hk;danielblum.info;thaysa.com;mdk-mediadesign.de;nataschawessels.com;smale-opticiens.nl;charlesreger.com;kaliber.co.jp;almosthomedogrescue.dog;reddysbakery.com;waynela.com;ahouseforlease.com;binder-buerotechnik.at;happyeasterimages.org;dr-tremel-rednitzhembach.de;mikeramirezcpa.com;zweerscreatives.nl;dramagickcom.wordpress.com;commercialboatbuilding.com;argenblogs.com.ar;heurigen-bauer.at;ogdenvision.com;gadgetedges.com;izzi360.com;turkcaparbariatrics.com;spargel-kochen.de;pridoxmaterieel.nl;heidelbergartstudio.gallery;ftf.or.at;kaminscy.com;filmvideoweb.com;meusharklinithome.wordpress.com;xn--thucmctc-13a1357egba.com;tstaffing.nl;abogadosadomicilio.es;igorbarbosa.com;homesdollar.com;ncuccr.org;caffeinternet.it;abogados-en-alicante.es;evologic-technologies.com;oslomf.no;desert-trails.com;gastsicht.de;nvwoodwerks.com;slwgs.org;vorotauu.ru;lionware.de;bodyfulls.com;myhostcloud.com;amylendscrestview.com;bptdmaluku.com;bogdanpeptine.ro;perbudget.com;strategicstatements.com;simpliza.com;innote.fi;365questions.org;sanyue119.com;walter-lemm.de;cuppacap.com;teknoz.net;layrshift.eu;blog.solutionsarchitect.guru;parkcf.nl;themadbotter.com;upmrkt.co;modelmaking.nl;nandistribution.nl;ledmes.ru;coding-marking.com;sachnendoc.com;thedad.com;mercantedifiori.com;artotelamsterdam.com;plotlinecreative.com;bauertree.com;woodleyacademy.org;dw-css.de;leda-ukraine.com.ua;destinationclients.fr;jasonbaileystudio.com;cheminpsy.fr;devstyle.org;kindersitze-vergleich.de;live-con-arte.de;bee4win.com;fiscalsort.com;jeanlouissibomana.com;huehnerauge-entfernen.de;eadsmurraypugh.com;fotoscondron.com;DupontSellsHomes.com;brigitte-erler.com;imperfectstore.com;shonacox.com;nacktfalter.de;devok.info;esope-formation.fr;mariposapropaneaz.com;sw1m.ru;mrtour.site;hannah-fink.de;bafuncs.org;kampotpepper.gives;ampisolabergeggi.it;cuspdental.com;philippedebroca.com;abitur-undwieweiter.de;hoteledenpadova.it;tanciu.com;delchacay.com.ar;cortec-neuro.com;theshungiteexperience.com.au;deschl.net;biortaggivaldelsa.com;fitnessingbyjessica.com;dsl-ip.de;officehymy.com;shadebarandgrillorlando.com;bargningharnosand.se;mmgdouai.fr;daniel-akermann-architektur-und-planung.ch;xn--logopdie-leverkusen-kwb.de;buroludo.nl;ymca-cw.org.uk;executiveairllc.com;allamatberedare.se;servicegsm.net;kingfamily.construction;nakupunafoundation.org;henricekupper.com;shsthepapercut.com;lbcframingelectrical.com;ladelirante.fr;clos-galant.com;dr-seleznev.com;siliconbeach-realestate.com;tanzprojekt.com;fatfreezingmachines.com;kamahouse.net;gratispresent.se;softsproductkey.com;marathonerpaolo.com;gopackapp.com;manutouchmassage.com;marketingsulweb.com;craigvalentineacademy.com;catholicmusicfest.com;gaiam.nl;woodworkersolution.com;pasivect.co.uk;cyntox.com;advizewealth.com;y-archive.com;saarland-thermen-resort.com;fizzl.ru;oemands.dk;mrsfieldskc.com;levdittliv.se;rksbusiness.com;sexandfessenjoon.wordpress.com;first-2-aid-u.com;simpkinsedwards.co.uk;the-domain-trader.com;rocketccw.com;celeclub.org;urist-bogatyr.ru;lapinvihreat.fi;ecpmedia.vn;zieglerbrothers.de;piajeppesen.dk;joseconstela.com;carlosja.com;real-estate-experts.com;toreria.es;analiticapublica.es;kariokids.com;leeuwardenstudentcity.nl;psc.de;tetinfo.in;ai-spt.jp;homng.net;em-gmbh.ch;trulynolen.co.uk;oceanastudios.com;csgospeltips.se;luxurytv.jp;abuelos.com;birnam-wood.com;theletter.company;bbsmobler.se;restaurantesszimmer.de;insp.bi;besttechie.com;autodujos.lt;chaotrang.com;galleryartfair.com;321play.com.hk;saka.gr;tandartspraktijkhartjegroningen.nl;steampluscarpetandfloors.com;waermetauscher-berechnen.de;sterlingessay.com;justinvieira.com;waywithwords.net;shiresresidential.com;naswrrg.org;spinheal.ru;slimani.net;modestmanagement.com;triggi.de;cityorchardhtx.com;narcert.com",
"net":false,
"svc":[
"veeam",
"memtas",
"sql",
"backup",
"vss",
"sophos",
"svc$",
"mepocs"
],
"nbody":"LQAtAC0APQA9AD0AIABXAGUAbABjAG8AbQBlAC4AIABBAGcAYQBpAG4ALgAgAD0APQA9AC0ALQAtAA0ACgANAAoAWwAtAF0AIABXAGgAYQB0AHMAIABIAGEAcABQAGUAbgA/ACAAWwAtAF0ADQAKAA0ACgBZAG8AdQByACAAZgBpAGwAZQBzACAAYQByAGUAIABlAG4AYwByAHkAcAB0AGUAZAAsACAAYQBuAGQAIABjAHUAcgByAGUAbgB0AGwAeQAgAHUAbgBhAHYAYQBpAGwAYQBiAGwAZQAuACAAWQBvAHUAIABjAGEAbgAgAGMAaABlAGMAawAgAGkAdAA6ACAAYQBsAGwAIABmAGkAbABlAHMAIABvAG4AIAB5AG8AdQByACAAcwB5AHMAdABlAG0AIABoAGEAcwAgAGUAeAB0AGUAbgBzAGkAbwBuACAAewBFAFgAVAB9AC4ADQAKAEIAeQAgAHQAaABlACAAdwBhAHkALAAgAGUAdgBlAHIAeQB0AGgAaQBuAGcAIABpAHMAIABwAG8AcwBzAGkAYgBsAGUAIAB0AG8AIAByAGUAYwBvAHYAZQByACAAKAByAGUAcwB0AG8AcgBlACkALAAgAGIAdQB0ACAAeQBvAHUAIABuAGUAZQBkACAAdABvACAAZgBvAGwAbABvAHcAIABvAHUAcgAgAGkAbgBzAHQAcgB1AGMAdABpAG8AbgBzAC4AIABPAHQAaABlAHIAdwBpAHMAZQAsACAAeQBvAHUAIABjAGEAbgB0ACAAcgBlAHQAdQByAG4AIAB5AG8AdQByACAAZABhAHQAYQAgACgATgBFAFYARQBSACkALgANAAoADQAKAFsAKwBdACAAVwBoAGEAdAAgAGcAdQBhAHIAYQBuAHQAZQBlAHMAPwAgAFsAKwBdAA0ACgANAAoASQB0AHMAIABqAHUAcwB0ACAAYQAgAGIAdQBzAGkAbgBlAHMAcwAuACAAVwBlACAAYQBiAHMAbwBsAHUAdABlAGwAeQAgAGQAbwAgAG4AbwB0ACAAYwBhAHIAZQAgAGEAYgBvAHUAdAAgAHkAbwB1ACAAYQBuAGQAIAB5AG8AdQByACAAZABlAGEAbABzACwAIABlAHgAYwBlAHAAdAAgAGcAZQB0AHQAaQBuAGcAIABiAGUAbgBlAGYAaQB0AHMALgAgAEkAZgAgAHcAZQAgAGQAbwAgAG4AbwB0ACAAZABvACAAbwB1AHIAIAB3AG8AcgBrACAAYQBuAGQAIABsAGkAYQBiAGkAbABpAHQAaQBlAHMAIAAtACAAbgBvAGIAbwBkAHkAIAB3AGkAbABsACAAbgBvAHQAIABjAG8AbwBwAGUAcgBhAHQAZQAgAHcAaQB0AGgAIAB1AHMALgAgAEkAdABzACAAbgBvAHQAIABpAG4AIABvAHUAcgAgAGkAbgB0AGUAcgBlAHMAdABzAC4ADQAKAFQAbwAgAGMAaABlAGMAawAgAHQAaABlACAAYQBiAGkAbABpAHQAeQAgAG8AZgAgAHIAZQB0AHUAcgBuAGkAbgBnACAAZgBpAGwAZQBzACwAIABZAG8AdQAgAHMAaABvAHUAbABkACAAZwBvACAAdABvACAAbwB1AHIAIAB3AGUAYgBzAGkAdABlAC4AIABUAGgAZQByAGUAIAB5AG8AdQAgAGMAYQBuACAAZABlAGMAcgB5AHAAdAAgAG8AbgBlACAAZgBpAGwAZQAgAGYAbwByACAAZgByAGUAZQAuACAAVABoAGEAdAAgAGkAcwAgAG8AdQByACAAZwB1AGEAcgBhAG4AdABlAGUALgANAAoASQBmACAAeQBvAHUAIAB3AGkAbABsACAAbgBvAHQAIABjAG8AbwBwAGUAcgBhAHQAZQAgAHcAaQB0AGgAIABvAHUAcgAgAHMAZQByAHYAaQBjAGUAIAAtACAAZgBvAHIAIAB1AHMALAAgAGkAdABzACAAZABvAGUAcwAgAG4AbwB0ACAAbQBhAHQAdABlAHIALgAgAEIAdQB0ACAAeQBvAHUAIAB3AGkAbABsACAAbABvAHMAZQAgAHkAbwB1AHIAIAB0AGkAbQBlACAAYQBuAGQAIABkAGEAdABhACwAIABjAGEAdQBzAGUAIABqAHUAcwB0ACAAdwBlACAAaABhAHYAZQAgAHQAaABlACAAcAByAGkAdgBhAHQAZQAgAGsAZQB5AC4AIABJAG4AIABwAHIAYQBjAHQAaQBjAGUAIAAtACAAdABpAG0AZQAgAGkAcwAgAG0AdQBjAGgAIABtAG8AcgBlACAAdgBhAGwAdQBhAGIAbABlACAAdABoAGEAbgAgAG0AbwBuAGUAeQAuAA0ACgANAAoAWwArAF0AIABIAG8AdwAgAHQAbwAgAGcAZQB0ACAAYQBjAGMAZQBzAHMAIABvAG4AIAB3AGUAYgBzAGkAdABlAD8AIABbACsAXQANAAoADQAKAFkAbwB1ACAAaABhAHYAZQAgAHQAdwBvACAAdwBhAHkAcwA6AA0ACgANAAoAMQApACAAWwBSAGUAYwBvAG0AbQBlAG4AZABlAGQAXQAgAFUAcwBpAG4AZwAgAGEAIABUAE8AUgAgAGIAcgBvAHcAcwBlAHIAIQANAAoAIAAgAGEAKQAgAEQAbwB3AG4AbABvAGEAZAAgAGEAbgBkACAAaQBuAHMAdABhAGwAbAAgAFQATwBSACAAYgByAG8AdwBzAGUAcgAgAGYAcgBvAG0AIAB0AGgAaQBzACAAcwBpAHQAZQA6ACAAaAB0AHQAcABzADoALwAvAHQAbwByAHAAcgBvAGoAZQBjAHQALgBvAHIAZwAvAA0ACgAgACAAYgApACAATwBwAGUAbgAgAG8AdQByACAAdwBlAGIAcwBpAHQAZQA6ACAAaAB0AHQAcAA6AC8ALwBhAHAAbABlAGIAegB1ADQANwB3AGcAYQB6AGEAcABkAHEAawBzADYAdgByAGMAdgA2AHoAYwBuAGoAcABwAGsAYgB4AGIAcgA2AHcAawBlAHQAZgA1ADYAbgBmADYAYQBxADIAbgBtAHkAbwB5AGQALgBvAG4AaQBvAG4ALwB7AFUASQBEAH0ADQAKAA0ACgAyACkAIABJAGYAIABUAE8AUgAgAGIAbABvAGMAawBlAGQAIABpAG4AIAB5AG8AdQByACAAYwBvAHUAbgB0AHIAeQAsACAAdAByAHkAIAB0AG8AIAB1AHMAZQAgAFYAUABOACEAIABCAHUAdAAgAHkAbwB1ACAAYwBhAG4AIAB1AHMAZQAgAG8AdQByACAAcwBlAGMAbwBuAGQAYQByAHkAIAB3AGUAYgBzAGkAdABlAC4AIABGAG8AcgAgAHQAaABpAHMAOgANAAoAIAAgAGEAKQAgAE8AcABlAG4AIAB5AG8AdQByACAAYQBuAHkAIABiAHIAbwB3AHMAZQByACAAKABDAGgAcgBvAG0AZQAsACAARgBpAHIAZQBmAG8AeAAsACAATwBwAGUAcgBhACwAIABJAEUALAAgAEUAZABnAGUAKQANAAoAIAAgAGIAKQAgAE8AcABlAG4AIABvAHUAcgAgAHMAZQBjAG8AbgBkAGEAcgB5ACAAdwBlAGIAcwBpAHQAZQA6ACAAaAB0AHQAcAA6AC8ALwBkAGUAYwBvAGQAZQByAC4AcgBlAC8AewBVAEkARAB9AA0ACgANAAoAVwBhAHIAbgBpAG4AZwA6ACAAcwBlAGMAbwBuAGQAYQByAHkAIAB3AGUAYgBzAGkAdABlACAAYwBhAG4AIABiAGUAIABiAGwAbwBjAGsAZQBkACwAIAB0AGgAYQB0AHMAIAB3AGgAeQAgAGYAaQByAHMAdAAgAHYAYQByAGkAYQBuAHQAIABtAHUAYwBoACAAYgBlAHQAdABlAHIAIABhAG4AZAAgAG0AbwByAGUAIABhAHYAYQBpAGwAYQBiAGwAZQAuAA0ACgANAAoAVwBoAGUAbgAgAHkAbwB1ACAAbwBwAGUAbgAgAG8AdQByACAAdwBlAGIAcwBpAHQAZQAsACAAcAB1AHQAIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAZABhAHQAYQAgAGkAbgAgAHQAaABlACAAaQBuAHAAdQB0ACAAZgBvAHIAbQA6AA0ACgBLAGUAeQA6AA0ACgANAAoADQAKAHsASwBFAFkAfQANAAoADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgAhACEAIQAgAEQAQQBOAEcARQBSACAAIQAhACEADQAKAEQATwBOACcAVAAgAHQAcgB5ACAAdABvACAAYwBoAGEAbgBnAGUAIABmAGkAbABlAHMAIABiAHkAIAB5AG8AdQByAHMAZQBsAGYALAAgAEQATwBOACcAVAAgAHUAcwBlACAAYQBuAHkAIAB0AGgAaQByAGQAIABwAGEAcgB0AHkAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAHIAZQBzAHQAbwByAGkAbgBnACAAeQBvAHUAcgAgAGQAYQB0AGEAIABvAHIAIABhAG4AdABpAHYAaQByAHUAcwAgAHMAbwBsAHUAdABpAG8AbgBzACAALQAgAGkAdABzACAAbQBhAHkAIABlAG4AdABhAGkAbAAgAGQAYQBtAGEAZwBlACAAbwBmACAAdABoAGUAIABwAHIAaQB2AGEAdABlACAAawBlAHkAIABhAG4AZAAsACAAYQBzACAAcgBlAHMAdQBsAHQALAAgAFQAaABlACAATABvAHMAcwAgAGEAbABsACAAZABhAHQAYQAuAA0ACgAhACEAIQAgACEAIQAhACAAIQAhACEADQAKAE8ATgBFACAATQBPAFIARQAgAFQASQBNAEUAOgAgAEkAdABzACAAaQBuACAAeQBvAHUAcgAgAGkAbgB0AGUAcgBlAHMAdABzACAAdABvACAAZwBlAHQAIAB5AG8AdQByACAAZgBpAGwAZQBzACAAYgBhAGMAawAuACAARgByAG8AbQAgAG8AdQByACAAcwBpAGQAZQAsACAAdwBlACAAKAB0AGgAZQAgAGIAZQBzAHQAIABzAHAAZQBjAGkAYQBsAGkAcwB0AHMAKQAgAG0AYQBrAGUAIABlAHYAZQByAHkAdABoAGkAbgBnACAAZgBvAHIAIAByAGUAcwB0AG8AcgBpAG4AZwAsACAAYgB1AHQAIABwAGwAZQBhAHMAZQAgAHMAaABvAHUAbABkACAAbgBvAHQAIABpAG4AdABlAHIAZgBlAHIAZQAuAA0ACgAhACEAIQAgACEAIQAhACAAIQAhACEAAAA=",
"nname":"{EXT}-readme.txt",
"exp":false,
"img":"QQBsAGwAIABvAGYAIAB5AG8AdQByACAAZgBpAGwAZQBzACAAYQByAGUAIABlAG4AYwByAHkAcAB0AGUAZAAhAA0ACgANAAoARgBpAG4AZAAgAHsARQBYAFQAfQAtAHIAZQBhAGQAbQBlAC4AdAB4AHQAIABhAG4AZAAgAGYAbwBsAGwAbwB3ACAAaQBuAHMAdAB1AGMAdABpAG8AbgBzAAAA",
"arn":false,
"rdmcnt":0
}
Di seguito la descrizione delle chiavi utilizzate:
pk | Chiave pubblica X25519 |
pid | Un identificativo presumibilmente unico per sample. Viene solo inviato al C2. E’ un hash bcrypt. |
sub | Altro identificativo mai usato da altre parti se non nella comunicazione con il C2. |
dbg | Se vero, evita il check della lingua e del layout per evitare di attaccare paesi “amici”. |
et | Tipo di cifratura dei file. |
wipe | Non usato. Presumibilmente serve per cancellare specifiche cartelle (vedi wfld). |
wht | Whitelist di cartelle (fld), file (fls) ed estensioni (ext). |
wfld | Non usato, presumibilmente per le cartelle da cancellare. |
prc | Processi da terminare (per permettere la cifratura dei file). |
dmn | Lista dei C2. Notare che 8 sono italiani. Si presume siano tutti domini compromessi. |
net | Con valore false il malware non comunica con il C2. |
svc | Servizi da fermare (sempre per cifrare i file). |
nbody | Contenuto del file di manifesto. |
nname | Nome del file di manifesto. |
exp | Serve per elevarsi ad admin completo (exp potrebbe stare per exploit ma non sono usati exploit). |
img | Testo da scrivere nell’immagine che sarà impostata come sfondo. |
arn | Usato per impostarsi in autorun (chiave t32mMaunsR sotto il solito percorso “Run”). |
rdmcnt | Massimo numero di manifesti da scrivere (se non zero). |
Raccolta delle informazioni
Il malware procede quindi raccogliendo alcune informazioni sulla macchina, come:
- Nome utente
- Nome computer
- Dominio o gruppo di lavoro
- Lettura spazio libero e totale dei volumi presenti.
Notare che i volumi vengono rilevati enumerando le lettere da A a Z, per cui i mount point non sono rilevati come volumi a sè.
Viene creato un ID univoco come:
Hex(crc32(numero_seriale_disco_installazione_windows), digits=8) || Hex(crc32(brand_string_cpu), digits=8)
I CRC32 sono calcolati con valori iniziali non nulli: si faccia riferimento al codice nel DB IDA allegato.
Il ransomware procede con la creazione del contenuto del manifesto e dell’immagine relativa.
Disinnesco selettivo
Nel caso che il layout della tastiera e la lingua corrisponda ad un paese ex-URSS o alla Siria, il malware si disinnesca.
Parametri da linea di comando
Grazie alle stringhe decodificate è facile vedere quali parametri da linea di comando sono supportati.
-fast | Sovrascrive l’impostazione “et” impostando la cifratura veloce dei file. |
-full | Sovrascrive l’impostazione “et” impostando la cifratura completa dei file. |
-silent | Non termina processi o servizi. |
-path | Cifra una cartella/file specifico. |
-nolan | Non cifra le share montate sulla macchina. |
-nolocal | Non cifra i volumi locali. |
-smode | Attiva la modalità smode. |
La modalità smode
Smode potrebbe essere utilizzato come un Safeboot mode. Quando questo parametro è passato, il ransomware esegue le seguenti operazioni:
- Imposta la password dell’utente corrente a DTrump4ever.
- Imposta l’utente corrente per l’auto-logon (avvio senza password).
- Abilita la modalità provvisoria con rete.
- Si imposta all’avvio.
- Riavvia la macchina.
Questa modalità può essere usata per partire con un numero minimo di servizi in modo da avere accesso a più file.
Chiavi e crittografia
Le primitive crittografiche usate sono piuttosto comuni: X25519, SHA3-256, ChaCha2 e AES256-CTR.
La fonte di entropia invece è particolarmente complessa, con l’utilizzo di funzioni crittografiche modificate di cui non è semplice interpretare l’effettiva necessità (se non forse per fare “key stretching” dei dati random al fine di rallentare eventuali bruteforce).
La prima funzione crittografica che troviamo è la seguente:
Come si evince dal blocco al centro, è presente il codice che fa clamping dei 32 byte random generati nel primo blocco. Questo ci permette di identificare la funzione come quella per generare una chiave privata X25519 (vedi Netwalker).
La funzione che genera i byte casuali è di interesse per stimare la vera entropia della chiave.
Questa funzione si basa su una primitiva, rndbytes, che riempe un buffer di data lunghezza con byte casuali.
L’implementazione di rndbytes è quella qui sotto (dove abbiamo già identificato le funzioni):
Che lo scopo di questa funzione sia generare dei byte casuali è chiaro dalla chiamata a rndbytes_cryptctx che invitiamo a consultare nel DB IDA allegato. Quest’ultima chiama CryptGenRandom, per cui non vi sono dubbi sullo scopo della funzione.
Ma l’uso delle API crittografiche di Windows è solo l’ultima opzione del ransomware, che prima prova ad utilizzare due metodi custom.
rndbytes_rdrand utilizza l’istruzione rdrand per generare un byte casuale alla volta:
Notare che l’operando di rdrand è a 32-bit ma solo 8 di questi sono usati (quelli bassi). Inoltre è presente anche il controllo sul Carry Flag che solitamente è assente in utilizzi amatoriali di rdrand (l’istruzione è riprovata fino a 16 volte in caso ritorni dati non buoni).
Per calcolare questo bit random viene utilizzata la differenza tra due istruzioni rdtsc a distanza di 1ms (contato tramite timeBeginPeriod ed un ciclo su timeGetTime) per ottenere un valore a 32-bit (tramite varie operazioni logiche).
Sono calcolati due valori: questi valori sono poi passati, singolarmente ad una versione modificata di TEA per usare valori a 16-bit e ritorna un valore 0 o 1 (1 bit di “entropia”).
L’altro, metodo di generazione di byte casuali preferenziale, è tramite l’utilizzo di rdtsc. Questo metodo è particolare: non abbiamo trovato riferimenti in circolazione e non è chiaro se sia custom o si tratti di una pratica già nota. Un byte casuale è costruito un bit alla volta, tramite una funzione che ritorna un bit random.
Se i due bit differiscono, il primo viene ritornato ed usato nella costruzione del byte.
Non è chiaro perchè sia stato usato un ordine che predilige il metodo rdtsc: le API crittografiche sono da preferirsi in quanto delegano a Windows l’onere di un’implementazione sicura e se queste non possono essere usate, rdrand dovrebbe essere provata prima di rdtsc in quanto più sicura e facile da usare (come dimostra l’implementazione).
Non è altrettanto chiaro perchè sia usata una versione modificata di TEA per ottenere un bit random, in particolare non è chiaro che vi sia uno studio crittoanalitico dietro o se, semplicemente, gli autori hanno voluto complicare l’algoritmo. In fin dei conti, l’entropia rimane quella del numero di tick del TSC, che nelle CPU recenti è invariante e fisso sui 2 GHz circa, lasciando spazio quindi a pochi milioni di possibili valori.
I dati ritornati da rndbytes non sono però usati direttamente. Invece viene generata una coppia (chiave, IV) AES256 random (tramite rndbytes appunto) e poi questa viene cifrata con AES256-CTR usando chiave ed IV nulli.
Il risultato è un buffer di 48 byte random che sono usati come chiave AES256-CTR nelle invocazioni successive per ottenere byte random.
Lo schema può essere riassunto con il seguente pseudo-codice:
get_randombytes(len):
if not init:
ctr=0
key = "gONRzzreFplynD81rU0WSXjPhD0Aivno"
key_for_rng, iv_for_rng = AES256_CTR((key || nullIV) ^ rndbytes(48), key=nullKey, iv=NullIV, counter=&ctr)
result = an null buffer of size len
return AES256_CTR(result, key=key_for_rng, iv=iv_for_rng, counter=&ctr)
Non abbiamo verificato la correttezza di questo pseudo-codice tramite un’analisi dinamica.
Abbiamo fin ora identificato la sorgente di entropia (bassa ma “stretchata”) e la funzione che genera una chiave privata X25519.
La funzione chiamata subito dopo è quella per la generazione della relativa chiave pubblica: notare infatti il basepoint pari a 9. Questo ci permette anche di identificare la funzione che implementa curve25519.
Un’altra funzione da identificare è la seguente:
La funzione a destra utilizza le costanti tipiche della funzione di permutazione KECCAK, a sinistra si vede l’invocazione con i parametri 6 e 136, tipici di SHA3-256.
Notare che l’implementazione di SHA3 è basata sul concetto di Sponge function ed è quindi molto diversa da SHA1 e SHA2.
Un’altra funzione che verrà usata ma di facile identificazione è ChaCha2 (si veda Netwalker).
Curve25519 e SHA3-256 sono usati per generare un segreto comune a partire dalla chiave pubblica data ad una propria chiave privata:
get_shared(SKa, PKb):
return SHA3-256(curve25519(SKa, PKb))
dove si è definito che la funzione curve25519 ritorni il valore segreto (shared) anzichè copiarlo in un buffer.
Questa funzione è usata per cifrare un buffer tramite AES256-CTR nel seguente modo:
encrypt(data, len, PK):
//Genera una coppia di chiavi effimera
PKe, SKe = curve25519_gen_keys()
//Ottiene il segreto da SKe e PK, i criminali necessitano di SK (relativa a PK) e PKe per riottenerlo
shared = get_shared(SKe, PK)
//Cifra con AES
iv = get_randombytes(16)
encrypted_data = AES256_CTR(data, len=len, key=shared, iv=iv)
//Check
crc = CRC32(0x000000 || encrypted_data)
return encrypted_data, PKe, iv, crc
//Il formato binario ritornato ha lunghezza pari a len + 0x38 ed è così composto:
//
//Offset Size Desc
// 0 4 DWORD nulla (zero)
// 4 len Dati cifrati
//len+4 32 PKe
//len+36 16 IV
//Len+52 4 crc
Possiamo ora parlare della chiavi usate dal ransomware.
La prima chiave è quella presente nella configurazione, chiamiamola PKc. E’ una chiave pubblica X25519.
La seconda chiave è una chiave fissa, chiamiamola PKf, di valore:
FF, 5E, ED, CA, ED, EE, 62, 50, D4, 88, F0, F0, 4E, FA, 4C, 95, 7B, 55, 7B, DB, DC, 0B, BC, A2, BA, 1B, B7, A6, 4D, 04, 3A, 3D
Il ransomware genera una coppia di chiavi X25519, che chiameremo rispettivamente SK1 e PK1.
Queste chiavi sono salvate nel registro di sistema sotto SOFTWARE\BlackLivesMatter (in HKCU o HKLM) nel seguente modo:
Ed7 -> PKc
QIeQ -> PK1
96Ia6 -> cryptdata(SK1, 32, PKc)
Ucr1RB -> cryptdata(SK1, 32, PKf)
Notare come SK1 sia cifrata con entrambe le chiavi pubbliche PKc e PKf (separatamente).
I file sono cifrati con una coppia di chiavi effimera, generando un segreto con PK1. In questo modo è necessario conoscere la chiave pubblica effimera e SK1 per riottenere il segreto. Ma SK1 è cifrata con PKc e PKf per cui solo i criminali possono riottenerlo.
Per ogni file è creato un blocco di informazioni di lunghezza pari a min(fileSize, 1MiB) + 0x160 byte.
Viene poi generata una coppia di chiavi X25519 (SKx, PKx) usate per ottenere una chiave ChaCha2 nel seguente modo:
SKx, PKx = curve25519_gen_keys()
sharedF = get_shared(SKf, PK1)
IV = get_randombytes(8)
testDWORD = ChaCha2(0x00000000, len=4, key=sharedF, IV=IV)
sharedF è la chiave ChaCha2. Notare come venga anche cifrata una DWORD nulla, probabilmente come verifica, infatti la DWORD è salvata nel blocco appeso al file.
Il formato binario del blocco usato per cifrare i file è il seguente:
00 08 ??
08 08 Size
10 04 ??
14 04 HANDLE file
18 04 Ptr file name
20 08 File size (QWORD)
------- INIZIO DATI SALVATI ALLA FINE DEL FILE -------
28 58 SK1 encrypted with PKc
80 58 SK1 encrypted with PKf
D8 20 PKx
F8 08 IV (8 bytes)
100 04 CRC32(PKf)
104 04 et
108 04 spsize
10C 04 ChaCha2(0x00000000, len=4, key=sharedF, IV=IV)
------ FINE DATI SALVATI ALLA FINE DEL FILE -------
110 40 ChaCha2 CTX
150 04 ??
154 04 Block state (1 = ReadData, 2 = encrypt,3 = Write final block or 4 = Close file)
158 04 Crypted size (min(fileSize, 1MiB))
15C XX Data read from file (Crypted size)
I blocchi sono generati dal thread principale che poi li passa ad una completion queue letta da un numero di thread pari al doppio dei processori e gestiti tramite uno stato all’offset 0x154
Se il parametro et è 1, viene cifrato solo un blocco pari al minimo tra 1MiB e la dimensione del file. Se il parametro et è 0 viene cifrato tutto il file, se è 2 viene cifrato un blocco pari a spsize MiB.
Per decifrare il file è necessario conoscere sharedF, per conoscere sharedF serve SK1 e PKx. PKx è nota ma SK1 è cifrata con PKc e PKf, e per decifrarla servono SKc o SKf, noti solo agli attaccanti.
Il blocco indicato sopra è scritto alla fine del file per evitare doppie cifrature e per permettere di scrivere un decriptor e un servizio di decifratura dei primi N file in modo semplice.
Per eventuali approfondimenti, i metodi interessati sono: thread3, prepareForFileENcryption, fillEncBlockInfo e doEncryptSIngleFile nel DB IDA.
Comunicazione con il C2
Il malware crea un file JSON con il seguente formato:
{"ver":%d,"pid":"%s","sub":"%s","pk":"%s","uid":"%s","sk":"%s","unm":"%s","net":"%s","grp":"%s","lng":"%s","bro":%s,"os":"%s","bit":%d,"dsk":"%s","ext":"%s"}
Campi piuttosto ovvi, tranne alcuni:
- pk è PKc.
- sk è il base64 di SK1 cifrata con PKc.
- unm è l’username.
- net è il nome del computer.
- bro indica se la macchina è da non attaccare (bro -> brother).
- dsk sono le info sui volumi presenti codificati in base64 (vedi sezione sopra).
Successivamente, salva nella chiave di registro JmfOBvhb (sempre sotto SOFTWARE\BlackLivesMatter) e lo invia ai C2 tramite una richiesta POST con content-type octect-stream (e non JSON).
L’URL a cui è inviato è generato casualmente tra una possibilità di scelte:
https://<domain>/<str1>/<str2>/<2-20 lowercase letters>.<ext>
str1 = wp-c, stratic, content, include, uploads, news, data, admin
str2 = images, pictures, image, temp, tmp, graphic, assets, game, pics
ext = jpg, gif, png
Il ransomware invia i dati al C2 solo dopo aver terminato la cifratura dei file e con il solo fine di censire la macchina nella lista delle vittime.
Database IDA
Nello zip qui allegato è presente il databse IDA del ransomware (p.exe.i64), dei packer e vari file di note e utilità.