Перейти к содержимому

HTB Underpass прохождение: от SNMP-разведки до root через mosh-server

HTB Underpass прохождение: от SNMP-разведки до root через mosh-server
Время чтения: 12 мин.

Дефолтная community string public в SNMP — из тех вещей, которую каждый админ знает и каждый забывает поменять. На машине Underpass с HackTheBox именно она раскрывает всю инфраструктуру: имя внутреннего сервиса, контактный email, путь до панели управления. Дальше — дефолтный пароль daloRADIUS, MD5-хеш без соли и sudo-правило, разрешающее запуск mosh-server от root. Полная цепочка от нулевого доступа до root-привилегий занимает минут 15. Разберём каждый шаг: от UDP-разведки до повышения привилегий через sudo и mosh. С объяснением, почему каждая команда работает и как отличить тупик от рабочего вектора.

Цепочка атаки и требования к окружению

Перед тем как открывать терминал, полезно увидеть маршрут целиком. MITRE ATT&CK — открытая база тактик и техник атак; T-коды вроде T1046 — её идентификаторы. Если встречаете их впервые, просто воспринимайте как «артикул» техники в каталоге. Цепочка Underpass:

  1. Разведка сервисов — сканирование TCP и UDP портов, T1046 Network Service Discovery
  2. Сбор данных через SNMP — дамп MIB-дерева с community string public, T1602.001 SNMP (MIB Dump), Collection
  3. Обнаружение системной информации — hostname, email, название сервиса daloRADIUS, T1082 System Information Discovery
  4. Дефолтные учётные данные — вход в daloRADIUS с administrator:radius, T1078 Valid Accounts, Initial Access
  5. Перечисление локальных аккаунтов — извлечение хеша пользователя svcMosh, T1087.001 Local Account, Discovery
  6. SSH-подключение — вход с взломанным паролем, T1021.004 SSH, Lateral Movement
  7. Повышение привилегий через sudo — запуск mosh-server от root, T1548.003 Sudo and Sudo Caching, Privilege Escalation

PATH hijacking (T1574.007 — подмена исполняемого файла через манипуляцию переменной окружения PATH) — отдельная техника, концептуально связанная с этим privesc-сценарием. Разберём её в разделе про повышение привилегий.

Требования к окружению:

  • ОС: Kali Linux 2024.x+ или Parrot OS — подойдёт любая атакующая система с предустановленными инструментами
  • RAM: от 4 ГБ (тяжёлые фреймворки здесь не нужны)
  • Сеть: активное VPN-подключение к HackTheBox (файл .ovpn из личного кабинета)
  • Инструменты: nmap, snmpwalk (пакет snmp), snmp-mibs-downloader, john или hashcat, ssh, mosh-client
  • Подготовка MIB: выполнить sudo apt install snmp-mibs-downloader, затем закомментировать строку mibs : в файле /etc/snmp/snmp.conf. Без этого вывод snmpwalk будет нечитаемым — числовые OID вместо текстовых имён

Разведка: сканирование TCP и UDP портов

Первый шаг — узнать, какие сервисы живут на целевой машине. Запускаем TCP-сканирование всех 65535 портов: nmap -p- --min-rate 10000 10.10.11.48. Флаг --min-rate 10000 ускоряет процесс — минимум 10 000 пакетов в секунду. Результат: два открытых порта — 22/tcp (SSH, OpenSSH 8.9p1 Ubuntu) и 80/tcp (HTTP, Apache 2.4.52). Уточняем версии: nmap -p 22,80 -sCV 10.10.11.48.

По версиям SSH и Apache определяем Ubuntu 22.04 (jammy). Веб-сервер на 80-м порту отдаёт стандартную страницу Apache — «It works». Запуск feroxbuster -u http://10.10.11.48 по стандартным словарям не находит ни одного нестандартного маршрута.

Здесь новички обычно застревают: TCP просканирован, веб пустой, SSH без учёток — тупик. Но тупик только если забыть про UDP. Служба SNMP (Simple Network Management Protocol — протокол для мониторинга и управления сетевым оборудованием) работает на UDP-порту 161, и TCP-сканирование её не видит. Это частая ловушка на CTF и на реальных пентестах.

Запускаем UDP-сканирование: sudo nmap -sU --min-rate 10000 10.10.11.48. Префикс sudo обязателен — UDP-сканирование требует raw-сокетов. Результат: 161/udp open snmp. Уточняем версию: sudo nmap -sU -sCV -p 161 10.10.11.48. В поле Service Info видим строку: UnDerPass.htb is the only daloradius server in the basin! Мы узнали hostname (UnDerPass.htb) и то, что на сервере крутится daloRADIUS — веб-интерфейс для управления RADIUS-серверами.

Ограничение: UDP-сканирование nmap значительно медленнее TCP и менее надёжно — пакеты теряются. Если порт показывается как open|filtered, повторите прицельно: sudo nmap -sU -p 161 10.10.11.48. На внешнем пентесте файрвол часто блокирует SNMP; на внутреннем — это один из первых портов для проверки.

SNMP community string enumeration: snmpwalk перечисление пользователей

SNMP работает по принципу «вопрос-ответ»: клиент отправляет запрос с community string (по сути — пароль в открытом тексте), и если строка совпадает, сервер отдаёт данные. Дефолтная community string для чтения — public. На production-серверах её меняют. В теории. На практике, по данным IBM X-Force Threat Intelligence Index 2025, рост атак с использованием действительных учётных данных составил 71% год к году — дефолтные конфигурации живучи.

Чтобы убедиться, что строка public подходит, можно использовать onesixtyone — утилиту для перебора community strings по словарю: onesixtyone -c /usr/share/seclists/Discovery/SNMP/snmp-onesixtyone.txt 10.10.11.48. Для Underpass достаточно знать, что дефолтная строка не менялась.

Запускаем snmpwalk — утилиту, которая «обходит» всё MIB-дерево (Management Information Base — иерархическая структура данных, описывающая параметры устройства) и выводит доступные значения. Флаг -v 2c задаёт версию протокола SNMPv2c, -c public — community string, а tee snmp_data сохраняет вывод в файл для последующего анализа через grep:

snmpwalk -v 2c -c public 10.10.11.48 | tee snmp_data

SNMPv2-MIB::sysContact.0 = STRING: "steve@underpass.htb"
SNMPv2-MIB::sysName.0    = STRING: "UnDerPass.htb is the only daloradius server in the basin!"
SNMPv2-MIB::sysLocation.0 = STRING: "Nevada, U.S.A. but not Vegas"

Три ключевые строки — и мы уже знаем многое. Адрес steve@underpass.htb — потенциальное имя пользователя. Подтверждение daloRADIUS — направление для дальнейшей разведки веб-панели. Локация — декоративная, но показывает, что SNMP отдаёт всё без ограничений.

Остальные OID (Object Identifier — числовой путь к параметру в MIB-дереве, например 1.3.6.1.2.1.1.4.0 для sysContact) содержат версию ядра Linux (5.15.0-126-generic), аптайм и загрузочные параметры — полезно для fingerprinting целевой ОС.

Ограничение SNMP-перечисления: community string public работает только на серверах с дефолтной конфигурацией SNMPv1/v2c. На SNMPv3 с аутентификацией и шифрованием (режим authPriv) эта техника бесполезна. В корпоративных сетях с SNMP trap-фильтрацией или IDS-правилами запрос snmpwalk может быть обнаружен и заблокирован. На периметре порт 161/udp обычно закрыт файрволом, поэтому техника чаще работает на внутреннем пентесте.

Инструмент Преимущества Ограничения Когда использовать
snmpwalk Полный дамп MIB-дерева Медленный на больших деревьях Полный обзор данных устройства
snmpbulkwalk Быстрее за счёт пакетных запросов Не все агенты обрабатывают bulk-запросы Быстрое сканирование большой сети
onesixtyone Перебор community strings по словарю Не дампит данные, только подтверждает строку Когда дефолтная строка не подошла
snmp-check Структурированный и читаемый вывод Менее гибкий для нестандартных OID Быстрая разведка с человекочитаемым отчётом

daloRADIUS: дефолтные учётные данные и хеш пользователя

SNMP подсказал, что на сервере работает daloRADIUS. Добавляем hostname в /etc/hosts на атакующей машине: echo "10.10.11.48 underpass.htb" | sudo tee -a /etc/hosts. Без этого браузер и инструменты не смогут разрешить доменное имя в IP машины.

Переход на http://underpass.htb/daloradius/ возвращает 403 Forbidden. Обратите внимание: это не 404 (страница не найдена), а 403 (доступ к директории запрещён). Директория существует, но листинг отключён. Нужен конкретный путь. Можно запустить ffuf для перебора поддиректорий, но для daloRADIUS путь к панели оператора документирован в установочных скриптах проекта: /daloradius/app/operators/login.php.

Переходим на http://underpass.htb/daloradius/app/operators/login.php — форма логина. Дефолтные учётные данные daloRADIUS: administrator / radius. Вводим — попадаем в административную панель. Да, вот так просто.

В разделе Management, List Users обнаруживаем единственного пользователя: svcMosh с паролем 412DD4759978ACFCC81DEAB01B382403. 32-символьная hex-строка — классический MD5-хеш. RADIUS-серверы исторически хранят пароли в MD5 без соли, что делает их уязвимыми к словарному перебору и lookup-таблицам.

Дефолтные учётные данные — одна из самых частых ошибок. По классификации OWASP Top 10 (рейтинг критичных веб-уязвимостей, обновляется раз в несколько лет) это сочетание A05:2021 Security Misconfiguration и A07:2021 Identification and Authentication Failures. В отчёте Verizon DBIR 2025 указано, что 38% утечек данных связаны с кражей учётных данных — дефолтные пароли составляют заметную часть этой статистики.

Начальный доступ: взлом MD5-хеша и SSH

Сохраняем хеш в файл: echo "412DD4759978ACFCC81DEAB01B382403" > hash.txt. Запускаем John the Ripper — утилиту для взлома хешей методом словарного перебора: john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt. Словарь rockyou.txt содержит около 14 миллионов паролей из реальных утечек.

John выдаёт результат за секунды: пароль underwaterfriends. MD5 без соли ломается мгновенно — на современном GPU весь словарь rockyou перебирается за доли секунды. Альтернатива — онлайн-сервис CrackStation, который использует предвычисленные радужные таблицы для распространённых алгоритмов хеширования.

Подключаемся по SSH: ssh svcMosh@10.10.11.48, вводим пароль underwaterfriends. Вход успешен. whoami возвращает svcMosh, а cat ~/user.txt — пользовательский флаг. На этом этапе у нас shell от непривилегированного пользователя. Для полного захвата машины нужен root.

Повышение привилегий: mosh-server privilege escalation через sudo

Перечисление sudo-привилегий и эксплуатация mosh

Первая команда после получения shell на Linux — sudo -l. Она показывает, какие команды текущий пользователь может запускать с повышенными привилегиями:

User svcMosh may run the following commands on underpass:
    (ALL) NOPASSWD: /usr/bin/mosh-server

Разберём эту строку по частям. svcMosh может запустить /usr/bin/mosh-server от имени любого пользователя (ALL), включая root, без ввода пароля (NOPASSWD). Mosh (Mobile Shell) — альтернатива SSH, спроектированная для нестабильных соединений (Wi-Fi, сотовые сети). Mosh-server открывает UDP-порт и запускает терминальную сессию, к которой подключается mosh-client.

Ключевой момент: если запустить mosh-server от root, терминальная сессия тоже будет root. Вот и весь вектор.

Делай раз — запускаем mosh-server с sudo:

sudo /usr/bin/mosh-server
# Ожидаемый вывод: MOSH CONNECT 60001 <ключ-сессии>
# Где 60001 — UDP-порт, длинная строка — одноразовый ключ аутентификации

Делай два — подключаемся mosh-client к этому порту с полученным ключом. В том же терминале (или в новой SSH-сессии от svcMosh): MOSH_KEY=<ключ-из-вывода> mosh-client 127.0.0.1 60001. Адрес 127.0.0.1 — потому что mosh-server слушает локально.

Делай три — проверяем: whoami возвращает root. Читаем cat /root/root.txt — root-флаг получен, машина захвачена.

Ограничение: вектор требует наличия mosh-client на целевой машине или возможности установить его. Если mosh-client отсутствует — можно попробовать загрузить статический бинарь через wget/curl. Вектор также заблокируется, если sudo-правило ограничено конкретным пользователем (например, (mosh : mosh) вместо (ALL)) или если указаны аргументы с ограничениями.

PATH hijacking Linux privesc: когда подмена в PATH работает

Sudo-правило в Underpass указывает полный путь /usr/bin/mosh-server, поэтому PATH hijacking (T1574.007 — подмена исполняемого файла через манипуляцию переменной окружения PATH) здесь не сработает. Но технику стоит понимать — она встречается на других машинах HackTheBox и в реальных пентестах legacy-инфраструктур.

Механика PATH hijacking: когда система получает команду без полного пути (просто mosh-server вместо /usr/bin/mosh-server), она ищет исполняемый файл по директориям из переменной PATH слева направо. Если атакующий поместит поддельный бинарь с тем же именем в директорию, которая стоит в PATH раньше — система выполнит подделку.

Пример: если бы sudo-правило выглядело как (ALL) NOPASSWD: mosh-server (без полного пути), атакующий мог бы создать echo '/bin/bash -p' > /tmp/mosh-server && chmod +x /tmp/mosh-server, добавить /tmp в начало PATH командой export PATH=/tmp:$PATH и запустить sudo mosh-server. Система нашла бы /tmp/mosh-server раньше оригинала и выполнила бы вредоносный скрипт от root.

Когда PATH hijacking работает: sudo-правило без полного пути к бинарю; secure_path в /etc/sudoers не задан или пользователь может влиять на PATH через env_keep; директория для поддельного файла доступна на запись; файловая система не смонтирована с noexec.

Когда не работает: полный путь в sudo-правиле (как в Underpass); включён secure_path; SELinux/AppArmor блокируют исполнение из нестандартных директорий; /tmp смонтирован с noexec; используется env_reset без env_keep для PATH.

Чеклист защиты для системного администратора

Конкретные действия, которые предотвратили бы захват Underpass на каждом этапе. Формат готов для включения в отчёт по аудиту или передачи ответственному специалисту:

  1. Сменить community string SNMP с public на случайную строку длиной 20+ символов; при возможности перейти на SNMPv3 с режимом authPriv (аутентификация и шифрование)
  2. Ограничить SNMP по IP источника через iptables -A INPUT -p udp --dport 161 -s <IP_мониторинга> -j ACCEPT и iptables -A INPUT -p udp --dport 161 -j DROP
  3. Удалить реальные email из sysContact SNMP или заменить на generic-адрес
  4. Сменить дефолтные учётные данные daloRADIUS сразу после установки — administrator:radius заменить на уникальный пароль
  5. Закрыть панель daloRADIUS от внешнего доступа через VPN или IP-whitelist на уровне Apache (Require ip 10.0.0.0/8)
  6. Перевести хранение паролей RADIUS на bcrypt или scrypt вместо MD5 без соли
  7. Ограничить sudo-правило mosh-server: указать конкретного пользователя вместо (ALL), добавить NOEXEC для предотвращения shell escape
  8. Задать secure_path в /etc/sudoers — явный PATH для sudo-сессий, исключающий пользовательские директории
  9. Настроить профиль AppArmor или SELinux для mosh-server — ограничить запуск произвольных shell

Справочно: для Ubuntu 22.04 и Apache 2.4 существуют профили DISA STIG (Security Technical Implementation Guides), покрывающие базовый hardening этих сервисов.

Underpass — пример каскада ошибок конфигурации. Ни одной уязвимости в коде: SNMP работает штатно, daloRADIUS работает штатно, sudo работает штатно. Вся атака построена на том, что админ не потратил 10 минут на настройку после установки. По данным CrowdStrike Global Threat Report 2025, 75% вторжений используют действительные учётные данные — значительная часть из них получена через дефолтные конфигурации, утёкшие хеши и слабые пароли.

На реальных внутренних пентестах community string public встречается куда чаще, чем хотелось бы. Маршрутизаторы «временно поставили и забыли», принтеры с открытым SNMP, системы мониторинга с дефолтами — всё это рабочие векторы, которые проверяются одной командой за три секунды. Машина Underpass моделирует именно этот сценарий: не zero-day, не сложный exploit, а системная небрежность. В этом её главная ценность для обучения. Разница между «прочитал writeup» и «понял, почему это работает» — в осознании механики за каждым шагом: зачем UDP-скан, как устроен SNMP, почему sudo с (ALL) опасен. Если хочется разбираться в этой логике системно, а не прыгать от writeup к writeup — IB Basics для тех, кому скучно от Hack The Box без объяснений почему.

Эту тему и смежные навыки разбирают на практике в курсе «Специалист по тестированию на проникновение» Codeby Academy.