Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Naplánované úlohy, které nejsou vidět
říjen 21
Naplánované úlohy, které nejsou vidět

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!

Comments

Neverim

Neverim :) Pekny clanok.

Dakujem,
Ondrej Zilinec on 22.10.2012 9:11

Add Comment

Sorry comments are disable due to the constant load of spam *


Omlouvám se, ale příval spamu nelze kontrolovat, takže mi prosím pošlete email, pokud máte nějaký dotaz, nebo připomínku.

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments