SEED Labs – Shellshock Attack Lab

Task 1: Experimenting with Bash Function

Ubuntu 16.04中的Bash程序已被修补,因此它不再容易受到Shellshock的攻击。为了本实验的目的,我们在/bin文件夹中安装了易受攻击的Bash版本。它的名字叫bash_shellshock。 我们需要在任务中使用此Bash。 请运行此易受攻击的版本的Bash,如下所示,然后设计一个实验来验证该Bash是否易受攻击Shellshock攻击与否。

$ /bin/bash_shellshock

在补丁版本的bash(/bin/bash)上尝试相同的实验,并报告您的观察结果。
实验步骤如下:
1,设计一个实验。定义一个包含特殊内容的shell变量foo。用一个看上去是函数定义的字符串作为变量foo的值,并且在结尾的大括号后面添加一个额外的命令(echo)(左大括号前后都需要有一个空格)。在补丁版本的bash(/bin/bash)上尝试,对于当前进程来说,这些圆括号、大括号没有任何特别的含义,它们仅仅是一个变量的内容,就如同内容中的其他字符一样。 这也是用declare命令列出所有函数定义时显示为空的原因。因为foo只是一个变量,不是函数。

2,用export 命令标记该shell变量,这样它会作为环境变量传给子进程。此时运行有漏洞版本的bash,当一个子Bash进程被创建时,子shell将会解析该环境变量,把它转化为子函数定义。在解析的过程中,由于Shellshock漏洞,Bash将执行大括号后面的额外命令。因此,当有漏洞版本的Bash在子进程中运行后,一个“ extra”字符串被打印出来。

3,在补丁版本的bash(/bin/bash)上运行结果如下:

额外的命令不会被打印出来。
总结:父进程可以通过环境变量向子shell进程传递函数定义。当子进程中的Bash将环境变量转换成函数时,Bash应当将变量中的指令解析出来,而不是执行它们。但是由于解析逻辑中的漏洞,Bash可能会执行变量中包含的一些指令。
实验说明有漏洞版本的Bash易受攻击Shellshock攻击。

Task 2: Setting up CGI programs

在本实验中,我们将在远程Web服务器上发起Shellshock攻击。 许多网络服务器启用CGI,这是用于在网页和Web应用程序上生成动态内容的标准方法。许多CGI程序是使用Shell脚本编写的。因此,在执行CGI程序之前,需要一个Shell程序将首先调用,然后由用户从远程计算机触发这样的调用。 如果外壳该程序是一个易受攻击的Bash程序,我们可以利用Shellshock易受攻击的程序来获取特权服务器。
在此任务中,我们将建立一个非常简单的CGI程序(称为myprog.cgi),如下所示。 它只需使用shell脚本打印出“ Hello World”。

请确保在第➀行中使用/bin/bash shellshock,而不要使用/bin/bash。的行指定应调用哪个外壳程序来运行脚本。我们确实需要利用弱势群体在本实验中重击。请将上面的CGI程序放在/usr/lib/cgi-bin目录中并设置其755的权限(因此它是可执行的)。 您需要使用root特权来执行这些操作,因为该文件夹仅root可写。该文件夹是Apache Web服务器的默认CGI目录。要从Web访问此CGI程序,可以使用浏览器通过键入以下URL:http://localhost/cgi-bin/myprog.cgi,或使用以下命令行程序curl做同样的事情:

$ curl http://localhost/cgi-bin/myprog.cgi

在我们的设置中,我们从同一台计算机上运行Web服务器和攻击,这就是为什么我们使用本地主机在实际攻击中,服务器运行在远程计算机上,而不是使用localhost,我们使用服务器的主机名或IP地址。
实验步骤如下:
1,创建一个CGI程序,命名为myprog.cgi内容如下:把这个程序建立在/usr/lib/cgi-bin这个路径下,并且设置权限为755,这样它就是可执行的。这些操作需要使用root权限(用sudo)来完成,因为只有root用户可以修改目录中的文件。


把这个程序设置权限为755:

2,从Web访问此CGI程序,可以使用浏览器通过键入以下URL:http://localhost/cgi-bin/myprog.cgi,或使用以下命令行程序curl做同样的事情:

$ curl http://localhost/cgi-bin/myprog.cgi

我们从同一台计算机上运行Web服务器和攻击。

我们使用curl程序来从攻击者的机器上访问该cgi程序,curl程序用来发送http请求到服务器端的cgi程序。如结果所示,我们利用shellshock漏洞成功从攻击者的机器上访问了服务器中的cgi程序。

Task 3: Passing Data to Bash via Environment Variable

要在基于Bash的CGI程序中利用Shellshock漏洞,攻击者需要将其数据传递给易受攻击的Bash程序,并且数据需要通过环境变量进行传递。 在这项任务中,我们需要看看我们如何实现这个目标。 您可以使用以下CGI程序来证明您可以发送任意字符串到CGI程序,该字符串将显示在环境变量。

在上面的代码中,第①行打印出当前进程中所有环境变量的内容。如果实验成功,您应该可以在从中返回的页面中看到数据字符串服务器。 在您的报告中,请说明远程用户的数据如何进入这些环境变量。
实验步骤如下:

1,利用root权限修改文件myprog.cgi(只有root权限下才能修改这个文件夹的内容)。将下面的内容放在程序中,最后一行的指令
“string/proc/$$/environ”能打印出一个进程的所有环境变量。



2,现在通过curl来访问该CGI程序,使用“-v”选项,curl会打印出HTTP请求和来自服务器的响应:

上面标记的HTTP请求头中的User -Agent字段中,该字段的目的是向服务器提供一些客户端浏览器的信息、它可以帮助服务器根据不同浏览器类型对网页内容的显示方式进行优化。从上面的例子中可以看出,该字段表明客户端是curl。如果通过Firefox浏览器访问同样的URL,该字段会包含一个不同的值,说明客户端是Firefox.显然,该字段是由客户端设置的。
在Web服务器的响应中,CGI 程序将打印出CGI进程的所有环境变量。其中一个环境变量是HTTP_USER_AGENT,它的值和User-Agent字段一模一样。可知服务器从HTTP请求头中获得User-Agent信息,并将它赋值给一个名为HTTP_USER_AGENT的环境变量。
因此可以知道远程用户的数据如何进入这些环境变量:当服务器创建一个子进程执行Bash(使用exec()函数)时,它会为Bash进程提供环境变量。父进程(网络服务进程)将USER_AGENT环境变量传递给子进程(bash进程)。shellshock将该环境变量转化为自己的shell变量,而如果发现一个以一对圆括号开始的环境变量时,将其转化为shell函数。服务器创建一个子进程执行CGI程序时,它会传递该变量以及其他一些环境变量给CGI程序。

Task 4: Launching the Shellshock Attack

设置完上述CGI程序之后,我们现在可以启动Shellshock攻击。 攻击不取决于CGI程序中的内容,因为它针对的是Bash程序,该程序在CGI之前先被调用脚本已执行。 您的目标是通过URL http://localhost/cgi-bin/发起攻击myprog.cgi,这样您就可以实现远程用户无法完成的任务。 在此任务中,您应证明以下内容:
① 使用Shellshock攻击从服务器窃取机密文件的内容。
1,例如可以从下面这个文件获得密码:/var/www/CSRF/Elgg/elgg- config/settings.php。一旦获得了密码,就可以直接登录数据库,盗取或者改动信息。使用命令行工具curl,该命令的“-A”的选项可以用来设置请求的User-Agent字段。下面的命令演示了如何通过Shllshock攻击读取服务器的机密文件。


当一个Web应用连接后台数据库(例如MySQL)时,它需要提供登录密码,这些密码通常是直接写在程序中的,或者存储在配置文件中,远程用户无法读取这些密码,但是如果让服务器运行指令,就可以获得这些密码。Ubuntu虚拟机中的Web服务器运行了几个Web应用,它们中的大多数都是使用数据库的。
2,或者在服务器上创建一个文件1.txt。输入一些信息作为机密信息,并查看文件路径

攻击者使用命令行工具curl,该命令的“-A”的选项可以用来设置请求的User-Agent字段。可以看到,攻击者的命令行显示了服务器文件中的机密信息:

② 回答以下问题:您将能够窃取影子文件/etc/shadow的内容吗?为什么或者为什么不?

盗取影子文件失败,因为没有权限。使用ls命令查看文件权限:

Shadow的所有者是root,有rw的权限;所在组是shadow,组内用户有r的权限;其他组用户无权限读这个文件。
myprog.cgi的所有者是root,有rwx的权限;所在组是root,有rx权限。
所以通过myprog.cgi获得bash_shellshock之后,执行指令。对于shadow来说,myprog.cgi是其他组内用户,没有读的权限,所以不可以通过myprog.cgi执行程序获得shadow的内容。

Task 5: Getting a Reverse Shell via Shellshock Attack

Shellshock漏洞使攻击者可以在目标计算机上运行任意命令。在实际攻击中攻击者经常选择运行shell命令,而不是在攻击中对命令进行硬编码,因此只要shell程序仍然存在,就可以使用此shell运行其他命令。为了实现这个目标,攻击者需要运行反向Shell。
反向shell是在机器上启动的shell进程,其输入和输出由来自远程计算机的人。基本上,shell在受害者的机器上运行,但是需要输入从攻击者的计算机上输出,并将其输出打印在攻击者的计算机上。反壳给攻击者在受感染机器上运行命令的便捷方法。有关如何创建的详细说明可以在SEED书的第3章(第3.4.5节)中找到反向外壳。我们还将总结说明稍后的指南部分。
在此任务中,您需要演示如何通过Shellshock中的漏洞启动反向Shell。一个CGI程序。请说明您的操作方式。在您的报告中,还请说明您如何设置反向shell,以及它为什么起作用。基本上,您需要使用自己的文字来解释反向shell如何在您的Shellshock攻击。
实验步骤如下:
1,先输入ifconfig命令得到服务器和攻击者机器的IP地址,如下:


可知:
服务器IP为:10.0.2.04;
攻击者IP为:10.0.2.15

2,在攻击者端,使用nc来监听9090端口上的TCP连接。

nc命令会阻塞并等待连接。攻击者先运行:“nc -lv 9090”,命令启动TCP服务器,然后在攻击者另一个终端上运行下面的命令向目标服务器的CGI程序发送恶意请求。

得到以下结果:

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

Task 6: Using the Patched Bash

现在,让我们使用一个已修补的Bash程序。 程序/ bin / bash已修补版。 请用此程序替换CGI程序的第一行。 重做任务3和5,以及描述您的观察结果。
先用/ bin / bash已修补版程序替换CGI程序的第一行,如下:

按照上述步骤重做task3和task5即可,在此不详细说明。
结果:换了/bin/bash后重做任务3和5,可以打印环境变量,但不能建立反向shell

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值