Shellshock攻击实验
Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开。许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易受攻击的Bash版本上执行任意代码。这可使攻击者在未授权的情况下访问计算机系统。
环境搭建
以root权限安装4.1版bash(4.2版本以上的漏洞已经被堵上了)
$ tar xf bash-4.1.tar.gz
$ cd bash-4.1
$ ./configure
$ make && make install
- 链接
$ rm /bin/bash
$ ln -s /usr/local/bin/bash /bin/bash
漏洞检查
输出vulnerable,说明bash有漏洞。
攻击Set-UID程序
- 在 /home/shiyanlou 目录下新建一个 shock.c 文件:
#include <stdio.h>
void main()
{
setuid(geteuid()); // make real uid = effective uid.
system("/bin/ls -l");
}
我们注意到这里使用了setuid(geteuid()) 来使real uid = effective uid,这在Set-UID程序中不是普遍现象,但它确实有时会发生。
-
编译这段代码,并设置其为Set-UID程序,保证它的所有者是root。
- system()函数将调用"/bin/sh -c" 来运行指定的命令, 这也意味着/bin/bash 会被调用
- 当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。
-
进行攻击
-
去掉setuid(geteuid()) 语句,再攻击
攻击失败。这就说明如果 real uid 和 effective uid 相同的话,定义在环境变量中的内容在该程序内有效,那样shellshock漏洞就能够被利用了。但是如果两个 uid 不同的话,环境变量失效,就无法发动攻击了,这可以从 bash的源代码中得到印证:
void initialize_shell_variables(){
// 循环遍历所有环境变量
for (string_index = 0; string = env[string_index++]; ) {
/*...*/
/* 如果有export过的函数, 在这里定义 */
/* 无法导入在特权模式下(root下)定义的函数 */
if (privmode == 0 && read_but_dont_execute == 0 &&
STREQN (“() {“, string, 4)) {
[...]
// 这里是shellshock发生的地方
// 传递函数定义 + 运行额外的指令
parse_and_execute (temp_string, name,
SEVAL_NONINT|SEVAL_NOHIST);
[...]
} }
primode即私有模式,要求real uid 与 effective uid保持一致。
实验总结
Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,启动Bash的时候,它不但会导入这个函数,而且也会把函数定义后面的命令执行。在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。如何修复ShellShock漏洞:禁用CGI(但是可能会导致web服务功能出问题);完善权限管理机制,在设置环境变量的之前先做好检测,确保环境变量设置语句里面不会有一些越权的行为。