前言
巨详细的复现过程等你来!因为遇到了很多问题,因此目录做的详细一些,方便大家查看和搜索对自己有用的内容。
复现过程是在我踩过很多坑后按照应该做的步骤梳理后的流程,目的是希望你可以一次成功不用遇到问题后各种填坑。如果你遇到不明白我为什么要采取一些看似无关的环境配置步骤的情况,可以到4. 遇到的问题
中看我的探索过程,希望可以提示你。
漏洞原理
Bash支持通过进程环境导出shell变量和shell函数到子进程的其他的bash实例中。现有的bash版本使用环境变量实现这一过程。环境变量以函数名命名,以“() { }”作为环境变量的值传送函数定义。由于bash处理函数定义后仍会继续解析和执行跟在函数定义后的shell命令导致远程任意代码执行。
核心原因:没有严格限制输入的边界,没有合法化的参数判断。
详见:https://seclists.org/oss-sec/2014/q3/650
安天实验室对CVE-2014-6271破壳漏洞进行了详细的分析,且提供了其他参考资料。
例子:
VAR=() { ignored; }; /bin/id
当上述环境变量导入bash进程时将执行/bin/id
。
解决方案:安装补丁。在补丁中主要进行了参数的合法性过滤,补丁程序在/builtins/evalstring.c的parse_and_execute函数中进行了输入的command进行了合法性的边界检测。(CVE-2014-6271 的修补不够完善,导致CVE-2014-7169。)
利用方式
需要以下条件:
- 远程服务会调用bash。(创建bash子进程)
- 远程服务允许用户定义环境变量。
- 远程服务调用子bash时加载了用户定义的环境变量。
攻击向量:
- 对CGI脚本的HTTP请求(bash命令可能出现的位置有:请求方法,路径,服务器协议,Header的值(Referer、host、UserAgent等)。还可能出现在查询字符串,查询字符串变量名)
- OpenSSH(通过AcceptEnv,TERM,SSH_ORIGINAL_COMMAND)
- 涉及其他需要额外编程设置的环境变量的情况