Exchange Build Nummer ermitteln

Wer einen Exchange Server betreibt, muss natürlich auch Updates einspielen. Die Frage ist dabei aber, wie sie die "richtige" Versionsnummer finden. Es gibt wenige "offizielle" Versionen aber Angreifer interessieren sich natürlich auch für andere Optionen.

Mit dem Security Update Juli 2021 hat Microsoft endlich einen offiziellen Weg zur Ermittlung der aktuell installierten Version veröffentlicht. Siehe Verifikation Analyse per AutoD.

Übersicht

Auf der Seite Exchange und Outlook Build Nummern versuche ich die Versionsnummern aktuell zu halten. Aber auch Microsoft hat eine Liste, die Exchange Versionen mit ihrer Build-Nummer aufführt.

Die folgenden Analysen habe ich mit einem Exchange 2016 Server am 17. Mai 2021 erstellt, der das zu der Zeit aktuelle CU20 und letzte Security Updates vom 11 Mai 2021 installiert hatte.

Die korrekte Build-Nummer wäre daher 15.1.2242.10

Folgende Wege habe ich betrachtets:

Weg Ergebnis Beschreibung

Analyse per AutoD

OK
Seit Jul 2021

Diese URL ist bei meist allen Exchange extern erreichbar.

Systemsteuerung

Zwei Klicks

Wenn der Admin in der Liste der Software und der Update-Liste die richtigen Einträge lesen kann, dann sieht er schon die aktuell installierte Version.

WMI und CIM

Eingeschränkt

Über diese Schnittstellen ist die aktuell installiert Version nicht einfach ermitteln

Registry Software

Eingeschränkt

Über diese Schnittstellen ist die aktuell installiert Version nicht einfach ermitteln

Exchange PowerShell

Nur CU

Über diese Schnittstellen ist nur die installierte CU-Version zu ermitteln aber das Security Update wird nicht angezeigt.

Registrierung

Je Komponente

Das Exchange Setup protokolliert die Version der installierten Komponenten in der Registrierung. Allerdings gibt es keine "Major"-Version, auch wenn man das für "Setup/OwaVersion" vielleicht annehmen könnte.

Dateisystem

OK

Solange jedes Security Update auch einen neuen Ordner anlegt, kann damit die höchste Version ausgelesen werden. Bislang gab es immer eine neue Datei.

Dateiversion

OK
Seit Jul 2021

Seit dem Security Update vom Jul 2021 soll die Fileversioninfo der exsetup.exe den aktuellen Build-Level wiedergeben

Analyse per OWA

OK
Seit Jul 2021

Diese URL ist bei vielen Exchange OWA-Zugängen extern erreichbar.

Analyse per ECP

OK

Diese URL liefert die genaue Version in einer XML-Datei auf eine anonyme Anfrage. Um einem externen Angreifer den diese Information vorzuenthalten, sollten Sie /ECP nicht aus dem Internet erreichbar machen.

SMTP-Header

Nur CU

Über diese Schnittstellen ist nur die installierte CU-Version zu ermitteln aber das Security Update wird nicht angezeigt.

Achtung: Die korrekte Anzeige an den verschiedenen Stellen gibt nur, wenn Sie die Installation korrekt als Administrator durchgeführt haben. Wer Updates

Analyse per AutoD (Ab Jul 21)

Der Zugriff auf Autodiscover ist eine der grundlegenden Funktionen von Exchange, damit Clients den Weg zu ihrem Server finden. Daher ist es fast immer möglich, diese URL von extern anzusprechen.

Mit dem Security Update Juli 2021 hat Microsoft endlich einen offiziellen Weg zur Ermittlung der aktuell installierten Version veröffentlicht. Siehe Verifikation auf Patchday Jul 2021

Interessant ist natürlich immer ein Weg, die Version über einen Netzwerkzugriff, idealerweise sogar anonym, zu ermitteln. So können Sie als Administrator sehr schnell prüfen, ob die Exchange Server aktuell sind. Das geht seit Juli 2021 sogar sehr zuverlässig. Vorher haben wir immer nur "Schätzungen" erhalten. Per PowerShell ist es sehr einfach, die Version eines Exchange Servers anonym zu ermitteln.

PS C:\> (Invoke-WebRequest https://autodiscover.msxfaq.de/autodiscover/autodiscover.xml -SkipCertificateCheck -SkipHttpErrorCheck).headers."X-OWA-Version"
15.1.2242.12

Die komplette URL funktioniert meist sehr gut aber es gibt auch Fälle, wo sie keine Antwort oder eine falsche Antwort bekommen:

  • Firma nutzt kein Exchange
    Es werden immer weniger aber ja, es gibt Firmen, die andere Messagingsysteme nutzen.
  • IP-Beschränkungen
    Sie funktioniert nur dann nicht, wenn die Firma eine Auflösung per Autodiscover von extern auf bestimmte IP-Adressen, z.B. Exchange Online oder erst mit einem VPN erlaubt.
  • Inspection Firewall
    Wie ein gültiger "Autodiscover"-Request aussieht, ist von Microsoft dokumentiert. WebApplication Firewalls könnten so einen einfachen Request blockieren. Ich habe mir hier nicht die Mühe gemacht, einen kompletten Autodiscover-Request zu formulieren.
  • Autodiscover nicht auflösbar
    Das kann z.B. intern der Fall sein, wenn die Clients per LDAP den Autodiscover-SCP ermitteln. Wobei das in Zeiten von Skype for Business, Konferenzsystemen und 3rd Party Produkten eher ungewöhnlich wäre.

Auch wenn Sie daher von extern eine ihnen unbekannte Firma "beproben" können, funktioniert der Test vor allem intern gegen alle vorhandenen Server. Von Extern prüfen Sie eh nur die Frontend-Server.

Analyse per OWA

Anstelle von Autodiscover können Sie auch versuchen, den Outlook Web Access zu finden. Häufige Namen sind schon "owa.<maildomain>", "webmail.<maildomain>" oder "outlook.<maildomain>. Nur wenige Firmen trennen aber den Zugang komplett von Autodiscover ab, so dass Sie auch testweise einfach mal in die SAN-Einträge des Autodiscover-Zertifikats schauen können, welche weiteren URLs es noch bereitstellt.

Kritischer wird es, wenn so einen Anfrage auch von extern "anonym" möglich ist und damit auch Angreifer schnell ermitteln können, auf welchem Stand ihr Exchange Server ist.

Eine interessante Quelle sind hier durchaus Webserver-Logs. Selbst auf der statischen Seite der MSXFAQ finden sich solche "Treffer".

192.241.206.19 - - [12/May/2021:07:43:53 +0200] "GET /owa/auth/logon.aspx?url=https%3a%2f%2f1%2fecp%2f HTTP/1.1" 404 2857 "-" 
                                                           "Mozilla/5.0 zgrab/0.x" "178.77.117.98"
192.53.161.117 - - [12/May/2021:16:07:08 +0200] "GET /owa/ HTTP/1.1" 404 2857 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
                                                           AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
                                                            "178.77.117.98"

Der erste Abruf ist sicher zumindest ein "Probing" während der zweite Aufruf eher auf eine Firma zurück geht, die Sicherheitslücken sucht. Über die erste URL bekommt der externe anonyme Client an die Anmeldeseite und diese enthält eine Version. Hier die Powershell-Version

$owalogin=(Invoke-WebRequest https://outlook.msxfaq.de/owa/auth/logon.aspx -SkipHttpErrorCheck -SkipCertificateCheck)
$owalogin.Content.Substring($owalogin.Content.IndexOf('<link rel="shortcut icon" href="/owa/auth/')+42,16).split("/")[0]
15.1.2242

Ich bekomme über den Weg zumindest den CU-Level heraus. Allerdings sehe ich so noch nicht den Servicepack-Level.

Analyse per ECP

Interessanter ist da schon eher die URL, die jemand aus dem Internet gegen meine Webseite versucht hat. Er hat den folgenden Pfad angesprochen.

https://outlook.msxfaq.de/ecp/Current/exporttool/microsoft.exchange.ediscovery.exporttool.application

Diese URL ist tatsächlich anonym erreichbar und liefert eine XML-Datei mit einer Versionsnummer zurück. Per PowerShell können Sie damit sehr einfach dann eine Version ermitteln.

# Get-ExchangeVersion über ECP 
$versionxml=Invoke-WebRequest https://outlook.msxfaq.de/ecp/Current/exporttool/microsoft.exchange.ediscovery.exporttool.application
([xml][System.Text.Encoding]::ascii.GetString($versionxml.content[3..($versionxml.content.count)])).assembly.assemblyIdentity.version
15.1.2242.10

Hier sehe ich zumindest auf meinem Exchange 2016 CU20 Server mit 11.Mai SecUpdates die komplette Versionsnummer.

Da ist ein deutlicher Weckruf, dass Sie die "/ECP"-Url nicht aus dem URL erreichbar machen soll.

Interessanterweise ist die URL auch mit Exchange Online erreichbar.

$versionxml=Invoke-WebRequest https://outlook.office365.com/ecp/Current/exporttool/microsoft.exchange.ediscovery.exporttool.application
([xml][System.Text.Encoding]::ascii.GetString($versionxml.content[3..($versionxml.content.count)])).assembly.assemblyIdentity.version
15.20.4150.17

Interessant, dass hier die Version schon viel weiter ist.

Systemsteuerung

Ein Blick in die Systemsteuerung zeigt zuerst einmal das installierte CU20.

Die hier angezeigte Version 15.1.2242.4 verweist auf das CU20 ohne Security update. Das Security Update finden Sie erst nach dem Klick auf "View installed updates".

Insofern ist das etwas unschön, dass Security Updates nicht schon in der ersten Ansicht die Build-Nummer aktualisieren.

WMI und CIM

Was per GUI erreichbar ist, kann ich auch per Skript, hier eben PowerShell, auslesen:

Get-WmiObject win32_product

# Auszug des Eintrags für Exchange. P
PS C:\> $a[15] | fl *

PSComputerName    : EX2016
Name              : Microsoft Exchange Server
Version           : 15.1.2242.4
InstallState      : 5
__GENUS           : 2
__CLASS           : Win32_Product
__SUPERCLASS      : CIM_Product
__DYNASTY         : CIM_Product
__RELPATH         : Win32_Product.IdentifyingNumber="{CD981244-E9B8-405A-9026-6AEB9DCEF1F1}",Name="Microsoft Exchange
                    Server",Version="15.1.2242.4"
__PROPERTY_COUNT  : 27
__DERIVATION      : {CIM_Product}
__SERVER          : EX2016
__NAMESPACE       : root\cimv2
__PATH            : \\EX2016\root\cimv2:Win32_Product.IdentifyingNumber="{CD981244-E9B8-405A-9026-6AEB9DCEF1F1}",Name=
                    "Microsoft Exchange Server",Version="15.1.2242.4"
AssignmentType    : 1
Caption           : Microsoft Exchange Server
Description       : Microsoft Exchange Server
HelpLink          :
HelpTelephone     :
IdentifyingNumber : {CD981244-E9B8-405A-9026-6AEB9DCEF1F1}
InstallDate       : 20210512
InstallDate2      :
InstallLocation   :
InstallSource     : F:\
Language          : 1033
LocalPackage      : C:\Windows\Installer\3697c12b.msi
PackageCache      : C:\Windows\Installer\3697c12b.msi
PackageCode       : {3294467A-71B2-4DB8-9C59-018ABE3A7FDA}
PackageName       : EXCHANGESERVER.msi
ProductID         :
RegCompany        :
RegOwner          :
SKUNumber         :
Transforms        :
URLInfoAbout      :
URLUpdateInfo     :
Vendor            : Microsoft Corporation
WordCount         : 0
Scope             : System.Management.ManagementScope
Path              : \\EX2016\root\cimv2:Win32_Product.IdentifyingNumber="{CD981244-E9B8-405A-9026-6AEB9DCEF1F1}",Name=
                    "Microsoft Exchange Server",Version="15.1.2242.4"
Options           : System.Management.ObjectGetOptions
ClassPath         : \\EX2016\root\cimv2:Win32_Product
Properties        : {AssignmentType, Caption, Description, HelpLink...}
SystemProperties  : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers        : {dynamic, Locale, provider, UUID}
Site              :
Container         :

Das Security Update ist nicht zu finden. Auch die alternative Funktion über CIM liefert nur die gleiche Liste.

Get-CimInstance win32_product

Insgesamt habe ich auf dem Server 225 Produkte gefunden. Nicht alle waren mit Exchange verbunden.

Registry Software

Die auf einem System installierten Produkte finden sich natürlich auch in der Registrierung.

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* `
   | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate `
   | Format-Table –AutoSize 

DisplayName                                                                          DisplayVersion Publisher
-----------                                                                          -------------- ---------

Microsoft Exchange Server 2016 Cumulative Update 20                                  15.1.2242.4    Microsoft Corpor...
Security Update for Exchange Server 2016 Cumulative Update 20 (KB5003435)            1              Microsoft Corpor...
Microsoft Unified Communications Managed API 4.0, Runtime                            5.0.8308.0     Microsoft Corpor...
Microsoft Exchange Server                                                            15.1.2242.4    Microsoft Corpor...
Microsoft Exchange Speech - (en-US)                                                  15.1.2242.4    Microsoft Corpor...
Microsoft Exchange 2007 Enterprise Block List Updates                                3.3.4604.001   Microsoft Corpor...
Microsoft Exchange Server Language Pack - Chinese (Traditional)                      15.1.2242.4    Microsoft Corpor...
Microsoft Exchange Server Language Pack - German                                     15.1.2242.4    Microsoft Corpor...
Microsoft Exchange Server Language Pack - English                                    15.1.2242.4    Microsoft Corpor...
...
Microsoft Exchange Client Language Pack - German                                     15.1.2242.4    Microsoft Corpor...
Microsoft Exchange Client Language Pack - English                                    15.1.2242.4    Microsoft Corpor...
...

Interessanterweise habe ich über den Weg nur 199 Einträge statt 225 Einträge erhalten. Anscheinend gibt es hier ein Inkonsistenz zwischen WMI/CIM und Registrierung. Dafür habe ich hier neben der Exchange Server-Installation mit CU20 auch das Security Update sehe. Allerdings hilft mir die Versionsnummer des Updates nicht weiter.

Exchange PowerShell

Die Exchange PowerShell hat eigens ein Commandlet um die Exchange Server samt Version auszugeben. Allerdings liefert das Produkt auch nur die CU-Version oder Servicepack aber keine Information über installierte Exchange Security Updates.

# Diese Abfrage liefert nicht ausführliche Informationen
[PS] C:\>Get-ExchangeServer | Format-List Name,Edition,AdminDisplayVersion

Name                : EX16
Edition             : Standard
AdminDisplayVersion : Version 15.1 (Build 2242.4)

Insofern ist der Befehl zur Versionsermittlung nicht ausreichend.

Registrierung

Exchange installiert nicht nur jede Menge "Dienste" sondern schreibt auch einige Einstellungen in die Registrierung. Hier ist insbesondere der folgende Schlüssel interessant:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\v15

Hierunter gibt es sehr viele eigene Schlüssel für unterschiedliche Komponenten und in einigen gibt es sogar eine Version. Ich habe mir hier den Schlüssel "Setup" herausgepickt der die passende Version enthält:

Das ist aber nicht für alle Einträge der Fall, wie die drei Beispiele zeigen



Ob nun der Key "OwaVersion" eine legitime Quelle ist, kann ich nicht sicher sagen.

Dateisystem

Jede neuere Exchange Version mit einer neuen Build-Version addiert auf dem Filesystem in der Regel neue Ordner. Das ist der Kompatibilität zu Backend-Servern geschuldet, da der Frontend-Server je nach Backend den passenden Code benötigt. Hier sehen Sie auf meinem Server die Historie der Installationen.

Dies ist ein Auszug aus dem "/ECP"-Verzeichnis. Ähnliche Verzeichnisse finden Sie auch unter /OWA und anderen Stellen. Wenn ich es aber richtig einschätze, dann greift ein Client nicht direkt auf diese Dateien zu, sondern über den Frontend-Proxy, der sich dieser Dateien bedient.

Ich gehe davon aus, dass "ältere" Versionen nicht mehr erforderlich sind, wenn Sie auf allen Servern in der Topologie entfernt werden und daher keine Rückwärtskompatibilität erforderlich ist.

Eine Software kann z.B. diese Verzeichnisse auflisten und damit die höchste Build-Nummer ermitteln.

Dateiversion

Seit dem Security Update vom Jul 2021 soll die Fileversioninfo der exsetup.exe immer den aktuellen Build-Level wiedergeben: Sie können daher folgendes machen:

PS C:\> (get-item $env:ExchangeInstallPath\bin\exsetup.exe).VersionInfo

ProductVersion   FileVersion      FileName
--------------   -----------      --------
15.01.2242.012   15.01.2242.012   C:\Program Files\Microsoft\Exchange Server\V15\bin\exsetup.exe

Alternativ können Sie auch im Windows Explorer die Dateidetails anzeigen lassen

SMTP-Header

Eine letzte Möglichkeit aus meiner Sicht etwas über die verwendeten Exchange Versionen zu nutzen ist der SMTP-Header. Wenn eine Mail durch einen Exchange Server Transport geht, addiert er einen Header, der auch Rückschlüsse auf die Version zulässt. Eine Testmail zeigt mir, dass ich zumindest das CU sehe aber nicht das Security-Update.

Received: from hybrid.msxfaq.de (192.168.80.3) by hybrid.msxfaq.de (192.168.80.3) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2242.4; Sun, 07 Mar 2021 22:29:42 +0100
Received: from EUR05-DB8-obe.outbound.protection.outlook.com (104.47.17.110)  by hybrid.msxfaq.de (192.168.80.3) 
  with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2242.4 via
 Frontend Transport; Sun, 07 Mar 2021 22:29:42 +0100

Andererseits kann dieser Wert auch gelogen sein. Wenn ein Security Updates nur die Client Access-Komponenten aktualisiert aber die Transport-Komponenten nicht aktualisiert werden, würde die Version nicht stimmen.

Zusammenfassung

Es gibt ganz viele Optionen aber nur wenige Wege sind wirklich zuverlässig. Die Suche in "Programme" und "Updates" ist per Maus und GUI der sicher einfachste Weg für Administratoren, um den aktuellen Status zu prüfen. Per CIM/WMI lassen sich die Daten auch auslesen, wenngleich man schon nach den Strings suchen muss und keine "Versionsnummer" bekommt. Wenn Sie eine Datei finden, die immer mit aktualisiert werden, wäre das auch ein Weg.

Erst seit dem Juli 2021 hat Microsoft zumindest für Exchange 2013, 2016 und 2019 dokumentiert, dass die Version im HTTP-Header einer Antwort oder die Version der Datei EXSETUP.EXE ein legitimes Kriterium ist.

Weitere Links