Shellshock Lab

article/2025/9/17 21:31:28

注:全文如下,同时欢迎参观我的个人博客: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权限来修改这个文件:

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 中)为它们创建了别名。

$ 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 文件中为它们创建了别名。

$ 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

    #!/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 服务器容器正在运行。

$ 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

    #!/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 请求,并将请求与服务器打印的环境变量进行比较。 请在实验报告中包括您的调查结果。

****** 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请求中的一些字段,你需要弄清楚它们分别设置了哪些字段。 请在实验室报告中包括您的发现。 以下是有关如何使用这些字段的示例:

$ 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 开头,后跟一个空行,然后您可以放置您的 纯文本输出。 例如,如果您希望服务器返回其文件夹中的文件列表,您的命令将如下所示:

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中附加了一些数据,我们发现这些数据是用来设置如下环境变量的:

    $ 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
    补丁版本。 请用这个程序替换 CGI 程序的第一行。 重做任务 3 并描述您的观察结果。

实验记录

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

image-20211028210530090
image-20211028213149416

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

image-20211028213255481

  • 故无法攻击修复后的bash

http://chatgpt.dhexx.cn/article/YJC3J95C.shtml

相关文章

CVE-2014-6271-bash shellshock-破壳漏洞复现

破壳漏洞&#xff08;shellshock&#xff09;&#xff0c;也被称为bashdoor&#xff0c;是广泛使用的Unix shell中的一系列安全漏洞&#xff0c;其中第一个漏洞于2014年9月24日被披露。许多面向互联网的服务&#xff0c;如一些网络服务器部署&#xff0c;使用bash来处理某些请求…

Vulhub-Shellshock Remote Command Injection (CVE-2014-6271)

Shellshock远程命令注入 验证 $ env x() { :;}; echo vulnerable bash -c echo hello 在终端中运行上面的命令&#xff0c;如果返回有vulnerable&#xff0c;就说明这台服务器中枪了。 把命令中的bash替换成其他类型的shell&#xff0c;可以检查机器上其他shell是否中枪。 1、…

Shellshock(bashdoor)漏洞详细分析、复现

一、Shellshock的背景 Shellshock&#xff0c;又称Bashdoor&#xff0c;是在Unix中广泛使用的Bash shell中的一个安全漏洞&#xff0c;首次于2014年9月24日公开。许多互联网守护进程&#xff0c;如网页服务器&#xff0c;使用bash来处理某些命令&#xff0c;从而允许攻击者在易…

linux网络知识:路由策略(ip rule,ip route)

目录 一&#xff0c;路由策略&#xff08;使用ip rule命令操作路由策略数据库&#xff09; 二&#xff0c;路由表&#xff08;使用ip route命令操作静态路由表&#xff09; 三&#xff0c; ip rule&#xff0c;ip route&#xff0c;iptables 三者之间的关系 一&#xff0c;路…

iproute2 命令详解

iproute2 命令详解 一、和netstat说再见二、篡权的ss三、被ip取代的命令 博客环境说明&#xff1a; 系统版本&#xff1a;CentOS Linux release 7.7.1908 (Core) yum源:阿里源 一、和netstat说再见 netstat命令详解点击这里查看 二、篡权的ss centos安装iproute2命令: yum ins…

linux之ip route命令

1.基础知识 1.1 路由 &#xff08;Routing&#xff09; 1.1.1 路由策略 &#xff08;使用 ip rule 命令操作路由策略数据库&#xff09; 基于策略的路由比传统路由在功能上更强大&#xff0c;使用更灵活&#xff0c;它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

Linux系统route、ip route、ip rule简介

一、相关概念 1. 路由&#xff08;Routing&#xff09; 路由是指设备从一个接口上收到数据包&#xff0c;根据数据包的目的地址进行定向并转发到另一个接口的过程。 2. 路由表&#xff08;routing table&#xff09; 所谓路由表&#xff0c;是指路由器或者其它互联网网络设…

Linux 路由的添加删除-ip route

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 Linux 路由的添加删除-ip route - joshua317的博客 一、路由查看 # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default …

Arch LInux | 网络管理工具iproute2(网络接口、ip地址、路由表)

一、iproute2 Arch LInux已经弃用了 net-tools&#xff0c;转而使用 iproute2。 iproute2提供 ip 命令行接口&#xff0c;用于管理网络接口&#xff0c;IP地址。路由表。 使用 ip 命令配置的信息会在系统重启后丢失&#xff0c;要进行永久配置&#xff0c;可以使用网络管理器…

Linux ip route 常用配置

Linux ip route 常用配置 路由&#xff1a; 路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径&#xff0c;并将该数据有效地传送到目的站点。由此可见&#xff0c;选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作&#xff0c;在路由器…

iproute2路由配置(ip rule、ip route、traceroute)

一、Iproute2简介 Iproute2是一个在Linux下的高级网络管理工具软件。实际上&#xff0c;它是通过rtnetlink sockets方式动态配置内核的一些小工具组成的&#xff0c;从Linux2.2内核开始&#xff0c;Alexey Kuznetsov 实现了通过rtnetlink sockets用来配置网络协议栈&#xff0c…

iproute2编译安装

1、下载iproute2 cd /usr/local/src/ git clone https://github.com/shemminger/iproute2.git稳定版本库 git://git.kernel.org/pub/scm/network/iproute2/iproute2.git 2、下载编译安装libmnl git clone git://git.netfilter.org/libmnl cd libmnl/ sh autogen.sh ./confi…

ip route配置单个网关

环境&#xff1a; 树莓派通过网线连接laptop&#xff0c;走eth0网卡&#xff0c;用于ssh远程树莓派连接wifi&#xff0c;走wlan0网卡&#xff0c;用于访问外网 需求&#xff1a; 现在要让树莓派同时连接两个网络&#xff0c;必须能通过wifi上外网&#xff0c;通过网线能用笔…

ip route内容详解

------分割线------ 我们在k8s-calico2这个node上来看。执行ip r, 在这个node的路由中&#xff0c;需要我们关注的有&#xff1a; 192.168.97.2 dev calic285cddbb40 scope link blackhole 192.168.97.0/26 proto bird 192.168.210.192/26 via 10.173.32.26 dev eth0 proto…

华为路由器静态路由协议配置

华为路由器配置静态路由 静态路由 静态路由&#xff0c;一种路由的方式&#xff0c;路由项&#xff09;由手动配置&#xff0c;而非动态决定。与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变&#xff0c;即使网络状况已经改变或是重新被组态。一般来说&…

静态路由详细讲解

1.路由: 从源主机到目标主机的转发过程 2.路由器的转发原理&#xff1a; 根据路由表转发数据包&#xff0c;有路由条目则转发到下一跳&#xff1b; 无路由条目&#xff0c;则丢弃数据包&#xff0c;返回数据不可达信息。 3.路由表的形成 先添加直连网段路由&…

vue打印功能 手持终端打印小票,电脑连接打印机打印预览

最近的项目有手持终端打印小票和电脑连接诶打印机打印信息 方法有很多种的&#xff1a; 一. vue-print-nb 安装插件 1.安装插件 npm install vue-print-nb --save 2. 在main.js中引入安装的插件 import Print from vue-print-nb Vue.use(Print); 3.直接就可以在相应的页…

用计算机名共享打印机不能打印,共享打印机无法打印怎么办解决教程

在办公室使用共享打印机的时候&#xff0c;难免不遇到一些故障&#xff0c;比如共享打印机无法打印的问题&#xff0c;已经连接上打印机了&#xff0c;但使用它打印的时候就是不行&#xff0c;这时候我们要在自己的电脑上找原因&#xff0c;我们按下面的步骤操作来解决。 1、确…

如何在计算机上取消打印,打印机如何取消打印任务

打印机如何取消打印任务 如果文档正在打印过程中需要取消打印任务&#xff0c;则直接点击打印任务窗口中的“暂停”按钮即可取消打印任务。也可能通过点击Windows任务栏右下角的打印机图标来打开“打印任务”窗口&#xff0c;然后点击“暂停”按钮以暂停打印任务。 打印机如何取…

Excel打印针式打印机备货单

Excel打印针式打印机备货单 1. 进入控制面板2. 设置打印服务器属性3. 测试打印Excel5. 打印不全问题 得力打印机驱动下载官网&#xff1a;https://www.nbdeli.com/services/download.html 1. 进入控制面板 Win10&#xff1a; 快捷键&#xff1a;WinS 输入控制面板即可 2. 设…