Ačkoliv zpráv o úspěšných kybernetických útocích neustále přibývá, řada společností stále spoléhá pouze na neomylnost antiviru a jeho instalace je často jediným krokem k zvýšení zabezpečení firemní sítě.
Článek rozhodně neslouží k dehonestaci antivirových produktů, naopak je považujeme za základní a zásadní formu ochrany počítačových systémů!
Cílem tohoto článku je přiblížit základní metody, které běžné antiviry využívají k detekci malwaru, a ukázat základní možnosti modifikace souboru, který je antiviry považován za škodlivý tak, že ho jejich detekční systém nezachytí. Ačkoliv jsou v článku pro účely demonstrace zmíněny jen některé metody, měl by dostatečně poukázat na jejich nedostatky. Obvykle záleží pouze na dovednostech, kreativitě a motivaci potenciálního útočníka, rozhodně tedy není vhodné spoléhat pouze na antivirová řešení a běžné metody detekce malwaru.
Označení malware je shrnující název pro jakýkoliv škodlivý program, který na vašem počítači vykonává nežádoucí akce. Jeho spuštění obvykle předchází aplikování metod sociálního inženýrství, které uživatele přesvědčí ke spuštění škodlivého programu, který útočníkovi umožní přístup do sítě a vykonání dalších částí útoku. V roce 2018 se často jednalo např. o malware, který zašifruje váš disk a útočníci požadují za jeho opětovné zpřístupnění nemalé výkupné
(ransomware) či malware umožňující připojení vašeho počítače do útočníkovy sítě bez vědomí uživatele (botnet).
Antivir je pravděpodobně jedním z nejkomplexnějších programů třetí strany, který na svých počítačích máte. Pracuje s rozsáhlými databázemi již známých hrozeb a integruje do sebe např. skenery, sandbox či další nástroje pro heuristickou analýzu. Je to program, kterému v podstatě neomezeně umožňujete přístup k celému systému a všem svým souborům.
Představme si tedy základní metody kontrol shrnuté do tří kategorií.
Běžnou a zároveň i nejstarší součástí každého antiviru (používanou k identifikaci malwaru) je tzv. signature-based analýza, tedy kontrola prováděná na základě specifických podpisů. “Podpisy” jsou obvykle hashe souborů nebo řady bytů, které antivir v souborech vyhledává a porovnává se svou pravidelně aktualizovanou databází již známých typů malwaru.
Pokud najde shodu ve vybraném počtu takových podpisů, program zablokuje dříve, než dojde k jeho vykonání. Tato metoda je tedy efektivní pouze v případech, že se do vašeho počítače dostane známý malware pokud možno v neupravené formě. Pro většinu útočníků ale nepředstavuje problém tyto “kritické” úseky vyhledat a upravit tak, aby je antivir nedokázal identifikovat.
Dalším vývojovým stupněm k signature-based metodám je statická heuristická analýza. Antivirus kontroluje strukturu souboru a vyhledává podezřelé okolnosti. Do hledáčku antiviru se tak například dostanou soubory šifrované více metodami, PDF soubor obsahující spustitelný kód nebo textové soubory s povolenými makry.
Pokud u souboru nalezne kombinaci podezřelých faktorů, které z jeho pohledu tvoří nebezpečný vzor, nahlásí ho jako škodlivý. Tato technika tedy antivirům umožňuje na základě vícekriteriální analýzy variant detekovat i dříve neznámý škodlivý software.
V rámci behaviorální analýzy antivirus spouští program, který zatím nebylo možné s jistotou identifikovat jako malware a zachytává “podezřelé” aktivity, které se program snaží v systému vykonat a v případě podezření ho ukončí. Mezi takové aktivity může patřit například přepisování souborů, vynucování autorestartu, úprava registrů, replikace apod.
Zdálo by se, že to je optimální řešení, mezi zásadní nevýhody ale patří zvýšená míra false-positive výsledků a fakt, že dobře napsaný malware se často skrývá za procesy legitimní aplikace. Některé procesy, které jsou obvykle součástí malwaru, mohou být stejně tak i součástí zcela legitimního programu. Behaviorální analýza tedy musí být provedena pouze v takovém rozsahu, aby neblokovala provoz počítače.
Vzhledem k tomu, že spouštět program přímo v systému může způsobit řadu problémů, moderní antiviry nabízejí např. možnost odesílání souborů do jejich cloudu, kde probíhá analýza jeho chování v bezpečí vzdáleného prostředí s využitím aktuální databáze poskytovatele (i před aktualizací desktopového antiviru uživatelem). Další možností je pro analýzu využít prostředí sandboxu, tzn. lokálního emulátoru odděleného od zbytku systému tak, aby nemohlo dojít k infekci. Některé typy malwaru dokáží ale sandbox identifikovat a upravit své chování tak, aby je antivirus vyhodnotil jako neškodné a povolil spuštění na reálném systému.
I v případě, že je takto zkontrolovaný program označen jako neškodný, antivir může monitorovat i všechny procesy, které v systému probíhají a v případě, že zaregistruje nečekané anomálie, program alespoň zpětně ukončí. Tyto metody jsou ale poměrně náročné na výkon počítače a obvykle není možné je provádět v dostatečném rozsahu.
Takže jak to, že stále dochází k úspěšným útokům i v době, kdy počítač s instalovaným antivirem je už běžnou záležitostí? Kromě úplně nových typů malwaru cílených na dosud nezjištěné zranitelnosti nejsou výjimkou ani modifikované verze již známých útoků.
Mezi obvyklé metody úprav malwaru za účelem vyhýbání se detekci antiviru patří především odstranění nebo úprava typických “podpisů” a obfuskace (znepřehlednění strojového kódu např. přidáním “mrtvého” kódu, který nic nevykonává, šifrováním, úpravou formátování, řetězců a názvosloví, záměnou pořadí funkcí nebo substituce běžných operací jinými, vedoucími ke stejnému výsledku apod.).
Je možné využít i tzv. packery (které samotný malware komprimují, příp. přidávají k nějakému většímu neškodnému souboru) nebo cryptery (které ho šifrují tak, aby antiviru ztížili jeho detekci). Po spuštění v systému oběti se tedy nejdříve aktivuje dekomprimace/dešifrování a poté až samotný škodlivý kód.
Je možné najít celou řadu komplexních nástrojů, které vám aplikaci těchto metod velmi usnadní, jako například:
Velkou "nevýhodou" využití již předpřipravených nástrojů ale je, že jsou dostupné i pro antivirové společnosti. Jejich využití tedy na výsledném souboru zanechává “stopy”, které antivir může rozpoznat. Například použití packerů vyvolává podezření antiviru už samo o sobě nehledě na to, že aktuální verze dokážou skenovat i většinu komprimovaných formátů. Pokud se tedy jedná o cílený útok, nejlepším řešením je provést úpravy manuálně podle konkrétních potřeb útočníka, či integrovat konkrétní funkce z již existujícího softwaru do svého.
V následující části si některé z úprav ukážeme prakticky. Jako příklad použijeme Mimikatz, známý opensource nástroj Benjamina Delphyho pro sběr autentizačních údajů, jako jsou např. NTLM hashe nebo Kerberos tickety z paměti procesu LSASS (Local Security Authority Subsystem Service) v systému Windows, usnadňující laterální pohyb v síti např. pomocí metod “pass-the-hash” (využití NTLM hashe uživatelského hesla k přihlášení bez znalosti cleartext podoby hesla) , příp. “pass-the-ticket” (kerberos) a obsahující řadu dalších funkcí užitečných při penetračním testování. Mimikatz je standardním nástrojem využívaným pentestery v post-exploitační fázi testování a je i součástí exploitačních frameworků jako např. Powershell Empire (powershellová verze Invoke-Mimikatz) či Metasploit. Za pozornost stojí i nově vydaná modifikace SafetyKatz. I když ve své podstatě použití Mimikatzu není nelegální, vzhledem k očividné zneužitelnosti (např. jako součást ransomwaru WannaCry) je antivirovým společnostem velmi dobře známý a je standardně blokován jako malware.
Pro demonstraci dopadu úprav budeme modifikovaný soubor čas od času testovat pomocí aplikace VirusTotal, která soubor proskenuje pomocí řady různých antivirů a nahlásí výslednou detekci. VirusTotal spolupracuje s antivirovými společnostmi v rámci zlepšování služeb a aktualizace databází, škodlivý kód tedy rovnou přeposílá a není vhodné tuto službu používat, pokud chceme vytvořit kód určený ke skutečnému testování. V takovém případě je nejvhodnější identifikovat antivirus běžící na cílovém systému a testovat zvolený nástroj např. ve virtuálním prostředí s vypnutím automatických reportů o nálezech. Úpravy, které budeme s nástrojem Mimikatz provádět zde slouží pouze k demonstrativnímu účelu v rámci tohoto článku (upravený soubor nebude použit v rámci testování), není tedy nutné se VirusTotalu vyhnout.
Na Github můžeme stáhnout už předpřipravenou verzi Mimikatzu jako klasický exe soubor - přímo k použití v 32-bitové a 64-bitové verzi.
Soubor v nezměněné formě tak, jak je dostupný na Githubu, ale označí jako škodlivý 46 produktů, což je více než dvě třetiny z testovaných antivirů.
Abychom ukázali, že i základní úpravy známého nástroje mají značný dopad na úroveň antivirové detekce, budeme pracovat s kódem v master větvi programu Mimikatz.
Jak jsme viděli výše, spustitelný soubor v nezměněné formě tak, jak je dostupný na Github, označí jako škodlivý 46 z testovaných antivirů. Stáhneme si tedy zdrojový kód a otevřeme celý projekt ve Visual Studiu.
Už ve chvíli, kdy všechny potřebné soubory - tak, jak jsou dostupné na Github bez jakýchkoliv úprav - sami sestavíme do spustitelného souboru a znovu nahrajeme na VirusTotal, klesne původní úroveň detekce ze 46 na “pouhých” 27.
Významný rozdíl z hlediska některých AV databází tedy tvoří již změna hashe (např. SHA-256) spustitelného souboru. Kontrola hashů (převedením jednotlivých bitů souboru do mnohem kratších “stringů” pomocí řady kryptografických úprav, které ho následně jednoznačně identifikují) umožňuje výrazné zrychlení skenování podezřelého souboru. Už malou změnou výchozího kódu, či jeho rekompilací - i změnou jediného bitu - ovšem dochází k velké změně výsledného hashe a pokud bychom spoléhali pouze na tuto metodu, úroveň detekce antivirů by byla velmi nízká.
Její použití je tedy vhodné pouze pro rychlé “odfiltrování” nezměněných verzí již známého malwaru. Alternativou k této statické analýze je využití tzv. fuzzing hashe - metody, která dokáže identifikovat nový malware i na základě podobností s jiným. S fuzzing hashi umí pracovat např. nástroj ssdeep, původně vyvinutý k detekci emailového spamu.
Je jasné, že jednoduše přejmenovat samotný soubor nevyvolá žádnou změnu. Zkusíme tedy upravit některé další očividné identifikátory jako např. zdrojový soubor mimikatz.rc (Resource Script file).
Stejně tak můžeme zkusit nahradit ve všech souborech např. výraz “gentilkiwi”, “kiwi”, “Delpy”, což mohou být výrazy, které v kombinaci s ostatními testovanými stringy upozorní antivirus na Mimikatz. Tyto úpravy ale obecně vedou pouze k drobnému snížení rizika detekce.
Antiviry obecně vybírají mnohem náhodnější sadu “stringů” v rámci signature-based analýzy, které - pokud se vyskytnou v dané kombinaci - upozorní na přítomnost nebezpečného kódu právě proto, aby nebylo snadné je identifikovat a upravit. Změna “očividných identifikátorů” jako jsou tyto ve výsledku nepřináší téměř žádný úspěch.
Musíme se tedy podrobněji zaměřit na identifikaci stringů, které by mohly být problémové.
Abychom si ukázali, jak takový problémový string může vlastně vypadat, využijeme známý opensource antivirus ClamAV, který oproti běžným komerčním antivirům umožňuje snadno nahlédnout přímo do své databáze signatur.
V terminálu proscanujeme náš soubor mimikatz.exe a vypíšeme si testovaný vzor.
Jak vidíme, ClamAV v souboru kontroluje celkem sedm řetězců a v případě, že najde shodu ve všech sedmi, soubor identifikuje jako Mimikatz. Stačí tedy ve Visual Studiu přepsat pouze jeden z nich a konkrétně ClamAV již Mimikatz neidentifikuje.
YARA je nástroj, který slouží k vytváření pravidel pro identifikaci řetězců v rámci kontroly souborů a napomáhá detekci tak, že vyhledává dané textové nebo binární vzory a na jejichž základě identifikuje škodlivý software.
Mimikatz obsahuje i soubor kiwi_passwords.yar, kde jsou uvedena pravidla, která definují, jaké řetězce jsou v souborech vyhledávány. Na obrázku vidíme ukázkové řetězce zapsané v hexadecimálním kódu a podmínky, které jsou definovány pro jejich uplatňování.
Příslušné řetězce pak najdeme v jednom z modulů.
Ve chvíli, kdy se nám podaří “problémové” řetězce identifikovat, je možné provést jejich obfuskaci, šifrovat je, či provést libovolnou operaci, která signaturu neutralizuje. V případě programu Mimikatz jsou detekovaná pole deklarovana globálně, tedy je nutné je převést do scopu konkrétních funkcí.
Packing je jednou z běžných obfuskačních technik využívaných k ukrytí škodlivého souboru před antiviry pomocí komprese a příp. i šifrování (tzv. cryptery), často ve více vrstvách. Poté, co se takto modifikovaný malware dostane do cílového systému, dojde v prvním kroku k jeho rozbalení a následně se v paměti vykoná. Je ale možné, že i když ze začátku antivir komprimovaný soubor nezachytí, po jeho spuštění zaznamená podezřelou aktivitu a program ukončí.
V případě, že útočník využije některý ze “známých” packingových nástrojů, může se stát, že ho antivir rozpozná a uplatní již známou metodu rozbalování. Původní záměr se “skrytím” škodlivého programu pak může být úplně neúčinný. V řadě případů může dojít i k tomu, že využití některého ze známých packerů úroveň detekce dokonce zvýší, protože antivirové společnosti dokáží zachytit jeho použití a předpokládají, že byl využitý k zamaskování škodlivého souboru. K detekci dochází obvykle proto, že použití packeru lze poměrně dobře odhalit pomocí heuristické analýzy, např. kvůli nízkému počtu importů, vysoké míře entropie či podezřele pojmenovaným sekcím a jejich malému počtu.
V rámci demonstrace použijeme právě jeden z nich, jednoduchý packer pro spustitelné soubory UPX. Jeho použití je typické i pro “neškodné soubory” a většina antivirů ho i po identifikaci automaticky nevyhodnotí jako malware. Z hlediska reverzního inženýrství a rozbalování souborů je ale antivirům obecně dobře známý. Obecně vyšší podezření vyvolávají programy, které soubory skrývají šifrováním.
Z našeho sestaveného spustitelného souboru mimikatz.exe tak vytvoříme nový komprimovaný soubor. Už i takováto malá úprava ovšem snížila úroveň detekce na Virustotal o další tři typy antivirů.
Jak bylo ale řečeno, UPX je jedním ze známých packerů a antiviry jeho použití dokáží detekovat. Stopy můžeme vidět např. pokud exe soubor otevřeme v hex editoru (ukázka níže). V hex editoru můžeme také změnit názvy sekcí tak, aby neobsahovaly známá pojmenování (např. UPX0, UPX1). Tím docílíme toho, že během kontroly UPX nedokáže soubor opětovně rozbalit. Modifikovaný mimikatz je ale možné i nadále spouštět, takže můžeme ošálit některé rozbalovací implementace v antivirech.
Důvěryhodnost souborů z pohledu uživatelů i antiviru zvyšují certifikáty, obvykle vydávané některou z certifikačních autorit. Dokonce i self-signed certifikát (podepsaný autorem, nikoliv certifikační autoritou) může zvýšit šanci, že antivir soubor neoznačí jako škodlivý, ačkoliv obvykle funguje jen v souvislosti s dalšími úpravami - pokud jinak špatně skrytý soubor vykazuje řadu podezřelého chování, nebo neprojde základní signature-based analýzou, samotný certifikát je k ničemu.
Pokud aktivace škodlivého software vyžaduje i nějaké potvrzení ze strany oběti, v rámci sociálního inženýrství může jakákoli podoba certifikátu zvýšit důvěryhodnost souboru.
V našem případě se nám podařilo automaticky vygenerovaným self-signed certifikátem připojeným ke komprimovanému souboru s doposud zmíněnými základními úpravami snížit úroveň detekce o dalších 9 antivirů.
Mimikatz je napsaný v jazyce C. Jeho základní proměnné, které např. obsahují název programu, verzi, kódové jméno aj., jsou definovány globálně v souboru globals.h, což antivirovému programu usnadňuje jejich identifikaci.
Můžeme tedy zkusit proměnné přejmenovat. Bohužel v našem případě neměla úprava z hlediska detekce žádný efekt.
Jaké zajímavé řetězce zkompilovaný soubor obsahuje lze zjistit například pomocí příkazu strings:
$ strings mimikatz.exe
$ strings -e l mimikatz.exe
V případě Mimikatzu bude zajímavější podívat se na definice funkcí. Jedním z kritérií heuristické analýzy bývají i importované funkce (Import Address Table). Mimikatz má některé definované globálně v hlavičkových souborech, ostatní používané knihovny jsou definované v nastavení linkeru ve Visual Studio projektu. Místo propojování spustitelného souboru s potřebnými knihovnami je ale možné knihovny načítat při běhu programu dynamicky.
Např. soubor kuhl_m_lsadump.h obsahuje mj. i tři externě deklarované funkce: LsaOpenSecret, LsaSetSecret a LsaQuerySecret.
Funkce odstraníme (zakomentujeme) a znovu je deklarujeme jako “typedef”:
V jednotlivých částech kódu v souboru kuhl_m_lsadump.c pak dynamicky načteme potřebné knihovny (funkce LoadLibraryA), zjistíme adresu požadovaných funkcí (funkce GetProcAddress) a provedeme jejich definování se stejným jménem jako dříve použitá funkce tak, abychom nemuseli zbytečně upravovat zbytek zdrojového kódu.
Aktuální stav importovaných funkci je možné zjistit ze zkompilovaného mimikatzu například využitím utility rabin2 (nástroj radare2) s parametrem -i.
Takto upravený Mimimkatz jsme následně testovali v rámci virtualizací s instalovaným operačním systémem Windows 10 a plně aktualizovanými antivirovými programy Windows Defender a Eset. Na obou systémech bylo možné upravený Mimikatz spustit a vykonat modul “Sekurlsa”, který z paměti extrahuje klíče, hesla a tikety uživatelů aniž by došlo k jeho detekci a blokování. Výsledkem podle VirusTotalu je detekce čtyř antivirových řešení.
Ačkoliv je pravidelně aktualizovaný antivir doporučovanou součástí systému zabezpečení firemní sítě, je velmi nebezpečné spoléhat pouze na něj. Často počítač účinně chrání pouze před již známými hrozbami, které jsou v nedostatečně modifikované formě plošně distribuovány např. přes internet.
Mezi základní principy zvyšování bezpečnosti patří například udržování operačního systému i dalších programů v aktuálních verzích, které obsahují patche a ochrany proti již známým zranitelnostem.
Zcela klíčové je efektivní vzdělávání zaměstnanců tak, aby chápali závažnost případného úspěšného útoku a neotevírali jakýkoliv soubor z neověřeného zdroje, stahovali pouze schválený legální obsah z oficiálních stránek výrobce a nenechávali svá elektronická zařízení bez dozoru.
Na zařízeních připojených k síti je vhodné mít také nastavený firewall (firewall obsahuje každý moderní operační systém, ale také bývá často distribuován v sadě společně s antivirovým produktem).
V neposlední řadě je důležité sledovat a vyhodnocovat síťové anomálie (tzv. Network Security Monitoring), logy z provozovaných operačních systémů (např. pomocí nástroje sysmon pro OS Windows) a sbírat logy z dalších síťových prvků - firewallů, VPN bran aj. Podezřelé soubory můžete případně při jejich zachycení nechat zkontrolovat skenery (např. VirusTotal), nebo nástroji pro behaviorální analýzu (např. Cuckoo Sandbox).
Obcházení i zbývajících detekcí antivirů si třeba ukážeme v některém z budoucích článků.
Článek vznikl pod vedením Petra Medonose.