这两天Shellshock(CVE-2014-6271)漏洞闹的沸沸扬扬,相关链接:
http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-analysis/ 知道创宇的源码级分析
http://coolshell.cn/articles/11973.html 酷壳陈皓的分析
具体细节上面两篇文章应该说的很清楚了,就不多说了。
在陈皓的分析里面,提到了官方补丁的绕过,即CVE-2014-7169。绕过代码如下:
env X='() { (a)=>\' sh -c "echo date";cat echo
关于这个绕过,说一下我自己的观点:
这是一个炫技式的绕过,意义不大。
先说一下Shellshock(CVE-2014-6271)是怎么产生的,PoC如下:
env VAR='() { :;}; echo Bash is vulnerable!' bash -c "echo Bash Test"
() { :;}; echo Bash is vulnerable!
随后bash进程启动初始化的时候,会解析当前的环境变量。但是对于函数没有解析好,造成了命令注入,导致了echo Bash is vulnerable!被执行。
这个洞的核心在于bash解析环境变量的时候没有解析好,只要污染环境变量,都会造成有漏洞的bash执行预先设置好的指令。
也就是说,攻击者只需要污染环境变量就可以了,后面的bash所执行的内容(echo Bash Test)是不用管的,无论执行什么内容,都会导致echo Bash is vulnerable!被执行。
来看一下攻击远程web服务器的PoC:
curl -H 'User-Agent: () { :;}; YOUR COMMAND' http://xxx/cgi-bin/xxx.sh
攻击者发送了User-Agent头为() { :;}; YOUR COMMAND的HTTP报文,其中的YOUR COMMAND是攻击者注入的命令。
前半段的注入的User-Agent就相当于env VAR='() { :;}; YOUR COMMAND',后面服务器执行xxx.sh相当于bash
-c
"echo Bash Test"
。
因此攻击者才可以执行任意指令。
现在来看这个所谓的绕过:
env X='() { (a)=>\' sh -c "echo date";cat echo
其实这个可以写成
env X='() { (a)=>\' bash -c "dumped command";cat dumped
具体为什么这么写,可以看陈皓的分析。
cat dumped仅仅是读取文件,与这个洞无关,可以去掉,于是成为
env X='() { (a)=>\' bash -c "dumped command"
对比第一个PoC:
env VAR='() { :;}; YOUR COMMAND' bash -c "WHATEVER"
可以看到,攻击者根本就没有注入任何的攻击指令(没有YOUR COMMAND)。
攻击者所注入的,仅仅是一个>\,而服务器要执行什么指令,是攻击者所不能控制的。
所以我才说这个所谓的绕过,是炫技式的。
当然这只是我的一家之言,或许某些部分是我没有想明白,欢迎大家跟我讨论。