Při poslechu Mean Mr. Mustard pokračuju v chrlení článků, co jsem tu chvilku zanedbával.
Takže co tu máme teďka? Skryté naplánované úlohy. Zrovna řeším jeden bezpečnostní incident, kdy si hodný zaměstnanec nainstaloval do celé sítě různé dobrůtky a teďka se nedá těch mazlíků zbavit. Co je horší, že toho se nemůžete nikdy na 100% zbavit. Můžete si udělat nějaký audit. Ale nikdy nevíte. Nebo teda lépe je pozvat si mě :-). Teď se třeba zrovna dozvíte, že jste určitě nevěděli, o tomhle typu naplánovaných úloh.
Nejsou vidět a nikdo je nezobrazuje
Existují různé nástroje na zobrazení programů a služeb a DLL knihoven, které se spouští po přihlášení a automaticky a podle plánu apod. Například autoruns od Sysinternals. Ale neviděl jsem žádný nástroj, který by zobrazoval seznam objektů z WMI zvaných EventConsumer.
Prostě. WMI umí samo sledovat různé události, jako je třeba vznik nového procesu, spuštění nebo pád služby, vznik události v protokolu událostí (event log) apod. Na to jsou třídy (tabulky) __EventFilter. Umí také samo generovat události buď v nějakých přesných časech (__AbsoluteTimerInstruction), nebo intervalech (__IntervalTimeInstruction).
Pokud to sleduje nebo generuje tyto události, tak to na ně umí také samo reagovat. Reakce se definuje za pomoci třídy __EventConsumer. Reakce, neboli kunzument, může například zapisovat něco zase do protokolu událostí. Když by třeba vznikl nový proces, který vás zajímá, tak byste si to mohli třeba poznačit do logu a nějak to sebrat SCOMem třeba. I sám SCOM si například registruje takového konzumenta.
Ale tohle mě nevzrušuje. Co vzrušuje hackery jsou konzumenti, kteří umí spustit EXE (CommandLineEventConsumer) nebo VBScript (ActiveScriptEventConsumer). Prostě na událost v logu, nebo v nějakých čase spustí program. Stejně jako naplánovaná úloha. Pod systémovým účtem. Parádička.
Tyto definice se ukládají přímo do WMI konfigurační databáze, takže to tam vydrží bez ohledu na restarty apod.
Vždyť ty trojany najde antivirus
Tak to je iluze. Antiviry umí najít trojany a backdoory, které znají. Obvykle se chvástají různými heuristikami, ale to je iluze. Nic takového neexistuje. Pokud si hacker napíše skript ve VBS, který bude dělat cokoliv, dá ho do WMI a nechá ho spouštět čas od času, několikrát za rok, tak garantuju, že to nikdo nedetekuje.
Cílený, individuální útok nelze automaticky rozpoznat. Naštěstí většina hackerů jsou trosky, které stáhnou někde z webu nějaké trojan downloadery. Virus si naklikají v nějakém příjemném GUI visual virus studiu a na programování čučí jako puci.
Ovšem pořád platí moje heslo (nebo lépe řečeno heslo pana Marcinka) - nikdy nic nepředpokládej!
Dá se nějak vypsat seznam těch konzumentů?
Jasně. Tu je na to skript v PowerShellu.
function global:List-WMINamespaces `
([string] $parent, [string] $computer)
{
$parent = $parent.Trim()
$res = $null
if ($parent -ne '') {
if ($computer -eq '') {
$computer = 'localhost'
}
$myNamespacesRaw = $null
$myNamespacesRaw = Get-WmiObject `
-Namespace $parent `
-Query "SELECT * FROM __NAMESPACE" `
-ComputerName $computer `
-EA SilentlyContinue
# The result is either 1 WMI object,
# array of WMI objects
# or a $null if nothing was found
if ($myNamespacesRaw -ne $null) {
$myNamespaces = `
$myNamespacesRaw | `
? { $_ -ne $null } | `
Select-Object Name | `
% { ('{0}\{1}' -f $parent, $_.Name.Trim()) } | `
Sort-Object
# myNamespaces contains either 1 string
# or array of strings
$res = $myNamespaces | % {
$_
List-WMINamespaces ($_) | ? { $_ -ne $null }
# List-WMINamespaces is either $null
# 1 string or array of strings
}
}
}
return $res
}
function global:List-WMIEventConsumers `
([string] $computer)
{
if ($computer -eq '') {
$computer = 'localhost'
}
List-WMINamespaces 'root' $computer | % {
$namespace = $_
Write-Host `
('Computer: {0} | Namespace: {1}' `
-f $computer, $namespace)
Get-WMIObject `
-ComputerName $computer `
-Namespace $namespace `
-Query "SELECT * FROM __EventConsumer"
}
}
List-WMIEventConsumers
Tak ještě jednou. Nidky nic nepředpokládejte (v originále: thou shalt never assume). A nikdy nikomu nevěřte. Ani mě ne!