Hola a todos, soy
Nikita Kurtin , curadora de la Escuela Superior Israelí de Informática y Seguridad
HackerUCheckpoint , 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.

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:

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:

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)

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

La bandera se especificó en el archivo descifrado:
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".

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

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

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

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

Inserté el valor resultante en la cadena de contraseña. Bingo!
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:

Circuito preestablecido:

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:

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 URLLo intenté:
35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php?view=flag.txtY la bandera era mía.
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 suerteDespués de extraer el archivo, obtienes un directorio llamado "archivos" con dos mil archivos dentro, titulado "descomprimir. [Número]".

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

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.

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

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:

Y la bandera era mía:

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