看一下题目
连上去看看有什么
看下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