Einblicke in (Security)-Themen ausm tiefen Wald

Kategorie: Powershell Seite 2 von 3

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.

TaskManager – Prozesse auslesen und darstellen

Der folgende Befehl listet alle Prozesse auf, sortiert nach CPU-Nutzung:

Get-Process | Select-Object -Property ProcessName, Id, CPU | Sort-Object -Property CPU -Descending

Netzwerk Konfiguration auslesen

Will man mittels PowerShell die in Windows hinterlegten Netzwerk-Konfigurationen auslesen, so nimmt sich man den folgenden Befehl:

Get-NetIPConfiguration | Select-Object -Property InterfaceAlias, IPv4Address, IPv6Address, DNServer

Dieser Befehl sammelt Netzwerkkonfigurationsdetails wie Schnittstellenaliase, IPv4- und IPv6-Adressen und DNS-Serverinformationen.

Befehl letzte Änderung des Passworts eines Benutzers im Active Directory

Wann hat ein User das letzte Mal sein Passwort geändert? Wenn ich ein Active Directory einsetze und PowerShell nutzen möchte, so lautet der Befehl dazu wie folgt:

Get-ADUser USER -Properties PwdLastSet | Select-Object Name,UserPrincipalName,@{N="PasswordDate";e={[DateTime]::FromFileTime($_.Pwdlastset)}}

Man muss lediglich das Wort USER durch den Benutzernamen ersetzen.

Seite 2 von 3

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