Einblicke in (Security)-Themen ausm tiefen Wald

Kategorie: Powershell Seite 1 von 3

Windows – Suche in Dateien mit Ausgabe aller Treffer (mittels PowerShell)

Oft steht man vor dem Problem, dass man einen großen Logfile hat und nach einem Stichwort in der Datei suchen will. Bedient man sich des Windows Explorers und sucht mittels der Suchmaske, so ist die Ausgabe der Treffer nicht wirklich hilfreich. Hier hilft PowerShell ungemein. Man sucht in einer Datei nach einem Stichwort und erhält alle Treffer mit Zeilenangaben etc.

Und das geht wie folgt:

Select-String -Path .\datei.log -Pattern 'Stichwort' > Ausgabe.txt

Anstelle einer Datei kann man natürlich auch mit Wildcards arbeiten. Mit dem „>“ Zeichen wird die Ausgabe der Suche direkt in eine andere Datei „ge-pipt“.

Absender in Exchange Shared Mailbox blockieren mittels PowerShell

Wer regelmäßig mit dem Outlook Client arbeitet und eine Exchange Mailbox dabei eingebunden hat, wird irgendwann auch mal mit einer Besonderheit konfrontiert werden.

Denn wenn man eine weitere Mailbox einbindet (beispielsweise für einen Vorgesetzten, also die Berechtigung „send on behalf“, „Senden im Namen von“) erhält, so wird man sich wundern, dass man keine Junk-Mail Konfigurationen für diese Mailbox vornehmen kann/darf.

Will man also beispielsweise Absender blockieren, so kann man dies zwar im Outlook Client mittels GUI vornehmen, dies gilt jedoch immer nur für die eigene Mailbox. Eine Pflege von gesperrten Absendern für eine „verwaltete“ Mailbox geht nicht mehr über die GUI, sondern nur über zwei Wege: OWA (Outlook Web Exchange) oder PowerShell. Ich bevorzuge PowerShell. Und das geht dann recht komfortabel mit folgendem Befehl:

Connect-ExchangeOnline

Set-MailboxJunkEmailConfiguration "a.paradise@excample.com" -BlockedSendersAndDomains @{Add="spammer@bigpain.com"}

Natürlich kann man auch vertrauenswürdige Absender hinterlegen. Dazu tauscht man nur den Parameter aus, wie folgt:

Set-MailboxJunkEmailConfiguration "a.paradise@excample.com" -TrustedSendersAndDomains @{Add=“nopain.com“,“nice@nopain.com“}

Suche und Vergleich von AD-Gruppenzugehörigkeiten und Nicht-Zugehörigkeiten

Oftmals hangelt man sich durch AD-Gruppen, um herauszufinden ob Einträge dort enthalten sind. Dabei kommt man immer wieder an seine Grenzen, wenn es darum geht, die Zugehörigkeiten zu einer Active Directory Gruppe ausschließen. Also zu prüfen, ob jemand in einer Gruppe explizit nicht enthalten ist.

Hierzu kann man sich mittels Powershell auch Listen bedienen, die in Programmiersprachen dann als Arrays verfügbar sind. Hier ist das Stichwort „hashmap“.

Als erste Maßnahme sollte man sich mit dem jeweiligen AD verbinden, wenn es AzureAD, bzw. jetzt EntraID, heißt:

Connect-AzureAD

Dann sucht man sich die AD-Gruppen IDs raus, die man prüfen will, bzw. definiert sie:

$groupids = @("Gruppen ID 1", "Gruppen ID 2") 

Nun definiert man seine Hash Map:

$userht = @{}

Und ruft dann alle Benutzer ab und pipet das Ergebnis dann an eine foreach-Schleife, die alle IDs der Benutzer in die Hash Map kippt:

Get-AzureADUser -all $true | foreach-object {$userht.Add($_.ObjectId,$_)}

Mit dem Zwischenschritt eines Counts sieht man die gesamte Anzahl wie folgt:

$userht.count

Nun geht man die Gruppen IDs einzeln durch und holt sich alle Benutzer, die in diesen Gruppen enthalten sind, und löscht einzeln mittels foreach die Benutzer aus der Hash Map raus.

ForEach($id in  $groupids){ 

Get-AzureADGroupMember -all $true -ObjectId $id | foreach-object { $userht.Remove($_.ObjectId) }

}

$userht.count

$userht.values > C:\temp\export.csv

Ergebnis sind dann alle Benutzer aus der ursprünglichen Abfrage minus der Mitglieder in den Vergleichsgruppen. Übrig sind also alle Einträge, die nicht in den Vergleichsgruppen enthalten sind.

Freischaltung von authentifiziertem SMTP in Microsoft Exchange für einzelne Mailboxen

Wer auf Microsoft Exchange setzt, der nutzt in der Regel die Clients wie Outlook, um ein- und ausgehende Mails zu verarbeiten. Es gibt aber auch durchaus Dienste oder Anwendungen, die gerne Mails verschicken würden, aber nur die offenen Protokolle wie SMTP (Auth) sprechen. Dann steht man vor dem Dilemma, dass man das Protokoll freischalten will/muss, aber dies nicht für die gesamte Domäne/Tenant machen möchte.

Hier hilft die Möglichkeit das Protokoll auf Mailbox-Ebene zu setzen, denn das ist möglich. Aber: wer jetzt glaubt mit logischem Denken ins Exchange Admin Center Portal zu navigieren und dort die Option zu finden, der wird erstaunt sein, denn dort gibt es diese Option nicht:

Hier muss man in das Admin Center von Microsoft 365 direkt gehen (Bereich Active Users), dort findet sich die gleiche Möglichkeit zur Einstellung, allerdings diesmal mit der zusätzlichen Option „Authenticated SMTP“:

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

Seite 1 von 3

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