Der Waldmeister

Einblicke in (Security)-Themen ausm tiefen Wald

Scheduled Task erstellen

Unter Windows lassen sich PowerShell-Befehle auch ganz einfach in einen wiederkehrenden Task, sogenannte Scheduled Tasks, verwandeln. Folgendes Beispiel illustriert diese Vorgehensweise:

$action = New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument '-NoProfile -WindowStyle Hidden -Command "BEFEHL"';

$trigger = New-ScheduledTaskTrigger -AtStartup;

Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'Mein Task' -Description 'Beschreibung'

Man muss also lediglich das Feld “BEFEHL” durch den PowerShell-Befehl ersetzen.

Alias von Kommandos

Neben dem Verstecken von Kommandos gibt es auch noch die einfache Möglichkeit die vorhandenen PowerShell-Kommandos mit Aliasen zu versehen. Das kann praktische Gründe haben, kann aber auch im Rahmen von Malware vorkommen, wenn man Kommandos verstecken will.

Ein Alias geht wie folgt:

$alias = 'Get-Dir';

Set-Alias -Name $alias -Value Get-ChildItem;

Invoke-Expression $alias

Hier gilt es also auf die Stichwörter Set-Alias sowie erneut auf Invoke-Expression zu achten.

Komplexes Passwort per Zufall erzeugen

Es gibt viele Tipps und Tricks, um sich ein komplexes Passwort automatisiert erzeugen zu lassen. So bin ich beispielsweise auf diesen tollen PowerShell User Blog gestoßen, der detailliert erläutert wie man beim Erstellen solch eines Scripts vorgeht, und welche sicherheitstechnischen Anforderungen zu beachten sind.

Ich hatte das Ziel das Script möglichst klein zu halten mit der Anforderung, die zulässigen Zeichen selbst festlegen zu können.

Ich habe die ähnlich aussehenden Zeichen für “O”, “o”, “0” somit entfernt und auch nur die Sonderzeichen genommen, die man eindeutig lesen kann.

Herauskommen ist folgendes und funktioniert tadellos:

-Join("ABCDabcd&@#$%1234".tochararray() | Get-Random -Count 10 | % {[char]$_})

Als Parameter dienen folgende Angaben:

  • count: Anzahl der Zeichen des Passworts
  • Zeichen in Klammern: hier legt man fest welche Zeichen im Passwort vorkommen sollen

Pfad-Angaben verstecken

Auf der Suche nach Mustern für verdächtige PowerShell-Ausführungen (weitere Beispiele) findet sich auch oft die Nutzung von codierten Strings.

Beispiel ist die zuvor codierte Pfadangabe mittels Base64 dann beim “Opfer” wieder in eine lesbare Pfadangabe zu decodierten und dann auszuführen, wie folgt:

$path = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('QzpcVGVtcFxBZG1pblRvb2xz'));

Invoke-Item $path

Es gilt also auf die Befehle “Invoke-Item” zu achten.

Verstecken von Kommandos

Bei maliziösen PowerShells in freier Wildbahn sollte man auf der Hut. Allerdings muss man auch die besagten Kommandos erkennen, die schadhaft oder zumindest verdächtig sind.

Die “Endgegner” versuchen mit allen Methoden ihre Künste zu verstecken, sowohl vor der Abwehr als auch schon bei der Erkennung sowie Ausführung.

Ein beliebtes Beispiel sind die Obfuscation- Methoden, die man immer wieder findet. Da werden Strings zusammengebaut, Codierungen wie Base64 verwendet oder die Befehle über In-Memory-Runs ausgeführt. Besonders beliebt ist auch die “Living off the land”-Methode, also die Nutzung von validen DLLs bzw. APIs von Windows. Hier heisst das Stichwort “rundll32”, “svchost.exe” oder ganz einfach PowerShell 😉

Hier ein Beispiel für das Verstecken von Befehlssequenzen:

$o = 'Get'; $b = 'Process'; $cmd = $o + '-' + $b;

Invoke-Expression $cmd

Hier wird der PowerShell-Befehl “Get-Process” einfach bei der Ausführung zusammengesetzt. Die Methode nennt ich “Concatenierung” von “concat”.

Es gilt also speziell sein Augenmerk auf Befehle wie “Invoke-Expression” bzw. ganz allgemein auf “Invoke” zu legen.

Festplatte auf Ereignisse überwachen

Die PowerShell eignet sich auch dafür, dass man Ereignisse auf seinem Rechner im Detail überwacht, beispielsweise Aktivitäten auf der Festplatte.

Wenn eine Malware beispielsweise neue Dateien anlegt, so kann man dies mittels FileMon von SysInternals (migriert zu Process Monitor) mitbekommen. Es geht aber auch mittels PowerShell mit ein paar Befehlen, wie folgt:

$watcher = New-Object System.IO.FileSystemWatcher;
$watcher.Path = 'C:\';
$watcher.IncludeSubdirectories = $true;
$watcher.EnableRaisingEvents = $true;
Register-ObjectEvent $watcher 'Created' -Action { Write-Host 'File Created: ' $Event.SourceEventArgs.FullPath }

Man erzeugt ein neues Objekt, wählt den Pfad aus, gibt an ob es auch für Unterverzeichnisse gilt, legt fest dass man benachrichtig wird, und registriert dann dieses Objekt. Es gilt allerdings nur für die Anlage von neuen Dateien.

Weitere Infos zu dem Befehl Register-ObjectEvent lässt sich nachlesen.

WLAN Passwörter auslesen

Mittels PowerShell lassen sich für alle Profile (verschiedene abgespeicherte WLANs) die jeweiligen Einstellungen als auch die mitgespeicherten Passwörter auslesen, wie folgt:

Dieser Befehl listet die abgespeicherten WLAN-Profile auf:

netsh wlan show profiles

Mit dem Profilnamen lässt sich dann das Profil auslesen, inklusive Passwort, wie folgt:


netsh wlan show profile name="WiFi-SID" key=clear

Remote Script ausführen

Es ist meist im Bereich Malware zu finden, aber manchmal gibt es wirklich die Anforderungen, dass man mittels PowerShell ein Skript aus dem Netz lädt und es dann ausführt. Dies geht wie folgt mit den beiden Befehlen:

$url = 'http://example.com/script.ps1'

Invoke-Expression (New-Object Net.WebClient).DownloadString($url)

Eventlog auslesen

Mittels PowerShell lässt sich recht einfach der Eventlog (Ereignisanzeige) auslesen, in dem man als Paramter die Art des Logs (hier Security) auswählt und dann noch beispielsweise nach einem Event (Ereignis) filtern kann.

Get-EventLog -LogName Security | Where-Object {$_.EntryType -eq 'FailureAudit'}

Bekanntlich kann man unter Windows viele verschiedene Wege nach Rom wählen, daher gibt es auch die Möglichkeit den Befehl Get-WinEvent nehmen, wie hier bereits beschrieben:

PowerShell Events mittels Get-WinEvent

Befehl auf remote Maschine ausführen

Wie schon in meinem anderen PowerShell-Posting zum Administrieren von remote Maschinen, geht es hier um das Gleiche, allerdings mit einem anderen Befehl.

Invoke-Command -ComputerName ZielPC -ScriptBlock { Get-Process } -Credential (Get-Credential)

In diesem Falle wird der Befehl Get-Process ausgeführt. Man kann natürlich auch seinen kompletten Code in eine andere Variable packen und diese dann hier nennen. Komfortabel wird es, wenn man seinen Scriptblock einfach in eine externe Datei legt und diese inkludiert.

Seite 2 von 5

Präsentiert von WordPress & Theme erstellt von Anders Norén