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
10.9.0.80	www.seedlab-shellshock.com

image-20211027165835745

2.2 Container Setup and Commands-容器设置和命令

​ 请从实验室网站下载 Labsetup.zip 文件到您的虚拟机,解压,进入 Labsetup 文件夹,使用 docker-compose.yml 文件设置实验室环境。 该文件内容的详细说明以及所有涉及的Dockerfile可以从用户手册中找到,该手册链接到本实验室的网站。 如果这是您第一次使用容器设置 SEED 实验室环境,阅读用户手册非常重要。

​ 下面我们列出一些与 Docker 和 Compose 相关的常用命令。 由于我们将非常频繁地使用这些命令,因此我们在 .bashrc 文件(在我们提供的 SEEDUbuntu 20.04 VM 中)为它们创建了别名。

1
2
3
4
5
6
7
$ docker-compose build # Build the container image
$ docker-compose up # Start the container
$ docker-compose down # Shut down the container
// Aliases for the Compose commands above
$ dcbuild # Alias for: docker-compose build
$ dcup # Alias for: docker-compose up
$ dcdown # Alias for: docker-compose down

​ 所有容器都将在后台运行。 要在容器上运行命令,我们通常需要在该容器上获得一个 shell。 我们首先需要使用“docker ps”命令找出容器的ID,然后使用“docker exec”在该容器上启动一个shell。 我们在 .bashrc 文件中为它们创建了别名。

1
2
3
4
5
6
7
8
9
10
11
12
$ dockps // Alias for: docker ps --format "{{.ID}} {{.Names}}"
$ docksh <id> // Alias for: docker exec -it <id> /bin/bash
// The following example shows how to get a shell inside hostC
$ dockps
b1004832e275 hostA-10.9.0.5
0af4ea7a3e2e hostB-10.9.0.6
9652715c8e0a hostC-10.9.0.7
$ docksh 96
root@9652715c8e0a:/#
// Note: If a docker command requires a container ID, you do not need to
// type the entire ID string. Typing the first few characters will
// be sufficient, as long as they are unique among all the containers.

实验记录image-20211027201946906 image-20211027202012172 image-20211027203134116

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
$ curl http://www.seedlab-shellshock.com/cgi-bin/vul.cgi

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 进行相同的实验并报告您的观察结果。

实验记录

image-20211027205119366

  • 这里我在容器中运行有漏洞bash版本:bash_shellshock,可以发现extra被输出,即额外的命令被执行了。echo用于显示变量,declare -f用于显示函数。可见bash_shellshock将分号前的部分解析为函数定义,执行了分号后的shell命令。

image-20211027205310744

  • 运行补丁版本的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
2
3
4
5
6
7
****** Environment Variables ******
HTTP_HOST=www.seedlab-shellshock.com
HTTP_USER_AGENT=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) ...
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9, ...
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.5
HTTP_ACCEPT_ENCODING=gzip, deflate
...

实验记录

image-20211027225701084

image-20211027225719230

  • 结论:HTTP 请求的Host、User-Agent等信息会变为环境变量。

Task 2.A: Using curl-使用curl

  • 注:本任务可以在本机终端运行。而下列操作是在容器中自娱自乐。

​ 如果我们想将环境变量数据设置为任意值,我们将不得不修改浏览器的行为,那太复杂了。 幸运的是,有一个名为 curl 的命令行工具,它允许用户控制 HTTP 请求中的大部分字段。 以下是一些有用的选项: (1) -v 字段可以打印出 HTTP 请求的标头; (2) -A, -e, -H 选项可以设置header请求中的一些字段,你需要弄清楚它们分别设置了哪些字段。 请在实验室报告中包括您的发现。 以下是有关如何使用这些字段的示例:

1
2
3
4
$ curl -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -A "my data" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -e "my data" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -H "AAAAAA: BBBBBB" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi

根据这个实验,请描述一下curl的哪些选项可以用来将数据注入到目标CGI程序的环境变量中。

实验记录

image-20211028202210186

image-20211028202303555

image-20211028202341046

image-20211028202420289

  • -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
echo Content_type: text/plain; echo; /bin/ls -l

Task 3.A:

  • Get the server to send back the content of the /etc/passwd file.

  • 让服务器发回 /etc/passwd 文件的内容。

  • 这里使用 -A

    image-20211029191336688

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

    image-20211029191430634

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

    image-20211029191612100

    • 图例中,创建的文件为file。

Task 3.D

  • Get the server to delete the file that you just created inside the /tmp folder.

  • 让服务器删除您刚刚在 /tmp 文件夹中创建的文件。

    image-20211028193124293

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中需要被转义,而函数定义的左大括号前后都需要有一个空格,否则整个字符串无法被解析。

      image-20211028202607706

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端口进行监听。

    image-20211028204828593

  • 查看攻击者TCP服务器的ip地址:10.9.0.1。

    image-20211028204752710

  • 实行shellshock攻击

    image-20211028205621956

  • 成功创建反向shell

    image-20211028205559402

3.5 Task 5: Using the Patched Bash-任务 5:使用修补的 Bash

​ 现在,让我们使用一个已经打过补丁的 bash 程序。 程序 /bin/bash 是一个补丁版本。 请用这个程序替换 CGI 程序的第一行。 重做任务 3 并描述您的观察结果。

实验记录

  • image_www下新建vul1.cgi,名称加入Dockerfile,重新搭建容器。

image-20211028210530090

image-20211028213149416

  • 重新执行Task3中的命令,发现输出Hello World。

    image-20211028213255481

  • 故无法攻击修复后的bash


本博客所有文章除特别声明外,均为博客作者本人编写整理,转载请联系作者!