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.

Ü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

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

Eingeschränkt

Wenn man immer eine Datei findet, die aktualisiert wurde, kann dieser Weg funktionieren. Ich habe aber noch keine Datei im Blick, die wirklich mit jedem CU aktualisiert wird.

Analyse per OWA

Nur CU -Level

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

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

Alle ausführbaren Programme zu Exchange sind mit einer Datei-Version versehen. Nun ist es leider so, dass nicht alle Dateien durch ein Security Update ersetzt werden. Insofern ist die Variante nicht zuverlässig. Bislang hat sich aber eine Datei mit geändert:

C:\Program Files\Microsoft\Exchange Server\V15\Bin\ExSetupUI.exe

Sie sehen hier die richtige Version inklusive des Security Update. Eventuell ist es ja eine Option einfach die aktuellste Datei mit Signatur auszulesen. Aber ich würde mich nicht darauf verlassen.

Analyse per OWA

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.

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.

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.

Interessant ist natürlich auch, wie genau externe anonyme

Weitere Links