seedlab_shellshock攻击实验
一、实验目的
2014年9月24日,在Bash中发现了一个严重漏洞,称为Shellshock。这会影响许多系统。可以从远程或本地计算机轻松利用此漏洞。在本实验中,学生需要研究此攻击,以便他们可以了解Shellshock漏洞。
二、实验步骤与结果
Task1:测试是否含有漏洞的shell.
原理大概就是:当一个shell程序接受环境变量的时候,会检测环境变量的值是否以:”() {“开头,一旦发现这样的字符串,Bash就会用=来替换空格,把环境变量替换成函数定义,但是如果环境变量是:
env x=’() { :;}; echo vulnerable’
的形式。
但在shell的源代码中,使用parse_and_execute()函数来解析指令,但是如果转化的结果包含多条用“;”分开的shell命令,那么这个函数就会执行每一条指令。
接下来为测试:
从上面的测试,我们可以看到把foo变量以环境变量的形式传递给了子进程,然后子进程直接执行了echo “extra”;,子进程的foo变成了一个函数,后面的一段消失了。说明bash_shellshock是有漏洞的。
Task2:测试curl
建立/usr/lib/cgi-bin目录下的程序,内容为:
使用curl http://10.0.2.4/cgi-bin/myprg.cgi发送请求到该程序
结果为:
成功。
Task3:建立test.cgi
运行如下程序:
即可获得该进程的环境变量。
使用 curl -v指令可以显示HTTP请求和来自服务器的响应。
发现Use-Agent为:curl/7.47.0,下面的环境变量也一样。
但是在浏览器打开就变得不一样了,所以这个值是根据方式可变的,除此之外,可以用
curl -A “xxxxx”来设置Use-Agent字段为xxxxx.
比如:
此时该字段就发生了变化,与此同时环境变量也发生了变化。
所以根据task 2,3 就可以构造攻击了
Task4:构造攻击:获得/etc/passwd
输入指令:
1 | curl -A “() { echo ”hello” ;}; echo Content_type: text/plain; echo; /bin/cat /etc/passwd” http://10.0.2.4//cgi-bin/test.cgi |
() { echo ”hello” ;};这一段就是新程序的一个函数。
echo Content_type: text/plain; echo;这一段就是告诉shell解析的时候保持为纯文本,不用其他的解释型语言来解析
/bin/cat /etc/passwd 这一段就是查看/etc/passwd的文件内容。至于为什么不直接用cat指令,的确打印不出来,应该是无法识别,可能无法共享环境变量。
运行之后即可打开/etc/passwd文件
至于/etc/shadow文件是需要root权限打开的,这样执行无法拿到其内容。
Task5:使用/bin/bash运行任务3,4.
把test.cgi改为上图的形式。
其实此时可以猜测任务三效果,就是跟之前一样,也可以修改一些http字段的值,因为任务三并不涉及漏洞利用。
运行之后User-Agent字段改变,同时其对应的环境变量也发生改变。
所以我们可以类似于bash_shellshock一样做攻击,进行任务4
相同的输入下,直接打印出了环境变量。
发现HTTP_USER_AGENT变量一直到passwd,一长串全是变量,并不会转化为函数,并且分割符也不是“;”了。这样说明之前的漏洞被修复了。
3.2问题:
- Shellshock 攻击能够成功的原因是什么?你这个漏洞中学到了什么教训?
当一个shell程序接受环境变量的时候,会检测环境变量的值是否以:”() {“开头,一旦发现这样的字符串,Bash就会用=来替换空格,把环境变量替换成函数定义,但是如果环境变量是:
env x=’() { :;}; echo vulnerable’的形式。但在shell的源代码中,使用parse_and_execute()函数来解析指令,但是如果转化的结果包含多条用“;”分开的shell命令,那么这个函数就会执行每一条指令。
也就是对于输入检查不彻底,对输入过于信任。或者说代码逻辑有漏洞
教训:不能太过于信任用户的输入。
- 本文作者: 李小混
- 本文链接: https://lixiaohun.github.io/post/8.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!