
Подробный разбор CVE-2021-41773: обход пути и эксплуатация RCE в Apache с пошаговыми командами и анализом первопричин из лабораторной среды TryHackMe.
Описание прохождения комнаты TryHackMe "Modern Web Stacks", посвященной эксплуатации CVE-2021-41773 — уязвимости path traversal в Apache HTTP Server 2.4.49, которая приводит к удаленному выполнению кода при включенном mod_cgi.
| Пункт | Детали |
|---|
| Уязвимость | CVE-2021-41773 — Apache 2.4.49 Path Traversal / RCE |
| Целевой сервис | Apache HTTP Server на порту 8080 |
| Уязвимая версия | Apache/2.4.49 (Unix) |
| Корневая причина | Нарушение порядка нормализации в ap_normalize_path() |
| Воздействие | Чтение произвольных файлов → Удаленное выполнение кода через mod_cgi |
| Используемые инструменты | curl |
В Apache 2.4.49 была изменена работа ap_normalize_path() при обработке URL. Apache должен блокировать любой путь запроса, содержащий ../, до того как он достигнет файловой системы, но фильтр обхода каталога запускается до полного декодирования URL.
Это означает, что запрос с двойным кодированием последовательности .%2e/ не распознается фильтром как ../. Однако когда Apache передает путь ОС, .%2e/ преобразуется в ../, и фильтр обхода каталога уже обойден.
Сама по себе эта уязвимость позволяет читать произвольные файлы за пределами корневого каталога веб-сервера. Воздействие становится критическим при совместном использовании с mod_cgi: если путь обхода ведет к исполняемому файлу, например /bin/sh, внутри каталога с поддержкой CGI (например, /cgi-bin/), Apache выполняет его как CGI-скрипт и передает тело HTTP POST запроса в его stdin — что дает удаленное выполнение команд.
Определили, что заголовок ответа Server цели:
Apache/2.4.49 (Unix)
Эта версия напрямую подвержена CVE-2021-41773.
/cgi-bin/Запросили /cgi-bin/ и получили ответ 403 Forbidden (не 404), что указывает на существование каталога и, вероятно, включенный mod_cgi — предварительное условие для RCE через эту CVE.
Использовали curl с флагом --path-as-is, чтобы отправить закодированную последовательность обхода в точности как набрано, без предварительной нормализации curl на стороне клиента:
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
Почему требуется --path-as-is: по умолчанию curl нормализует URL и удаляет последовательности .%2e/ еще до отправки запроса. --path-as-is сообщает curl отправлять URL точно как написано, сохраняя закодированный обход, чтобы он достиг сервера в неизменном виде.
Полезная нагрузка прошла из /cgi-bin/ в корневую файловую систему, выполнила /bin/sh как CGI-скрипт через внедренное тело POST и вернула содержимое /flag.txt.
Формат флага подтвержден: THM{...}
(Флаг удален в соответствии с правилами TryHackMe для публичных решений.)
mod_cgi + path traversal = RCE. Чтение файлов само по себе плохо; в сочетании с каталогом, в котором можно выполнять CGI, это превращается в выполнение команд.--path-as-is (или аналогичный инструмент для необработанных запросов) крайне важен при тестировании обходов, основанных на кодировании.mod_cgi, если только он явно не требуется.Это описание документирует лабораторную среду (TryHackMe). Несанкционированного доступа к системам не было.