Bash破壳漏洞Shellshock(CVE-2014-6271)复现分析
漏洞简介
GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利⽤此漏洞改变或绕过环境限制,以执⾏Shell命令。某些服务和应⽤允许未经⾝份验证的远程攻击者提供环境变量以利⽤此漏洞。此漏洞源于在调⽤Bash Shell之前可以⽤构造的值创建环境变量。这些变量可以包含代码,在Shell被调⽤后会被⽴即执⾏。
这个漏洞的英⽂是:ShellShock,中⽂名被XCERT命名为:破壳漏洞。
该漏洞在Red Hat、CentOS、Ubuntu 、Fedora 、Amazon Linux 、OS X 10.10中均拥有存在CVE-2014-6271(即“破壳”漏洞)漏洞的Bash版本,同时由于Bash在各主流操作系统的⼴泛应⽤,此漏洞的影响范围包括但不限于⼤多数应⽤Bash的Unix、Linux、Mac OS X,⽽针对这些操作系统管理下的数据均存在⾼危威胁。
漏洞的利⽤⽅式会通过与Bash交互的多种应⽤展开,包括HTTP、OpenSSH、DHCP等
环境部署
安装部署vulhub环境:
进⼊vulhub⽂件夹
进⼊bash⽂件夹下的shellshock
执⾏命令启动docker
docker-compose up -d
服务起在8080端⼝
本地漏洞检测
进⼊docker容器
payload为: env x='() { :;}; echo shellshocked' bash –c "echo hi"
如果输出shellshocked则表⽰存在漏洞
本地漏洞检测POC分析
⼝语化阐释⼀下漏洞原理:⽗进程中的特殊变量字符串(这⾥指字符串内容为函数)成为环境变量后,在⼦进程中调⽤该字符串时将其理解为函数执⾏在shell中函数定义:
luo发音#!/bin/bash
# author:菜鸟教程
# url:www.runoob
demoFun(){
echo "这是我的第⼀个 shell 函数!"
}
echo "-----函数开始执⾏-----"
demoFun
echo "-----函数执⾏完毕-----"
在shell中定义变量
springbird="hi"
使⽤echo 输出
然后开启以后新的进程后,可以看到$springbird变量没有继承到⼦进程中来
那么我们怎么样才能在⼦进程中使⽤⽗进程的变量呢?(⾃问⾃答)
可以将变量存储到环境变量中,这样就可以在⽗⼦进程中⼀起使⽤该变量了
我们使⽤export命令将其设置为环境变量,export简介:
如图:
可以看到设置环境变量后⼦进程也能够使⽤该变量了
这个时候我们设置⼀个函数作为环境变量
x(){ echo "test"; }
如图
可以看到⼦进程中也能成功执⾏该函数
这时候我们改变⼀点点华清远见成都中心
创建字符串环境变量springbird
export springbird='() { cat /etc/passwd;}'
centos和ubuntu注意:
()和{之间有空格
可以看到我们创建的字符串变量被设置成环境变量后在⼦进程解释成了函数执⾏,成功读取了 /etc/passwd 所以触发并利⽤破壳漏洞的所需要的⼏点:
被攻击的bash存在漏洞(版本⼩于等于4.3)
攻击者可以控制环境变量
新的bash进程被打开触发漏洞并执⾏命令
从上⾯的分析中可以看出,漏洞的根本原因存在于Bash的ENV命令实现上,因此漏洞本⾝是不能够直接导致远程代码执⾏的。如果要达到远程代码执⾏的⽬的,必须借助第三⽅服务程序作为媒介才能够实现,第三⽅服务程序也必须要满⾜众多条件才可以充当此媒介的⾓⾊。
漏洞原理
该Bash使⽤的环境变量是通过函数名称来调⽤的,导致漏洞出问题是以(){开头定义的环境变量在命令ENV中解析成函数后,Bash执⾏并未退出,⽽是继续解析并执⾏shell命令。⽽其核⼼的原因在于在输⼊的过滤中没有严格限制边界,也没有做出合法化的参数判断。
偷图:
request动词用法插曲
访问靶场的漏洞⽂件时出现了500 Internal Server Error的错误,即访问靶场地址/i时报错
进⼊容器内部
docker exec -it 6d40 bash
查看apache2的error.log
发现错误为权限不⾜:
[cgid:error] [pid 69:tid 140543753557888] (13)Permission denied: AH01241: exec of '/var/www/i' failed
修改其权限为755即可
chmod i
漏洞利⽤
按照前⾯分析的漏洞原理,此处构造读取/etc/passwd的payload
() { :; }; echo; /bin/cat /etc/passwd
可以看到打出了passwdfete
还有⼀个问题
但是我们在i⽂件⾥⾯并没有看到调⽤环境变量,我们从User-agent⾥⾯打过去的payload为什么就⽣效了
在这篇博⽂中提到:
CGI脚本会继承系统的环境变量。CGI环境变量在CGI程序启动时初始化,在结束时销毁。
php代码运行sublime
当⼀个CGI脚本未被HTTP服务器调⽤时,它的环境变量⼏乎是系统环境变量的复制,当这个CGI脚本被HTTP服务器调⽤时,它的环境变量就会增加关于HTTP服务器,客户端,CGI传输过程等条⽬

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。