Bearer Decoding
Office 365 nutzt fast ausschließlich HTTPS und neben BASIC, Negotiate (Kerberos/NTLM) und TLS-PSK werden Anmeldedaten auch oft als "Bearer"-Token übermittelt. Auf dieser Seite beschreibe ich an einem konkreten Problem, wie Sie mit Fiddler das Token soweit auseinander nehmen können, dass Sie die Anmeldedaten untersuchen können.
Siehe dazu auch die Seiten Authentifizierung im Wandel der Zeit und HTTP Authentication
Auslöser
Angefangen hat es damit, dass mein eigenes Postfach sich nicht mehr replizieren konnte. Wie aus heiterem Himmel konnte mein Outlook nicht mehr mit meinem Office 365 Konto interagieren. In der Fußleiste stand natürlich drin, dass die Verbindung hergestellt war.
Und auch in der Verbindungsansicht war alles soweit in Ordnung
Ich habe mein eigenes Postfach in Office 365 geöffnet und ein zusätzliches Support-Postfach On-Premises und zwei weitere Postfächer in einem anderen Tenant eingebunden. Alle Verbindungen stehen und meine erste Verbindung nutzt "Bearer", was Microsoft als "Träger" bei der Authentifizierung anzeigt. Kleine Spitze: Auch bei Microsoft haben nicht alle Exchange Server die gleiche Version. Sie sind aber sehr viel weiter als mein aktuell gepatchter lokaler Server. Aber das hilft mir so nicht weiter denn Mails habe ich dennoch keine bekommen oder gesendet.
HTTPS-Trace mit Fiddler
Nun sehen Sie ja, dass die Verbindung per HTTP /SSL hergestellt ist. Also wird es Zeit für Fiddler und noch ehe ich was in Outlook antriggern konnte, hat Outlook mit in Fiddler schon die Meldungen geflutet. Es gibt einige "Autodiscover"-Anfragen und alle enden mit einem 401 und vielen 200 ohne zu einem Erfolg zu kommen.
Sie sehen hier auch, dass Outlook 2016 schon mit Autodiscover V2 arbeitet. Es ist eine Mischung von Anfragen auf die On-Premises Umgebung mit Umleitungen zu Office 365 und letztlich kommt es zu einer Autodiscover-Anfrage an die Cloud mit "Bearer" Authentifizierung:
POST https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml HTTP/1.1 Cache-Control: no-cache Connection: Keep-Alive Pragma: no-cache Content-Type: text/xml Authorization: Bearer eyJ0eX.....MqV3mA User-Agent: Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.9330; Pro) X-MS-CookieUri-Requested: t X-FeatureVersion: 1 Client-Request-Id: {8E60333C-5A11-4CB9-AB37-125C300A67CA} X-User-Identity: User43@uclabor.net X-MapiHttpCapability: 1 Depth: 0 X-AnchorMailbox: User43@uclabor.mail.onmicrosoft.com Content-Length: 371 Host: autodiscover-s.outlook.com Cookie: OutlookSession="{4C06E39E-F612-4078-A319-EAF73AFD63EB}";X-BackEndCookie=User43@uclabor.mail.onmicrosoft.com=xxxxxkJKBzw== <?xml version="1.0" encoding="utf-8"?> <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006"> <Request> <EMailAddress>User43@uclabor.mail.onmicrosoft.com</EMailAddress> <AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema> </Request> </Autodiscover>
Die Antwort darauf ist aber verblüffend:
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/xml; charset=utf-8 Server: Microsoft-IIS/10.0 request-id: c76caf73-67d0-44e1-9e10-d21b69dc3169 X-CalculatedBETarget: vi1pr0402mb3646.eurprd04.prod.outlook.com X-RUM-Validated: 1 x-ms-appId: d3590ed6-52b3-4102-aeff-aad2292ab01c X-DiagInfo: VI1PR0402MB3646 X-BEServer: VI1PR0402MB3646 X-AspNet-Version: 4.0.30319 Set-Cookie: X-BackEndCookie2=User43@uclabor.mail.onmicrosoft.com=xxx/xxx==&adminUser@carius.onmicrosoft.com=xxx/xxx==; expires=Sun, 17-Jun-2018 17:15:45 GMT; path=/autodiscover; secure; HttpOnly Set-Cookie: X-BackEndCookie=User43@uclabor.mail.onmicrosoft.com=xxx/xxx==&adminUser@carius.onmicrosoft.com=xxx/xxx==; expires=Sun, 17-Jun-2018 17:15:45 GMT; path=/autodiscover; secure; HttpOnly X-Powered-By: ASP.NET X-FEServer: AM5PR0701CA0050 Date: Fri, 18 May 2018 17:15:44 GMT Content-Length: 361 <?xml version="1.0" encoding="utf-8"?> <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006"> <Response> <Error Time="17:15:45.1029895" Id="2008461090"> <ErrorCode>500</ErrorCode> <Message>The email address can't be found.</Message> <DebugData /> </Error> </Response> </Autodiscover>
Wer genau hinschaut findet hier schon den Fehler. Damit meine ich nun nicht den "The email address can't be found.". Die Mailadresse ist definitiv korrekt aber die Cookies, die gesetzt werden, enthalten nicht nur die Mailadresse des Users sondern auch die Anmeldedaten. Die sind hier aber falsch. Das ist ein AdminUser in einem ganz anderen Tenant. Der darf gar nicht prüfen, was hier passiert.
Bearer decodieren
Das wollte ich nun genauer verstehen und habe mir den String, der im Request steht, genauer angeschaut:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbG......er_4g3v7MqV3mA (gekürzt)
Das ist eine Base64-codierte Information, sie die mit jedem Decoder wieder zurück verwandeln können. Das geht sogar direkt in Fiddler. Sie markieren den Text im Request und senden ihn zum Textwizard
Im Textwizard gilt es dann den String zu decodieren.
Die nun sichtbare Struktur ist wieder ein JSON-Objekt und es sollte gut ersichtlich sein, welcher UPN im den Bearer-Token enthalten ist. Wer noch mehr Strings anschaut, findet auch die URL, für welche das Token ausgestellt ist, welche Rechte damit verbunden sind aber auch den Ausstelle (https://sts.windows.net) und weiter Daten des Bearer Tokens. Hier eine gekürzte Text-Version, damit Google und Co auch was zu finden haben.
{ "typ":"JWT", "alg":"RS256", "x5t":"xxxxxxxxxxxxxxxxxxxxxxxxxxx", "kid":"xxxxxxxxxxxxxxxxxxxxxxxxxxx" } { "aud":"https://autodiscover-s.outlook.com/", "iss":"https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/", "iat":xxxxxxxxxx, "nbf":xxxxxxxxxx, "exp":xxxxxxxx "acct":0 "acr":"1" "aio":"xxxx/xxxxxxxxxxxxxxxxxxxxxxxxxx/xxx/xxxxxxx=" "amr":["pwd" "rsa"] "app_displayname":"Microsoft Office" "appid":"xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "appidacr":"0" "deviceid":"xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "e_exp":262800 "enfpolids":[] "family_name":"Carius" "given_name":"Frank" "ipaddr":"80.66.10.222" "name":"Frank Carius (farius ADM)" "oid":"xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx" "puid":"xxxxxxxxx" "pwd_exp":"7669693" "pwd_url":"https://portal.microsoftonline.com/ChangePassword.aspx" "scp":"Calendars.ReadWrite Calendars.ReadWrite.Shared Contacts.ReadWrite Contacts.ReadWrite.Shared Files.ReadWrite.All Group.ReadWrite.All Mail.ReadWrite Mail.ReadWrite.Shared Mail.Send Mail.Send.Shared MailboxSettings.ReadWrite Notes.Read Notes.ReadWrite Privilege.ELT Signals.Read Signals.ReadWrite SubstrateSearch-Internal.ReadWrite Tags.ReadWrite Tasks.ReadWrite.Shared User_impersonation User-Internal.ReadWrite" "sub":"xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx" "tid":"3xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx" "unique_name":"fc.admin@fc.onmicrosoft.com" "upn":"fc.admin@fc.onmicrosoft.com" "uti":"xxxxxxxxxxxxx" "ver":"1.0" }
Es ist also gar nicht so einfach ein Bearer-Token zu decodieren und die darin enthaltenen Informationen zu interpretieren. Natürlich gibt es dazu auch jede Menge Skripte, die im Browser ein Token für Sie decodieren.
-
ConvertFrom-Bearertoken
Bearer Tokens per PowerShell decodieren - https://adfshelp.microsoft.com/JwtDecoder/GetToken
- https://jwt.io
- https://jwt.ms
-
Parse-JWTToken.ps1
https://www.powershellgallery.com/packages/PSZoom/1.1.0/Content/Private%5CParse-JWTToken.ps1
Im Prinzip ein Base64-Decoder mit Aufschlüsseln der Felder in ein Objekt -
Decode JWT access and id tokens via PowerShell
https://www.michev.info/Blog/Post/2140/decode-jwt-access-and-id-tokens-via-powershell
Windows Credential Speicher
Damit wusste ich nun, warum mein Outlook nicht mehr synchronisieren konnte aber nicht, woher die Daten kommen. Es gibt ja mehrere Speicher unter Windows. Mein erster Anlaufpunkt ist der Windows Tresor unter "Systemsteuerung\Alle Systemsteuerungselemente\Anmeldeinformationsverwaltung". Leider war da nichts zu finden. Dennoch ist es wohl das einfachste hier erst mal zu putzen. Da steht ja in der Regel nichts, was man nicht wieder eingeben könnte. Mit CMDKEY geht das recht schnell, wenn Sie nicht über die GUI Eintrag für Eintrag anklicken wollen.
REM Anzeige der gespeicherten Credentials cmdkey /list
Interessant sind alle Einträge die dem Namensschema "MicrosoftOfficeXXData:XXXXXXXXX" folgen.
Alternativ können die Daten auch per PowerShell verändert werden. Dazu muss aber ein Modul installiert werden
Install-Module -Name PSCredentialManager
Office Identity Speicher
Aber irgendwie merken sich auch die Office Applikationen den angemeldeten Benutzer. Dies gilt nicht nur für OneDrive, sondern auch für Word, Excel PowerPoint als auch Office. In Word habe ich dann gesehen, dass irgendwo etwas durcheinander sein musste. Hier tauchen gleich drei Einträge von unterschiedlichen Objekten auf
Den "Frank Carius (fcarius ADM) habe ich nicht direkt in der Registrierung gefunden aber verweist auf den falschen Benutzer. Auch unten bei den verbundenen Diensten ist ein fremdes Konto. Die Lizenz dieser Office-Instanz ist aber richtig. Ich habe mich dann einfach mal "abgemeldet" und Outlook neu gestartet. Klar musste ich nun wieder Anmeldeinformationen eingeben aber danach hat der Ordner sich wieder synchronisiert. In Word stand dann wieder
Vielleicht ist das aber auch mal ein Zeichen, die Windows 10 App-Konten etwas aufzuräumen.
Hier haben sich schon einige Konten gesammelt.
Weitere Links
- Fiddler
- Get-O365 Usage
- Authentifizierung im Wandel der Zeit
- HTTP Authentication
- Test-Bearer - Schnell prüfen, ob die Gegenseite BEARER anbietet
-
ConvertFrom-Bearertoken
Bearer Tokens per PowerShell decodieren -
PoPToken
MSGraph erlaubt neben Bearer auch PoPTokens. Was steckt dahinter? -
Decode JWT access and id tokens via PowerShell
https://www.michev.info/Blog/Post/2140/decode-jwt-access-and-id-tokens-via-powershell -
Innenleben des Exchange-Identitätstokens
https://docs.microsoft.com/de-de/office/dev/add-ins/outlook/inside-the-identity-token - Session timeouts for Office 365
https://support.office.com/en-us/article/session-timeouts-for-office-365-37a5c116-5b07-4f70-8333-5b86fd2c3c40 - Outlook continues to prompt for credentials after your
domain password changes
https://support.microsoft.com/en-us/help/2762344/outlook-continues-to-prompt-for-credentials-after-your-domain-password - 2708705 Policy to prevent Outlook from saving basic
authentication credentials seems not to work
https://support.microsoft.com/en-us/help/2708705 - Decode JWT access and id tokens via
PowerShell
https://www.michev.info/Blog/Post/2140/decode-jwt-access-and-id-tokens-via-powershell - How to get rid of the password prompt every time you open
Outlook
https://www.it-support.com.au/how-to-get-rid-of-the-password-prompt-every-time-you-open-outlook/2018/02/ - Updated Fiddler OAuth Inspector
https://learn.microsoft.com/en-us/archive/blogs/kaevans/updated-fiddler-oauth-inspector - Mailbox.org: Google sperrt "unsichere" Dritte von Kalender
aus
https://www.heise.de/ix/meldung/Mailbox-org-Google-sperrt-unsichere-Dritte-von-Kalender-aus-4640540.html