2️2FA

Mindmap

Checklist

Méthode 1:

Changer le code 4XX en code 200 OK.

Méthode 2:

  • Intercepter la demande de 2FA avec burp

  • Forward la requête

  • Regarder si il n'y a pas de leak en réponse

Méthode 3:

Chercher d'éventuels leaks dans les fichiers JS.

Méthode 4:

Vérifier si on peu utiliser plusieurs fois le même code.

Méthode 5:

  • Vérifier si il y a un rate limit en tentant de brute force le code.

  • Tenter des contournements de rate limit génériques.

  • Vérifier si la fonction de resend ne réinitialise pas le compteur.

Méthode 6:

Vérifier si changer de mot de passe ou d'email désactive le 2FA.

Méthode 7:

Tester s'il est possible d'utiliser du clickjacking avec des iframes pour forcer l'utilisateur à désactiver son 2FA.

Méthode 8:

Tenter d'utiliser un code "null" ou "000000"

Méthode 9:

Tenter de passer la page de 2FA (https://target.com/login => https://target.com/account)

Utiliser le header referer pour faire croire à l'application qu'on est bien passé par cette étape.

Exemple:

GET /account

Host: target.com

Referer: https://target.com/login

Méthode 10:

Utiliser le code de validation de l'attaquant sur le compte d'une cible.

Méthode 11:

Essayer de générer 2 codes de vérifications pour le même compte et regarder si celui-ci est bien changé à chaque demande.

Méthode 12:

Vérifier si la génération du code est basé sur le moment de la demande en envoyant la demande exactement au même moment. (race condition)

#Script python

import requests
url = "https://target.com/login"
headers = {}
target ={"LOGIN": "<login target>", "PASS": "<password>"}
attacker ={"LOGIN": "<login attacker>", "PASS": "<password>"}
requests.post(url, headers=headers, data=target, verify=False)
requests.post(url, headers=headers, data=attacker, verify=False)

Méthode 13:

Manipulation des méthodes HTTP, URL, Paramètres (aléatoires ou malformés)

Méthode 14:

Se connecter sur des navigateurs différents puis vérifier si activer ou modifier les paramètres de 2FA déconnecte la première session.

Méthode 15:

Vérifier la requête d'authentification avec puis sans 2FA permet parfois de relever quelques informations utiles.

Sans

Requête:

{"email" : "abc@gmail.com" , "password" : " abc1234" , "mfa" : null , "code" : ""}

Réponse:

Location: https://target.com/user/dashboard

Avec

Requête:

{"email" : "abc@gmail.com" , "password" : " abc1234" , "mfa" : true , "code" : ""}

Réponse:

Location: https://target.com/v1/proxy/authentication/authenticate

Dans ce cas, peut-être que si on modifie la requête en envoyant ceci avec le 2FA d'activé on pourra bypass le bypass.

{"email" : "abc@gmail.com" , "password" : " abc1234" , "mfa" : null , "code" : ""}

ou en allant directement sur le lien vers le dashboard.

Méthode 16:

Dans le cas ou le 2FA serait géré avec une appli mobile tier type Google authenticator. L'application devrait vous donner des codes de backup uniques à sauvegarder.

Dans ce cas, sélectionner la connexion avec le code de backup et vérifier la bonne validation de la fonctionnalité en entrant un code aléatoire. (Avec un peu de chance aucune vérification n'est faite)

ressource: https://medium.com/@ultranoob/weird-and-simple-2fa-bypass-without-any-test-b869e09ac261

Méthode 17:

  • Envoyer une demande de mot de passe oublié ave 2FA.

  • Entrer un mauvais code de vérification.

  • Si un code d'erreur est généré dans l'url, essayer de changer la valeur de ce code.

Méthode 18:

Si après plusieurs demandes de vérification sont raté, il arrive que certains site demande de se connecter avec username et password après 3 code de vérification raté par exemple.

Dans ce cas voici une technique pour bypass cette méthode.

Dans burp:

Récupérez les page de login et de vérification GET et POST dans le HTTP history.

Allez dans "Projet options" puis dans Session handling rules cliquez sur "Add"

Dans scope choisissez "include all URLs"

Ensuite, dans Details > Rule Actions, cliqez su "Add".

Sélectionnez les requêtes:

  • GET /login

  • POST /login

  • GET /verification

Cliquez sur "OK" puis sur "Test macro", dans la réponse à la requête POST /verification, sélectionnez le dtexte de la demande de code (Veuillez entrer le code de vérification 4-digit)

Retournez dans Proxy > HTTP history.

Envoyez le POST /verification dans "Intruder".

Bruteforce le paramètre contenant le code de 0000 à 9999.

Méthode 19:

  • 2FA implémenté en api REST (exp: /rest/login)

Exp: { "username":"user","pass":"password":"SecurityToken":"173572537"}

  • Vérifier si un des endpoints accepte SOAP (exp: /endpoint/Soap/version).

  • Si c'est le cas, écrire un message sans SecurityToken et envoyer la requête.

Exp:

<SOAP-ENV:Envelope xmlns:se="">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<login xmlns="">
<username>user</username>
<password>password</password>
</login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • Si les développeurs ont oublié d'implémenter le 2FA dans les endpoints SOAP alors vous devriez être connecté

Méthode 20:

  • Changer d'adresse email

Si un lien est envoyé à l'ancien email pour prévenir du changement et qu'il y a un lien permettant d'annuler le changement,

  • Suivre le lien (si il redirige vers la page de connexion)

  • Entrer ses identifiants

Si le second facteur n'est pas demandé alors la manipulation a fonctionné.

Méthode 21:

Vérifier si il existe une API d'une ancienne version qui n'avait pas encore le 2FA.

Méthode 22:

Vérifier la durée de validité du code.

Méthode 23:

Vérifier si passer par un lien tier contourne la demande de 2FA (lien de réinitialisation de mot de passe, lien dans une newsletter...)

Méthode 24:

Si utilisation de OAuth, tenter de se connecter en OAuth via un sous-domaine et vérifier si la demande de 2FA est effectuée.

Outils

MFASweep

MFASweep est un script powershell créé spécifiquement pour les contournements de MFA Microsoft (O365, Azure, ADFS...)

Exemple d'utilisation:

> Invoke-MFASweep -Username target@example.xyz -Password P@ssw0rd123!

ressource: https://github.com/dafthack/MFASweep

Dernière mise à jour