
Shellshock
Shellshock
Скачайте файлы docker-compose.yml и poc.py Обязательно установите библиотеку requests с помощью pip install requests!!! Если вы используете uv, поместите библиотеку requests в venv через uv!!!
| Официальное описание CVE |
|---|
| В GNU Bash до версии 4.3 существовала проблема обработки строк, следующих за определением функции в значении переменной окружения. Используя эту уязвимость, удалённый злоумышленник мог выполнить произвольный код через подделанное окружение. Уязвимость была обнаружена в функции ForceCommand в OpenSSH sshd, в модулях mod_cgi и mod_cgid Apache HTTP Server, в скриптах, выполняемых некоторыми DHCP-клиентами, а также в ряде ситуаций, где права на выполнение Bash и установка переменных окружения пересекают границы прав. Она также известна как «ShellShock». Примечание: первоначальное исправление этой проблемы было ошибочным, и для устранения уязвимости, всё ещё существовавшей после некорректного исправления, был назначен CVE-2014-7169. |

| Конфигурация окружения |
|---|
Конфигурация Dockerfile
| ОС | веб-сервер | версия bash |
|---|---|---|
| Debian 10 | Apach | 4.2.37(1) |

При выполнении команды docker compose up Dockerfile написан так, чтобы веб-сервер оставался запущенным.
Поскольку os, apach и т.д. в Dockerfile загружаются из внешних репозиториев, я пометил собранный образ тегом, отправил его в Docker Hub и указал этот образ в файле docker-compose.yml, чтобы даже при удалении оригинала всё продолжало работать.

| Условия уязвимости |
|---|
Нужна bash-оболочка, в которой присутствует уязвимость Shellshock. Я использовал bash-оболочку версии 4.2.37(1).

Кроме того, код выполняется только после того, как он помещён в переменные окружения и вызывается bash, поэтому необходимо наличие программы, способной вызывать bash. Я установил CGI-программу, используемую веб-сервером для обработки клиентских запросов. Согласно спецификации CGI (RFC 3875), веб-сервер помещает все заголовки, отправленные браузером, в переменные окружения Linux для обработки.
При этих условиях веб-сервер отправляет запрос, и информация из заголовков сохраняется в переменные окружения (в соответствии со спецификацией CGI). Атака завершается тем, что CGI вызывает bash-оболочку, в которой есть уязвимость, позволяющая выполнять строку после определения функции в переменной окружения.
Запрос (код встраивается в заголовок User-Agent) -> CGI вызывает bash -> подключение reverse shell
| Процедура воспроизведения |
|---|

| Результат |
|---|
Терминал, в котором вы слушали порт на шаге 2 процедуры воспроизведения, подключается к bash-оболочке внутри контейнера, и в нём можно выполнять команды whoami, id и т.д.

| Причина возникновения уязвимости |
|---|
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
{
string_length = strlen (string);
temp_string = (char *)xmalloc (3 + string_length + char_index);
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
// 이하 생략
'''
Причина уязвимости находится в функции initialize_shell_variables внутри файла variables.c в коде bash-оболочки. Сама функция слишком длинная, поэтому я вырезал только ключевую часть.
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
'''
Этот if проверяет с помощью STREQN ("() {", string, 4), начинается ли строка с «() {». Если совпадает, она считается функцией. Удивительно, но после этого никакой фильтрации string нет, поэтому и возникла проблема.
'''
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
''' Этот код объединяет имя и значение. Поскольку значение уже было проверено выше, string начинается с () {, а name — это имя переменной окружения.
Затем имя и значение переменной окружения объединяются и передаются в код ниже для разбора. Так как проверка выше была только для () {, команды whoami, id, pwd и т.д., добавленные после определения функции, тоже полностью выполняются.
'''
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
'''
| Меры противодействия |
|---|
| Обновите Bash до версии, не подверженной уязвимости Shellshock. |
| Не используйте программы, вызывающие bash-оболочку. |