Write-ups

Resolución del CTF PILA


Escaneo de puertos

Realizamos un escaneo de todos los puertos para saber cuáles están activos.

Los parámetros utilizados son:

  • -p- : Escaneo de todos los puertos. (65535)
  • -sS : Realiza un TCP SYN Scan para escanear de manera rápida que puertos están abiertos.
  • -sC : Realiz una escaneo con los scripts basicos de reconocimiento
  • -sV : Realiza un escaneo en buqueda de los servicios
  • –min-rate 5000: Especificamos que el escaneo de puertos no vaya más lento que 5000 paquetes por segundo, el parámetro anterior y este hacen que el escaneo se demore menos.
  • -n: No realiza resolución de DNS, evitamos que el escaneo dure más tiempo del necesario.
  • -Pn: Deshabilitamos el descubrimiento de host mediante ping.

Nos llama la atencionn el puerto 9999, el cual si buscamos encontramos que es un servidor vulnerable a Buffer Over Flow (B0F)

Nos encontramos ante en puerto 80 el cual parece que no encuentra el recurso.

Pero si buscamos el codigo fuente vemos que al final del todo casi oculto, como suele ser normal en nosotros, encontramos un directorio.

Nos dirigimos a el y nos encontramos con el ejecutable, asi que nos lo vamos a traer a otra maquina virtual en windows, siempre que encontremos ejecutables o scripts lo haremos en maquinas virtuales de usar y tirar, sin red y la cual no reutilizaremos. Nunca sabe uno lo que puede esconder.

Descargaremos el Inmutty debuger, lo cargamos y lo ejecutamos.

Comporbamos que direccion tenemos en nuestra maquina virtual donde tenemos el Imnuity

Ejecutaremos el primer script para fuzzear. Esperamos a que el programa falle y veamos el estado «Pausado» en la parte inferior derecha de Immunity Debugger.

En mi caso, el servidor vulnerable falló después de 5900 bytes. Además, no todos los registros fueron sobrescritos por ‘A’ (0x41), y eso no es un problema a menos que el programa haya fallado. Ahora tenemos una idea general de cómo enviar datos para bloquear el programa. Vea la imagen a continuación.

Lo que debemos hacer a continuación es averiguar exactamente dónde se encuentra el EIP (en bytes) e intentar controlarlo.

Encontrar la compensación

Entonces, ahora que sabemos cómo podemos sobrescribir el EIP y que la sobrescritura se produjo entre 1 y 5900 bytes.

Usamos 2 herramientas de Ruby: ‘msf-pattern_create’ y ‘msf-pattern_offset’ para encontrar la ubicación exacta de la sobrescritura.

Pattern Create nos permite generar una cierta cantidad de bytes, según la cantidad de bytes especificada. Luego podemos enviar esos bytes a Vulnserver en lugar de A e intentar encontrar exactamente dónde sobrescribimos el EIP. El desplazamiento del patrón nos ayudará a determinar pronto la ubicación de la sobrescritura.

En Kali, de forma predeterminada, estas herramientas se encuentran en la carpeta /usr/share/metasploit-framework/tools/exploit.

Solo necesitamos enviar este código una sola vez. Volvemos a cargar el ejecutable en el Immunity Debugger puesto que esta pausado y ejecutamos la herramienta

Vemos el registro EIP -‘386F4337’. Este valor es en realidad parte de nuestro script que generamos usando la herramienta msf-pattern_create.
Para averiguar la ubicación usaremos la herramienta msf-pattern_offset.

Bueno, ahora que sabemos la ubicación exacta desde donde comienza el EIP y ahora podemos intentar controlar el EIP, lo que será muy útil en nuestro exploit.

Ahora pasaremos a Sobrescribir el EIP y vemos que comienza en 2003 bytes. Primero enviaremos 2003 ‘A y luego enviaremos 4 ‘B’ (ya que EIP tiene un tamaño de 4 bytes).

Los A de 2003 simplemente alcanzarán el EIP pero no sobrescribirán el EIP, pero los B deberían sobrescribir el EIP. Escribir una nueva secuencia de comandos de Python:- OverwriteEIP.py

Volvemos a cargar el ejecutable en el Immunity Debugger puesto que esta pausado y ejecutamos la herramienta.

Observe que nuestro EIP tiene el valor ‘42424242’ tal como queríamos. Ahora descubriremos qué Badchars son considerados «malos» por la aplicación Vulnserver.
De forma predeterminada, el byte nulo (x00) siempre se considera un carácter incorrecto ya que truncará el código de shell cuando se ejecute.

Encontrar los Badchars

Algunos Badchars causan problemas en el desarrollo del exploit. Debemos ejecutar cada byte (de valor 0 a 255 porque el rango de 1 byte es 0 a 255) a través del programa Vulnserver para ver si algún carácter causa problemas. Ya sabemos que el byte nulo (x00) siempre se considera un carácter incorrecto de forma predeterminada.

Para encontrar caracteres incorrectos en Vulnserver, agregue una variable adicional ‘badchars’ a nuestro código que contiene una lista de cada carácter hexadecimal, excepto \x00. Pero primero los generamos con badchars.py.

Volvemos a cargar el ejecutable en el Immunity Debugger puesto que esta pausado y ejecutamos la herramienta.

Hacemos clic derecho en el registro ESP y seleccione «SFolloow in Dump».

Si hay un badchar, inmediatamente parecerá fuera de lugar. Pero en nuestro caso, no los hay. Solo el (0x00)

Encontrar el módulo correcto.

Encontrar el módulo correcto significa que necesitamos encontrar alguna parte de Vulnserver que no tenga ningún tipo de protección de memoria. Usaremos ‘módulos mona’ para encontrarlo.

Descargamos mona.py y lo pegamos en esa ruta.

Buscamos «Falso» en la tabla. Eso significa que no hay protecciones de memoria presentes en ese módulo, ‘essfunc.dll‘ se ejecuta como parte de Vulnserver y no tiene protecciones de memoria. Ahora encontraremos el código de operación equivalente a JMP ESP. Estamos usando JMP ESP porque nuestro EIP apuntará a la ubicación de JMP ESP, que saltará a nuestro código shell malicioso que inyectaremos más adelante.

Encontrar códigos hexadecimales para obtener instrucciones útiles

Kali Linux contiene una útil utilidad para convertir lenguaje ensamblador a códigos hexadecimales.

El código hexadecimal para una instrucción «JMP ESP» es FFE4. Ahora encontraremos la dirección del puntero usando esta información. Colocaremos esta dirección de puntero en el EIP para que apunte a nuestro código shell malicioso.

Encontramos 9 ubicaciones en la memoria (que no cambiarán de dirección cuando reiniciemos el programa) que contienen la instrucción «JMP ESP».

Es una lista de direcciones que potencialmente podemos usar como nuestro puntero. Las direcciones se encuentran en el lado izquierdo, en color blanco. Seleccionaremos la primera dirección –625011AF y la agregaremos a nuestro script.

Lo pegmoas 625011af y hacemos clic derecho en el punto de Breakpoint.

Si el EIP muestra nuestra dirección copiada, entonces es el módulo correcto.

Generando carga útil de shell inverso

Generaremos una shell para obtener acceso

Con awk le añadimos el valor b en cada linea.

Y lo copiamos.

Nos ponemos en escucha y ejecutamos el script.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *