目录
1.0 前言
2. 0 实验任务
2.1任务1:试验Bash函数
2.2任务2:设置CGI程序
2.3 任务3:通过环境变量将数据传递给Bash
2.4任务4:发起shellshock 攻击
2.5任务5:通过Shellshock攻击获得反shell
2.6 任务6:使用补丁的Bash
2014年9月24日,发现了Bash的一个严重漏洞。昵称为Shellshock的这个漏洞可以利用许多系统,并从远程或本地机器上启动。在这个实验室里,学生们需要研究这种攻击,这样他们就能了解Shellshock的弱点。这个实验的学习目标是让学生对这种有趣的攻击有第一手的经验,了解它是如何运作的,并思考我们能从这种攻击中学到什么。该实验室的第一个版本是在2014年9月29日开发的,也就是袭击被报道的五天之后。这是2014年9月30日在我们计算机安全课上分配给学生的。SEED项目的一个重要任务是迅速将真实的攻击转化为教育材料,以便教师能够及时将它们带到课堂上,让学生参与到现实世界中发生的事情中。本实验室包括以下主题:
•shellshock
•环境变量
•Bash中的函数定义
•Apache和CGI程序
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)上运行结果如下:"extra"字符串不会被打印出来
在这个实验中,我们将对一个远程web服务器发起Shellshock攻击。许多web服务器启用CGI,这是一种用于在web页面和web应用程序上生成动态内容的标准方法。许多CGI程序是用shell脚本编写的。因此,在执行CGI程序之前,首先会调用shell程序,这样的调用是由远程计算机上的用户触发的。如果shell程序是一个易受攻击的Bash程序,我们可以利用Shellshock易受攻击来获得服务器上的特权。在这个任务中,我们将设置一个非常简单的CGI程序(称为myprog.cgi),如下所示。它只是使用shell脚本打印出“Hello World”。
#!/bin/bash_shellshock ➀
echo "Content-type: text/plain"
echo
echo
echo "Hello World"
请确认您在①行使用的是/bin/bash_shellshock,而不是/bin/bash.该行指定应该调用哪个shell程序来运行脚本。我们确实需要在实验室里使用易受攻击的Bash。请将上面的CGI程序放在/usr/lib/cgi-bin目录下,并将其权限设置为755(因此它是可执行的)。您需要使用根权限来完成这些操作,因为文件夹只能由根写入。这个文件夹是Apache web服务器的默认CGI目录。要从Web访问这个CGI程序,您可以使用浏览器输入以下URL:http://localhost/cgi-bin/myprog.cgi,或者使用以下命令行程序curl To
做同样的事情:
$ curl http://localhost/cgi-bin/myprog.cgi
在我们的设置中,我们从同一台计算机运行Web服务器和攻击,这就是我们使用localhost的原因。在真正的攻击中,服务器运行在远程机器上,我们使用服务器的主机名或IP地址,而不是localhost。
进入/usr/lib/cig-bin 文件:cd /usr/lib/cgi-bin (如果进入不了usr文件不可自己创建、自己创建文件的方式后续的任务都会有问题,最好换一台虚拟机然后cd 进入)
创建myprog.cgi文件:sudo vim myprog.cgi
更改权限,将权限设置为755:sudo chmod 755 myprog.cgi
查看myprog.cgi文件的情况:ll myprog.cgi
为了利用基于Bash的CGI程序中的Shellshock漏洞,攻击者需要将其数据传递给易受攻击的Bash程序,数据需要通过环境变量传递。在这项任务中,我们需要看看如何实现这个目标。您可以使用以下CGI程序来演示您可以向CGI程序发送任意字符串,该字符串将显示在其中一个环境变量的内容中。
#!/bin/bash_shellshock
echo "Content-type: text/plain"
echo
echo "****** Environment Variables ******"
strings /proc/$$/environ // ➀
在上面的代码中,➀行打印出了当前流程中所有环境变量的内容。如果您的实验成功,您应该能够在从服务器返回的页面中看到您的数据字符串。在您的报告中,请解释来自远程用户的数据如何进入这些环境变量。
myprog2.cgi的内容:
在上面的CGI程序设置好之后,我们现在可以启动Shellshock攻击了。攻击不依赖于CGI程序中的内容,因为它的目标是在CGI脚本执行之前首先调用的Bash程序。您的目标是通过URL http://localhost/CGI-bin/myprog . CGI发起攻击,这样您就可以完成作为远程用户无法完成的事情。在此任务中,您应该演示以下内容:
1、使用Shellshock攻击从服务器上窃取机密文件的内容。
1,例如可以从下面这个文件获得密码:/var/www/CSRF/Elgg/elgg- config/settings.php。一旦获得了密码,就可以直接登录数据库,盗取或者改动信息。使用命令行工具curl,该命令的“-A”的选项可以用来设置请求的User-Agent字段。下面的命令演示了如何通过Shllshock攻击读取服务器的机密文件。
可以看到密码:
当一个Web应用连接后台数据库(例如MySQL)时,它需要提供登录密码,这些密码通常是直接写在程序中的,或者存储在配置文件中,远程用户无法读取这些密码,但是如果让服务器运行指令,就可以获得这些密码。Ubuntu虚拟机中的Web服务器运行了几个Web应用,它们中的大多数都是使用数据库的。
2、 您能窃取shadow文件/etc/shadow的内容吗?为什么可以或者为什么不行?
不行。
原因:Shadow的所有者是root,有rw的权限;所在组是shadow,组内用户有r的权限;其他组用户无权限读这个文件。
myprog2.cgi的所有者是root,有rwx的权限;所在组是root,有rx权限。所以通过myprog.cgi获得bash_shellshock之后,执行指令。对于shadow来说,myprog.cgi是其他组内用户,没有读的权限,所以不可以通过myprog.cgi执行程序获得shadow的内容。
Shellshock漏洞允许攻击者在目标计算机上运行任意命令。在真正的攻击中,攻击者通常选择运行shell命令,而不是在攻击中对命令进行硬编码,因此只要shell程序存在,他们就可以使用这个shell来运行其他命令。为了实现这个目标,攻击者需要运行一个反向shell。反向shell是在机器上启动的shell进程,其输入和输出由控制远程电脑上的人。基本上,外壳在受害者的机器上运行,但是它接受输入并在攻击者的机器上打印其输出。反向shell为攻击者提供了一种在受损机器上运行命令的便捷方式。关于如何创建反向外壳的详细解释可以在SEED书籍的第3章(3.4.5)中找到。我们也在后面的指南部分总结了解释。
在此任务中,您需要演示如何通过Shellshock中的漏洞启动反向Shell。一个CGI程序。请说明您的操作方式。在您的报告中,还请说明您如何设置反向shell,以及它为什么起作用。基本上,您需要使用自己的文字来解释反向shell如何在您的Shellshock攻击。
实验步骤如下:
1,先输入ifconfig命令得到服务器和攻击者机器的IP地址,如下:
一个虚拟机作为服务器:ifconfig 、得到ip地址:10.0.2.15
再开另一台虚拟机作为攻击机器:ifconfig、得到ip地址:10.0.2.4
服务器IP为:10.0.2.15
攻击者IP为:10.0.2.4;
首先要检查这个两个机器可否ping通:
服务端:ping 10.0.2.4 攻击端:ping 10.0.2.15
ping通的情况:
如果不通的话、需要检查虚拟机的网络是否改为了NAT、混杂模型是否改为了运行虚拟电脑:
博主在这里的坑搞了一个晚上…………
2,在攻击者端,使用nc来监听9090端口上的TCP连接:
服务端:
攻击端监听更新:
在攻击者另一个终端:
攻击者监听终端:(如果监听不到变换就关掉监听终端再重新打开终端监听:nc -lv 9090)
现在,让我们使用一个已经打过补丁的Bash程序。程序/bin/bash是修补过的版本。请用这个程序替换你的CGI程序的第一行。重做任务3和任务5,描述你的观察结果。
myprog.cgi内容:第一行变为#!/bin/bash
task3重做:不同的是REMOTE_PORT变化了
task5重做:
攻击端:
攻击端监听终端:没有变化
整理不易、科软的师弟师妹给学姐点个赞吧~~!!!
需要更多科软课程资料关注“小柒很爱喵”,回复【Q群】进群拿导图、和各科复习资料。