看一下题目 连上去看看有什么 看下shellshock.c
#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破壳(X-CERT)漏洞(CVE-2014-6271)有关. 看了别人的分析,shellshock的逻辑和setresuid的定义是这样的
我们以shellshock身份启动时,程序的权限是other权限r-x,而在setresuid和 setresgid中使用的是effective gid,也就是shellshock_pwn的权限r-s,当程序执行 到system时,程序已经具有shellshock_pwn组权限了。 这个组权限对于flag文件来说是可读的(r–),但是问题在于这一段程序并没有涉及对 flag的读操作,权限虽然有了,但怎么办呢?也就是我们有权限取读取flag文件,但是代码内并没有读取flag的操作,而Bash破壳(X-CERT)漏洞(CVE-2014-6271)是一个 远程执行代码漏洞,漏洞具体的原理可以拜读下面的文章,这里不做展开: https://www.freebuf.com/articles/system/50065.html -安全科普:让高大上的Bash破壳漏洞不再难理解(上) https://www.freebuf.com/articles/system/50707.html -安全科普:让高大上的Bash破壳漏洞不再难理解(下) https://www.antiy.com/response/CVE-2014-6271.html -Bash远程代码执行漏洞“破壳”(CVE-2014-6271)分析 https://blog.51cto.com/wt7315/1831974 -Bash破壳漏洞(这位兄弟也是总结的很好) https://blog.csdn.net/pygain/article/details/53969081 -关于ShellShock漏洞的利用过程和原理解析
先检查是否有此漏洞
env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test"上面这句就是poc 我们可以解读一下这个poc x=’() { :;}; echo vulnerable’是new出来了一个新的环境变量:
1.KEY=x 2.VALUE=() {:;}; echo vulnerable而当我们后续执行bash的时候,最终会定位到initialize_shell_variables中,这个函数内部会遍历所有的环境变量,而我们设计的VALUE绕过了其中一个export函数的定义检查,使得最终执行的是后面的echo vulnerable串。所以,调用bash的时候,自定义的这个语句就会触发 如果执行输入了echo vulnerable这句shell则证明漏洞存在
然后我们将将echo vulnerable 换成想执行的命令 bash -c “cat ./flag”’
而./ bash -c “echo this is a test” 换成./shellshock
也就是shellshock在执行system("/home/shellshock/bash -c 'echo shock_me'");这句代码的时候 会执行我们的cat ./flag
env x='() { :;}; bash -c "cat ./flag"' ./shellshock