Shellshock Lab
Shellshock
1 Overview-概述
- 2014 年 9 月 24 日,发现了 bash 中的一个严重漏洞。 该漏洞绰号为 Shellshock,可以利用许多系统并从远程或从本地计算机启动。 在本实验中,学生需要研究此攻击,以便了解 Shellshock 漏洞。 本实验的学习目标是让学生亲身体验这次有趣的攻击,了解它是如何工作的,并思考我们可以从这次攻击中吸取的教训。 本实验涵盖以下主题:
- Shellshock
- 环境变量
- bash 中的函数定义
- Apache 和 CGI 程序
Lab environment-实验环境
- 该实验已在我们预先构建的 Ubuntu 20.04 VM 上进行了测试,该 VM 可从 SEED 网站下载。 由于我们使用容器来设置实验室环境,因此本实验不太依赖 SEED VM。 可以使用其他 VM、物理机或云上的 VM 来完成此实验。
2 Environment Setup-环境设置
2.1 DNS Setting-DNS设置
在我们的设置中,Web 服务器容器的 IP 地址是 10.9.0.80。 服务器的主机名称为 www.seedlab-shellshock.com。 我们需要将此名称映射到 IP 地址。 请将以下内容添加到 /etc/hosts 中。 你需要使用root权限来修改这个文件:
1 |
|
2.2 Container Setup and Commands-容器设置和命令
请从实验室网站下载 Labsetup.zip 文件到您的虚拟机,解压,进入 Labsetup 文件夹,使用 docker-compose.yml 文件设置实验室环境。 该文件内容的详细说明以及所有涉及的Dockerfile可以从用户手册中找到,该手册链接到本实验室的网站。 如果这是您第一次使用容器设置 SEED 实验室环境,阅读用户手册非常重要。
下面我们列出一些与 Docker 和 Compose 相关的常用命令。 由于我们将非常频繁地使用这些命令,因此我们在 .bashrc 文件(在我们提供的 SEEDUbuntu 20.04 VM 中)为它们创建了别名。
1 |
|
所有容器都将在后台运行。 要在容器上运行命令,我们通常需要在该容器上获得一个 shell。 我们首先需要使用“docker ps”命令找出容器的ID,然后使用“docker exec”在该容器上启动一个shell。 我们在 .bashrc 文件中为它们创建了别名。
1 |
|
实验记录:
2.3 Web Server and CGI-Web 服务器和 CGI
在本实验中,我们将对 Web 服务器容器发起 Shellshock 攻击。 许多 Web 服务器启用 CGI,这是一种用于在网页和 Web 应用程序上生成动态内容的标准方法。 很多CGI程序都是shell脚本,所以在实际的CGI程序运行之前,会先调用一个shell程序,这样的调用是由远程计算机的用户触发的。 如果shell程序是一个易受攻击的bash程序,我们可以利用易受攻击的Shellshock获取服务器权限。
在我们的 Web 服务器容器中,我们已经设置了一个非常简单的 CGI 程序(称为 vul.cgi)。 它使用 shell 脚本简单地打印出“Hello World”。 CGI 程序放在 Apache 的默认 CGI 文件夹 /usr/lib/cgi-bin 中,它必须是可执行的。
-
Listing 1: vul.cgi
1
2
3
4
5#!/bin/bash shellshock
echo "Content-type: text/plain"
echo
echo
echo "Hello World"CGI 程序使用 /bin/bash shellshock(第一行),而不是使用 /bin/bash。 此行指定应调用哪个 shell 程序来运行脚本。 我们确实需要在本实验中使用易受攻击的 bash。
要从 Web 访问 CGI 程序,我们可以使用浏览器输入以下 URL:http://www.seedlab-shellshock.com/cgi-bin/vul.cgi,或者使用以下命令行程序 curl 做同样的事。 请确保 Web 服务器容器正在运行。
1 |
|
3 Lab Tasks-实验任务
3.1 Task 1: Experimenting with Bash Function-试验Bash函数
Ubuntu 20.04 中的 bash 程序已经打过补丁,所以它不再容易受到 Shellshock 攻击。 出于本实验的目的,我们在容器内(/bin 内)安装了一个易受攻击的 bash 版本。 该程序也可以在 Labsetup 文件夹中找到(内部图像 www)。 它的名字是 bash_shellshock。 我们需要在我们的任务中使用这个 bash。 您可以在容器中或直接在您的计算机上运行此 shell 程序。
请设计一个实验来验证这个 bash 是否容易受到 Shellshock 攻击。对补丁版本 /bin/bash 进行相同的实验并报告您的观察结果。
实验记录
- 这里我在容器中运行有漏洞bash版本:bash_shellshock,可以发现
extra
被输出,即额外的命令被执行了。echo
用于显示变量,declare -f
用于显示函数。可见bash_shellshock将分号前的部分解析为函数定义,执行了分号后的shell命令。
- 运行补丁版本的bash,不会输出
extra
。
3.2 Task 2: Passing Data to Bash via Environment Variable-通过环境变量将数据传递给 Bash
为了利用基于 bash 的 CGI 程序中的 Shellshock 漏洞,攻击者需要将他们的数据传递给易受攻击的 bash 程序,并且需要通过环境变量传递数据。 在这项任务中,我们需要了解如何实现这一目标。 我们在服务器上提供了另一个 CGI 程序 (getenv.cgi) 来帮助您识别哪些用户数据可以进入 CGI 程序的环境变量。 这个 CGI 程序打印出它所有的环境变量。
-
Listing 2: getenv.cgi
1
2
3
4
5#!/bin/bash_shellshock
echo "Content-type: text/plain"
echo
echo "****** Environment Variables ******"
strings /proc/$$/environ ①
Task 2.A: Using brower-使用浏览器
在上面的代码中,行 ①打印出当前进程中所有环境变量的内容。 通常,如果您使用浏览器访问 CGI 程序,您会看到类似以下内容。 请确定浏览器设置了哪些环境变量的值。 您可以在浏览器上打开 HTTP Header Live 扩展来捕获 HTTP 请求,并将请求与服务器打印的环境变量进行比较。 请在实验报告中包括您的调查结果。
1 |
|
实验记录
- 结论:HTTP 请求的Host、User-Agent等信息会变为环境变量。
Task 2.A: Using curl-使用curl
- 注:本任务可以在本机终端运行。而下列操作是在容器中自娱自乐。
如果我们想将环境变量数据设置为任意值,我们将不得不修改浏览器的行为,那太复杂了。 幸运的是,有一个名为 curl 的命令行工具,它允许用户控制 HTTP 请求中的大部分字段。 以下是一些有用的选项: (1) -v 字段可以打印出 HTTP 请求的标头; (2) -A, -e, -H 选项可以设置header请求中的一些字段,你需要弄清楚它们分别设置了哪些字段。 请在实验室报告中包括您的发现。 以下是有关如何使用这些字段的示例:
1 |
|
根据这个实验,请描述一下curl的哪些选项可以用来将数据注入到目标CGI程序的环境变量中。
实验记录
- -A:设置用户代理(User-Agent);
- -e:设置 HTTP 的标头Referer,表示请求的来源;
- -H:添加自定义的 HTTP 请求头。
3.3 Task 3: Launching the Shellshock Attack-发起 Shellshock 攻击
我们现在可以发起 Shellshock 攻击。 攻击不依赖于 CGI 程序中的内容,因为它针对的是 bash 程序,该程序在执行实际 CGI 脚本之前被调用。 你的工作是通过 URL http://www.seedlab-shellshock.com/cgi-bin/vul.cgi 发起攻击,这样你就可以让服务器运行任意命令。
如果您的命令有纯文本输出,并且您希望输出返回给您,则您的输出需要遵循一个协议:它应该以 Content type: text/plain 开头,后跟一个空行,然后您可以放置您的 纯文本输出。 例如,如果您希望服务器返回其文件夹中的文件列表,您的命令将如下所示:
1 |
|
Task 3.A:
-
Get the server to send back the content of the /etc/passwd file.
-
让服务器发回 /etc/passwd 文件的内容。
-
这里使用 -A
Task 3.B:
-
Get the server to tell you its process’ user ID. You can use the /bin/id command to print out the ID information.
-
让服务器告诉你它的进程的用户 ID。 您可以使用 /bin/id 命令打印出 ID 信息。
-
这里使用 -e
Task 3.C:
-
Get the server to create a file inside the /tmp folder. You need to get into the container to see whether the file is created or not, or use another Shellshock attack to list the /tmp folder.
-
让服务器在 /tmp 文件夹中创建一个文件。 需要进入容器查看文件是否创建,或者使用另一个Shellshock攻击列出/tmp文件夹。
-
这里使用 -H
- 图例中,创建的文件为file。
Task 3.D
-
Get the server to delete the file that you just created inside the /tmp folder.
-
让服务器删除您刚刚在 /tmp 文件夹中创建的文件。
Questions-问题
-
问题 1:你能从服务器窃取影子文件 /etc/shadow 的内容吗?为什么或者为什么不? 在Task 3.B 中获得的信息应该会给你一个线索。
- 答:不能。因为打开/etc/shadow需要root权限。从Task 3.B中我们可以知道当前用户id为33,并非root。
-
问题 2:HTTP GET 请求通常在 URL 中附加数据,在 ? 标记后。 这可能是我们可以用来发起攻击的另一种方法。 在下面的例子中,我们在URL中附加了一些数据,我们发现这些数据是用来设置如下环境变量的:
1
2
3
4$ curl "http://www.seedlab-shellshock.com/cgi-bin/getenv.cgi?AAAAA"
...
UERY_STRING=AAAAA
...我们可以使用这种方法来发起 Shellshock 攻击吗? 请进行您的实验并根据您的实验结果得出您的结论。
-
不能。因为空格在URL中需要被转义,而函数定义的左大括号前后都需要有一个空格,否则整个字符串无法被解析。
-
3.4 Task 4: Getting a Reverse Shell via Shellshock Attack-通过 Shellshock 攻击获取反向 Shell
Shellshock 漏洞允许攻击者在目标机器上运行任意命令。 在真正的攻击中,攻击者通常选择运行一个 shell 命令,而不是对攻击中的命令进行硬编码,因此他们可以使用这个 shell 运行其他命令,只要 shell 程序还活着。 为了实现这一目标,攻击者需要运行一个反向 shell。
反向 shell 是在机器上启动的 shell 进程,其输入和输出由远程计算机的某个人控制。 基本上,shell 在受害者的机器上运行,但它从攻击者的机器上获取输入,并将其输出打印在攻击者的机器上。 反向 shell 为攻击者提供了一种在受感染机器上运行命令的便捷方式。 可以在 SEED 书中找到有关如何创建反向 shell 的详细说明。 在此任务中,您需要演示如何使用 Shellshock 攻击从受害者那里获取反向 shell。
实验记录
-
打开攻击者的9090端口进行监听。
-
查看攻击者TCP服务器的ip地址:10.9.0.1。
-
实行shellshock攻击
-
成功创建反向shell
3.5 Task 5: Using the Patched Bash-任务 5:使用修补的 Bash
现在,让我们使用一个已经打过补丁的 bash 程序。 程序 /bin/bash
是一个补丁版本。 请用这个程序替换 CGI 程序的第一行。 重做任务 3 并描述您的观察结果。
实验记录
- image_www下新建vul1.cgi,名称加入Dockerfile,重新搭建容器。
-
重新执行Task3中的命令,发现输出Hello World。
-
故无法攻击修复后的bash
本博客所有文章除特别声明外,均为博客作者本人编写整理,转载请联系作者!