shellshock漏洞

Shellshock漏洞:GNU Bash 远程代码执行漏洞

准备工作

首先安装一个有shellshock漏洞的bash,这里安装bash4.0,参考教程:

[]: https://blog.csdn.net/manshq163com/article/details/38079389

结果如下:

验证漏洞

思考

利用shellshock漏洞需要满足的条件:

  • bash版本需要满足小于4.3
  • 使用export设置环境变量,并且环境变量的值以字符"(){"开头
  • 启动新的shell(子进程)

原理

Bash允许在Bash的shell中使用环境变量来定义函数,如果环境变量的值以字符”( ){“开头,那么这个变量就会被当作是一个函数,当开启新的bash初始化环境变量时,会解析函数定义并执行。

利用shellshock漏洞攻击Set-Uid程序

攻击原理

首先,我们编写一个Set-Uid程序,注意程序内需要设置uid与euid相同,这样才能保证后续成功提权,拿到root shell,程序内调用了system函数,system函数会继续调用fork()函数产生子进程,此时开启新的bash,对导入的环境变量foo进行解析,并执行/bin/sh;,从而得到root shell。

补充

/* test.c */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
    printf("%d\n",getuid());
    printf("%d\n",geteuid());
    system("/bin/sh;");
    return 0;
}

sudo chmod 4755 xxx设置用户的权限为:

文件所有者可读可写可执行,与文件所有者同属一个用户组的其他用户可读可执行,其它用户组可读可执行,同时,其他用户执行文件时,具有与所有者相当的权限。

竞态条件漏洞

竞态条件是指一个系统或程序的输出结果取决于其他不可控制事件执行的时间顺序。当一个特权程序有竞态条件漏洞时,攻击者可以通过对其他时间的控制来影响特权程序的行为。

准备知识

fs.protected_symlinks 用于限制普通用户建立软链接
0:不限制用户建立软链接
1:限制,允许用户建立软链接的情况是软链接所在目录是全局可读写目录或者软链接的uid与跟从者的uid匹配,又或者目录所有者与软连接所有者匹配

在本实验中我们需要提前关闭限制用户建立软链接的保护:

sudo sysctl -w fs.protected_symlinks=0

/etc/passwd

/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

验证漏洞

编写漏洞程序vulp.c,并编译成Set-Uid程序:

把root权限用户的信息写入文本文件passwd_input,该文件将作为vulp程序的输入,其中U6aMy0wojraho是空密码加盐后加密的结果:

编写attack_process.c程序,由于我们关闭了系统禁止用户使用软链接的保护,因此可以把/tmp/Theffth文件接替链接到黑洞文件/dev/null和只有root用户权限才能写的/etc/passwd文件:

最后,编写target_process.sh脚本,即不断尝试把root权限用户Hacker信息写入vulp程序,直到Hacker信息追加到/etc/passwd文件:

最后,先执行attack_process程序,再执行target_process.sh脚本:

可以看到成功修改了/etc/passwd文件,此时我们切换到Hacker,输入空密码即可得到root shell:

攻击原理

操作系统进程调度的本质是时间片轮转,一个进程可能在任何时刻被调度,接着运行第二个程序。竞态条件漏洞利用了这种进程调度的特点,把一个程序中连续的两步打断,接着切换到另一进程,这个进程可能会对原来进程需要的资源进行修改,导致原程序的执行发生错误。上述例子中可以成功修改/etc/passwd文件的条件是:

  1. /tmp/Theffth文件软链接到/dev/null,同时vulp程序运行到access权限验证,由于我们可以向/dev/null中写入任意内容,验证通过
  2. /tmp/Theffth文件接着链接到/etc/passwd,同时vulp程序接着运行到打开文件并写入passwd_input,此时Hacker用户的信息就被成功写入了本来只有root用户才能进行写操作的/etc/passwd文件

防御措施

  • 打开系统禁止用户使用软链接的保护

  • 使用最小用户权限,在access检查之前加入seteuid(getuid()):

    程序进行access权限检查的意图就是为了防止非root用户利用Set-Uid程序对只有root用户才能进行修改的文件进行修改,如果我们可以保证Set-Uid程序的最小权限为普通用户的话,那么就不能对/etc/passwd等文件进行打开和写入操作