Shellshock攻击实验

Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开。许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易受攻击的Bash版本上执行任意代码。这可使攻击者在未授权的情况下访问计算机系统。

环境搭建

以root权限安装4.1版bash(4.2版本以上的漏洞已经被堵上了)

$ 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

漏洞检查

输出vulnerable,说明bash有漏洞。

攻击Set-UID程序

  • 在 /home/shiyanlou 目录下新建一个 shock.c 文件:
#include <stdio.h>
void main()
{
    setuid(geteuid()); // make real uid = effective uid.
    system("/bin/ls -l");
}

我们注意到这里使用了setuid(geteuid()) 来使real uid = effective uid,这在Set-UID程序中不是普遍现象,但它确实有时会发生。

  • 编译这段代码,并设置其为Set-UID程序,保证它的所有者是root。

    • system()函数将调用"/bin/sh -c" 来运行指定的命令, 这也意味着/bin/bash 会被调用
    • 当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。

  • 进行攻击

  • 去掉setuid(geteuid()) 语句,再攻击

    攻击失败。这就说明如果 real uid 和 effective uid 相同的话,定义在环境变量中的内容在该程序内有效,那样shellshock漏洞就能够被利用了。但是如果两个 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保持一致。

实验总结

Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,启动Bash的时候,它不但会导入这个函数,而且也会把函数定义后面的命令执行。在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。如何修复ShellShock漏洞:禁用CGI(但是可能会导致web服务功能出问题);完善权限管理机制,在设置环境变量的之前先做好检测,确保环境变量设置语句里面不会有一些越权的行为。

 posted on 2019-12-04 11:40  捞起月亮的渔民  阅读(196)  评论(0编辑  收藏  举报