1. 实验bash功能

Ubuntu16.04中/bin文件夹下有bash和有漏洞的bash_shellshock程序,利用教材代码进行实验,测试有漏洞的bash_shellshock和无漏洞的bash,结果如下:

foo是一个变量,以分号隔开两行指令,前面是函数定义,后面是一行命令

echo命令打印变量,declare命令打印函数

export后作为环境变量传递给子进程,而子进程是bash程序,则会将环境变量转换成一个shell变量,但当发现()开始则会转换成shell函数,所以declare能打印函数而不能打印变量,shellshock漏洞会将{}后面的指令执行出来

具体转化过程:(export之后)

Bash检查环境变量是否(){开头,若是则转化为函数定义

调用parse_and_execute()函数解析函数定义,这个函数功能很强大,不仅能解析函数定义,还能解析和运行shell 指令,所以;隔开的多个shell命令也会被解析执行

Shellshock漏洞条件:目标进程是必运行bash+攻击者通过函数有函数定义的环境变量传给目标进程

在无漏洞的bash中子进程不会将原来的字符串变量转换成函数而是依旧是一个变量,所以declare打印为空

  1. 建立CGI进程

CGI程序是使用Shell脚本编写的。因此,在执行CGI程序之前,将首先调用shell程序,并且这种调用是由用户从远程计算机触发的。

在我们的设置中,我们从同一台计算机上运行Web服务器和攻击,这就是为什么使用localhost的原因。在实际攻击中,服务器在远程计算机上运行,我们使用服务器的主机名或IP地址来代替localhost。

需要将CGI程序放在目标服务器的/usr/lib/cgi-bin目录下,并将权限设置为可执行的775,root权限完成,curl发送HTTP请求,可见执行命令echo打印出Hello World

只写一个CGI脚本,未涉及攻击

  1. 通过环境变量给bash传输数据

CGI请求则服务器会fork新建子进程,然后execve执行

Shellshock攻击成功的两个条件:

触发bash:

CGI程序以#!/bin/bash_shellshock开头所以是一个shell脚本,execve执行的是/bin/bash_shellshock,调用bash执行shell脚本

通过环境变量为bash提供输入:

最后一行指令strings /proc/$$/environ能打印一个进程的所有环境变量,bash将¥$$替换成当前进程ID

通过curl访问CGI程序

可见成功输出环境变量

  1. 发起shellshock攻击

HTTP请求头中的User-Agent字段客户端是curl,因为通过curl客户端访问,赋值给环境变量HTTP_USER_AGENT

Curl -A选项可以设置User-Agent字段

攻击者为User-Agent构造字符串用来触发bash错误解析,例如简单的指令/bin/ls -l /etc/shadow,观察是否会打印这个root的文件信息

但无法查看/etc/shadow的内容,因为需要特权所以无法查看

ls -l打印数据库/var/www/CSRF/Elgg/elgg-config/settings.php的文件权限信息

构造/bin/cat /var/.../settings.php 攻击的原理是 -A 后面的字符串会作为 http头中 的 agent 发送给服务器,apache agent 会构造相应的环境变量传给 shell,有漏洞的shell 看到环境变量以 A=() { 会识别成shell函数,将=替换成空格,也就是A () {,而后调用强大的函数解析函数体{echo hello;};在}后的分号后面的指令执行,从而被攻击。

|grep pass查看数据库密码

  1. 通过shellshock创建反向shell

反向Shell是在计算机上启动的Shell进程,其输入和输出由远程计算机的某人控制。基本上,shell在受害者的计算机上运行,但是它从攻击者的计算机上获取输入,并在攻击者的计算机上打印其输出。

原理同样是:curl -A 设置HTTP头USER-AGETN,赋值给环境变量HTTP-USER-AGENT,shell转化环境变量时发现(){开头转化为函数,这样的话USER_AGENT被转化为一个shell函数和三个shell命令并执行。

在同一台虚拟机上打开两个终端,分别作为攻击者和目标者,用ipconfig查看ip为127.0.0.1

首先在攻击者终端搭建服务器,监听8000端口,输出listening...

然后在目标者终端输入命令,-i表示shell交互式,输出重定向至TCP连接的127.0.0.1的8000端口,0<&1从网络里读取输入,2>&1错误输出也重定向到网络连接。回车后可在攻击者终端看到响应

用户id为www-data

  1. 用无漏洞bash重做3和5

重做3:

修改cgi程序,改为/bin/bash修补版本

复制到/usr/lib/cgi-bin目录下并改为root可执行,成功打印出环境变量,结果与bash_shellshock相同,因为curl没有涉及攻击(比如-A修改HTTP头等),功能时两个shell正常提供的功能

重做5:

在攻击端监听后,到目标端运行恶意指令

可见攻击端没有响应,且输出结果在目标端而不在攻击端,说明反向shell创建失败,只是执行了cgi程序中的打印环境变量,因为bash打补丁后不会再错误的将环境变量解析为函数并分号后面的指令

Comments

⬆︎TOP