2019-2020-11 20199313《Linux内核原理与分析》第十二周作业
第十二周学习——“ShellShock攻击实验”
-
问题描述:
- 经过上一阶段的学习,我们逐渐了解了计算机操作系统的核心工作机制,并且对Linux内核装载和启动了可执行程序,追踪了各个函数。
- 通过实验掌握缓冲区溢出的原理,通过使用缓冲区溢出攻击软件模拟入侵远程主机理解缓冲区溢出危害性并理解防范和避免缓冲区溢出攻击的措施。
- 经过上一阶段的学习,我们逐渐了解了计算机操作系统的核心工作机制,并且对Linux内核装载和启动了可执行程序,追踪了各个函数。
-
本周学习:
- 通过实验掌握ShellShock攻击的原理,通过使用ShellShock攻击软件模拟入侵远程主机理解缓冲区溢出危害性
- 进行总结
- 通过实验掌握ShellShock攻击的原理,通过使用ShellShock攻击软件模拟入侵远程主机理解缓冲区溢出危害性
一、理论阐述
ShellShock攻击
- 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发。
- Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞。
- 许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易受攻击的Bash版本上执行任意代码。
- 这可使攻击者在未授权的情况下访问计算机系统。
背景
- Shellshock错误将影响Bash,即各种基于Unix的系统用来执行命令行和命令脚本。它通常安装为系统的默认命令行界面。对Bash的源代码历史的分析显示自1989年9月Bash版本1.03发布以来,这些bug已经存在。
- Shellshock是一个特权升级漏洞,它为系统用户提供了执行应该不可用的命令的方法。这是通过Bash的“函数导出”功能发生的,因此在一个运行的Bash实例中创建的命令脚本可以与下级实例共享。通过在实例之间共享的表内编码脚本(称为环境变量列表)来实现此功能。Bash的每个新实例都会扫描此表以获取编码脚本,将每个实例组装成一个在新实例中定义该脚本的命令,然后执行该命令。新实例假设在列表中找到的脚本来自另一个实例,但是它不能验证这个,也不能验证它构建的命令是一个正确形成的脚本定义。因此,攻击者可以在系统上执行任意命令,或利用Bash命令解释器中可能存在的其他错误(如果攻击者有办法操纵环境变量列表并导致Bash运行)。
- 2014年9月24日向公众发布了这个bug,当时Bash更新了这个修补程序,准备发布尽管需要一些时间来更新计算机来解决潜在的安全问题。
实现过程
1、环境搭建
-
以root权限安装4.1版bash(4.2版本以上的漏洞已经被堵上了)
-
为了加快速度,我们这里使用下面的下载地址 http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz
$ sudo su $ wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz
-
安装:
$ tar xf bash-4.1.tar.gz $ cd bash-4.1 $ ./configure #这一步大概用时3分钟! $ make && make install
-
安装完成:
2、连接过程:
-
在上一步我们已经安装完了4.1版本的bash,接下来检测是否存在shellshock漏洞
$ exit $ env x='() { :; }; echo vulnerable' bash -c "echo this is a test"
- 可见,上图并没有出现“ bulnerable ” 的提示,说明并无漏洞。(若出现如下图这样,则说明存在漏洞)
-
最后,让/bin/sh 指向/bin/bash.
$ sudo ln -sf /bin/bash /bin/sh
3、漏洞原理分析
自定义bash函数foo(),只需要函数名就可以调用该函数,此情况下定义的foo()函数的KEY=foo; VALUE=(){ echo bar; };
$ foo() { echo bar; }
$ foo
> bar
但如果定义export foo(),其内部就变成了:KEY=foo; VALUE=(){ :; };echo Hello World
export foo='() { :; }; echo Hello World'
bash
>Hello World
并且在bash读取了环境变量,在定义foo之后直接调用了后面的函数。 一旦调用bash,自定义的语句就直接触发。