Reverzní engineering jednoho silně obfuskovaného makroviru

malwareV poslední době se ke mně opět dostalo několik spear phishing e-mailů s přílohami, které obsahovaly dokumenty se silně obfuskovanými makry.

Netřeba snad dodávat, že vzhledem k tomu, že v nich byly použity některé méně známé obfuskační techniky, tak v nich žádný antivirus škodlivý kód nedetekoval.

Microsoft Word, ve kterém se příloha po kliknutí otevírá, uživatele samozřejmě varuje, že makra jsou zakázána, ale pokud uživatel obsah povolí, tak se makro automaticky spustí spolu s otevřením dokumentu, neboť je pověšeno na funkci Document_Open.

Jedno z maker, které jsem analyzoval, mělo přes 7000 řádek kódu a skládalo z 6 funkcí a 6 podprogramů. Názvy podprogramů, funkcí, proměnných a konstant byly, jak už to bývá, dlouhé náhodně generované řetězce znaků, které měly ztížit orientaci v kódu a zabránit odvození účelu daných podprogramů, funkcí, proměnných a konstant už z jejich samotného názvu.

Za účelem analýzy kódu je vhodné si jednotlivé podprogramy, funkce, proměnné a konstanty přejmenovat. Je jedno na co, třeba na fce1, fce2 apod. Až zjistíte, k čemu slouží, tak si přejmenujete na něco výstižnějšího. V první fázi jde o to, abyste se v kódu alespoň trochu zorientovali a bylo vám jasné, odkud se co volá.

Přejmenování procedur a funkcí jsem provedl pomocí interní funkce najít a nahradit, přičemž je vhodné si celý kód nejprve prohlédnout a podívat se, zda náhodou není v pojmenování fcí a procedur nějaký systém a pak začít s přejmenováním od funkce s nejdelším názvem.

Následně jsem si nakreslil, který podprogram se spouští jak první a jak probíhá volání mezi jednotlivými funkcemi. Tímto způsobem je možné odhalit, které funkce nejsou např. volány vůbec, a které jsou naopak volány velice intenzivně. Zjistil jsem, že jednotlivé funkce nejsou v kódu uvedeny v pořadí, jak jsou volány, ale schválně zpřeházeny.

Abych zjistil, jaké hodnoty vstupují do jednotlivých funkcí, které jsou postupně volány a jak se s nimi v těchto funkcích pracuje, použil jsem interní debugger a krokoval provedení jednotlivých příkazů, protože na první pohled nebylo vůbec zřejmé, jaké hodnoty jsou vstupem a výstupem těchto funkcí, a co vlastně jednotlivé funkce dělají.

Jednotlivé hodnoty byly přiřazovány zásadně jako podíl nebo rozdíl velkých čísel např. 862976 / 3371 nebo 3158 – 2903. To proto, aby na opět první pohled nebylo zřejmé, že se jedná o čísla z intervalu <0,255>, což by mohlo značit, že se bude jednat o transformace, jejichž výsledkem bude ve finále nějaký textový řetězec.

Abych se těchto velkých čísel zbavil, tak jsem makro vyexportoval a pak z něj tyto výrazy vyparsoval, hodnoty těchto výrazů spočítal, a původní výrazy jimi nahradil. Po těchto a výše uvedených úpravách bylo makro již mnohem přehlednější.

Zajímavé bylo, že v celém makru nebyla přímo použita jediná interní funkce pro práci s textovými řetězci nebo se soubory! Na první pohled by se tak mohlo zdát, že makro nic nebezpečného nedělá. Jediným podezřelým místem v makru bylo volání funkce CreateObject, které byly předány parametry voláním dalších funkcí.

CreateObject(Qc0h7nv(RHPbD3pvp2NOSN,MnUtQ6uskE)).Run GFGhAqFffPANsi7L, 0, 0.

Tato funkce se navíc nacházela v podprogramu, která se spouští spolu s otevřením dokumentu, tak jsem se na ni zaměřil jako první. Parametry této funkce však nebyly konstanty, nýbrž funkce, které volaly další funkce, takže bylo nutné provést i analýzu těchto funkcí.           

První podprogram nedělal nic jiného, než že plnil jednorozměrné pole čísly. A protože ho vzhledem k jeho velikosti nemohl naplnit z jednoho podprogramu, tak k jeho naplnění docházelo pomocí 4 podprogramů, kdy se vždy na konci podprogramu zavolal další podprogram.

Sub IzcO0aVRFK()
SoTQVEdbD20Ts(1878) = (7664 – 7424)
S63PFbQz7
End Sub

Poté, co bylo pole těmito čísly naplněno, tak se volaly další funkce, které nad těmito čísly prováděly ve smyčkách s podmíněnými skoky nejrůznější matematické a logické operace. Mezi nejzajímavější funkce bezesporu patřily bitové operace (bitwise operation) jako bitová konjunkce, disjunkce a negace a dále pak celočíselné dělení (integer division). Např. co myslíte, že dělala tato funkce:

Function L9d58IYSqXl(BUGClsK0VRY, N54r9W77tNCtaZ)
L9d58IYSqXl = BUGClsK0VRY – (N54r9W77tNCtaZ * (BUGClsK0VRY \ N54r9W77tNCtaZ))
End Function

Pokud je na vstupu této funkce např. hodnota 8 a 50 tak potom na výstupu dostaneme hodnotu 8. Pozor „\“ není symbol dělení, ale celočíselného dělení. Další zajímavou funkcí pak byla třeba funkce:

Function Aq5L(USkcxRF41IzDCuii, UIszj6Prwxs4qvA)
Aq5L = (USkcxRF41IzDCuii And Not UIszj6Prwxs4qvA) Or (Not USkcxRF41IzDCuii And UIszj6Prwxs4qvA)
End Function

Ta ze dvou decimálních čísel na vstupu dělala jen jedno. Pozor, opět se jedná o poměrně zajímavou obfuskaci využívající logické operace součinu, negace a součtu. Pokud je např. na vstupu číslo 11 a 83, tak na výstupu vám vyjde 188. Zkuste si to spočítat sami.

Poslední zajímavou funkcí pak byla funkce převádějící číselné hodnoty na text, která mimochodem obsahovala mrtvý kód, a volala další funkci. Vzhledem k tomu, že tato funkce už nebyla volána žádnou jinou funkcí, tak je bylo možné sloučit.

Function Qc0h7nv(EJ2sr5oZq6x() As Byte, FhTVpJQXEY1SN() As Byte) As String

Nyní jsem měl už poměrně dobrou představu o tom, jak celé makro funguje. Mrtvý kód jsem vyhodil a získal jsem nějakých 100 řádků kódu, který skutečně něco dělal. Takže co vlastně dělala ta funkce CreateObject? Po sérii transformací nad několika tisíci čísly uloženými v jednodimenzionálním jí byly jako parametry předány 2 řetězce. Prvním byl řetězec Wscript.Shell. A za Run se pak nacházel poměrně dlouhý kód (zkráceno):

CMD.EXE /V /C SET „RF6USPSUG2=%RANDOM%“ && (FOR %I IN ( zde se nachází seznam tokenů a celý příkaz končí DO @ECHO %~I)>“%APPDATA%\!RF6USPSUG2!.VBS“ && START „“ „%APPDATA%\!RF6USPSUG2!.VBS“ && EXIT“

Pokud jste znalí psaní skriptů v systému MS-DOS, tak vám asi neuniklo, že z makra je spuštěn příkazový interpreter CMD.EXE s parametry a cyklus FOR vybírá ze závorky jednotlivé tokeny, ty předává funkci ECHO, která je zapisuje do souboru .VBS, což je Visual Basic Script a ve finále se tímto způsobem vytvořený skript spustí příkazem START.

Pokud se ptáte, proč prostě nebyl VBS script vytvořen přímo z makra, tak je tomu proto, že by v makru musela být použita funkce OPEN a následně pak funkce WRITE nebo PRINT a tím by došlo k vyzrazení toho, co makro dělá.

Netřeba snad dodávat, že tento VBS script byl opět obfuskován stejně jako VBA a byly použity i stejné techniky, takže je velice pravděpodobné, že ho programoval stejný člověk. Navíc jsou v něm schválně použita náhodně velká a malá písmena, aby se tím ještě více zhoršila čitelnost. (Tento problém lze snadno odstranit převedením na velká písmena.)

Na první pohled opět není zřejmé, co script vlastně dělá. Je zde hojně používaná funkce CreateObject, které jsou předávány dva parametry. Bez převedení těchto řetězců na příkazy, které interpretuje WSH, opět nelze zjistit, co vlastně skript dělá. Ve VBS skriptu je použito několik zajímavých funkcí, např.:

HVm3rkMY9Gv=CJu05Wb9MYCaa.ExPAnDeNvIROnMENTstriNGs
(DbUyjy(„730E063E152D155148″,“OVovNqLa0m2″))&“\“
& M1mI3nhzii & M1mI3nhzii

WshShell.ExpandEnvironmentStrings je prvním krokem k tomu, jak zjistit, jaké proměnné jsou použity a odvodit z nich, zda skript neběží na virtuálním stroji a neprobíhá zachytávání komunikace pomocí nějakého nástroje, čemuž se skript chce vyhnout.

Vzhledem k množství řetězců ve VBS by bylo neefektivní provádět transformaci ručně, takže jsem za tímto účelem použil VBSEDIT, v něm kód provádějící kontrolu prostředí zakomentoval a poté spustil a Fiddler činnost skriptu dále krokoval.

Další analýzou jsem zjistil, že VBS skript obsahuje opět několik funkcí a podprogramů. Nejzajímavější je funkce SSL2S, která navazuje spojení se serverem na internetu. Jakým, není ve skriptu uvedeno, jeho název se sestavuje až za běhu skriptu. Ze serveru pak přijde odpověď s názvem spustitelného souboru, který se má stáhnout.

sEt XcjUw20ot3U=GSkvfJibSPnVk.geTFiLE(SrV96UopXGhU17)

Co se děje po stažení souboru už není až tak zajímavé, protože jde jen o to, jaké instrukce od serveru tento malware, který si své spuštění zajistí zapsáním do klíče Run, obdrží.


Pokud vás tento příspěvek zaujal, sdílejte ho!
Share on FacebookShare on LinkedInTweet about this on TwitterShare on Google+Email this to someonePrint this page

Štítky:


K článku “Reverzní engineering jednoho silně obfuskovaného makroviru” se zde nenachází žádný komentář - buďte první.

Diskuse na tomto webu je moderována. Pod článkem budou zobrazovány jen takové komentáře, které nebudou sloužit k propagaci konkrétní firmy, produktu nebo služby. V případě, že chcete, aby z těchto stránek vedl odkaz na váš web, kontaktujte nás, známe efektivnější způsoby propagace.

Přihlášeným uživatelům se tento formulář nezobrazuje - zaregistrujte se.

Jméno:(požadováno)
E-mail:(požadováno - nebude zobrazen)
Web:

Text vaší reakce: