
Bash漏洞的原因,修复,验证和分析
一个. 发现Bash漏洞
1. 发现和跟踪漏洞
a)2014年9月24日,外国媒体打破了一个在Linux系统中广泛发现的bash软件漏洞,并将其称为: shellshock,中国中文名称为“ Broken Shell”,CVE漏洞编号: CVE -2014- 6271
b)2014年9月25日,GNU Bash正式发布了补丁. 此后不久,外国安全研究人员表示该补丁已被绕过,导致该漏洞仍未修复.
c)2014年9月26日,红帽安全团队意识到了该漏洞的危险,并为绕过shellshock漏洞创建了一个新的漏洞编号CVE-2014-7169,并发布了一个新补丁.
d)2014年9月27日,GNU Bash提供了最新的升级补丁,每个人都尽快为不同版本进行升级. 升级补丁:
2. 名称说明:
CVE: 常见漏洞和披露
漏洞: 缺陷(多种形式的漏洞);易碎点
暴露: 暴露,暴露
Shellshock: 国内中文名称是“破壳”
震惊: n. 休克;震惊休克;震惊;
两个. 攻击者如何利用Bash漏洞发起攻击
1)Bash漏洞是由bash解释器对变量和函数的严格定义引起的,并且过滤也不严格. 攻击者使用此漏洞进行代码注入.
2)攻击者可以向目标系统发起经过特殊修改的HTTP请求. 请求中的某些字段可通过影响环境变量将恶意代码注入服务器. 当服务器派生一个新进程时,环境变量将被引入到新进程中. 子进程中恶意代码的执行(例如HTTP_USER_AGENT环境变量)仅由浏览器发出.
3)如果系统中存在攻击者植入的环境变量,则在系统执行新程序时,将引入环境变量,并执行恶意代码.
三个. Babsh漏洞检测
1. 环境说明:
系统版本: CentOS 6.5版(最终版)
内核版本: 2.6.32-431.el6.x86_64
Bash版本: GNU bash,版本4.1.2(1)-发行版(x86_64)
2. 漏洞验证: CVE-2014-6271:
[root @ master〜]#env x ='(){: ;}; echo CVE-2014-6271'bash -c“ echo test”
如果出现以下两行,则表明bash中存在6271漏洞.
CVE-2014-6271
测试
3. 漏洞验证: CVE-2014-7169
[root @ master〜]#env x ='(){(a)=> \'bash -c“ echo date”;猫回声

如果出现以下提示: bash中存在7169漏洞.
bash: x: 第1行: 语法错误接近意外令牌'='
bash: x: 第1行: “'
bash: 导入x的函数定义时出错
Sun Apr 19 22:03:03 CST 2015这是当前系统时间
四个. Bash错误修复
a)YUM方法:
好好清理所有
yum makecache
yum -y更新bash
b)源模式:
2. 登录
3. 下载新版本bash源码包,然后上传到目标系统
下载 bash-4.3.30.tar.gz 07-Nov-2014 09:19 7.6M
请注意最后修改日期: 2014-11-07(由于漏洞而于2014-09-25找到)
因此,BASH版本应在漏洞发现日期之后下载bash软件包
下载后,上传到目标系统
或直接从目标系统下载
Wget
4. YUM安装和编辑工具: gcc gcc-c ++ automake autoconf
yuminstall gcc gcc-c ++ automake autoconf --y
autoconf noarch 2.63-5.1.el6 c6-media 781 k
automake noarch 1.11.1-4.el6 c6-media 550 k
gcc-c ++ x86_64 4.4.7-4.el6 c6-media 4.7 M
安装依赖项:
libstdc ++-devel x86_64 4.4.7-4.el6 c6-media 1.6 M
5. 安装bash-4.3.30
tar --zxf bash-4.3.30.tar.gz
cd /root/bash-4.3.30
./ configure默认安装在/ usr / local

进行&&进行测试&&进行安装
过程有点长,请耐心等待. . . . .
安装完成后,重新启动系统,重新启动
6. 查看新版本的Bash
[root @ master〜]#bash --version
GNU bash,版本4.3.30(1)-发布
7. 安装另一个版本: bash-4.2.53.tar.gz
该过程与安装bash-4.3.30相同
唯一的区别: 安装的软件包比第3步多
五个. Bash漏洞验证和验证
1. 漏洞修复验证: CVE-2014-6271:
[root @ master〜]#env x ='(){: ;}; echo CVE-2014-6271'bash -c“ echo test”
测试
如果仅输出测试,则表明漏洞已修复.
2. 漏洞修复验证: CVE-2014-7169:
[root @ master〜]#env x ='(){(a)=> \'bash -c“ echodate”;猫回声
日期
cat: echo: 没有这样的文件或目录
如果输出上述两行,则表明漏洞已解决
六个. Bash漏洞分析
引自以下内容: “ Bash代码注入的安全漏洞的详细说明”
细节太多,原理和细节都直接引用了.
原理和技术细节
为阐明这一原理和细节,我们需要从bash的环境变量开始.
bash环境变量
每个人都知道环境变量,我不需要推广它. 环境变量是操作系统的操作系统外壳中的变量. 许多程序通过环境变量更改其执行行为. 在bash中定义环境变量的语法很简单(请注意: =符号前后不能有空格):
$ var =“ hello world”
然后可以使用此变量,例如: echo $ var或其他内容. 但是,我们必须知道,该变量只是当前shell的“局部变量”,只能在当前shell进程中访问. 此shell进程派生的进程不可访问.
您可以执行此测试:

在上面的测试中,第三个命令执行了一个bash,即启动了bash的子进程,您将发现无法访问var.
要使Shell的子进程可访问,我们需要将其导出:
此环境变量将在其子进程中可见.
如果要查看哪些环境变量在子进程中可见(即是否导出),则可以使用env命令. 但是,env命令也可以用于定义导出环境变量. 看起来像这样:
仅凭这些基础知识还不够. 我们还需要了解一种基础知识-Shell的功能.
bash功能
在bash下定义函数很简单,如下所示:
$ foo(){echo“ hello coolshell”;}
$ foo
你好酷壳
有了上述环境变量的基本知识,您肯定会尝试尝试是否可以在子进程中调用此函数,当然答案是否定的.
您会看到,它与环境变量相同. 如果希望在子进程中可访问,则它仍然相同,需要export,并且export具有参数-f,这意味着导出函数. 如:
好的,我已经讨论了很长时间的基本知识,不用担心,在您理解了这些知识之后,您将很容易理解这两个漏洞是如何发生的.
好的,现在我们要讨论这个问题.
打击错误
从上面我们可以看到bash的变量和函数使用完全相同的机制. 如果使用env命令查看导出的内容,则会看到我们上面定义的变量和函数全部如下(我省略了其他环境变量):
结果是一样的-函数和变量都是变量. 因此,聪明的黑客无需查看bash的源代码,就可以猜测bash判断环境变量是否为函数,具体取决于其值是否以“()”开头. 然后,我想到一个邪恶的想法.
Hacker定义了这样的环境变量(注意: ()和{)之间不能有空格:
$ exportX ='(){在“ X里面回显”;};回显“ X之外”;'
env,您将看到X已经在这里:
然后,当我们在当前bash shell进程下生成bash子进程时,新的子进程将读取父进程的所有导出环境变量,并将其复制到其自己的进程空间中. 显然bash 漏洞测试,上面的X变量函数还会在该函数之后注入一个命令: echo“ outside X”. 在从父级到子级的复制过程中会执行此操作吗? (对于与叉子相关的事情,您可以看一下我之前写的“叉子访谈问题”)
答案是肯定的.
$ exportX ='(){在“ X里面回显”;};回显“ X之外”;'
$ bash
X以外
看,代码注入是这样完成的. 这是bash的错误-函数主体外部的代码是默认执行的.
我们不必如上所述创建另一个bash子进程. 我们可以使用bash -c参数执行bash子进程命令. 就像该漏洞的测试脚本一样:
envVAR ='(){: ;};回声巴什很脆弱! bash-c“ echo Bash测试”
其中,(){: ;}中的冒号等效于/ bin / true,返回true并退出. bash -c实际上是bawn生成中的echo的子进程,用于在函数外部触发echo命令. 因此,更友好的测试脚本将是:

envVAR ='(){: ;};回声巴什很脆弱! bash-c“ echo如果您看到“易受攻击”一词,则说明bash存在安全问题”
好的,您应该了解漏洞的全部原因.
bash漏洞的影响有多大
许在Internet上看到此漏洞并不严重,他们说此问题仅适用于那些执行CGI脚本的过时网站. 不再有使用CGI的网站. 我靠,这真是无所畏惧.
例如bash 漏洞测试,如果您的网站上有调用操作系统的命令,例如您使用PHP执行exec之类的程序. 有这样的要求,尤其是对于某些需要与操作系统进行交互的重要后台管理程序而言. 然后将打开一个bash进程来执行.
我们还知道当前的HTTP服务器基本上是子进程,因此必须导出一些环境变量,并且某些环境变量来自用户端,例如: HTTP_USER_AGENT之类的环境变量仅由浏览器发出. 实际上,可以根据需要编写此变量.
因此,我可以将HTTP_USER_AGENT环境变量设置为上述测试脚本,但是我将替换echo Bash容易受到攻击!还有更残酷的东西哈哈.
AfterShock-CVE-2014-7169测试脚本的解释
许多学生不理解以下测试脚本的含义. 我会在这里解释.
·X ='(){(a)=> \’不用说,定义X环境变量. 但是,此功能不完整,是的,这是有意的. 另外,您必须注意\’不是用于单引号的转义,变量X的值为(){(a)=> \
·(a)=这件事的目的是使bash的解释器出错(语法错误).
·语法错误后,缓冲区中仅剩下两个字符“> \”. [我不明白为什么只留下>>]
·然后,此魔术bash将以下命令回显日期放在换行符的新行中,然后执行.
等效于在shell中执行以下命令:
如果您了解bash,就知道\用于命令行中的换行符,因此等效于执行:
这不只是重定向吗?上面的命令等效于:
因此,回显文件将出现在当前目录中. 该文件的内容是date命令的输出.
要点再次说明:
[root @ master〜]#>测试文件日期
#上面的一行表示date命令的执行结果被重定向到测试文件
[root @ master〜]#猫测试文件
2015年4月14日星期二08:22:38
>测试文件日期等于date>测试文件
[root @ master〜]#> \>这是重定向符号
>测试文件日期
[root @ master〜]#
测试语句再次说明:
蓝色日期是执行的命令,攻击者可以用恶意代码替换它.
此处的红色echo不是echo命令,而是作为日期执行结果输出的文件
> \是重定向符号和连续符号
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-151279-1.html
他不会因为南海而丢了中东和欧洲