Site icon Franky's Web

ProxyNotShell: Workaround lässt sich einfach umgehen

Die Exchange Mitigation EM1, welche am Wochenende durch Microsoft veröffentlicht wurde, dichtet die Exchange Zero-Day Schwachstelle ProxyNotShell (CVE-2022-41040) nur unzureichend ab und lässt sich einfach umgehen. Problem ist ein „@“ Zeichen im Reg-Ex Pattern, welches die Regel zu sehr präzisiert. Durch leichte Anpassungen lässt sich somit die Reg-Ex umgehen. Somit wird die Regel nicht mehr angewendet und die Schwachstelle trotzdem ausnutzen:

Microsoft hat bisher keine aktualisierte Version der Regel per Exchange Mitigation verteilt, daher sollte zusätzlich zur von Exchange Mitigation konfigurierten Regel, wieder eine eigene Regel erstellt werden.

Die Regel kann nach diesem Artikel konfiguriert werden, jedoch muss das Pattern angepasst werden:

.*autodiscover\.json.*Powershell.*

Die eigene Regel sieht dann wie folgt aus:

Auch das von Microsoft veröffentlichte Script zum Installieren von URL Rewrite und Konfiguration der Regel, weißt noch das falsche Pattern auf:

Von Microsoft gibt es aber eine neue Empfehlung: RemotePowerShell sollte für alle nicht administrativen Benutzer abgeschaltet werden. Leider ist in der Standardeinstellung RemotePowerShell für alle Benutzer erlaubt:

Get-User | ft name,RemotePowerShellEnabled

Wenn man nun also RemotePowerShell für alle Benutzer deaktiviert, dann haben es alle neu erstellten Benutzer wieder aktiviert. Ich habe daher ein kleines Script erstellt, welches RemotePowerShell bei allen Benutzern deaktiviert, außer bei Mitgliedern einer bestimmten AD-Gruppe:

#Allowed AD Group for RemotePowerShell:
$AllowedGroup = "AllowRemotePowerShell"


$AllUsers = get-mailbox -resultsize Unlimited | Get-User -ResultSize Unlimited | select SamAccountName,RemotePowerShellEnabled | where {$_.RemotePowerShellEnabled -eq $true}
$AllowedUsers = Get-ADGroupMember $AllowedGroup -Recursive | ForEach-Object {Get-User -Identity $_.SamAccountName | select SamAccountName,RemotePowerShellEnabled}

#Enable RemotePowerShell for allowed Users
foreach ($AllowedUser in $AllowedUsers) {
	if ($AllowedUser.RemotePowerShellEnabled -eq $False) {
		Set-User $AllowedUser.SamAccountName -RemotePowerShellEnabled $true
	}
}

#Disable RemotePowerShell for all Users
foreach ($User in $AllUsers) {
	if ($AllowedUsers.SamAccountName -notcontains $User.SamAccountName) {
		Set-User $User.SamAccountName -RemotePowerShellEnabled $false
	}
}

#Display RemotePowerSthell State
$RemotePowerShellState = get-mailbox -resultsize Unlimited | Get-User -ResultSize Unlimited | select SamAccountName,RemotePowerShellEnabled
$RemotePowerShellState

Das Script könnte beispielsweise zyklisch per Windows Aufgabenplanung ausgeführt werden, in diesem Fall wird RemotePowerShell für alle Mitglieder der Gruppe „AllowRemotePowerShell“ aktiviert und für alle anderen Benutzer deaktiviert (Das Script muss in einer administrativen Exchange Management Shell gestartet werden)

Das Script konnte ich bisher nur in meiner Testumgebung testen und mit der „heißen Nadel gestrickt“, daher ist Vorsicht geboten. Ich habe das Script auch auf GitHub veröffentlicht, falls jemand mitwirken möchte:

Aktuell ist noch kein Sicherheitsupdate für die ProxyNotShell Schwachstelle veröffentlicht worden. Es heißt also weiter warten, bis die Schwachstelle endgültig geschlossen wird. All diese Maßnahmen sind nur als Workaround gedacht und sollten daher sorgfältig geprüft werden.

Exit mobile version