20199321 《Linux内核原理与分析》第十二周作业

Shellshock攻击实验

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

环境搭建

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

  • 下载 下载地址 http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz
    20199321 《Linux内核原理与分析》第十二周作业_第1张图片
  • 安装
$ tar xf bash-4.1.tar.gz
$ cd bash-4.1
$ ./configure 
$ make && make install

20199321 《Linux内核原理与分析》第十二周作业_第2张图片

  • 链接
$ rm /bin/bash
$ ln -s /usr/local/bin/bash /bin/bash

漏洞检查

输出vulnerable,说明bash有漏洞。

攻击Set-UID程序

  • 在 /home/shiyanlou 目录下新建一个 shock.c 文件:
#include 
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,那么任何人运行这个程序时都会获得程序拥有者的权限。

    20199321 《Linux内核原理与分析》第十二周作业_第3张图片

  • 进行攻击

  • 去掉setuid(geteuid()) 语句,再攻击
    20199321 《Linux内核原理与分析》第十二周作业_第4张图片

    攻击失败。这就说明如果 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服务功能出问题);完善权限管理机制,在设置环境变量的之前先做好检测,确保环境变量设置语句里面不会有一些越权的行为。

你可能感兴趣的:(20199321 《Linux内核原理与分析》第十二周作业)