Содержание статьи
Наша цель — захват рута на машине Bookworm с площадки Hack The Box. Уровень ее сложности — «безумный».
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
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
).

Сканер нашел всего два открытых порта:
- 22 — служба OpenSSH 8.2p1;
- 80 — веб‑сервер Nginx 1.18.0.
SSH, как обычно, оставляем на потом: без учетных данных там ничего не сделать. В первую очередь идем смотреть веб‑сайт.

Точка входа
На сайте есть возможность зарегистрироваться и авторизоваться, что мы и делаем.

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

Сам сайт представляет собой магазин книг, поэтому добавим файл в корзину, а затем просмотрим ее.


В корзине у нас есть возможность изменить запись, а это значит, что тут может быть уязвимость как XXS, так и SSTI.
Точка опоры
XSS
Выбираем пункт изменения записи и пробуем подключить файл с нашего сервера.
<img src="http://10.10.14.118/test_xss">

После отправки нагрузки смотрим логи веб‑сервера и видим там запрос.


Находим запрос в Burp History и обращаем внимание на заголовок CSP.

Content Security Policy — это механизм обеспечения безопасности, с помощью которого можно защищаться от XSS-атак. CSP описывает безопасные источники для загрузки ресурсов и устанавливает правила использования встроенных скриптов. Загрузка с ресурсов, не входящих в белый список, блокируется. В данном случае будут исполняться скрипты только с тестируемого сервера, а значит, нагрузку со своего сервера мы не выполним.
Также после меня какой‑то пользователь добавил товар себе в корзину.

Исходный код страницы раскрывает какой‑то id
, скорее всего, это идентификатор заказа, так как при новой покупке от имени того же пользователя идентификатор обновляется.


Попробуем в нашем запросе поменять идентификатор на изменение записи. Если доступ к заказу не контролируется, то нагрузка выполнится и другой пользователь обратится к файлу на нашем сервере.


На сервер пришел запрос, а значит, мы можем триггерить запросы от имени другого пользователя сайта.
File Upload
Перейдем к загрузке аватарки. Больше всего нас интересует данный запрос в Burp History.

При попытке загрузить шелл получаем ошибку, сообщающую о том, что мы можем загрузить только файлы JPEG и PNG.

При новой загрузке файла перехватываем запрос в Burp Proxy и изменяем содержимое файла на простую строку‑индикатор test_file_upload
. Но получаем уже другую ошибку.


Раз ошибка изменилась, значит, содержимое файла не проверяется. Тогда надо попытаться изменить расширение файла. Первым делом пробуем использовать двойное расширение, разделенное null-символом (%00
). При проверке файла будет учитываться второе расширение, а при загрузке его отсечет из‑за null-символа, и файл сохранится с первым расширением.


После редиректа видим обращение к нашему файлу и отображение его содержимого. Доступ к файлу тоже не проверяется.
curl http://bookworm.htb/static/img/uploads/14

CSP Bypass XSS
Итак, мы можем загрузить на сервер файл с текстовым содержимым. Давай попробуем добавить код на JavaScript, делающий простой запрос на наш сервер.
fetch("http://10.10.14.118/csp_bypass");
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»