Cómo pasar una prueba cibernética en Checkpoint

Hola a todos, soy Nikita Kurtin , curadora de la Escuela Superior Israelí de Informática y Seguridad HackerU

Checkpoint , la principal compañía israelí de seguridad de la información, publicó una serie de pruebas cibernéticas este verano.

Las tareas se dividieron en seis categorías:

• lógica
• Web
• Programación
• Redes
• marcha atrás
• sorpresa

Dos tareas para cada dirección. En esta publicación, te contaré cómo realicé solo cuatro pruebas, en las otras tres siguientes:

Checkpoint ya había logrado ganar respeto e interés por mi parte, así que decidí aceptar estos desafíos. Sin embargo, debido al empleo, pude permitirme asumir solo 8 de 12 tareas (de cuatro categorías diferentes). Y logré resolver 7 de ellos.

El desafío finalizó oficialmente a fines de septiembre de 2018.

imagen

Así que ahora, con la conciencia tranquila, puedo contarles paso a paso cómo me abrí paso para resolver los siguientes problemas:

• Desafío lógico "PNG ++"
• Desafío web "Los robots han vuelto"
• Web Challenge "Galería Diego"
• Tarea de programación "Pasos cuidadosos"
• La tarea de programar "Puzzle"
• Reto de redes "Ping Pong"
• Networking Challenge "Protocolo"

Desafío: PNG ++

Descripción:

Esta imagen (enlace al archivo PNG cifrado) se codificó utilizando un cifrado personalizado.

Logramos leer la mayor parte de este código aquí (enlace al código de Python).
Desafortunadamente, alguien derramó lentamente café en todo key_transformator.py.
¿Podrías ayudarnos a descifrar esta imagen?

Código de Python:

imagen

La lógica de cifrado es la siguiente:

1. Establezca la longitud de la clave (tamaño de la clave) en 4 bytes

2. Lea los bytes del archivo "flag.png" en la variable "img"

3. Agregue relleno al archivo, al primer múltiplo más cercano de cuatro. El relleno es igual al número de bytes que faltan. Por ejemplo, si la longitud del archivo es de 29 bytes (faltan 3), agregue tres bytes con el valor decimal 3 (ASCII 0x03). O, en otras palabras, los bytes de relleno no pueden estar vacíos (ASCII 0x00), porque su valor decimal es cero, lo que no implica relleno.

4. Configure la tecla de inicio con cuatro letras mayúsculas aleatorias ([AZ]).

5. Haz lo mismo con todos los bytes en el archivo, encriptando cadenas de cuatro bytes a la vez

a. Cada byte en el archivo se pelea por byte de la clave
b. La clave se convierte constantemente en otra clave, key_transformator.transform (key) es responsable de esto
c. Los bytes encriptados se agregan a enc_data

6. Ingrese enc_data (bytes encriptados) en encrypted.png

Para comenzar, verifiqué el encabezado del formato PNG y descubrí que los primeros ocho bytes son los siguientes:

[137, 80, 78, 71, 13, 10, 26, 10]

Tomé los primeros ocho bytes del archivo encriptado y los giré con estos ocho bytes:

imagen

La clave del primer bloque resultó así:
[85, 80, 82, 81]

Y el segundo bloque, así:
[86, 81, 83, 82]

Dado que cada clave posterior se genera dinámicamente utilizando la clave anterior (clave = key_transformator.transform (clave), entendí el algoritmo: agregue uno a cada byte en la clave anterior:
85 -> 86
80 -> 81
82 -> 83
81 -> 82

Y luego me di cuenta de que el nombre del desafío ocultaba una pista enfermiza.

Escribí dos "funciones de ayuda":

• "nextKey", que restaura la siguiente clave en función de la última
• "nextChar", que restaura la siguiente letra, y en la mayoría de los casos simplemente aumenta en uno si cae dentro de los límites de bytes (255)

imagen

Convertí los 4 bytes originales [85, 80 82, 81] en letras: “UPRQ” y ejecuté el algoritmo nuevamente

imagen

La bandera se especificó en el archivo descifrado:

imagen

Desafío: el regreso de los robots


Descripción:

Los robots son geniales, pero créanme: ¡su acceso debe ser limitado! Compruébalo (enlace)

Después de seguir el enlace, verá una determinada página dedicada a los robots. Básicamente, todo sugiere que debe verificar la presencia del archivo "robots.txt".

imagen

Al agregar ./robots.txt a la url obtenemos lo siguiente:

imagen

Revisé ./secret_login.html y encontré una página de registro

imagen

Luego, verifiqué el código fuente del formulario para encontrar la confirmación de contraseña y vi este Javascript:

imagen

Parece que cuando se confirma el valor, se envía a la función de autorización, que decodifica el valor pasado utilizando la función btoa (función de decodificación base64 en Javascript) y luego lo compara con la cadena: "SzMzcFQjM1IwYjB0JDB1dA ==".

Decodifiqué esta línea

imagen

Inserté el valor resultante en la cadena de contraseña. Bingo!

imagen


Desafío: Galería Diego

Descripción:

Recientemente comencé a desarrollar una plataforma para administrar las fotos de mi gato y asegurar mi flag.txt. Por favor revise mi sistema (enlace al formulario de registro).

Para evitar jambas en el sistema de seguridad, como la capacidad de incrustar código SQL, se me ocurrió mi propio esquema.

Su breve descripción está disponible aquí (enlace al diagrama)

Formulario de registro:

imagen

Circuito preestablecido:

imagen

Después de configurar el nombre de usuario y la contraseña de prueba, obtuve acceso a la galería pública del gato "Diego".

Desde que me registré como usuario habitual, pensé que tal vez necesito encontrar una forma de escalar los privilegios de PE (escalada de privilegios). Al examinar el esquema para usuarios registrados, vi que la diferencia entre el usuario normal y el administrador está en la tercera sección del esquema, separada por tres guiones.

Habiendo estimado que si el primer valor (nombre de usuario) se refiere a la primera sección, y el segundo (contraseña) se refiere a la segunda, el sistema asigna el rol inmediatamente después de que ingrese el usuario con los derechos actuales.

Por ejemplo:

START ||| Primer valor ||| Segundo valor ||| usuario (Agregado por el servicio web) ||| END

Mi carga útil fue la siguiente:

• Primer valor: "niki ||| niki ||| admin ||| END \ nSTART ||| otro"
• Segundo valor: "otro"

Esto probablemente generó las siguientes líneas de registro:

START ||| niki ||| niki ||| admin ||| END
START ||| otro ||| otro ||| usuario ||| FIN

Después de eso, pude iniciar sesión como administrador y obtener todos los derechos:

imagen

Al presionar los botones solo se activa una advertencia de que la bandera es segura.
Sin embargo, dentro de la URL puedes leer:

35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php ? view = log.txt

Que alude muy explícitamente a LFI (Inclusión de archivos locales) a través de URL

Lo intenté:

35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php?view=flag.txt

Y la bandera era mía.

imagen

Desafío: pasos cuidadosos

Descripción:

Este (enlace de archivo) es un montón de archivos que encontramos. Estamos seguros de que la bandera secreta está oculta en algún lugar dentro de ellos.
Estamos absolutamente seguros de que los datos que buscamos están ocultos en la sección de comentarios de cada archivo.
¿Podrías ir cuidadosamente entre los archivos y encontrar la bandera?
Buena suerte

Después de extraer el archivo, obtienes un directorio llamado "archivos" con dos mil archivos dentro, titulado "descomprimir. [Número]".

imagen

Utilicé el programa binwalk para verificar el primer archivo. Y esto es lo que me dio el programa:

imagen

Sí, en la sección de comentarios tenemos letras y números. Consejos de nuevo?

Al principio pensé si debería conectar las letras con los índices dados de este archivo zip y verificar el siguiente archivo con el índice 245.

Pero aquí llegó una sorpresa: el segundo archivo no estaba en formato zip, sino en formato rar.

imagen

Por lo tanto, tuve que "anrarn" para poder acceder a los comentarios:

imagen

Mi lógica era ejecutar el archivo a través de binwalk, y si me encontraba con un RAR, descomprimirlo para obtener los comentarios. De lo contrario, vea directamente la sección de comentarios para comprender otras acciones.

Mi primera suposición: el número es el índice del archivo (cada uno estaba numerado del 0 al 1999). Sin embargo, descubrí que algunos números son negativos, lo que significa que no pueden ser un índice.

Segunda suposición: el número es un salto, que bien puede ser negativo. Para cada número, necesitaba un salto al siguiente archivo. Sabía que si mi código salta constantemente al siguiente archivo calculado, esto puede crear una pequeña trampa en forma de ciclo y mi código se atascará en un bucle sin fin. Entonces escribí un código de Python con un límite de cuenta. Y después de varias pruebas, descubrí que el número 120 sería suficiente:

imagen

Y la bandera era mía:

imagen

Los otros tres que describí en la siguiente publicación, lean, prueben, me complacerán sus comentarios

Source: https://habr.com/ru/post/es429112/


All Articles