记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

Bash 3.0-4.3命令执行漏洞补丁Bypass漏洞分析

2014-09-27 20:35

白天忙着漏洞响应、服务器测试和修复、漏洞影响范围统计等事,直到晚上终于有时间来分析了。

官方提供的第一个补丁主要修改了:

1、参数类型和个数的限制,从注释中即可看出:

#define SEVAL_FUNCDEF 0x080       /* only allow function definitions */
#define SEVAL_ONECMD  0x100       /* only allow a single command */

2、给builtins/evalstring.c文件里的parse_and_execute加入了类型判断:

 if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
 {
    不合法,不是函数定义
    break;
 }

 ...

 // 逻辑为真就表明参数不合法
 if (flags & SEVAL_ONECMD)
     break;

从上面即可看出补丁思路:如果不是函数定义、命令(command)超过一个就判为不合法。什么才算合法呢,Bypass POC给出了答案:

env X='() { (x)=>\' ./bash -c 'my echo hello'

只要函数体满足() {打头就行了。并且这条POC也满足单个命令(command),因为没出现“;”。

Bash Shell在eval的时候遇到语法问题(x)=被忽略了。接着就来到重点了,新的bash进程执行了这条命令:

>\my echo hello

然后在路径下生成了my文件,内容为hello

Bash语法极其怪异,让我们逐一分析。

字符\是个转移字符,当会保留后面跟的文本,\my实际等于字符串my,如果没有\,新的bash进程会把my当作是命令。因为如果你在终端只输入\并回车,当前bash进程会阻塞等待你输入,在POC里,“输入”的就是my

字符>就是传说中的重定向,假设要把进程A的输出写入到文件B中,就写成如下:

A > B

其实你写成> B A形式也可以,不信试试:

[lu4nx@lx-pc /tmp]$ > hi date
[lu4nx@lx-pc /tmp]$ cat hi
2014年 09月 27日 星期六 01:06:06 CST

这种前缀写法我也是头一次见到,这次分析Shell源码,看得出它的设计极其像一个Lisp解析器,我以为这种写法是照顾Lisper,因为Bash结构基本上就是一个交互式(REPL)和eval,而Lisp解析器的核心就是eval,直到我看了Shell的Yacc语法分析(parse.y)后,我才恍然大悟。重定向的语法定义如下:

redirection:    '>' WORD
                       {
                           redir.filename = $2;
                           $$ = make_redirection (1, r_output_direction, redir);
                       }

这里表示,输出的文件是取自$2$2在这段表示参数WORD,如果输入的语句是> A B,那么WORD的实参就是A;如果输入的语句是A > B,那么WORD的实参就是B

所以POC的思路就是定义一个语法不合法的函数体,绕过函数定义的检测代码,然后执行了后面的命令,最终让Bash在初始化的时候执行了>\my echo hello

知识来源: www.shellcodes.org/safe/Bash_3.0-4.3%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E8

阅读:61405 | 评论:0 | 标签:bash 漏洞 bypass

想收藏或者和大家分享这篇好文章→复制链接地址

“Bash 3.0-4.3命令执行漏洞补丁Bypass漏洞分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云