GetCredentialtype u.a.
Wie kann ich mehr über eine Anmeldeadresse erfahren? Diese Frage stellen sich vielleicht Administratoren aber eher noch Entwickler, die per OATH z.B. die Anmeldung in eigenen Anmeldungen verwenden möchten. Wenn Sie als Entwickler eine Anmeldung nicht über eine eigene Datenbank mit Kennwort etc. realisieren, sondern die großen Cloud-Dienste nutzen ("Anmelden mit Apple", "Mit Facebook anmelden", "Mit Google anmelden" oder eben auch "mit Microsoft anmelden"), dann will man schon mehr wissen. Aber auch für einen Consultant kann es interessant sein, zu einer Mailadresse etwas mehr zu erfahren.
Microsoft GetCredentialtype-Service
Wenn Sie eine Anmeldung an Office 365 oder Microsoft Konten per "Fiddler" mitschneiden, dann finden Sie schon einige URLs, die auf so einen Informations-Service hinweisen. Allerdings schützt Microsoft sich hier gegen Replay-Attacken durch Cookies und andere Möglichkeiten. Sie sollten solche Abrufe also nicht übertreiben.
Im Wesentlichen ist es ein REST-Aufruf mit dem Benutzernamen in einem JSON-Payload. Das geht per PowerShell recht einfach:
Invoke-RestMethod ` -Uri "https://login.microsoftonline.com/common/GetCredentialtype" ` -ContentType "application/json" ` -Method POST ` -Body (@{"username"="invalid@invalid.domain"} ` |convertto-json) Username : invalid@invalid.domain Display : invalid@invalid.domain IfExistsResult : 1 ThrottleStatus : 1 Credentials : @{PrefCredential=1; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=;GoogleParams=} EstsProperties : @{DomainType=1} IsSignupDisallowed : False apiCanary : AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tApQ0ItAdLtHJzdhYkZlsMiC5JKx7AXfINUXX_EULRPbVr7Us5Zk7e7ja0hdXiLCeyqd luWIqELHFVj0AXP81rK_ZgUqwXkBkCfIdF5jV3O1pH-spu8jDJY3_mvrAWda2xmqXFRK1RT3mMZNbxPrdhXnyIA1ZJvLH9AuYU tMWPYYMDrjKTjJhKfEv6SH6VVbF4EhUDaVEJG18xVOH-0CzZzSAA
Wenn Sie die URL einfach so aufrufen, dann zeigt der Browser die Fehler-JSON-Datei an
https://login.microsoftonline.com/common/GetCredentialType
Eine Dokumentation zu dem Service habe ich aber noch nicht gefunden. Allerdings hilft hier ja Fiddler weiter.
Testserie
Je nach angefragter Adresse verändern sich die Rückgabewerte. Hier eine kleine Liste:
Achtung: Diese ist eine Momentaufnahme und da es keine dokumentierte API gibt, kann Microsoft die Funktionsweise jederzeit ändern.
Adresse | Ungültige Domain | Microsoft-ID (früher Passport) |
Ungültiges outlook.de-Konto | Ungültiger User in AzureAD-Tenant-Domain | Office 365 AzureAD CloudUser und ADSync User |
Konto mit LiveID und Office 365 |
---|---|---|---|---|---|---|
IfExistsResult |
1 |
1 |
1 |
1 |
0 |
6 |
ThrottleStatus |
1 |
0 |
0 |
0 |
0 |
0 |
Credentials |
@{ PrefCredential=1; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=; GoogleParams= } |
@{ PrefCredential=6; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=; GoogleParams= } |
@{ PrefCredential=6; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=; GoogleParams= } |
@{ PrefCredential=1; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=; GoogleParams= } |
@{ PrefCredential=1; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=; GoogleParams= } |
@{ PrefCredential=1; HasPassword=True; RemoteNgcParams=; FidoParams=; SasParams=; CertAuthParams=; GoogleParams= } |
EstsProperties.DesktopSsoEnabled |
- |
|
|
True |
True |
|
EstsProperties.DomainType |
1 |
4 |
4 |
3 |
3 |
1 |
EstsProperties.UserTenantBranding |
$null |
$null |
$null |
Tenant System.Object[] |
Locale : 0 BannerLogo : https://aadcdn.msauthimages.net/xxx/ logintenantbranding/0/bannerlogo?ts=xxx Illustration : https://aadcdn.msauthimages.net/xxx/ logintenantbranding/0/illustration?ts=xxx BoilerPlateText : <p>Bitte anmelden.</p> UserIdLabel : Vorname.Nachname@msxfaq.de KeepMeSignedInDisabled : False UseTransparentLightBox : False |
|
IsSignupDisallowed |
False |
True |
True |
True |
True |
|
UserIDLabel |
$null |
$null |
$null |
vorname.nachname@msxfaq.de |
vorname.nachname@msxfaq.de |
|
Bedeutung der Felder
Wenn Sie sich die Daten anschauen, dann sind schon Unterschiede erkennbar und welche Informationen daraus generiert werden können.
Feld | Bewertung |
---|---|
IfExistsResult |
Diese Feld ist anscheinend nur dann auf "0" gesetzt, wenn ich ein gültiges AzureAD-Konto abfrage. Es ist aber nicht hinreichend, ob es vielleicht ein passendes Microsoft-Konto (vormals Passport) gibt. |
ThrottleStatus |
Der Wert ist anscheinend nur gesetzt, wenn die Microsoft Anmeldedienste mit der Domain überhaupt nichts anfangen können. Sobald die Domain in AzureAD bekannt ist, ist der Status 0 |
Credentials |
Der Inhalte hier war bei allen von mir getestete UPNs immer gleich. Es hat aber den Anschein, dass Microsoft hier schon weitere Funktionen vorbereitet hat. Vielleicht liegt es aber auch nur an meiner "einfachen Anfrage", dass keine weitere Daten geliefert werden. |
EstsProperties.DomainType |
Dieses Feld eignet sich wohl recht gut, um AzureAD von Microsoft-Konten über das Property "DomainType" zu unterscheiden.
Weitere Werte wie 0,2 oder 4 habe ich noch nicht gefunden |
EstsProperties.UserTenantBranding |
Wenn es sich um eine AzureAD-Domain handelt, dann enthält "EstsProperties" weitergehende Informationen. Insbesondere die Informationen unter "UserTenantBranding" liefern z.B. die Bilder im Anmeldebildschirm und "UserIdLabel" scheint eine Bildungsregel des UPN zu enthalten. Ich weiß aber noch nicht, woher Microsoft diese Information bezieht. |
IsSignupDisallowed |
Das Feld hat nur dann den Wert "False", wenn die Adresse weder als Microsoft Konto noch als AzureAD-Konto genutzt wird. |
UserIDLabel |
$null |
userrealm
GetCredentialtype ist aber nicht die einzige URL. In einem anderen Trace habe ich z.B. die folgende URL gefunden, die ich per PowerShell einfach anonym abrufen kann
Invoke-RestMethod -Uri ("https://login.microsoftonline.com/common/userrealm/<upn>?api-version=2.0")
Beim Abruf per PowerShell gibt es auch interessante Antworten:
Adresse | Ergebnis |
---|---|
Ungültige Domain |
NameSpaceType : Unknown Login : invaliddomain@invaliddomain.tld cloud_instance_name : microsoftonline.com |
Microsoft-ID (früher Passport) |
NameSpaceType : Federated federation_protocol : WSTrust Login : user@outlook.com AuthURL : https://login.live.com/login.srf?username=frank.carius%40outlook.com&wa=wsignin1.0&wtrealm=urn%3a federation%3aMicrosoftOnline&wctx= DomainName : live.com FederationBrandName : Windows Live ConsumerDomain : True TenantBrandingInfo : cloud_instance_name : microsoftonline.com |
Office 365 AzureAD CloudUser und ADSync User |
NameSpaceType : Managed Login : demouser1@msxfaq.de DomainName : msxfaq.de FederationBrandName : MSXFAQ BannerLogo=https://aadcdn.msauthimages.net/xxx/logintenantbranding/0/bannerlogo?ts=xxx; Illustration=https://aadcdn.msauthimages.net/xxx-xxxx/logintenantbranding/0/illustration?ts=xxx; BoilerPlateText=<p>Bitte anmelden.</p>; UserIdLabel=Vorname.Nachname@msxfaq.de; KeepMeSignedInDisabled=False; UseTransparentLightBox=False}} cloud_instance_name : microsoftonline.com is_dsso_enabled : True |
Ungültiger User in AzureAD |
NameSpaceType : Managed
Login : unknownuser@msxfaq.de
DomainName : msxfaq.de
FederationBrandName : msxfaq
TenantBrandingInfo : {@{Locale=0;
BannerLogo=https://aadcdn.msauthimages.net/xxx/logintenantbranding/0/bannerlogo?ts=xxx;
Illustration=https://aadcdn.msauthimages.net/xxx-xxxx/logintenantbranding/0/illustration?ts=xxx;
BoilerPlateText=<p>Bitte anmelden.</p>;
UserIdLabel=Vorname.Nachname@msxfaq.de;
KeepMeSignedInDisabled=False;
UseTransparentLightBox=False}}
cloud_instance_name : microsoftonline.com
is_dsso_enabled : True
|
Wenn es eine eindeutige "LiveID" ist, dann ist das im Domainname zu finden. Wenn die gleiche Adresse aber auch in AzureAD verwendet wird, dann bekommen Sie den Tenant zurück.
GetUserRealm.srf
Eine vermutlich noch ältere URL ist "GetUserRealm.srf", die per Powershell wie folgt abgefragt werden kann
Invoke-RestMethod -Uri ("https://login.microsoftonline.com/GetUserRealm.srf?login=$($upn)")
Auch hier gibt es interessante Ergebnisse:
Adresse | Ergebnis |
---|---|
Ungültige Domain |
State : 4 UserState : 1 Login : invaliddomain@nodomain.tld NameSpaceType : Unknown |
Microsoft-ID (früher Passport) |
State : 3 UserState : 2 Login : frank.carius@outlook.com NameSpaceType : Federated DomainName : live.com FederationGlobalVersion : -1 AuthURL : https://login.live.com/login.srf?username=user%40outlook.com &wa=wsignin1.0&wtrealm=urn%3afederation%3aMicrosoftOnline&wctx= FederationBrandName : Windows Live CloudInstanceName : microsoftonline.com CloudInstanceIssuerUri : urn:federation:MicrosoftOnline |
Office 365 AzureAD CloudUser und ADSync User |
State : 4
UserState : 1
Login : demouser@msxfaq.de
NameSpaceType : Managed
DomainName : msxfaq.de
FederationBrandName : MSXFAQ
CloudInstanceName : microsoftonline.com
CloudInstanceIssuerUri : urn:federation:MicrosoftOnline
|
Ungültiger User in AzureAD |
State : 4
UserState : 1
Login : invalid@msxfaq.de
NameSpaceType : Managed
DomainName : msxfaq.de
FederationBrandName : MSXFAQ
CloudInstanceName : microsoftonline.com
CloudInstanceIssuerUri : urn:federation:MicrosoftOnline
|
Die Rückgaben dieses Service unterscheiden sich zwar von userrealm aber auch hier erhalten ich keine Information über Adressen, die sowohl also LiveID als auch AzureAD-Konto genutzt werden.
Weitere Links
- Azure AD Seamless SSO allows enumerating tenant users
https://o365blog.com/post/desktopsso/ - GitHub: AADInternals: AccessToken_utils.ps1
https://www.powershellgallery.com/packages/AADInternals/0.2.3/Content/AccessToken_utils.ps1 - AZURE, AZURE ACTIVE DIRECTORY, AND
POWERSHELL. THE HARD WAY
https://www.cryingcloud.com/blog/2016/08/03/azure-azure-active-directory-powershell-hard-way - Automatic Azure AD User Account
Enumeration with PowerShell (Scary Stuff)
https://danielchronlund.com/2020/03/13/automatic-azure-ad-user-account-enumeration-with-powershell-scary-stuff/ - Invoke-GlobalMailSearch
https://raw.GitHubusercontent.com/dafthack/MailSniper/1cbd0d2e8f6caa89f9a6d6270e1cd43230b4d01a/MailSniper.ps1