Einblicke in (Security)-Themen ausm tiefen Wald

Autor: Der Waldmeister persönlich Seite 2 von 5

Microsoft Viva Dienste wie Insights, Learning oder Digest für alle Benutzer abschalten

Man ist es ja mittlerweile gewohnt, dass neue Dienste aus dem Hause MS direkt angeschaltet werden, also ohne Opt-In. Das führt dann meist zu Verdruss bei Nutzern, die wiederum ihren Frust dann an der IT Abteilung auslassen 😉

Wenn beispielsweise jemand in Outlook auf eine E-Mail einen Like abgibt (ja irgendwo ist das möglich), dann erhält man später als Absender der besagten E-Mail eine E-Mail von Microsoft mit dem Subject „Täglicher Reaktionsdigest“. Diese Art der Benachrichtigung lässt sich nur per Benutzer einzeln abschalten. Oder halt mittels PowerShell wie folgt:

Set-MyAnalyticsFeatureConfig –Identity john@example.org -PrivacyMode opt-out

Um dies für alle Benutzer in Form einer Schleife (ForEach Loop) umzusetzen, schreibt man Folgendes:

Get-Mailbox -ResultSize Unlimited | ForEach-Object {
Set-MyAnalyticsFeatureConfig -Identity $_.PrimarySmtpAddress -Feature digest-email -IsEnabled $false
}

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

Seite 2 von 5

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