[root@localhost ~]# env X='() { echo 我是环境变量;}; echo 你中招了' bash -c 'env'
你中招了
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
SSH_CONNECTION=172.16.35.220 60128 172.16.35.135 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
X=() { echo 我是环境变量
}
_=/bin/env
问题出现了!此时env为bash设置的环境变量X的值为
() { echo 我是环境变量;}; echo 你中招了
bash把前半部分解释成了函数X的函数体,而把后半部分啥也没做,直接原样转为脚本。解释后的脚本如下:
X() { echo 我是环境变量;};
echo 你中招了
合并后的脚本如下:
X() { echo 我是环境变量;};
echo 你中招了
env
这样就会直接执行 echo 你中招了 ,而其实这个命令可以换成任意其他命令,也就达到让bash执行任意命令的目的了。这就是此次bash漏洞的基本原理。
再来看看打完补丁后的效果。
[root@localhost ~]# env X='() { echo 我是环境变量;}; echo 你中招了' bash -c 'env'
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
X=() { echo 我是环境变量;}; echo 你中招了
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
_=/bin/env
[root@localhost ~]# env X='() { echo 我是环境变量;}; echo 你中招了' bash -c 'echo $X'
() { echo 我是环境变量;}; echo 你中招了
可以看出此时,bash不再把X当成函数来解释,而是把整个环境变量的值都全部作为纯字符串赋予了X。
3 谁会受到bash漏洞的影响?
通过上面的原理分析我们知道,只要是能通过某种手段为bash传递环境变量的程序都受此影响。当然最典型的的就是bash写的CGI程序了,客户端通过在请求字符串里加入值为 () { echo 我是环境变量;}; echo 你中招了的表单值,就可以轻松攻击运行CGI的服务器。
目前大多数的一般网站很少用CGI了,所以问题不算太大。但是有很多的网络设备,如路由器交换机等都使用了perl或者其他语言写的CGI程序,只要是底层调用了bash,那么风险还是很大的。
目前,针对此漏洞的补丁已经发布,请尽快打上。不幸的是打上补丁后仍存在另外的泄露文件内容的漏洞,详情参看如下转载文章:https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x07_DNFWAH_shellshock_bash_story_cve-2014-6271.txt
[sth0r@shawn-fortress]$ uname -a
Linux shawn-fortress 3.7-trunk-686-pae #1 SMP Debian 3.7.2-0+kali8 i686 GNU/Linux
|=-----------------------------------------------------------------=|
|=-----=[ D O N O T F U C K W I T H A H A C K E R ]=-----=|
|=-----------------------------------------------------------------=|
|=------------------------[ #4 File 0x07 ]-------------------------=|
|=-----------------------------------------------------------------=|
|=-------------------=[ Bash Shellshock事件: ]=--------------------=|
|=-------------------=[ CVE-2014-6271资料汇总]=--------------------=|
|=-----------------------------------------------------------------=|
|=---------------------=[ By Shawn the R0ck ]=---------------------=|
|=-----------------------------------------------------------------=|
|=-----------------------=[ Sep 25 2014 ]=------------------------=|
|=-----------------------------------------------------------------=|
--[ Content
0. What is BASH
1. CVE-2014-6271
2. Incomplete patch and story to be continued...
--[ 0. 什么是BASH
Bourne Again Shell(简称BASH)是在GNU/Linux上最流行的SHELL实现,于1980年
诞生,经过了几十年的进化从一个简单的终端命令行解释器演变成了和GNU系统深
度整合的多功能接口。
--[ 1. CVE-2014-6271
法国GNU/Linux爱好者Stéphane Chazelas于2014年9月中旬发现了著名SHELL实现
BASH的一个漏洞,你可以通过构造环境变量的值来执行你想要执行的脚本代码,
据报道称,这个漏洞能影响众多的运行在GNU/Linux上的会跟BASH交互的应用程序,
包括:
** 在sshd配置中使用了ForceCommand用以限制远程用户执行命令,这个漏洞可以
绕过限制去执行任何命令。一些Git和Subversion部署环境的限制Shell也会出
现类似情况,OpenSSH通常用法没有问题。
** Apache服务器使用mod_cgi或者mod_cgid,如果CGI脚本在BASH或者运行在子
SHELL里都会受影响。子Shell中使用C的system/popen,Python中使用
os.system/os.popen,PHP中使用system/exec(CGI模式)和Perl中使用
open/system的情况都会受此漏洞影响。
** PHP脚本执行在mod_php不会受影响。
** DHCP客户端调用shell脚本接收远程恶意服务器的环境变量参数值的情况会被
此漏洞利用。
** 守护进程和SUID程序在环境变量设置的环境下执行SHELL脚本也可能受到影响。
** 任何其他程序执行SHELL脚本时用BASH作为解释器都可能受影响。Shell脚本不
导出的情况下不会受影响。
我们先来看一个简单的POC:
1,本地SHELL环境中测试是否有漏洞:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
如果存在漏洞会打印"vulnerable"。