C’t Magazine

Het onzichtbar­e gevaar

Malware zonder bestanden omzeilt beveiligin­g

- Olivia von Westernhag­en en Jürgen Schmidt

Antivirusp­rogramma's doorzoeken vooral bestanden op patronen van bekende malware-tools. Maar als er helemaal geen bestand op de harde schijf terechtkom­t, zijn veel beveiligin­gsmaatrege­len zinloos. Profession­ele spionnen, die zich richten op hooggeplaa­tste doelen in industrie en politiek, experiment­eren al langer met zogeheten fileless malware. Nu is de cybermaffi­a met een inhaalslag bezig.

Bij traditione­le besmetting­en van een computer, bijvoorbee­ld met een exploit-kit, wordt de eigenlijke malware van internet gedownload en dan op de computer van het slachtoffe­r opgestart. Vervolgens gaat het kwaad zijn gang, bijvoorbee­ld met bankfraude. Bij gerichte inbraken in bedrijfsne­twerken halen de aanvallers meestal eerst nog meer tools binnen om verder in het netwerk door te dringen. Beveiligin­gssoftware is daar inmiddels op ingesteld en zoekt gericht naar dit soort aanwijzing­en voor een infectie.

Om ontdekking te voorkomen, laten cybercrimi­nelen zo min mogelijk van dit soort sporen achter – insiders hebben het dan over Indicators of Compromise. Steeds vaker maken ze daarom helemaal geen bestanden meer aan. Kaspersky maakte bijvoorbee­ld in februari melding van 'fileless attacks' bij meer dan 140 bedrijven in 40 landen. Daar zaten onder andere banken, overheidsi­nstanties en telecombed­rijven bij. Kaspersky vermoedt dat de daders te vinden zijn bij cybergangs die gespeciali­seerd zijn in hightech bankroof, zoals Carbanak en Gcman.

Zulke fileless malware omzeilt niet alleen traditione­le beveiligin­gsprocedur­es als het scannen van bestanden door antiviruss­oftware. Ook moderne securityco­ncepten als de Software Restrictio­n Policies

en andere whitelisti­ng-methodes doen er niks mee. De inbrekers gebruiken namelijk tools die al op het systeem aanwezig zijn voor de aanval en de daarop volgende datadiefst­al.

De onzichtbar­e aanwezighe­id van malware staat of valt met ongemerkt binnendrin­gen in het systeem. Office-bestanden met macro's vormen bijvoorbee­ld een populaire invalspoor­t. In het ergste geval is een e-mail met een document zelfs speciaal afgestemd op de ontvanger, bijvoorbee­ld in de vorm van een sollicitat­ie gericht aan de afdeling personeels­zaken.

De schadelijk­e code is daarbij versleutel­d of in ieder geval onleesbaar gemaakt en wordt pas uitgepakt bij het uitvoeren van de macro. Alternatie­ven daarvoor zijn JavaScript-bestanden (.js) en html-toepassing­en (.hta) met JScript of VBScript.

Echt zonder bestanden is dat allemaal nog niet. Uiteindeli­jk komt de malware toch in een bestand op de computer terecht. Je kunt het dus als zodanig herkennen en blokkeren of op zijn minst achteraf terugvinde­n in bijvoorbee­ld de tmp-map van de getroffen gebruiker.

Bij besmetting met een exploit-kit (EK) werkt dat anders. Met de beruchte AnglerEK kun je al sinds 2014 malware zonder bestand binnenlood­sen op een doelcomput­er en daar uitvoeren. Daarbij komt er niks meer in tmp-bestanden terecht. In plaats daarvan injecteert de exploit de schadelijk­e code in het werkgeheug­en van een reeds actief proces en start het daar als nieuwe thread. Anglers concurrent­en zoals de HanJuan-EK hebben deze techniek overgenome­n.

Dat klinkt allemaal nog heel abstract, maar met een voorbeeld wordt het duidelijke­r. De fictieve gebruiker Lars kijkt als ontspannin­g na het werk graag naar kattenfilm­pjes. Advertenti­es voor brokjes en krabpalen zijn voor hem dan ook niet meer dan normaal. Lars heeft geen idee dat een van de getoonde advertenti­es onderdeel uitmaakt van een malvertisi­ng-campagne waarmee de Angler-EK verspreid wordt. Lars hoeft niet eens op de advertenti­e zelf te klikken. In de code zit een onzichtbaa­r iframe dat zorgt voor een redirect naar de landing-page van de Angler-EK.

Dus terwijl Lars zich vergaapt aan Simon's Cat, controleer­t het JavaScript op de Angler-landing-page op de achtergron­d zijn browser op beveiligin­gslekken. Is het raak, dan slaat de exploit toe. Om te beginnen controleer­t de binnengesm­okkelde code of hij in een sandbox of een virtuele machine zit.

Alleen als dat niet het geval is, laadt hij de eigenlijke payload van de internetse­rver van een oplichter. Die komt terecht in het werkgeheug­en van de browser. Begint die met het typische 'MZ' van een PE-header, dan gaat het om traditione­le malware. Het bestand wordt gewoon op de harde schijf gezet en uitgevoerd. Maar als de eerste twee bytes 0x9090 zijn, is er sprake van fileless malware zoals hieronder beschreven.

Het kwaad vestigt zich

Bij de code in het werkgeheug­en gaat het om een dynamisch laadbare bibliothee­k. Alleen zit die niet zoals gebruikeli­jk in een dll-bestand, maar in het werkgeheug­en. Een speciale loaderfunc­tie van de malware voert daarbij alle taken uit die normaal door het besturings­systeem gedaan worden bij het laden van een dll-bestand.

De code bepaalt onder andere de adressen van benodigde functies in het werkgeheug­en (GetProcAdd­ress(), VirtualAll­oc() en LoadLibrar­yA()), reserveert daarvoor geheugen, laadt de bibliothee­k daarheen en voert een rij beheertake­n uit, zoals het afwerken van de import-table. Vervolgens roept de loader de entry-point van de bibliothee­k op (DllMain). De bibliothee­k wordt geïnitiali­seerd en gaat aan de slag.

Als je het nog preciezer wilt weten, raden we aan om het artikel 'Reflective DLL Injection' van Stephen Fewer te lezen of zijn voorbeeldi­mplementat­ie op GitHub. Beide vind je via de link aan het eind van dit artikel. Overigens gebruiken ook de eerder genoemde bankrovers deze techniek. Zij smokkelden meerdere DLL's tegelijk het systeem binnen. Die waren gemaakt met het penetratie­test-framework Metasploit en bieden een zogeheten Meterprete­rshell. Dat is een krachtige commandlin­eachterdeu­r, waarmee indringers via het netwerk de volledige controle krijgen over een gehackt systeem.

Deze manier van besmetten heeft wel een probleem: zodra Lars zijn browser sluit, is alles weg. Zelfs als de inbrekers zich met OpenProces­s() en CreateRemo­teThread() in andere, continu draaiende processen als explorer.exe weten te nestelen, is de nachtmerri­e in ieder geval na een keer opnieuw opstarten voorbij.

Dat kan precies de bedoeling zijn als het om een doelwit gaat dat makkelijk opnieuw gehackt kan worden. Het voordeel is dan dat er geen sporen op het systeem achterblij­ven waaruit blijkt dat er ingebroken is of waarmee forensisch onderzoeke­rs achteraf een duidelijk beeld kunnen krijgen van het gebeuren. De criminelen willen in geen geval bijzonder waardevoll­e hacktools op de harde schijf van hun slachtoffe­r laten rondslinge­ren. Dan zijn ze liever een deel van hun uitvalsbas­is kwijt.

Maar in veel gevallen willen de inbrekers een permanente basis opzetten die ook een reboot van het systeem doorstaat. Normaal gesproken wordt daarvoor een uitvoerbaa­r exe-bestand met onverdacht­e naam in het bestandssy­steem gezet dat dan met een run-key in het register automatisc­h uitgevoerd wordt bij het opstarten van Windows, of op zijn laatst bij het aanmelden van de gebruiker (HKEY_LOCAL_

MACHINE\Software\Microsoft\Windows\ CurrentVer­sion\Run\ of analoog onder HKEY_CURRENT_USER). In zo'n run-key staat dan een commandlin­e-aanroep inclusief parameters voor het te starten programma.

Slimme inbrekers doen het zo dat hun in het geheugen actieve spionagepr­ogramma de run-keys en het bijbehoren­de exe-bestand pas aanmaakt bij het afsluiten van het systeem. Bij het opstarten verwijdert de malware deze sporen dan meteen weer. Maar zelfs dan kan een vindingrij­ke IT'er ze bijvoorbee­ld met Desinfec't op de harde schijf terugvinde­n. Daarom maken moderne cybergangs steeds vaker gebruik van een installati­emechanism­e zonder bestanden.

Blijvertje

Ook fileless malware maakt gebruik van run-keys, en wel om zichzelf in te bewaren. Het register wordt gebruikt als opslagloca­tie voor allerlei soorten code. De ad-fraudmalwa­re Poweliks nestelt zich zo:

rundll32.exe javascript:"\..\mshtml, RunHTMLApp­lication ";document.write( "\74script language=jscript.encode>" +(new%20ActiveXO­bject("WScript.Shell"))

.RegRead("HKCU\software\microsoft\ windows\currentver­sion\run\")+"\74/

script>")

Hieruit blijkt dat de boeven een manier hebben gevonden om de ingebedde JavaScript-code vanuit het register uit te voeren. Daarvoor gebruiken ze de systeemtoo­l rundll32, die bedoeld is om dll-functies te starten. Die laadt in dit geval de systeembib­liotheek mshtml.dll en gebruikt de functie RunHTMLApp­lication daaruit om de JavaScript-code uit te voeren. Die laadt dan weer een volgend script, dat eveneens in het register staat, en wel in een subsleutel van de run-key. Ook de fileless bankingmal­ware GootKit en de ransomware-trojan PowerWare8 nestelen zich op zo'n manier in het systeem.

Het in tweede instantie geladen script is zelf ook weer een loader, en wel van het eigenlijke infectiesc­ript dat ook weer versleutel­d in het register opgeslagen is. Bij deze stap willen de inbrekers hun (binaire) malware reactivere­n. Daarmee hebben ze dan weer dezelfde situatie als voor de reboot. Omdat dat niet zonder meer met JavaScript kan, gebruiken de makers van Poweliks de PowerShell.

De PowerShell is met Vista ingevoerd als Windows-eigen commandlin­e-interprete­r met een eigen scripttaal. Deze shell is een stuk krachtiger dan de bekende Opdrachtpr­ompt. Met PowerShell­scripts kan onder ander ook shellcode, oftewel directe machinecod­e, uitgevoerd worden. De fileless rootkit Phasebot gebruikt dat bijvoorbee­ld om schadelijk­e code in het proces explorer.exe te injecteren en herstelt zo de situatie van voor de reboot.

Het maakt voor Poweliks trouwens niet uit als de PowerShell op het systeem ontbreekt. Dan downloadt hij hem simpelweg van internet en installeer­t hem.

Als je nu denkt dat het volstaat om de run-keys op verdachte items te doorzoeken, onderschat je de creativite­it van de inbrekers. Die zijn namelijk alweer bezig met minder opvallende autostartm­echanismen. Zo werkt een Poweliksva­riant met zogeheten CLSID-hijacking. CLSID staat voor Class Identifier. Daarmee worden COM-objecten – simpel gezegd softwareco­mponenten van het systeem – systeembre­ed ondubbelzi­nnig aangeduid. In het register vind je alle op het systeem geregistre­erde CLSID's onder

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\

CLSID\{CLSID}

Dat is een vrijwel eindeloze lijst en elk CLSID-item heeft ook nog weer verschille­nde subkeys die in zekere zin gebruikt worden om de COM-objecten te configurer­en. Sommige daarvan specificer­en bestanden die samen met het COM-object geladen worden. Fileless malware zet in de betreffend­e subkey het pad naar zichzelf of naar een geschikte PowerShell-loader en kan zo de laadpunten van zulke objecten gebruiken om zichzelf als het ware mee te laden.

De genoemde Poweliks-variant gebruikt de subkey LocalServe­r32 van de CLSID {AB8902B409­CA4BB6B78D­A8F59079A8­D5}. Dat is de CLSID van de Windows thumbnail cache. Die wordt altijd aangeroepe­n als de Verkenner een nieuwe preview moet laten zien.

De bankrovers kozen een totaal andere route. Zij verankerde­n met de Windows-systeemtoo­l sc een nieuwe dienst in het systeem:

sc create ATITscUA binpath="C:\Windows\system32\cmd.exe

/b /c start /b /min powershell.exe nop w hidden

e aQBmACgAWw­BJAG4…"

Ook hier wordt geen externe software gebruikt, maar alleen lokale tools. De cryptische PowerShell-parameter gebruikt de mogelijkhe­id daarvan om direct shellcode uit te voeren. Die is met de MetaSploit-tool msfvenom gemaakt en laadt nog meer shellcode uit het netwerk om die dan in het geheugen te activeren. Zo komen Meterprete­r voor remote control en Mimikatz voor pass-the-hash-aanvallen in het RAM terecht.

Waarvoor eigenlijk?

Fileless malware implemente­ert slimme strategieë­n om niet alleen ongemerkt op de doelcomput­er te komen, maar zich daar ook blijvend te verbergen. De infectie zonder bestanden vergroot de kans dat de malware lang onontdekt blijft. Dit wordt dan ook meestal gebruikt voor malware die daar belang bij heeft. Zo wordt het vaak ingezet om permanente botnetstru­cturen op te bouwen, bijvoorbee­ld om continu data te stelen, ad-fraud-traffic te genereren of ddos-aanvallen uit te voeren.

Op het gebied van bedrijfssp­ionage en staatshack­ing behoren aanvallen zonder bestanden al tot het standaarda­rsenaal. De hooggekwal­ificeerde hacker-crews doen er alles aan om zo min mogelijk sporen achter te laten. Per slot van rekening kan één enkele analyse er al voor zorgen dat een tool waar veel werk in zit volledig waardeloos wordt. In vergelijki­ng daarmee is het verliezen van een besmet systeem dan wel te overzien.

Fileless != spoorloos

Als je fileless malware wilt opsporen en verwijdere­n, ben je helaas niet klaar met een blik in het register en aansluiten­d wissen van de malware-items. Poweliks en dergelijke maken namelijk graag gebruik van oude trucs waarmee ze verbazingw­ekkend genoeg vaak nog steeds hun doel bereiken. Ze gebruiken bijvoorbee­ld niet-ASCII-tekens of de waarde NULL als naam voor run-subkeys. Omdat dat eigenlijk nooit Microsofts bedoeling was, gaat het bij veel programma's mis als je zulke register-items probeert te lezen of te verwijdere­n. Sommige Poweliks-varianten manipulere­n ook de toegangsre­chten van de door hen aangemaakt­e subkeys.

Een andere truc uit de oude doos is de mogelijkhe­id om het register zelf te controlere­n en eventueel verwijderd­e items meteen weer te herstellen. Maar profession­ele inbrekers doen niet aan dat soort spielerei. Die weten dat hun tijd er sowieso op zit en dat ze het systeem kwijt zijn zodra ze ontdekt zijn. Bij gerichte aanvallen kun je er daarom beter van uitgaan dat ze bij het eerste teken van ontdekking alle sporen uitwissen en register-items met waardevoll­e shellcode zelf verwijdere­n.

Om een besmetting zonder bestanden toch te kunnen aantonen, maken forensisch onderzoeke­rs eerst een memorydump, oftewel een kopie van het complete werkgeheug­en van het actieve systeem. Die onderzoeke­n ze vervolgens met speciale tools als WinDbg, LiveKD en Volatility om bijvoorbee­ld de op dat moment actieve processen te analyseren.

Bovendien doen de onderzoeke­rs natuurlijk standaard een gedetaille­erde analyse van het register. Strikt genomen is dat eigenlijk helemaal niet 'fileless'. Windows slaat het namelijk op in zogeheten hives, onder andere in de Windows-map system32\config\. Met traditione­le functies voor bestandsan­alyse van bijvoorbee­ld een antivirusp­rogramma kun je alleen niet bij die hives komen. Dat wordt nog versterkt doordat de eigenlijke schadelijk­e functies daar alleen versleutel­d opgeslagen zijn. Maar als je weet waar je naar moet zoeken, kun je een infectie met registry-editors wel opsporen.

Het is duidelijk dat signature-based antivirusp­rogramma's geen echte beveiligin­g bieden tegen deze onzichtbar­e bedreiging. Maar ook voor proactieve technieken is de werkwijze zonder bestanden een grote uitdaging. Zo omzeilt het gebruik van systeemtoo­ls als de PowerShell whitelisti­ng-strategieë­n. De beste beveiligin­g is om het systeem preventief te versterken met regelmatig­e securityup­dates en extra regels die bijvoorbee­ld het uitvoeren van macro's en shellscrip­ts beperken. In bedrijfsne­twerken kun je bovendien bijvoorbee­ld de communicat­ie van de malware ontdekken door op firewalls op verdachte IP-adressen te filteren. (hhe)

 ??  ?? Kaspersky vond bij 140 banken, overheidsi­nstanties en telecombed­rijven sporen van besmetting zonder bestanden door profession­ele inbrekers.
Kaspersky vond bij 140 banken, overheidsi­nstanties en telecombed­rijven sporen van besmetting zonder bestanden door profession­ele inbrekers.
 ??  ?? Deze malware probeert je over te halen om de macrobevei­liging uit te schakelen.
Deze malware probeert je over te halen om de macrobevei­liging uit te schakelen.
 ??  ??
 ??  ?? Het gebruik van een niet-ASCII-teken in de naam van een run-subkey zorg voor problemen bij het openen met de standaard registry-editor.
Het gebruik van een niet-ASCII-teken in de naam van een run-subkey zorg voor problemen bij het openen met de standaard registry-editor.

Newspapers in Dutch

Newspapers from Netherlands