CTF Flow Hard

URL Download CTF = https://drive.google.com/file/d/1DmnijAMfm8Ggk_8ZtaNoVWjOM8M64u0i/view?usp=sharing

Instalación

Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

unzip flow.zip

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

bash auto_run.sh flow.tar

Info:

██████╗ ██╗    ██╗███╗   ██╗██████╗ ██████╗ ██╗
██╔══██╗██║    ██║████╗  ██║╚════██╗██╔══██╗██║
██████╔╝██║ █╗ ██║██╔██╗ ██║ █████╔╝██║  ██║██║
██╔═══╝ ██║███╗██║██║╚██╗██║ ╚═══██╗██║  ██║╚═╝
██║     ╚███╔███╔╝██║ ╚████║██████╔╝██████╔╝██╗
╚═╝      ╚══╝╚══╝ ╚═╝  ╚═══╝╚═════╝ ╚═════╝ ╚═╝

          ==                           
         @+:@ @##@                     
          @++:-----+@ @@#+:----:+#     
           #-+-----:+:---------:       
            *::-----++-----::::#       
             ::------+:--------:       
             #-+------+:-::-----#@     
              *::+=@@#++-------::@     
              @+=     @++::+#@@@#*#    
               #-@                     
                *+#++@                 
               +-:::+-@                
               :-:+:::+                
              @+::*::::                
             *::++-::*                 
          =:--:-:++ @-#                
      #*:---:--++@   @@                
      @::-:--++*                       
       @::-:++#                        
         *++*                          

 :: Plataforma de máquinas vulnerables ::
 :: Desarrollado por Pwn3d! y Dockerlabs - creado por @d1se0 ::

 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
 █           FLAG{Pwn3d!_is_awesome!}            █
 █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█


[✔] bc ya está instalado.

[✔] Docker ya está instalado
[!] Limpiando previos contenedores e imágenes
[✔] Cargando la máquina virtual      
[✔] Activando máquina virtual      

[✔] Máquina activa. Dirección IP: 172.17.0.2
[!] Presiona Ctrl+C para limpiar y salir

Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.

Escaneo de puertos

Info:

Vemos que hay un puerto 80, en el que si entramos veremos un login, pero si inspeccionamos la pagina, veremos el siguiente comentario:

Por lo que podemos deducir que puede ser el nombre de usuario del login, por lo que vamos a probar fuerza bruta al login con dicho usuario.

Hydra

Info:

Por lo que vemos sacamos las credenciales, si iniciamos sesion en la pagina, nos llevara a una especie de pagina llamada gestionAdminPanel.php en el que parece ser un sistema de gestion del servidor.

Escalate user flow

BurpSuite

Donde pone se esta procesando la solicitud, podemos deducir que que tiene que ver algo con las solicitudes que se realiza a dicha pagina.

Vamos abrir BurpSuite configurarlo para que escuche en el mismo puerto donde esta la pagina, echo esto, capturaremos la peticion recargando la pagina, le daremos a Ctrl+R para pasarlo al Repeater y trastear con la peticion.

Si cambiamos algunas cosas del Head veremos que hay una seccion de la misma en concreto en la que se puede injectar comandos, que es en el User-Agent.

Aqui vemos que si ponemos el comando id para que nos muestre que usuario somos, veremos que funciona y que encima nos lo muestra en la pagina, por lo que veremos el passwd para ver que usuarios hay.

Por lo que vemos funciona y vemos que hay un usuario llamado flow, por lo que vamos a ver que archivos a creado dicho usuario por si hubiera algun archivo interesante.

Vemos que nos descubrio un archivo bastante interesante llamado secret en el /usr/bin, por lo que vamos a intentar leerlo por dentro a ver que hace.

Vemos que hay una cadena codificada, vamos a ver en que esta codificado con la siguiente pagina:

URL = Dcode - Cipher Identifier

Nos da como resultado 5 tipos que puede ser de codificacion, el primero siendo Base32, por lo que probaremos con ese:

URL = Decode base32

Vemos que nos da esto:

Lo que parece ser una contraseña del usuario flow, por lo que la probaremos por ssh:

Metemos como contraseña d1se0isthebest@$$! y veremos que estamos dentro, por lo que leeremos la flag del usuario.

user.txt

Escalate Privileges

Si hacemos sudo -l podremos ver lo siguiente:

Vemos que podemos ejecutar el binario manager como el usuario root.

Si nos vamos a /usr/local/bin e intentamos ejecutar el archivo, veremos lo siguiente:

Info:

Por lo que vemos nos esta comentando que alguna clave tiene que valer la palabra root para ir al modo administrador, por lo que podremos intuir que puede ser vulnerable a un Stack Buffer Overflow, probaremos a ingresar lo siguiente:

Info:

Vemos que la memoria se ha desbordado, por lo que es vulnerable, nos pasaremos el archivo a nuestro host y desde ahi intentaremos utilizar ingenieria inversa.

host

Ingenieria inversa (command_exec)

Instalacion de GDB con PEDA/GDB con pwndbg

Lo que primero tendremos que hacer sera lo siguiente:

Y si iniciamos el programa con GDB pasandole como parametro el programa, se nos pondra el gdb-peda...

Pero si diera error por las versiones, podremos instalar esta otra herramienta que es mas poderosa:

Y si iniciamos gdb veremos lo siguiente:

Info:

Comprobacion de desbordamiento de Buffer

En el host, generamos una cadena de caracteres diseñada para intentar desbordar el buffer de la aplicación. Esto se logra con la herramienta pattern_create.rb:

Info:

Este patrón se usará como entrada en la aplicación para identificar cómo se maneja el buffer.

Ahora llendonos al GDB tendremos que ejecutar run y meter lo que hemos generado de 400 caracteres, por lo que petara y veremos algo asi:

Vemos esta parte de aqui:

Que es la parte que nos interesa, ya que se muestra la direccion de memoria al cual le vamos a encontrar el offset de la siguiente forma:

Identificación del Offset

Para determinar el desplazamiento exacto (offset) donde ocurre la sobrescritura, usamos pattern_offset.rb, proporcionando la dirección en hexadecimal obtenida del RIP:

Info:

Esto indica que el offset es de 88 bytes.

NOTA:

En una arquitectura de 64 bits, no existe el registro EIP como en las arquitecturas de 32 bits. En su lugar, se utiliza el registro RIP, que almacena la dirección de la próxima instrucción a ejecutar. Sin embargo, esto no significa que RIP contenga directamente el valor que estamos sobreescribiendo en un desbordamiento de buffer.

Por ello, debemos buscar el valor en el stack que representa la dirección de retorno (ret), que es el objetivo del desbordamiento. En este caso, ese valor es 0x3164413064413963, el cual proviene de nuestra entrada controlada y será el punto que debemos sobreescribir para desviar el flujo de ejecución.

Pero para verlo mejor y ser mas certeros, vamos a realizarlo de forma manual de la siguiente forma.

Vamos a investigar donde se llena de B(42) la key que nos dice el binario.

Info:

Aparentemente no vemos nada, ya que de primeras no nos aparece el valor de la key para saber si se esta llenando correctamente o no, pero si investigamos, vemos que en el /tmp tenemos el siguiente archivo creado llamado key_output.txt que contiene lo siguiente:

Vemos que es un valor decimal y si lo pasamos a hexadecimal veremos lo siguiente:

Vemos que se esta llenando la key con A(41) por lo que nosotros tenemos que conseguir que eso se llene de B(42) todo entero, si probamos bajando los numeros...

Info:

Si ahora comprobamos el archivo de nuevo:

Info:

Vemos que el valor a cambiado y si lo traducimos a hexadecimal veremos lo siguiente:

Vemos que esta funcionando, ya que visto en ascii seria de la siguiente forma BBAA, por lo que solo tendremos que bajar 2 numeros mas.

Info:

Si ahora volvemos a leer el archivo...

Info:

Vemos que ahora si son todo B(42) ya que traducido seria 42424242, por lo que hemos dado con el offset correcto del RIP, ahora que podemos manipular la key vamos a poner el valor de root en la key de la siguiente forma, si nosotros ponemos la palabra root como tal, no va a funcionar, lo tendremos que poner en hexadecimal que corresponderia a 726f6f74, por lo que porbaremos a escribir lo siguiente:

Inyección de código en la key

Info:

Por lo que vemos funciono, por lo que solo tendremos que crear un pequeño script para automatizar todo esto, probaremos primero a ejecutar el comando id.

exploit.py

Si ahora ejecutamos esto, veremos lo siguiente:

Info:

Vemos que se esta ejecutando todo correctamente, por lo que ahora nos copiaremos este script y nos lo pasaremos a la maquina victima donde esta el binario manager, haremos lo siguiente:

Y si ejecutamos esto de la siguiente forma:

Info:

Si ahora vemos los permisos de la bash...

Info:

Vemos que ha funcionado, por lo que haremos lo siguiente:

Y con esto ya seremos root, por lo que leeremos la flag de root:

root.txt

Last updated