Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析

摘要:
Echoshellshocked‘bash–c“echohi”如果输出shellshock表明存在漏洞,则本地漏洞检测的POC分析将口头解释漏洞原理;可以看出,子流程在设置环境变量后也可以使用它。此时,我们将一个函数设置为环境变量x(){echo“test”:

漏洞简介

GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行Shell命令。某些服务和应用允许未经身份验证的远程攻击者提供环境变量以利用此漏洞。此漏洞源于在调用Bash Shell之前可以用构造的值创建环境变量。这些变量可以包含代码,在Shell被调用后会被立即执行。

这个漏洞的英文是:ShellShock,中文名被XCERT命名为:破壳漏洞。

该漏洞在Red Hat、CentOS、Ubuntu 、Fedora 、Amazon Linux 、OS X 10.10中均拥有存在CVE-2014-6271(即“破壳”漏洞)漏洞的Bash版本,同时由于Bash在各主流操作系统的广泛应用,此漏洞的影响范围包括但不限于大多数应用Bash的Unix、Linux、Mac OS X,而针对这些操作系统管理下的数据均存在高危威胁。

漏洞的利用方式会通过与Bash交互的多种应用展开,包括HTTP、OpenSSH、DHCP等

环境部署

安装部署vulhub环境:https://www.cnblogs.com/Cl0ud/p/14195114.html

进入vulhub文件夹

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第1张

进入bash文件夹下的shellshock

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第2张

执行命令启动docker

docker-compose up -d

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第3张

服务起在8080端口

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第4张

本地漏洞检测

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第5张

进入docker容器

payload为: env x='() { :;}; echo shellshocked' bash –c "echo hi"

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第6张

如果输出shellshocked则表示存在漏洞

本地漏洞检测POC分析

口语化阐释一下漏洞原理:父进程中的特殊变量字符串(这里指字符串内容为函数)成为环境变量后,在子进程中调用该字符串时将其理解为函数执行

shell中函数定义:https://www.runoob.com/linux/linux-shell-func.html

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

shell中定义变量

springbird="hi"

使用echo 输出

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第7张

然后开启以后新的进程后,可以看到$springbird变量没有继承到子进程中来

那么我们怎么样才能在子进程中使用父进程的变量呢?(自问自答)

可以将变量存储到环境变量中,这样就可以在父子进程中一起使用该变量了

我们使用export命令将其设置为环境变量,export简介:https://www.runoob.com/linux/linux-comm-export.html

如图:

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第8张

可以看到设置环境变量后子进程也能够使用该变量了

这个时候我们设置一个函数作为环境变量

x(){ echo "test"; }

如图

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第9张

可以看到子进程中也能成功执行该函数

这时候我们改变一点点

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第10张

创建字符串环境变量springbird

export springbird='() { cat /etc/passwd;}'

注意

(){之间有空格

可以看到我们创建的字符串变量被设置成环境变量后在子进程解释成了函数执行,成功读取了 /etc/passwd

所以触发并利用破壳漏洞的所需要的几点:

  • 被攻击的bash存在漏洞(版本小于等于4.3)
  • 攻击者可以控制环境变量
  • 新的bash进程被打开触发漏洞并执行命令

从上面的分析中可以看出,漏洞的根本原因存在于Bash的ENV命令实现上,因此漏洞本身是不能够直接导致远程代码执行的。如果要达到远程代码执行的目的,必须借助第三方服务程序作为媒介才能够实现,第三方服务程序也必须要满足众多条件才可以充当此媒介的角色。

漏洞原理

Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以(){开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。

偷图:

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第11张

插曲

访问靶场的漏洞文件时出现了500 Internal Server Error的错误,即访问http://靶场地址/victim.cgi时报错

进入容器内部

docker exec -it 6d40 bash

查看apache2error.log

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第12张

发现错误为权限不足:

[cgid:error] [pid 69:tid 140543753557888] (13)Permission denied: AH01241: exec of '/var/www/html/victim.cgi' failed

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第13张

修改其权限为755即可

chmod 755 victim.cgi

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第14张

漏洞利用

按照前面分析的漏洞原理,此处构造读取/etc/passwdpayload

() { :; }; echo; /bin/cat /etc/passwd

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第15张

可以看到打出了passwd

还有一个问题

但是我们在victim.cgi文件里面并没有看到调用环境变量,我们从User-agent里面打过去的payload为什么就生效了

Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析第16张

在这篇博文中提到:https://www.guildhab.top/?p=1805

CGI脚本会继承系统的环境变量。CGI环境变量在CGI程序启动时初始化,在结束时销毁。

当一个CGI脚本未被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制,当这个CGI脚本被HTTP服务器调用时,它的环境变量就会增加关于HTTP服务器,客户端,CGI传输过程等条目

也就是说,每当CGI脚本接收到一次HTTP请求,它的环境变量就会新增一些条目,比如User-agentConnection等信息

所以这里我们通过修改User-Agent来修改CGI环境变量

漏洞利用场景

  1. 程序在某一时刻使用 bash 作为脚本解释器处理环境变量赋值
  2. 环境变量的赋值字符串来源于用户输入 , 且没有通过有效的过滤

参考链接

免责声明:文章转载自《Bash 破壳漏洞Shellshock (CVE-2014-6271)复现分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 使用Lazy 懒加载求输出此日期是该年的第几天下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

shell export 作用转载

shell 与 export命令用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令 或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。 此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建 的shell。当一个...

中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-接收和发送数据)

B站:https://space.bilibili.com/309103931 中移4G模块-ML302专栏:https://blog.csdn.net/qq_33259323/category_10453372.html 中移4G模块-ML302文集:https://www.bilibili.com/read/readlist/rl328642 1.中移...

pcntl_fork()函数说明

pcntl_fork()函数复制了当前进程的PCB,并向父进程返回了派生子进程的pid,父子进程并行,打印语句的先后完全看系统的调度算法,打印的内容控制则靠pid变量来控制。因为我们知道pcntl_fork()向父进程返回了派生子进程的pid,是个正整数;而派生子进程的pid变量并没有被改变,这一区别使得我们看到了他们的不同输出。 1. 派生子进程的进程,...

[ 中间件漏洞 ] Tomcat 管理界面弱口令+war后门部署

前言:   Tomcat 支持在后台部署war包,可以直接将webshell部署到web目录下,如果tomcat后台管理用户存在弱口令,这很容易被利用上传webshell。 漏洞复现: 漏洞原理:   Tomcat后台管理界面的用户配置文件为conf目录下的tomcat-users.xml。   登录Tomcat的后台管理界面,上传war包  上传成功...

npm配置文件

npm获取配置的方式,优先级由高到底。 命令行参数。 以设置代理为例:--proxy http://server:port即将proxy的值设为http://server:port。 环境变量。 以npm_config_为前缀的环境变量将会被认为是npm的配置属性。以设置proxy为例可以加入这样的环境变量npm_config_proxy=http://s...

FSR薄膜压力传感器使用教程

FSR薄膜压力传感器教程 本店常用的外形有2种: 圆形: 长条形: 如果用单片机控制建议买带转换的,可以直接接单片机AD口或者数字IO去读取数值; 电压输出的AO接口是模拟量输出,可以接单片机的模拟口AD接口读取数据变化; 而DO输出可以直接接单片机的DO口,判断高低电平, 当压力超过电位器调节的比较值时候DO输出高电平,板载指示灯LED点亮; 低于比...