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.
Ja, ja, wer lesen kann…
Habe die Postings von NL vom 05.10. und von NorbertFe ebenfalls vom 05.10. zur Kenntnis genommen.
Geht gleich wieder viel besser… ;-)
Bei der Fehlermeldung oben fehlt das „k“ vor eine…
Moinse zusammen,
nun wollte ich mal wieder ein paar Clients einrichten, aber ich bekomme die Outlook.Profile nicht
eingerichtet. Selbst am Exchange-Server klappt es mit dem Outlook nicht. (Es steht eine verschlüsselte
Verbindung mit Ihrem E-Mail-Server zur Verfügung)
Kann es sein, daß die Autodiscover-Funktion mit diesem Workaround komplett außer Gefecht gesetzt ist?
Es besteht durchaus die Möglichkeit, daß ich etwas missverstanden oder falsch konfiguriert habe…
Vielen Dank im Voraus für Eure Einschätzung!
Viele Grüße
Marcus
Vielen Dank,
Ich denke ich habe meine Frage nicht vollständig formuliert. Werden diesen Systemusern ebenfalls die RemotePowershell rechte entzogen? Wäre dies ein Problem und wie verhindere ich das. In der AD kann ich Diese user gar nicht auswählen um diese in die Ausnahme gruppe aufzunehmen.
Viele Grüße
Christian
Hallo,
ich vielen Dank erst ma für das Script.
Was ist eigentlich mit den Usern „krbtgtg“ oder „Exchange Online-ApplicationAccount“ usw.
Werden solche Accounts nicht von Exchange benötigt?
können diese mit deaktiviert werden ohne dass es einen Einfluss auf die Funktionalität von Exchange hat?
Vielen Dank schon mal für die Antworten.
Viele Grüße
Christian
Bezüglich des Accounts „krbtgtg“ ein bisschen Lesestoff:
https://www.msxfaq.de/windows/kerberos/krbtgt_keyrollover.htm
Würde ich daher nicht anrühren bzw. Veränderungen vornehmen.
Es wurde ein neuer Regex von Microsoft veröffentlicht:
(?=.*autodiscover\.json)(?=.*powershell)
Dieser soll nicht mehr umgehbar sein. Laut Microsoft…
Grüße
M$ listet immernoch den alten Regex:
6. Add the string “(?=.*autodiscover)(?=.*powershell)” (excluding quotes).
woher nimmst du deinen?
Tja, da hast du die letzten 10 Änderungen von Microsoft verschlafen.
Anfang der Woche wurde der String wieder auf (?=.*autodiscover)(?=.*powershell) geändert…
Muss ja nicht alle hier posten ;)
Hallo, ich poste hier auch mal Version.
Eventuell hilft es ja jemand.
Ich habe das Skript an einigen Systemen ohne Probleme und bisher auch ohne „negativen Auswirkungen“ ausgeführt.
https://gist.github.com/xasz/53754812e48311a65c7d0b6bc3376634
Also ich habe überall einen Reverseproxy im Einsatz der https://kundenmailserver.de/PowerShell gar nicht erlaubt. Ist das dann auch safe?
So wie es da steht nicht…
Du sperrst da zwar etwas, was der Exchange auch anbietet, die Lücke ist aber über eine URL wie https://kundenmailserver.de/autodiscover/autodiscover.json?@wasweissich.tld… ausnutzbar…
Sofern Dein Reverse-Proxy nicht noch mehr blockt, reicht das vermutlich nicht aus.
Hi Zusammen,
es gibt seit gestern eine neue Version des Scripts von Microsoft
https://microsoft.github.io/CSS-Exchange/Security/EOMTv2/
Sollte gem. Heise und Microsoft ausgeführt werden, um die Lücke zu schließen.
Fühle mich langsam wie in „Und täglich grüßt das Murmeltier“, jeden Tag eine neue Überraschung :-(
Hi Frank
MS empfiehlt die erste Regel mit dem @ zu löschen.
https://msrc-blog.microsoft.com/2022/09/29/customer-guidance-for-reported-zero-day-vulnerabilities-in-microsoft-exchange-server/
A previously created rule for this mitigation can be deleted after the steps below are followed.
MS ist schon wieder zu spät, oder denkt nicht ’so weit‘ wie die anderen…
…dass man auch daran denken sollte, dass der String encoded sein könnte ;)
RegEx: .*autodiscover\.json.*Powershell.*
Condition: {UrlDecode:{REQUEST_URI}}
Wird wohl wieder mehr als 24h dauern, bis MS sich da wieder mit dem autom. Rollout der neuen Rule bequemt… **TRAURIG** !!
Microsoft scheint die Regel aktualisiert zu haben.
Bei mir ist jetzt der korrekte Wert definiert.
ist auch bestätigt bei heise -fyi
Ab Exchange 2019 gibt es auch die einfachere Möglichkeit den Remote Powershell Zugriff über Client Access Rules zu steuern.
Meines erachtens ist das wesentlich komfortabler als mit dem Script über die Aufgabenplanung.
siehe auch: https://www.frankysweb.de/exchange-2019-client-access-rules/
Es sei denn MS deaktiviert die Möglichkeit dann auch irgendwann bei den On-Premises Servern. ;)
https://techcommunity.microsoft.com/t5/exchange-team-blog/deprecation-of-client-access-rules-in-exchange-online/ba-p/3638563
Ich habe nochmal ne Frage.
@Franky: Was ist der Grund dafür, dass du in deinem Skript $AllUsers nur mit Usern befüllst, die auch über eine Mailbox verfügen?
Müsste man das nicht für alle AD-User deaktivieren, die keine administrativen Tätigkeiten an Exchange durchführen müssen?!
Ich hätte jetzt eher Get-ADUser erwartet oder bin ich da auf dem Holzweg?
bzw. Get-User für Exchange.
Hey Bent,
das würde mich auch interessieren.
Wir nutzen einen Hybrid Exchange welcher selber keine Mailboxen hostet.
Das Script hat bei mir keinerlei Auswirkung.
Ich habe jetzt prophylaktisch allen Usern bis auf wenigen Admins die RemotePowershell via get/set-user disabled.
Wenn ich die RemotePowershell via Exchange Management Shell OnPrem deaktiviere, ist diese auch nur OnPrem deaktiviert.
In der ExchangeOnline Shell sehe ich weiterhin mit „get-user | fl RemotePowerShellEnabled“ das der User auf „true“ steht.
-> das kann auch default vorerst so bleiben.
Mir hat es jedenfalls die Erkenntnis gebracht, dass der Befehl „Set-User -Identity XX -RemotePowerShellEnabled $false“ nur einen Impact auf die jeweilige Instanz hat, sprich, führt man diesen OnPrem in der ExchangeManagementShell aus, wird die Remoteshell für den User auch nur OnPrem deaktiviert.
Hab ich jetzt auch so gemacht. ;-)
Das wüsste ich auch gern – ich könnte es mir so vorstellen, dass sich nur User, die auch eine Mailbox haben, überhaupt sinnvoll an der Remote Powershell authentifizieren können um etwas zu tun. Aber das konnte ich bisher noch nicht prüfen – über Rückmeldung von franky dazu würde ich mich sehr freuen.
Achtung!
Wurde zuerst manuell die Rewrite Regel mit @ und anschließend eine weitere Rewrite Regel ohne @ hinzugefügt funktioniert der Autodiscover nicht mehr (HTTP 500) wenn Exchange Mitigation die erste Regel automatisch anpasst. Exchange Mitigation passt die Regel mit @ an auf den Wert ohne @ und somit gibt es zwei gleiche Regeln. Es muss dann die zweite Regel gelöscht werden. Diese heißt meistens „RequestBlockingRule1“. Man erhält im Fehlerfall auch im IIS unter Default Website –> Autodiscover –> URL-Rewrite eine Fehlermeldung.
Das Ergebnis ist reproduzierbar wenn man wieder eine zweite Regel ohne @ erstellt.
Dann antwortet der Autodiscover wieder mit HTTP 500, löscht man die zweite Regel wieder funktioniert es wieder.
Die mußt du nicht löschen, sondern nur umbenennen in bspw. „RequestBlockingRule2“. ;) Danach kannst du dann die ursprüngliche Regel im /autodiscover löschen.
Hallo und danke für das Skript,
ähhhm, was müsste man denn machen wenn die Gruppe versehentlich einen Tippfehler hat und jetzt niemand mehr Zugriff auf die PowerShell hat?
Einen neuen User im AD anlegen (mit den Administrativen Gruppen). Der bekommt ja automatisch by design wieder Zugriff auf die Powershell.
Da es ja lediglich um die RemotePowerShell Berechtigung geht, solltest lokal auf dem Exchange-Server im Ordner „ExchangeServer\v*\bin“ die Datei „exshell.psc1“ (PowerShell Konsolendatei) öffnen können.
Darin kannst für den benötigten administrativen User mit dem Befehl
„Set-User „BenutzerName“ -RemotePowerShellEnabled $true“
die RemotePowerShell Berechtigung wieder erlauben.
Noch eine Verständnisfrage. MS schreibt im Remote PS Blog folgendes: „By default, all user accounts have access to remote PowerShell. However, to actually use remote PowerShell to connect to an Exchange server, the user needs to be a member of a management role group, or be directly assigned a management role that enables the user to run Exchange cmdlets.“
Das bedeutet für mich: ja, alle User können standardmäßig remote PS benutzen, aber um es effektiv zu dürfen, müssen sie in einer entsprechenden Management Gruppe Mitglied sein, z.B. „Organization Management“.
Wenn das so stimmt, dann sollte es genügen die Gruppen zu prüfen und etwaige non-admin User zu entfernen. Bei mir ist bspw. nur der Administrator in manchen Gruppen gelistet. Gibt es eine Möglichkeit es zu testen?
Ich las gerade folgende Info „Exchange Remote PowerShell wird mittels IIS bereitgestellt und ist nicht zu verwechseln mit PowerShell Remoting (Port 5985/5986).“
Bedeutet also, dass ich theoretisch beides unterbinden muss?
Es wird ja auf unterschiedlichen Seiten zu dem Thema mal geraten die PS-Remoting Ports per FW zu sperren und auf anderen (u.a. MS selbst) wird geraten Remote PowerShell für nicht-administrative User zu deaktivieren.
Was ist jetzt der richtige Weg?
„Meine üblichen KMU-Umgebungen“ sehen so aus, dass der Exchange maximal per HTTP/HTTPS Portforwarding aus dem Internet erreichbar ist. Keiner dieser Server ist per öffentlicher IP mit allen Ports direkt im Internet.
Powershell Remoting Ports sind somit „nur“ im LAN erreichbar. Blockieren gegen Angriffe aus dem LAN schadet natürlich nicht!
Exchange Remote PowerShell per IIS (https://exchange/PowerShell) ist dagegen auch von außen erreichbar und ist somit viel kritischer zu sehen. Remote PowerShell für nicht-administrative User deaktivieren halte ich da für sinnvoll.
unbedingt. wird von Microsoft aber auch bereits seit Sonntag so als einen Teil des Workarounds kommuniziert (https://msrc-blog.microsoft.com/2022/09/29/customer-guidance-for-reported-zero-day-vulnerabilities-in-microsoft-exchange-server/):
October 2, 2022 updates:
Added to the Mitigations section: we strongly recommend Exchange Server customers disable remote PowerShell access for non-admin users in your organization. Guidance on how to do this for single user or multiple users is here.
Super, dank dir für die ausführliche Antwort!
was ich noch gerne wissen würde: reicht nun der eintrag von MS und kann der benutzerdefinierte eintrag unter autodiscover wieder gelöscht werden oder besser drinnen lassen auch wenn der @ dabei steht?
danke
Kann weg.
Muss dieser Workaround auch beim Exchange 2013 durchgeführt werden oder nur die Regel im autodiscover beim URL Rewrite + mit Anpassung ohne das „@“.
https://microsoft.github.io/CSS-Exchange/Security/EOMTv2/
Nimm erstmal das Skript, das macht inzwischen wohl alles soweit richtig. Ansonsten ja auf der Default Webseite und nicht auf /autodiscover. Die Rule im /autodiscover kannst du löschen.
Hallo,
MS hat per Exchange Mitigation wohl den neuen RegEx verteilt. Bei einem unserer Server war es heute morgen noch falsch und bei allen weiteren die ich geprüft habe schon korrigiert.
Ich war kurz davor, den folgenden Befehl auszuführen:
Get-User | Set-User -RemotePowerShellEnabled $false
Dan habe ich aber gelesen, dass die Remote Powershell selbst dann benötigt wird, wenn man die EAC oder die Shell LOKAL auf dem EX-Server öffnen will (was ich immer so mache). Ich würde mich mit dem Befehl also selber aussperren. Ist das zutreffend?
„Remote PowerShell access is required to open the Exchange Management Shell or the Exchange admin center (EAC), even if you’re trying to open the Exchange Management Shell or the EAC on the local Mailbox server. “
(Quelle: https://learn.microsoft.com/en-us/answers/questions/1033895/disable-remote-powershell-for-exchange.html)
Ja, zutreffend!
Ich habe über folgenden Einzeiler für alle Benutzer einer OU die Remote Powershell deaktiviert:
Get-User -OrganizationalUnit „OU=Standard,OU=Benutzer,DC=XXX,DC=XX“ -ResultSize Unlimited -Filter ‚RemotePowerShellEnabled -eq $true‘ | Set-User -RemotePowerShellEnabled $false
Da ich die Admins in einer anderen OU habe, war das der einfachste Weg.
Super-Idee, DANKE!!
Ich bin in diese Falle getreten. Fix über PS:
Add-PSSnapIn Microsoft.Exchange.Management.PowerShell.Snapin
set-user -RemotePowerShellEnabled $true
Das von Microsoft bereitgestellte Script EOMTv2.ps1 enthält jetzt auch das neue Pattern ohne das „@“.
Danke für die wertvolle Hilfe hier im Blog!
Genügt es nicht die Ports 5985,5986 für Remote PS auf dem EX in der Windows Firewall zu blockieren?
Das habe ich mich auch schon gefragt… Denke, das ist auch eine Möglichkeit.
Das Disable-RemotePowerShell Skript (Name bei GitHub ist auch falsch geschrieben) funktioniert nicht, wenn ein Benutzername so anfängt wie ein anderer Benutzer.
Set-User : The operation couldn’t be performed because ‚XXX‘ matches multiple entries.
Inzwischen wird die aktualisierte Version der Regel auch per Exchange Mitigation verteilt (Stand 04.10.2022 23:20 Uhr MESZ)
Wie stark wäre die Einschränkung eigentlich wenn man autodiscover temp. Bis zum Patch komplett deaktiviert?