Pages

Wednesday, January 4, 2012

Infección de procesos en Linux con Cymothoa

Estos días he estado jugando un poco con Cymothoa. Para quien no lo conozca, esta herramienta te permite inyectar payloads dentro del espacio de direcciones de un proceso, o dicho de otro modo, troyanizar un proceso en Linux. Cymothoa está desarrollada en C y se encuentra disponible en Backtrack 5 dentro de /pentest/backdoors/cymothoa.

Al no encontrar mucha información sobre su funcionamiento estuve indagando un poco sobre el código para ver exactamente como trabaja. La idea de esta herramienta es sobrescribir directamente el base address de alguna de las librerías utilizadas por el proceso, siendo por defecto el “dynamic linker/loader” (/libr/ld*.so). Los payloads utilizados por Cymothoa están embebidos en el propio binario y pueden verse con el parámetro -S aunque, como veremos a continuación, podremos incorporar los nuestros sin mucho esfuerzo.


Cuando ejecutamos Cymothoa tendremos que especificar como parámetro el pid del proceso (-p), el shellcode deseado (-s) así como sus parámetros (IP, port, etc) siempre y cuando sean necesarios. Cymothoa utiliza la syscall ptrace para “atachear”(adjuntar) el proceso, guardar el contexto del mismo y redirigir EIP al shellcode seleccionado. Veamos el proceso paso a paso.

Empezaremos añadiendo un reverse_tcp meterpreter shellcode a Cymothoa y compilaremos el binario de nuevo. Para ello ejecutamos:


El fichero de cabecera payloads.h contiene la lista de payloads disponibles, los cuales se encuentran dentro de un array de estructuras de typo payload:

struct payload { 
     char *description;
     size_t len;
     char *shellcode;
     int options;
 };

Para incluir meterpreter añadiremos un nuevo elemento al array con la información del shellcode. El payload lo definimos como una macro (en el ejemplo CODE_12):


Si queremos aceptar como parámetros la IP y el puerto necesitamos sobreescribir dichos valores con AAAA y BB como muestra la imagen. Dichas constantes están definidas al comienzo de payloads.h como const char:

const char ip_mark = 'A',
port_mark = 'B',

Éstas serán sustituidas en tiempo de ejecución por los argumentos proporcionados por el usuario (funciones set_ip y set_port en personalization.h)

Si compilamos y mostramos de nuevo la lista de payloads veremos Meterpreter como opción 12:


Antes de lanzar Cymothoa veamos la dirección base del dynamic linker del proceso que queremos infectar (gedit en el ejemplo):


Ejecutemos ahora Cymothoa con los siguientes parámetros:


Según podemos ver, el código se ha insertado a partir de la dirección base del ld (0xb782b000). Además nos informa del contexto del proceso una vez hecho el attach –> ptrace(PTRACE_GETREGS,pid,&reg,&reg);

Guardar el contexto del mismo será necesario para poder restaurar el estado del proceso padre justo antes de ejecutar el shellcode (más adelante veremos cómo). Además, necesitamos modificar dichos valores para saltar a nuestro payload. Esto lo hace guardando el valor EIP en el stack y posteriormente sustituyéndolo por la dirección 0xb782b000 + 2. Veamos el fragmento de código que hace lo comentado (cymothoa.c):


La función ptrace_inject únicamente sobrescribe /lib/ld con nuestro código. Comprobemos el resultado desde gdb:


Si nos fijamos Cymothoa ha añadido una serie de opcodes justo antes de nuestro payload. Esto lo hace desde la funcion payload_init(void) (cymotha.c):


La finalidad de dichos opcodes es hacer un fork() y permitir que el parent process vuelva a su ejecución. Como vimos antes, la dirección de EIP se almacenaba en el stack así que con el último return (0xc3) restauraría el mismo. Por otro lado, el proceso hijo hará un jump a nuestro shellcode. El resultado:


El único problema que encuentro en Cymothoa es el hecho de disponer de payloads estáticos en el propio binario, lo cual puede ‘cantar’ frente a NIDS/ID/AV a la hora de descargar la herramienta. Para evitar ésto podemos construir un Cymothoa a medida con nuestros propios payloads o bien, modificar un poco el código y bajarlos en runtime sin necesidad de tocar disco :)

No comments:

Post a Comment