首页 » 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

please input captcha *