当前位置: 首页>>技术教程>>正文


检查shellshock的命令的说明

, ,

问题描述

这是我用来检查我的bash shell以获取Shellshock错误的命令:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

任何人都可以详细解释命令吗?

最佳解决思路

这个答案是Matthew Miller的original article on Fedora Magazine衍生产品,根据Creative Commons Attribution-Share Alike 4.0许可证授权。

让我解释:

env x='() { :;}; echo OOPS' bash -c :

这将在易受攻击的系统上打印“OOPS”,但如果已修补bash,则会以静默方式退出。

env x='() { :;}; echo OOPS' bash -c "echo this is a test"

这将在易受攻击的系统上打印“OOPS”,但如果已修补bash,则打印“this is a test”

你可能听说它与环境变量有关。但是,为什么环境变量中的代码会被执行?好吧,它不应该是 – 但是,由于我很想为自己的好处调用一点太聪明的功能,因此存在一些缺陷的余地。 Bash是您看到的终端提示,但它也是一种脚本语言,并且能够定义函数。你这样做:

$ Ubuntu()  { echo "Ubuntu is awesome."; }

然后你有一个新的命令。请记住,这里的echo实际上还没有运行;它只是保存为我们运行新命令时会发生的事情。这一分钟很重要!

$ Ubuntu
 Ubuntu is awesome.

有用!但是,让我们说,出于某种原因,我们需要执行一个新的bash实例,作为一个子进程,并希望在其下运行我真棒的新命令。语句bash -c somecommand就是这样做的:在新shell中运行给定的命令:

$ bash -c Ubuntu
  bash: Ubuntu: command not found

哦。伤心。孩子没有继承函数定义。但是,它确实固有环境 – 从shell导出的key-value对的集合。 (这是一个完整的’概念;如果你不熟悉这个,请相信我现在。)事实证明,bash也可以导出函数。所以:

$ export -f Ubuntu
$ bash -c Ubuntu
  Ubuntu is awesome.

这一切都很好 – 除了完成这一机制的机制是狡猾的。基本上,由于在环境变量中没有用于执行函数的Linux /Unix魔术,导出函数实际上只是创建一个包含函数定义的常规环境变量。然后,当第二个shell读取“incoming”环境并遇到一个内容看起来像函数的变量时,它会对其进行求值。

从理论上讲,这是非常安全的,因为,记住,定义一个函数实际上并不执行它。除了 – 这就是我们在这里的原因 – 代码中存在一个错误,当达到函数定义的末尾时,评估没有停止。它只是跟踪。

当使用export -f合法地存储在环境变量中的函数时,这种情况永远不会发生。但是,为什么要合法?攻击者可以组成任何旧的环境变量,如果它看起来像一个函数,新的bash shell会认为它是!

所以,在我们的第一个例子中:

env x='() { :;}; echo OOPS' bash -c "echo this is a test"

env命令运行具有给定变量集的命令。在这种情况下,我们将x设置为看起来像函数的东西。该函数只是一个:,它实际上是一个简单的命令,定义为什么都不做。但是,在发出函数定义结束信号的semi-colon之后,有一个echo命令。那不应该存在,但没有什么能阻止我们这样做。

然后,使用这个新环境运行的命令是一个新的bash shell,再次使用“echo this is a test”或“do nothing :”命令,之后它将完全无害地退出。

但是 – 哎呀!当新shell启动并读取环境时,它将转到x变量,并且因为它看起来像一个函数,所以它会对它进行求值。功能定义无害地加载 – 然后我们的恶意负载也被触发。因此,如果您在易受攻击的系统上运行上述操作,则会将“OOPS”打印回来。或者,攻击者可能比打印东西更糟糕。

次佳解决思路

在未修补版本的bash中,它将导出的函数定义存储为环境变量。

存储功能x

$ x() { bar; }
$ export -f x

并检查其定义为,

$ env | grep -A1 x
x=() {  bar
}

因此,可以通过定义自己的环境变量来利用它,并将它们解释为函数定义。例如,env x='() { :;}'将被视为

x() { :;
}

检查shellshock的命令是做什么的,

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

来自man env

  1. env – 在修改后的环境中运行程序。

  2. :除退出状态0外什么也不做。见more

  3. 当一个新的未修补的bash实例作为bash -c "echo this is a test"启动时,精心设计的环境变量被视为一个函数并被加载。因此,获得输出


    vulnerable
    this is a test

Note: The echo outside the function definition has been unexpectedly executed during bash startup. The function definition is just a step to get the evaluation and exploit to happen, the function definition itself and the environment variable used are arbitrary. The shell looks at the environment variables, sees x, which looks like it meets the constraints it knows about what a function definition looks like, and it evaluates the line, unintentionally also executing the echo (which could be any command, malicious or not). Also See this

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2600.html,未经允许,请勿转载。