shellshock漏洞分析

这是tr0ll2靶机涉及到的东西,先看一下在这个靶机上的过程。
咱们获取了noob用户的ssh密钥,以后登陆却失败了:
图片.png
以后咱们输入以下命令:html

ssh  noob@192.168.16.141 -i noob -t '() { :;}; /bin/bash'

再次登陆,竟然成功了:
图片.png
以上就是shellshock攻击,其利用的是bash在导入环境变量函数时候的漏洞,启动bash的时候,它不只会导入这个函数,也会把函数定义后面的命令执行,在有些CGI脚本的设计中,数据是经过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。shell

这个漏洞刚开始接触还会以为有些奇怪,由于命令自己就是bash执行的,不以为有什么危害。实际环境中在远程访问时,有些CGI会把post包中的变量导入成用户变量,并起一个子bash来运行。bash

此利用方式,须要如下条件:

  1. 远程服务会调用bash。(建立bash子进程)
  2. 远程服务容许用户定义环境变量。
  3. 远程服务调用子bash时加载了用户定义的环境变量。

成因分析以下,参考了一位博主的文章,结尾贴连接:
在 bash 中能够自定义 Shell 变量 , 以下所示网络

但此时该变量仅是当前 Shell 的一个局部变量 , 只有在当前 Shell 进程中能够调用 . 即便是当前 Shell Fork 出的子进程 , 也是不能访问该变量的 .ssh

为此 , 咱们能够经过 export 命令 , 将该变量转变为一个环境变量 , 这样当前 Shell 的子进程就能够访问它了
图片.png
不只如此 , 在 Bash 中还能够定义 Shell 函数并将其导出为环境函数 , 只须要指明 -f 参数便可
图片.png
上图这种函数的定义方法是很是广泛的 , 很容易理解 . 但在 Bash 中还有一种独有的方法来定义函数 , 即 : 经过环境变量来定义函数函数

当某个环境变量的值以字符串 " () { " 的格式做为开头( 注意大括号与小括号间的空格不能少 ) , 那么该变量就会被当前 Bash 看成一个导出函数( export function ) , 该函数仅会在当前 Bash 的子进程中生效 . 在不少文章中会把它称为 Bash 的 "`自动导入机制( 自动导入函数到当前 Bash
图片.png
由于这种独特的函数定义方式仅会在当前 bash 的子进程中生效 , 因此网络上不少帖子给出的 POC 都是下面这样 .post

POC : env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
经过 bash -c 开启当前 Bash 的子进程 , 在子进程载入时会初始化用户环境变量 , 在初始化时发现了包含 "() {" 格式的字符串 , 因此将该字符串做为一个自动导入函数 . 但因为没有判断函数定义的结束 , 因此错误的将该函数定义后的语句也初始化并看成命令执行了 . 因此子 Bash 会执行该语句并输出 vulnerable , 而后再输出 this is a test .测试

简单的说 , 就是将恶意命令添加到合法的Bash函数定义后 , 在启动子进程时 , Bash 会先执行恶意命令 , 而后再执行正常的指令 .ui

Shellshock漏洞回顾与分析测试 中有一副图作的很是棒 , 十分容易理解 , 这里贴出来 .this

图片.png
以后看一下源代码:
由于 ShellShock 触发于 Bash 子进程初始化环境变量的时候 . 因此咱们进入 variables.c 文件 , 找到 initialize_shell_variables() 函数 .
图片.png
图片.png
图片.png
这里先定义了一些参数 , 而后循环遍历全部环境变量 , 经过 " = " 来分割变量名与变量值。以后判断刚才获取到的环境变量中是否有不合法的( 好比 "=xxx" 或者没有等号的 ) . 若是发现不合法的变量 , 就跳过它们,并赋值。再以后先判断是否存在自动导出函数( 经过 "() {" 来判断 ) , 若存在就将其定义为一个函数 . 同时判断当前是否处于 privileged mode ,若不处于该模式就将以前导出的函数导入到新的环境变量中 .

注意这里 , string( 获取到的环境变量值 ) 没有进行任何过滤 , 就被放入到 parse_and_execute 函数中 . 这是典型的注入漏洞。

参考连接:https://www.guildhab.top/?p=1805

相关文章
相关标签/搜索