首页 » NetworkSec » Penetration » 正文

重温经典:shellshock漏洞重现及分析

0x00 概述

2014年9月24日,网上爆出shellshock漏洞,掀起一阵波澜。

cve-2014-6721:由于数据没有和代码分离,导致bash的env在处理自动导入函数完成后继续执行后面的代码(命令)。

cve-2014-7169:利用语法报错绕过cve-2014-6721。

简单检测:

0.

查看bash版本是否<4.3

bash –version

<4.3则可能存在漏洞

 

1.

env x='() { :;}; echo vulnerable’ bash -c “echo this is a test”

如果输出了vulnerable则存在漏洞(6271)。

 

2.

env X='() { (a)=>\’ sh -c “echo date”; cat echo

如果当前目录生成了echo文件并且文件内容就是当前时间,则存在漏洞(7169)

 

0x01 触发条件

  1. 服务允许用户定义环境变量。
  2. 服务会调用bash。(创建bash子进程)
  3. 服务调用子bash时加载了用户定义的环境变量。

//如CGI会把HTTP包头部字段env为临时环境变量,并在里面启动子bash,这样就触发了漏洞。

 

0x02影响范围

Bash<4.3

cgi,dhcp,openssh等可与bash交互的应用。

 

0x03 漏洞重现

环境:vulhub

 

0x04 修复方案

升级bash

 

0x05 漏洞分析

export a=aaa:

使变量a在子bash中也可见。

env a=aaa

设置环境变量a,同时export。

6721测试payload:

env x='() { :;}; echo vulnerable’ bash -c “echo this is a test”

以() {开头的定义是函数导出为环境变量,而漏洞bash在处理函数环境变量时并没以};结束,再执行了后面的代码“echo vulnerable”。

bash -c是创建子bash以触发漏洞(echo vulnerable)。

子bash(进程)在复制父bash(进程)会读取父bash(进程)所有环境变量并复制到自己的进程空间,过程中执行了函数体外的代码(命令)。

漏洞函数:parse_and_execute

 

7169测试payload:

env X='() { (a)=>\’ sh -c “echo date”; cat echo

X='() { (a)=>\’

X这个变量的值就是 () { (a)=>\,其中的 (a)=这个东西目的就是为了让bash的解释器出错(语法错误),出错后,在缓冲区中就会只剩下了 “>\”这两个字符。于是,bash会把后面的命令echo date换个行放到这个缓冲区中,然后执行。

相当于:

>\

echo date

即>echo date

重定向,也就是

date > echo

 

0x06 结语

古老的漏洞,现在估计非常少了,但是运气爆发或许就碰到了呢。

Ps:在服务器领域占有不少份额的大多数FreeBSD 和NetBSD已经默认关闭了自动导入函数的功能,以应对未来可能出现的漏洞。

 

0x07 参考资料

https://wps2015.org/drops/drops/Shellshock漏洞回顾与分析测试.html

https://yq.aliyun.com/articles/53608#

https://coolshell.cn/articles/11973.html

codefine.site/2509.html

https://blog.csdn.net/u011721501/article/details/39558303

https://blog.csdn.net/Anprou/article/details/72819989

www.antiy.com/response/Bash Shellshock(cve-2014-6271)_V1.5.pdf

www.91ri.org/10922.html

Comment