题目大概是在提示我们跟shellshock有关
看到提供了bash,
先看看c源代码
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
验证存在shellshock,
这里有个小小的坑,
就是之前的几个题都可以直接以文件名运行文件,
这里需要加上./了
ls -al也看到shellshock文件属于root用户
关于shellshock:
1.需要攻击者能够控制环境变量
2.需要有能够执行的高权限的程序,并且程序中存在启动bash子进程的操作
参考https://developer.aliyun.com/article/53608
和https://zhuanlan.zhihu.com/p/35579956
bash可以将shell变量导出为环境变量,还可以将shell函数导出为环境变量。
bash通过以函数名作为环境变量名,
以“(){”开头的字串作为环境变量的值来将函数定义导出为环境变量。
正常情况下,要得到函数环境变量,应该在命令行中输入
a() { echo 1;}
然后回车,
之后只需要输入a,然后回车,就会输出1
而对于具有类似形式的普通环境变量(不是函数环境变量)
b='() { echo 1;}'
仅仅被当作普通的字符串,而不能作为函数执行
但是当启动bash子进程,在继承父进程的环境变量的时候,
b这样的变量不仅会被处理成函数变量,
在}之后的语句也会被执行。
测试的时候又把前面的坑踩了一次,
靶场环境当前目录下的bash才是有漏洞的bash,调用时需要用./bash
而直接用bash会从环境变量PATH里面找系统默认的bash,而这个bash是没有漏洞的
跟着网上的分析简单看了一下bash 4.3的varieble.c文件,
(虽然基本看不太懂)
可以看到这里对() {开头的字符串没有太多检查就传给了parse_and_execute,
尝试去找parse_and_execute,
从varieables.c到common.h到evalstring.c,
varieables.c
common.h
最后在evalstring.c里面找到了,
可惜定义的很多东西不清楚干啥用的,
对底层也不是那么了解,
感觉在看天书