Содержание статьи
Наша цель — захват рута на машине 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
).
![Результат работы скрипта Результат работы скрипта](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34357/02.png)
Сканер нашел всего два открытых порта:
- 22 — служба OpenSSH 8.2p1;
- 80 — веб‑сервер Nginx 1.18.0.
SSH, как обычно, оставляем на потом: без учетных данных там ничего не сделать. В первую очередь идем смотреть веб‑сайт.
![Главная страница сайта Главная страница сайта](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34356/03.png)
Точка входа
На сайте есть возможность зарегистрироваться и авторизоваться, что мы и делаем.
![Форма регистрации нового пользователя Форма регистрации нового пользователя](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34355/04.png)
Пробегаемся по сайту, чтобы определить возможные точки входа. К примеру, в профиле пользователя можно установить аватар, загрузив картинку. При загрузке файлов часто встречаются уязвимости, которые позволяют загружать не только картинки.
![Страница профиля пользователя Страница профиля пользователя](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34354/05.png)
Сам сайт представляет собой магазин книг, поэтому добавим файл в корзину, а затем просмотрим ее.
![Страница товара Страница товара](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34353/06.png)
![Корзина пользователя Корзина пользователя](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34352/07.png)
В корзине у нас есть возможность изменить запись, а это значит, что тут может быть уязвимость как XXS, так и SSTI.
Точка опоры
XSS
Выбираем пункт изменения записи и пробуем подключить файл с нашего сервера.
<img src="http://10.10.14.118/test_xss">
![Форма изменения Форма изменения](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34351/08.png)
После отправки нагрузки смотрим логи веб‑сервера и видим там запрос.
![Результат изменения записи Результат изменения записи](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34350/09.png)
![Логи веб-сервера Логи веб-сервера](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34349/10.png)
Находим запрос в Burp History и обращаем внимание на заголовок CSP.
![Запрос в Burp History Запрос в Burp History](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34348/11.png)
Content Security Policy — это механизм обеспечения безопасности, с помощью которого можно защищаться от XSS-атак. CSP описывает безопасные источники для загрузки ресурсов и устанавливает правила использования встроенных скриптов. Загрузка с ресурсов, не входящих в белый список, блокируется. В данном случае будут исполняться скрипты только с тестируемого сервера, а значит, нагрузку со своего сервера мы не выполним.
Также после меня какой‑то пользователь добавил товар себе в корзину.
![Список товаров Список товаров](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34347/12.png)
Исходный код страницы раскрывает какой‑то id
, скорее всего, это идентификатор заказа, так как при новой покупке от имени того же пользователя идентификатор обновляется.
![](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34346/13.png)
![Исходный код страницы Исходный код страницы](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34345/14.png)
Попробуем в нашем запросе поменять идентификатор на изменение записи. Если доступ к заказу не контролируется, то нагрузка выполнится и другой пользователь обратится к файлу на нашем сервере.
![Измененный запрос в Burp Repeater Измененный запрос в Burp Repeater](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34344/15.png)
![Логи сервера Логи сервера](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34343/16.png)
На сервер пришел запрос, а значит, мы можем триггерить запросы от имени другого пользователя сайта.
File Upload
Перейдем к загрузке аватарки. Больше всего нас интересует данный запрос в Burp History.
![Запрос в Burp History Запрос в Burp History](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34342/17.png)
При попытке загрузить шелл получаем ошибку, сообщающую о том, что мы можем загрузить только файлы JPEG и PNG.
![Ошибка загрузки файла Ошибка загрузки файла](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34341/18.png)
При новой загрузке файла перехватываем запрос в Burp Proxy и изменяем содержимое файла на простую строку‑индикатор test_file_upload
. Но получаем уже другую ошибку.
![Запрос на загрузку файла Запрос на загрузку файла](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34340/19.png)
![Ошибка сервера Ошибка сервера](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34339/20.png)
Раз ошибка изменилась, значит, содержимое файла не проверяется. Тогда надо попытаться изменить расширение файла. Первым делом пробуем использовать двойное расширение, разделенное null-символом (%00
). При проверке файла будет учитываться второе расширение, а при загрузке его отсечет из‑за null-символа, и файл сохранится с первым расширением.
![Запрос на загрузку файла Запрос на загрузку файла](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34338/21.png)
![Запрос загруженного файла Запрос загруженного файла](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34337/22.png)
После редиректа видим обращение к нашему файлу и отображение его содержимого. Доступ к файлу тоже не проверяется.
curl http://bookworm.htb/static/img/uploads/14
![Запрос содержимого загруженного файла Запрос содержимого загруженного файла](https://static.xakep.ru/images/955c27f38ae9c9dbe81ced27d34e84f3/34336/23.png)
CSP Bypass XSS
Итак, мы можем загрузить на сервер файл с текстовым содержимым. Давай попробуем добавить код на JavaScript, делающий простой запрос на наш сервер.
fetch("http://10.10.14.118/csp_bypass");
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»