Myslím další pěkný příklad pravidla "nikdy nic nepředpokládej" (což je jedno z deseti přikázání profesionálního válečníka Richarda Marcinka). Co asi udělá hacker, který chce zůstat v síti svého "zákazníka" i potom, co ho odtud vyženou svinským krokem? Nechá tam nějaký trojan downloader. Pojďme se podívat, co to může znamenat, a že nebude zrovna jednoduché mu v tom zabránit.
Když je to nějaký prosťáček, tak někde na netu takový downloader stáhne a rozinstaluje. Proti prosťáčkům funguje antivirus (asi lépe řečeno antimalware). Antimalware snad zná nějaké obvyklé signatury trojan downloaderů a umí je tedy najít.
Když to ovšem není prosťáček tak udělá co? Nějakého si naprogramuje. Bude mít jistotu, že takový program nic nenajde.
Nojo, naprogramovat. To už chce hodně velké znalosti, že? Nesmysl. To je skript na 4 řádky v PowerShellu. Něco jako tohle - to je základ skriptu, který já používám na sledování funkčnosti SharePointu (a podobných najdete na internetu desítky):
$webClient = New-Object System.Net.WebClient
$webClient.Headers.Add( `
"user-agent", `
"sevecek-nlb-testing")
$webClient.Credentials = `
[System.Net.CredentialCache]::DefaultCredentials
[string] $html = `
$webClient.DownloadString("http://intranet")
Tenhle skript stahuje normální HTML. Může ale stahovat cokoliv jiného. Dokonce to dělá pod identitou aktuálního uživatele. Takže to umí chodit i přes ověřovanou proxy. Není potřeba mír dvacet let programátorských zkušeností na to, abyste to upravili na stažení nějakého textového souboru se skriptem, který chcete spouštět.
No a jak to potom spustíte? Paráda je, že PowerShell umí spouštět kód z proměnné pomocí Invoke-Expression - tedy jen a jen z paměti. Nemusíte ani nic ukládat na disk. Příklad následuje - v řetězcové proměnné je text skriptu, který se spustí (tohle vypíše procesy na počítači).
$memoryOnlyScript = `
'echo "skriptu z retezce" ; get-process'
Invoke-Expression $memoryOnlyScript
Obrana?
Můžete zvážit tyhle možnosti:
- zakázat PowerShell úplně
- vyžadovat všechny skripty pouze digitálně podepsané
- zablokovat přístup na internet ze serverů
- zrušit alespoň výchozí bránu (default gateway), aby skript musel přes proxy a měl to tedy složitější
Všechny možnosti jsou nějak nedokonalé. PowerShell zakázat nechcete. Ten útočník si bude ten downloader nejspíš navíc spouštět pod SYSTEM účtem (viz. můj předchozí článeček o skrytých úlohách v WMI). Může si tedy se systémem dělat cokoliv a jakákoliv omezení si odebrat. Každé omezení je ale vždycky další hrebíček do rakve namachrovanýho hekříka. A to my chceme!
Přístup na internet je dobré omezit tím, pokud to jde, že zrušíte výchozí bránu a na internet se musí chodit přes proxy. A vypnete proxy pro system. Máte lepší kontrolu a skriptař to má přecejenom ztížené. Taky bych použil Windows Firewall. Můžete pro servery krásně přes GPO omezit odchozí spojení.
Proč by měly servery chodit někam na HTTP? Aktualizace? Máte WSUS, ne? A někdy potřebuju přecejenom internetit? Nepotřebujete internetovat ze serverů, to vám garantuju :-) Ale i kdyby, Windows Firewall přece umí omezit odchozí spojení i podle procesů. Tak si můžete povolit Internet Explorer a přecejenom se podíváte :-)
Zase. Je pravda, že SYSTEM si tahle omezení může sám odebrat. Ale ono to už zase víc a víc komplikuje ten útočníkův skript. Spíše v něm bude chyba, bude mu trvat déle, než to přizpůsobí konkrétnímu prostředí.