Quantcast
Channel: El blog de García Larragan y Cía
Viewing all 640 articles
Browse latest View live

Reversing (XIX): Solución Reto UTC-CTF 2019 "Jump! (baby)"

$
0
0
Comienzo con este post a incluir algunas de las soluciones a desafíos de la categoría 'Reversing' de UTC-CTF 2019, competición tipo 'Capture The Flag' (CTF), en formato 'Jeopardy', modalidad 'On-line' y por equipos.

Este primer reto, en mi opinión, tiene un nivel de dificultad bajo (☆☆☆).

El título del reto es "Jump! (baby)" y en su enunciado, que pongo a continuación, se hace referencia a otro reto "Strings (baby)", de la misma categoría y nivel de dificultad muy bajo, en el que la flag se obtiene sin más que buscarla directamente en el archivo que se proporciona (por ejemplo mostrando todas aquellas cadenas de texto que comiencen por "utc{"), y se nos da a entender que en este caso ese método no nos dará la solución al desafío.

Su enunciado es el siguiente:
Descargo el archivo que se proporciona (jump), un ejecutable de Linux (ELF).

No obstante lo dicho anteriormente, utilizo el software 'strings' para intentar localizar directamente la flag:
Y lo único que obtengo es una flag falsa.

Para obtener más información sobre el funcionamiento del ejecutable lo ejecuto:
Y directamente se muestra la flag falsa.

Desensamblo el ejecutable Linux con el software IDA para realizar un análisis estático del código y veo que la función 'main' se limita a mostrar la flag falsa:
Asimismo, veo que hay una función 'gimme_flag' que parece mostrar la flag y a la que por el título y enunciado del reto entiendo que es a la que debo realizar un salto para obtener la solución:
Para ello utilizo gdb, un depurador ('debugger') muy popular. En primer lugar desensamblo la función 'gimme_flag':
Tras analizar el código, creo que para que se muestre la flag se debe producir un salto a gimme_flag+108.

Para ello,pongo un punto de ruptura ('breakpoint') al inicio de la función 'main' (main+0) y otro en la función 'gimme_flag' (gimme_flag+84)ejecuto, cuando se detiene en el primer punto de ruptura salto al principio de la función 'gimme_flag' (gimme_flag+0), y cuando se detiene en el segundo punto de ruptura salto a gimme_flag+108:
 Y ya puedo ver la flag: utc{a_l1ttle_h4rd3r_:)}.

Explotación Web (VI): Solución Reto picoCTF 2019 "JaWT Scratchpad"

$
0
0
En este post comparto la solución a uno de los desafíos correspondientes a la categoría 'Web Exploitation' de la plataforma picoCTF 2019.

El reto en concreto, bajo el título "JaWT Scratchpad", en mi opinión, presenta un nivel de dificultad medio (☆☆).

JaWT Scratchpad - Points: 400.

Su enunciado dice lo siguiente: '
Check the admin scratchpad! https://2019shell1.picoctf.com/problem/37903/ or http://2019shell1.picoctf.com:37903'.

Y en la pestaña 'Hints' dan las siguientes pistas: 'What is that cookie?' y 'Have you heard of JWT?'.
Solución: se proporciona un 'link' a un sitio web:
Y me dicen que para iniciar sesión puedo usar cualquier nombre de usuario menos "admin", porque éste tiene un bloc de notas especial (que, además, según el enunciado es el que tengo que revisar para obtener la flag).

No sé a vosotros, pero a mí cuando me dicen que no puedo hacer algo, pues lo hago ;), a ver qué pasa... Intento iniciar sesión con el nombre de usuario "admin":
Y me da error, algo absolutamente previsible, pero por intentarlo... ;). Inicio sesión con un nombre de usuario cualquiera: hago caso a la recomendación que se hace y, aunque mi nombre me gusta ;), me conecto como "john" (¿puede ser esto último una pista?, ¿tendrá algo que ver el software 'John the Ripper' con este reto?,... Bueno, ya veré más adelante.):
Lo que sí tengo claro, por la primera pista que se proporciona, es que hay una 'cookie' que tiene algo que ver con la solución a este desafío, por lo que inspecciono las 'cookies' y veo, entre otras, la siguiente:
Por su nombre y la segunda pista que se proporciona, también parece claro que tiene algo que ver con la resolución de este reto, pero: ¿Qué es JWT?. Tras una breve búsqueda por Internet enseguida encuentro esta entrada, https://jwt.io/introduction/, que lo explica muy bien.

Decodifico la 'cookie' indicada anteriormente (jwt) en https://jwt.io/#debugger:
Bueno, creo que voy por buen camino: ¿Qué ocurriría si cambio el usuario "john" por "admin"?, ¿obtendría la flag?. Yo creo que sí y, por tanto, cambio el nombre de usuario, copio el JWT (JSON Web Token) así codificado, lo pego en la 'cookie' indicada anteriormente (jwt), la grabo y veo lo que pasa:
Al "Volver a cargar" la página (Ctrl + R) me da un error que no es muy explicativo, pero tras ciertas investigaciones entiendo que debo "crackear" la contraseña secreta para obtener una firma JWT válida.

Y es aquí donde puede entrar nuestro amigo 'John the Ripper' ;), posiblemente el software más popular para el "crackeo" de contraseñas. 

En la investigación realizada encuentro un script en python que convierte el JWT a un hash válido para 'John the Ripper'. Lo descargo y ejecuto:
Creo un archivo (JaWT_Scratchpad.hash) en el que copio el hash generado e intento "crackearlo" con 'John the Ripper':
Tras el resultado obtenido en el "crackeo", parece ser que la contraseña secreta para obtener una firma JWT válida es "ilovepico"Por tanto, cambio el nombre de usuario de "john" a "admin", incluyo como contraseña secreta: ilovepico, copio el JWT (JSON Web Token) así codificado, lo pego en la 'cookie' indicada anteriormente (jwt), la grabo y veo lo que pasa.  Y esta vez al "Volver a cargar" la página (Ctrl + R) puedo ver la flag:
Flag: picoCTF{jawt_was_just_what_you_thought_9ed4519dee8140de7a186a5df5a08d6e}.

Criptografía (CLXXV): Esquema de compartición de secretos de Shamir

$
0
0
Aunque habitualmente no las relacionamos con el esquema de compartición de secretos ideado por el criptógrafo israelí Adi Shamir (en inglés: 'Shamir's secret sharing scheme') o esquemas similares, todos hemos visto películas en las que un secreto se divide en partes y cada una de ellas se entrega a una persona, con la finalidad de que ninguna de ellas por separado pueda recuperar el secreto original y se precise que varias, un número mínimo y previamente establecido de éstas, se pongan de acuerdo y cooperen, aportando su parte, para que el secreto se revele.

Así, por ejemplo, todo recordamos películas en las que para activar el lanzamiento de misiles balísticos intercontinentales, para iniciar la tercera guerra mundial o responder a un ataque del enemigo, se reparte el código de activación (el secreto) entre diferentes participantes (a cada uno de ellos se le entrega una clave. Para el caso que pondré más adelante, consideremos cinco personas: presidente, vicepresidente y tres generales), de manera que para lanzar los misiles se requiere que un número de ellos (supongamos que tres) aporten su parte del secreto (la clave que ha recibido cada uno de ellos), y, sólo si es así, puedan obtener el código de activación.

Para implementar esto, en criptografía se utilizan los llamados esquemas de compartición de secretos, y en el caso concreto del esquema objeto de este post se  parte de lo que se denomina esquema de umbral (k, n), donde 'k' es el número de personas entre las que se divide o fracciona el secreto ('S') y 'n' es el número de ellas que deben cooperar para recuperar u obtener éste (en nuestro ejemplo, k = 5 y n = 3). Por tanto, 'n' es el umbral y, lógicamente, será menor o igual que 'k'(si 'n' = 'k' se requiere la concurrencia de todos los participantes para reconstruir el secreto).
Tal y como nos cuente wikipedia, "La idea esencial de la combinación de umbral de Shamir es que dos puntos son suficientes para definir una línea recta, tres puntos lo son para definir una parábola, cuatro para definir una curva cúbica y así sucesivamente. Es decir, basta con n + 1 puntos para definir un polinomio de grado n".

Pongamos un ejemplo: supongamos que, como he dicho antes, el código de activación de los misiles, el secreto ('S'), es 1234 y lo vamos a dividir en 5 partes, cada una de las cuales la entregaremos a uno de los participantes (presidente, vicepresidente y tres generales), y sólo si tres cualesquiera de ellos se ponen de acuerdo e introducen en el sistema sus correspondientes claves reconstruirán el secreto ('S'), es decir, obtendrán el código de activación para lanzar los misiles.

En este caso, para implementar el esquema de compartición de secretos de Shamir, necesitamos un polinomio de grado 2 (en general, de grado n -1):
Donde: a0 o término independiente es el secreto a compartir (en nuestro caso: S = a0 = 1234), y al resto de coeficientes (a1...an-1) les asignamos valores aleatorios (en nuestro caso, supongamos que: a1 = 24 y a2 = 57). Por tanto, en nuestro ejemplo tendríamos el siguiente polinomio:
A cada uno de los participantes le damos un punto de este polinomio (cada uno de ellos definido por x y f(x)):

f(1) =1234 + 24 + 57 = 1315, es decir, al presidente le damos el par de valores (1, 1315).
f(2) =1234 + 48 + 228 = 1510, es decir, al vicepresidente le damos (2, 1510).
f(3) =1234 + 72 + 513 = 1819, es decir, al primer general le damos (3, 1819).
f(4) =1234 + 96 + 912 = 2242, es decir, al segundo general le damos (4, 2242).
f(5) =1234 + 120 + 1425 = 2779, y, finalmente, al tercer general le damos (5, 2779).

Sin entrar en la demostración matemática, para lo que además no tengo ni capacidad ni talento, basándome en el polinomio interpolador de Lagrange, si no estoy equivocado, puedo obtener el polinomio original y, por tanto, reconstruir el secreto ('S') con sólo tres de los puntos anteriores (claves), no con menos, de la siguiente manera (supongamos que el primer general fallece en un atentado terrorista y nadie puede proporcionar su clave, el segundo general no está de acuerdo con el lanzamiento de los misiles en ese momento, porque duda de que estén siendo atacados, y que sólo el presidente, el vicepresidente y el tercer general están de acuerdo en el lanzamiento porque creen que, a su vez, están siendo atacados por misiles enemigos y que no pueden demorar más tiempo una respuesta contundente):
Como se ve en la figura anterior, con sólo tres puntos (claves) hemos reconstruido el secreto original, que es el término independiente del polinomio (S = a0 = 1234), y ya estaríamos en disposición de lanzar los misiles :).

Criptografía (CLXXVI): Reto 34

$
0
0
En este post un reto de criptografía en el que se ve involucrado un esquema de compartición de secretos.

Incluso aunque creas que no, seguro que has oído hablar de este tipo de esquemas (Ver este post donde explico el inventado por el criptógrafo israelí Adi Shamir).

La idea consiste en que el secreto se divide en partes y cada una de ellas se entrega a una persona, con la finalidad de que ninguno de los intervinientes por separado pueda recuperar el secreto original y se precise que varios, un número mínimo y previamente establecido de éstos, se pongan de acuerdo y cooperen, aportando su parte, para que el secreto se revele.

En el post mencionado anteriormente explico cómo reconstruir de forma manual el secreto compartidos ('S') entre varios participantes, pero para resolver este desafío utilizaré una herramienta.

Como siempre, se admiten soluciones en forma de comentarios a esta entrada. Pasado un tiempo iré proporcionando pistas para su resolución, un máximo de tres, y posteriormente actualizaré este post con la solución.

Reto 34: "El secreto compartido".

Supongamos que un padre ingresa una cierta cantidad de dinero a sus cinco hijos en una cuenta de una entidad bancaria. La única condición que les pone para disponer del dinero es que al menos tres de ellos se pongan de acuerdo en el fin o fines para los que gastarlo. La única manera que tienen los hijos de disponer del dinero es una tarjeta de débito que el padre les entrega, pero no les dice cuál es el PIN de la misma, sino que da a cada uno de ellos una clave (un par de números) de tal forma que sólo si al menos tres ellos se ponen de acuerdo e introducen sus respectivas claves en un programa informático elaborado por el padre se revelerá el PIN. Dadas las claves (el par de números id-clave) que figuran en el archivo asociado al reto para cada uno de los hijos, ¿puedes decirme cuál es el PIN de la tarjeta?.

Dificultad:
Tipo:       Criptografía.

Recursos: - claves.txt.

******** __/__/____
Pista 1:    Por publicar.

******** __/__/____
Solución: Por publicar.

******** PRÓXIMO RETO
Reto 35:   Por publicar.

Criptografía (CLXXVII): Solución Reto 34

$
0
0
Solución al último reto de criptografía que he puesto en este blog.

El enunciado del reto decía lo siguiente:

"Supongamos que un padre ingresa una cierta cantidad de dinero a sus cinco hijos en una cuenta de una entidad bancaria. La única condición que les pone para disponer del dinero es que al menos tres de ellos se pongan de acuerdo en el fin o fines para los que gastarlo. La única manera que tienen los hijos de disponer del dinero es una tarjeta de débito que el padre les entrega, pero no les dice cuál es el PIN de la misma, sino que da a cada uno de ellos una clave (un par de números) de tal forma que sólo si al menos tres ellos se ponen de acuerdo e introducen sus respectivas claves en un programa informático elaborado por el padre se revelerá el PIN. Dadas las claves (el par de números id-clave) que figuran en el archivo asociado al reto para cada uno de los hijos, ¿puedes decirme cuál es el PIN de la tarjeta?".

Y como recurso asociado al reto se proporcionaba el siguiente: 
claves.txt.

Solución: tal y como decía en la primera y única pista que puse para ayudar a resolver este reto, para obtener la solución basta con instalar en Linux el paquete ssss ("Shamir's secret sharing scheme") e investigar un poco su forma de uso, que es muy fácil.

Para recuperar el secreto basta con ejecutar el siguiente comando: ssss-combine -t 3 e introducir, al menos, tres cualesquiera de las claves que figuran en el archivo asociado al reto:
Y ya puedo ver que el PIN de la tarjeta y, por tanto, la solución a este reto es: 1964.

También decía en la citada primera y única pista que, si no se tiene Linux o no se quieres instalar nada, este desafío se puede resolver utilizando la siguiente herramienta 'online'http://point-at-infinity.org/ssss/demo.html.

Si introducimos, al menos, tres cualesquiera de las claves que figuran en el archivo asociado al reto y pulsamos sobre el botón "Combine!" obtenemos el PIN de la tarjeta: 1964.
******** PRÓXIMO RETO
Reto 35:   Por publicar.

Forense (XI): Solución Reto neverLAN CTF 2020 "Listen to this"

$
0
0
Según sus propios organizadores, NeverLAN CTF es una competición en modalidad 'on-line' estilo 'Capture the Flag'  y formato 'Jeopardy', creada con el objetivo de enseñar informática a la generación más joven y fomentar entre la misma el pensamiento crítico y la resolución de problemas.

Este evento dio comienzo este pasado sábado y concluyó el martes de esta misma semana, es decir, se ha llevado a cabo del 8 al 11 de febrero de 2020.

Esta competición está orientada a estudiantes de secundaria y creo que la dificulta de los retos es apropiada para ese colectivo. Además y como puede competir cualquiera :), aunque dichos estudiantes tienen su propia clasificación, me he entretenido un rato intentando resolver los desafíos.


Comienzo con este post a incluir algunas de las soluciones. En éste pongo la solución a un reto de la categoría 'Forensics', en concreto el que llevaba por título "Listen to this", que en mi opinión presenta un nivel de dificultad medio (☆☆):
Descargo el archivo de audio que se proporciona ("HiddenAudio.mp3") y lo escucho. Al principio del mismo creo reconocer un sonido parecido a código morse.

Abro el archivo con el software "Sonic Visualiser" y veo, al incluir el espectograma en el canal 2, algo parecido a código morse:
Es decir, el principio de dicho código sería: ..-. .-.. .-

Para decodificarlo utilizo una herramienta 'on-line' y obtengo la cadena "FLA":
Por lo que parece claro que, efectivamente, el canal 2 incorpora un sonido de código morse que una vez decodificado nos dará la solución a este reto, pero el resto de código morse no se ve muy bien.

Aunque sería posible obtener mayor cantidad de código que el indicado, intento obtener el código morse completo de la siguiente manera, ya que la única diferencia entre las señales de sonido incluidas en ambos canales parece ser que en el primero de ellos no se incorpora el código morse mientra que éste sí se incluye en el canal 2, es decir, canal 1 = A; canal 2 = A + B, siendo B la señal correspondiente al código morse:

1.- Abro el archivo asociado al reto,"HiddenAudio.mp3", con el software "Audacity" y divido la pista estéreo:
Y obtengo:
2.- Selecciono toda la señal del canal 1 y la invierto:
Y obtengo:
3.- Selecciono las señales de ambas pistas (Ctrl + A), las mezclo y genero una pista estéreo (opción "Pistas"> "Mezcla"> "Mezclar y generar"):
Y obtengo:
4.- Finalmente, selecciono las señales de ambos canales, las mezclo y genero una pista mono (opción "Pistas"> "Mezcla"> "Mezclar pista estéreo a mono"):
Y obtengo:
Es decir, con todo esto la idea que tengo es obtener la diferencia existente entre las señales de ambos canales del archivo asociado al reto (al invertir la señal del canal 1 y generar una pista mono con la mezcla de la señal invertida y la del canal 2 debería obtenerse la diferencia entre las señales de ambos canales, es decir, A + B - A = B (una señal con sólo el código morse), lo que parece que he conseguido. Examino el espectograma de esta última señal:
Y obtengo:
Con lo que ya puedo ver más claramente todo el código morse. No obstante, para verlo aún mejor (para examinar el espectograma suelo utilizar el software "Sonic Visualiser") exporto la señal a un archivo mp3 con el nombre "HiddenAudio_2", lo abro con el último software indicado y examino el espectograma:
Por tanto, el código morse completo es: ..-. .-.. .- --. -.. .. - ... .- -. -.. -.. .- .... ... ..-. --- .-. .-.. .. ..-. .

Lo decodifico:
Y ya puedo ver la flag.

Criptografía (CLXXVIII): Solución Reto NeverLAN CTF 2020 "Crypto Hole"

$
0
0
En mi opinión, los retos de la categoría 'Crypto' de la edición de 2020 de la competición NeverLAN CTF presentan como media un nivel de dificultad muy bajo, pero creo que dicho nivel es adecuado teniendo en cuenta, como dije en el post anterior, que esta competición está orientada a estudiantes de secundaria.

En esta entrada pongo la solución al desafío que creo que es un poco más complicado de resolver que el resto, cuyo título es "Crypto Hole", y que mezcla diferentes tipos de criptosistemas. A este reto en concreto yo le asignaría un nivel de dificultad medio (☆☆):
Descargo el archivo comprimido asociado al reto (A_ffine_Cipher_here_3.zip) y extraigo los archivos que contiene con la contraseña que se indica, "NeverLANCTF".

Uno de ellos, "chal.txt", contiene el siguiente criptograma: "whzzdvyk: HmcxWGD0iKTI&OAmgv". Por el nombre del archivo .zip se puede sospechar que el texto en claro ha sido cifrado utilizando el llamado cifrado afín y pruebo a descifrarlo mediante la fuerza bruta utilizando una herramienta 'on-line':
Y parece que he obtenido la contraseña ("password: AfvqPZW0bDMB&HTfzo") para extraer los ficheros contenidos en el archivo comprimido "Two is better than one.zip" y pasar así al siguiente nivel.

Nótese que como la constante de decimación (a) es 1 también podríamos haber obtenido la password del archivo utilizando la fuerza bruta con el cifrado César:
Una vez extraídos los ficheros contenidos en el archivo comprimido "Two is better than one.zip", en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "PASTNRQXX78DRDVI6KBD3SDFXXXXXXSWO". Desconozco qué criptosistema concreto se ha empleado para cifrar el texto en claro, pero creo que está claro que es de transposición y por el nombre del archivo .zip se puede sospechar que se trata de una transposición columnar doble, pero desconozco cuál es la clave utilizada. En muchos retos de esta competición, cuando se ve involucrada una clave, ésta suele ser "NEVERLANCTF" o algo similar, por lo que voy a probar a descifrar el criptograma utilizando una herramienta 'on-line' e introduciendo como clave la indicada o alguna similar:
Y, efectivamente, parece que he obtenido la contraseña ("PASSWORDV78DTNRI6KBD3SDFQXXXXXXXX"), sin la cadena "PASSWORD" inicial ni los caracteres "X" finales, para extraer los ficheros contenidos en el archivo comprimido "I'm on the fence with this one.zip" y pasar así al siguiente nivel.

Vale, supongamos que no hubiera podido inferir la clave empleada, ¿Podría haber hecho algo para obtener la password del archivo .zip que se esconde en el criptograma. En ese caso se me ocurre que podría utilizar un ataque de fuerza bruta por diccionario, de la siguiente manera:

1.- Creo un diccionario utilizando los grupos de caracteres del critograma que formarían parte de la clave (los grupos correspondientes a caracteres, tres o menos, no resaltados en color rojo en "PASTNRQXX78DRDVI6KBD3SDFXXXXXXSWO"), es decir:  "TNR", "Q", "78D", "V", "I6K", "BD3" y "SDF". Para ello utilizo la herramienta "pydictor", de la siguiente manera:
Y ahora realizo el ataque de fuerza bruta utilizando el software "fcrakzip" y el diccionario generado:
Una vez extraídos los ficheros contenidos en el archivo comprimido "I'm on the fence with this one.zip", en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "pw:Ea8oasod SA5egBlvsrVSvwr". En esta ocasión, por el nombre del archivo .zip se puede sospechar que se trata de un cifrado rail fence.  Para descifrar el criptograma utilizo una herramienta 'on-line':
parece que he obtenido la contraseña ("password:·VSEAS5aevg8Bwlovr") para extraer los ficheros contenidos en el archivo comprimido "Salad Time.zip" y pasar así al siguiente nivel.

Una vez extraídos los ficheros contenidos en el citado archivo .zip, en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "knppwjor: cQGuVCd$TyOUPppXUnPX". Por el nombre del archivo .zip se puede sospechar que se trata del cifrado César, pero no consigo  descifrar el criptograma con la herramienta 'on-line' que he utilizado anteriormente.

Investigo por Internet y repaso las herramientas que suelo utiliza para resolver los retos de criptografía, y entre estas últimas encuentro el cifrado de César con clave ('Keyed Caesar'):
Es decir, se trata de una variante del cifrado César en la que no se utiliza el alfabeto estándar, sino que se usa uno en el que se escribe primero una palabra o frase que utilizaremos como clave (omitiendo los caracteres repetidos) y se completa ésta con el resto de caracteres del alfabeto estándar, es decir, los no utilizados en la palabra o frase que nos sirve de clave.

Intento el descifrado utilizando esa herramienta 'on-line' y, como he hecho también antes, con "NEVERLANCTF" como clave:
creo que he obtenido la contraseña ("password: gTLvCGk$HyRVSssXVaSX") para extraer los ficheros contenidos en el archivo comprimido "ROTten.zip" y pasar así al siguiente nivel.

Una vez extraídos los ficheros contenidos en el citado archivo .zip, en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "cnffjbeq: r1Lqe*mkBBloS6EE%u5s". Por el nombre del archivo .zip se puede sospechar que se trata de un cifrado ROT13. Intento el descifrado utilizando una herramienta 'on-line':
parece que he obtenido la contraseña ("password: e1Ydr*zxOOybF6RR%h5f") para extraer los ficheros contenidos en el archivo comprimido "Viginere Equivent E.zip" y pasar así al siguiente nivel.

Una vez extraídos los ficheros contenidos en el citado archivo .zip, en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "tewwasvh: jM7FTDP#DR5TM!&tfXBg". Por el nombre del archivo .zip se puede sospechar que se trata de un cifrado de Vigenère. Sin embargo, hay una cosa que no me cuadra mucho, ya que entiendo que la primera cadena del criptograma, "tewwasvh", se debería corresponder con la cadena "password" en el texto en claro, y ésto, como este sistema de cifrado es de sustitución simple polialfabética, sólo sería posible si el tercer y cuarto caracteres de la clave utilizada fuera el mismo y en concreto "E". En cualquier caso, intento el descifrado utilizando una herramienta 'on-line' especifica para este criptosistema:
parece que he obtenido la contraseña ("password: fI7BPZL#ZN5PI!&pbTXc") para extraer los ficheros contenidos en el archivo comprimido "Easy One.zip" y pasar así al siguiente nivel.

Nótese que, como la clave utilizada en el cifrado tiene un único carácter ("E", ahora entiendo el nombre del archivo .zip, "Viginere Equivent E.zip", y que esta letra sea la última de dicho nombre), en este caso el cifrado realizado sería equivalente a un cifrado César con un desplazamiento de cuatro caracteres:
Una vez extraídos los ficheros contenidos en el archivo "Easy One.zip", en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "cGFzc3dvcmQ6IHZ4d0BadGV0I1pmQm5ZVnhKMUlN". Ni idea de cuál es el criptosistema empleado, pero por el título del archivo .zip no puede ser muy difícil. Por los caracteres empleados puede tratarse de código base64, por lo que utilizo una herramienta 'on-line' para decodificarlo (creo que a veces, como es el caso, se confunde la codificación con la criptografía, pero en fin...):
Una vez extraídos los ficheros contenidos en el archivo "Message indigestion.zip" utilizando la clave que se ve en la figura anterior, en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "1f82cdf9195b31244721c6026587fb78". Por el nombre del archivo .zip, "Message indigestion", se puede sospechar que se trata de un hash MD5, lo que se ve reforzado por que, además, tiene 32 caracteres hexadecimales. Para obtener la password para pasar de nivel utilizo una herramienta 'on-line':
parece que he obtenido la contraseña ("password23") para extraer los ficheros contenidos en el archivo comprimido "for SHA dude" y pasar así al siguiente nivel.

Una vez extraídos los ficheros contenidos en el citado archivo .zip, en el archivo "chal.txt" correspondiente a ese nivel se ve otro criptograma: "57fc022fb8dbf1640e732c40e835f74e637526d8"Por el nombre del archivo .zip no me cabe ninguna duda de que se trata de un hash SHA. Para obtener la password para pasar de nivel utilizo la misma herramienta 'on-line' que la que he usado en el nivel anterior:
parece que he obtenido la contraseña ("applez14") para extraer los ficheros contenidos en el archivo comprimido "ONE more TIME" y pasar así al siguiente nivel.

Una vez extraídos los ficheros contenidos en el citado archivo .zip, en el archivo "chal.txt" correspondiente a ese nivel se ve un texto en claro más otro criptograma: "This is our world now...
Vvvyzshm fj tzylfvegn ehz ksh qwrwxs nlcecsagrv ubmdp qgvv momt sny lsdjk osmy grhc xoxk zgprjr... Ks pzij, lecv'w yrsv ctsz nbx w rhi kyea dmvr lqox{yyyiv0gLakvr}". Por el nombre del archivo .zip se puede sospechar que se trata de un cifrado 'one-time pad' (OTP) y, si es así, para descifrar el criptograma necesio una contraseña igual de larga que él.

Tras buscar en 'Google' el texto en claro "This is our world now..." enseguida veo que hay un párrafo del "Manifiesto Hacker" que empieza precisamente así:
A partir de ese texto cojo un número de caracteres de longitud igual o mayor que el criptograma, para que me sirvan como clave en el descifrado, y utilizo una herramienta 'on-line':
Por tanto la solución a este reto sería: flag{crypt0sRphun}.

Criptografía (CLXXIX): Solución Reto Pragyan CTF 2019 "The Order of the Phoenix"

$
0
0
Este próximo fin de semana (22 feb., 12:30 UTC - 24 feb. 2020, 12:30 UTC) me voy a entretener un rato intentando resolver los retos de Pragyan CTF 2020una competición en modalidad 'on-line' estilo 'Capture the Flag'  y formato 'Jeopardy', y para hacerme una idea de la dificultad de los desafíos de este evento estoy "entrenándome" con retos de ediciones anteriores.

En esta entrada pongo la solución a un desafío de la edición de 2019, la correspondiente al reto que lleva por título "The Order of the Phoenix".

El enunciado dice lo siguiente:

'It's a new age Order of the Phoenix. The current members are:
1.Harry
2.Hermione
3.Ron
4.George
5.Charlie
6.Bill
7.Ginny
8.Fleur
9.Luna
10.Neville
Each of them has a secret QR code associated with him/her which is given to you. At the entrance of the Grimmauld place, is a system to scan their QR codes.
Any 5 or more of them can enter at once, but not less than 5. This is in place to prevent any rash decisions made by very few people regarding the matters concerning the Order.
However, now is an emergency time. Malfoy is causing trouble again, and Harry needs to enter Grimmauld Place for which he needs to know the secret associated with the entry system to let him in. Help him out'.

Solución: por el enunciado me queda claro que este reto toma como base el esquema de compartición de secretos de Shamir, sobre el que ya he escrito un post en este blog.

Por tanto, lo que entiendo que debo hacer es decodificar, al menos, cualesquiera de 5 de los códigos QR secretos asociados a otros tantos miembros de la orden y, a partir de las decodificaciones realizadas, obtener el secreto compartido (en nuestro caso la flag).

Utilizando una herramienta 'on-line', decodifico los códigos QR correspondientes a: Harry, George, Charlie, Ginny y Fleur, y obtengo lo siguiente:
Y ahora introduzco las cinco partes del secreto obtenidas (https://github.com/skewthreads/QR-secret-sharing) para recuperar el mensaje original:
Por lo que la solución (flag) a este reto es: pctf{sh4m1r3_w4s_4_gr34t_m4n}.

Criptografía (CLXXX): Reto 35

$
0
0
En este post un  reto de esteganografía con el que creo que llego al más alto nivel posible de frikismo :).

Como siempre, se admiten soluciones en forma de comentarios a esta entrada. Pasado un tiempo iré proporcionando pistas para su resolución, un máximo de tres, y posteriormente actualizaré este post con la solución.

Reto 35: "Atrápalo si puedes".

Si sabes qué es lo que aparece en la imagen que ilustra este post muy posiblemente tengas un/a hijo/a de unos 27 años o seas dicho hijo/a. Yo todavía recuerdo cuando jugaba con mi hijo Ander a capturar el mayor número posible de tipos o especies de pokémon, para ir completando la información de todos ellos en la Pokédex y que éstos vayan sumando habilidad y fortaleza, y evolucionando, mediante su enfrentamiento a otros pokémon (salvajes o pertenecientes a otros entrenadores), y así convertirnos en verdaderos Maestros Pokémon. Cada uno teníamos nuestro pokémon preferido y el mio está atrapado en la pokéball que se ve en el archivo de imagen asociado al reto. Para abrirla deberás usar el nombre de mi pokémon favorito. ¿Puedes abrirla y decirme que hay dentro?.

Dificultad:
Tipo:       Esteganografía.

Recursos: - pokeball.jpg.

******** __/__/____
Pista 1:    Por publicar.

******** __/__/____
Solución: Por publicar.

******** PRÓXIMO RETO
Reto 36:   Por publicar.

Criptografía (CLXXXI): Solución Reto 35

$
0
0
Solución al último reto de esteganografía que he puesto en este blog.

El enunciado del reto decía lo siguiente:

"
Si sabes qué es lo que aparece en la imagen que ilustra este post muy posiblemente tengas un/a hijo/a de unos 27 años o seas dicho hijo/a. Yo todavía recuerdo cuando jugaba con mi hijo Ander a capturar el mayor número posible de tipos o especies de pokémon, para ir completando la información de todos ellos en la Pokédex y que éstos fueran sumando habilidad y fortaleza, y evolucionando, mediante su enfrentamiento a otros pokémon (salvajes o pertenecientes a otros entrenadores), y así convertirnos en verdaderos Maestros Pokémon. Cada uno teníamos nuestro pokémon preferido y el mio está atrapado en la pokéball que se ve en el archivo de imagen asociado al reto. Para abrirla deberás usar el nombre de mi pokémon favorito. ¿Puedes abrirla y decirme qué hay dentro?".

Y como recurso asociado al reto se proporcionaba el siguiente: pokeball.jpg.


Solución: de lo indicado en el enunciado y por el propio archivo asociado al reto (pokeball.jpg) se puede deducir que en la imagen que contiene este último se esconde la solución a este desafío y que para acceder a ella se debe utilizar como clave el nombre de un pokémon. Inicialmente voy a suponer que el software de esteganografía que se ha empleado para ocultar la información es uno de los más populares, steghide.

El número de pokémon es bastante grandeaproximadamente novecientos, por lo que lo lógico parece ser realizar un ataque de fuerza bruta mediante diccionario. Por tanto, lo primero que hago es crear un diccionario con los nombres de los pokémon (Diccionario_Pokemon.txt) que aparecen en esta lista.


Y a partir del diccionario creado realizo el ataque:
$ for i in $(cat Diccionario_Pokemon.txt); do echo '[+] Probando ' $i; steghide extract -sf pokeball.jpg --passphrase $i; done

Se van probando como clave todos los nombres de los pokémon incluidos en el diccionario y, una vez finalizado el ataque se ve que se ha extraído un archivo de texto (pokemon.txt). Además, podemos ver que éste se ha generado cuando se ha introducido como clave "Zapdos":
Que, efectivamente, es mi pokémon favorito :), y abriendo el fichero extraído puedo ver la solución a este reto:
******** PRÓXIMO RETO
Reto 36:   Por publicar.

Criptografía (CLXXXII): Solución Reto CyberOlympics 2019 "Follow the hint"

$
0
0
CyberOlympics es una competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Esta competiicón 'on-line' suele llevarse a cabo anualmente hacia el mes de octubre y, posteriormente, los diez centros que obtienen la mejor puntuación son invitados a la final presencial que suele tener lugar en el mes de noviembre, cada año en una ciudad española diferente.

Pues bien, aunque en Internet se pueden consultar los enunciados y soluciones de los retos de la fase final (CyberCamp), al menos, yo no consigo ver los correspondientes a la fase previa (CyberOlympics).

Algunos de los centros que han participado en ediciones anteriores, conocedores de que me gusta este mundo de los CTF y una vez finalizada la competición, me suelen pedir a ver si puedo resolver alguno de los retos y enviarles las soluciones, con objeto de preparar al equipo del centro para la próxima edición. Cosa que suelo hacer, como digo este tipo de desafíos me entretienen mucho.

Comienzo con este post a compartir algunas de las soluciones de esta competición con quienes estén interesados. En esta entrada pongo la solución a uno de los retos de criptografía de la edición de 2019, que lleva por título "Follow the hint" y que, en mi opinión, presenta un nivel de dificultad bajo (☆☆).

Su enunciado decía lo siguiente:

Un ciudadano anónimo es testigo del delito que estás investigando y te ha enviado un correo electrónico el cual contiene una pista clave para la investigación.
Dicho ciudadano se ha tomado la molestia de utilizar varias capas de criptografía con el fin de que solo un auténtico detective pueda descifrarlo.
También ha añadido una envoltura cifrada mediante "web tokens". Se te entrega un ZIP cifrado y el mensaje en el fichero TXT que alberga la contraseña, el cual tendrás que descifrar para cumplir con éxito tu investigación.
#webtoken #warsecrets #whatthisstringlookslike

Solución: Decodifico el  código base64 que contiene el fichero de texto que se proporciona (password.txt) y que según el enunciado alberga la contraseña:

Y obtengo otro texto codificado en base64, y así sucesivamente hasta que obtengo un texto en claro inteligible:
Y digo que inteligible porque a mí, tras las múltiples entradas que he escrito en este blog sobre la máquina de cifrado más famosa de la historia :), me queda claro que se trata de una clave de la máquina enigma utilizada por el ejército alemán en la segunda guerra mundial.

Por tanto, para intentar descifrar el criptograma, utilizo un simulador de dicha máquina que configuro conforme a la clave obtenida:

1.- Selecciono la versión de la máquina enigma que se indica en la clave:
2.- Introduzco el reflector utilizado:
3.- Indico Rotores empleados en el cifrado (lento, medio y rápido), su posición y el ajuste de los anillos de los mismos:
4.- Y, finalmente, para terminar de configurar la máquina con la clave obtenida, establezco las conexiones correspondientes en el tablero de clavijas:
5.- Con lo que lo único que me queda por hacer para descifrar el criptograma es introducir éste:
Y ya puedo ver que la contraseña del archivo ZIP cifrado (flag.zip) que contiene la solución a este reto sería “LEADKSZU". Pruebo con ella, pero me dice que es incorrecta.

Compruebo la configuración de la máquina y el criptograma introducido, pero no veo que me haya equivocado y se me ocurre probar con la contraseña obtenida en minúsculas, es decir, "leadkszu", y es correcta, lo que entiendo que es un pequeño error del reto :), ya que una máquina enigma sólo tenía letras mayúsculas.

Abro el archivo flag.txt descomprimido y ya puedo ver la solución a este reto (he sustituido cada uno de los caracteres de la flag por '*'):

Forense (XII): Solución Reto CyberOlympics 2019 "Hidden Backup"

$
0
0
En este post la solución a otro de los retos de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

El desafió en cuestión llevaba por título "Hidden Backup", un reto de categoría Forense que, en mi opinión, presenta un nivel de dificultad bajo (☆☆).

Su enunciado decía lo siguiente:

Se han conseguido incautar una serie de pruebas en las dependencias de una organización criminal. Siendo parte del equipo de investigación, debes encargarte de examinar un fichero que parece ser una especie de copia de seguridad de un dispositivo de almacenamiento.
¿Crees que contiene únicamente lo que aparenta?.
#freeornot #forensictools #whomadethis #filecarving

Solución: extraigo el fichero (evidence.raw) contenido en el archivo comprimido que se proporciona y utilizo la herramienta 'ExifToolGUI' para ver sus metadatos:
Me llama la atención que el campo "Software" contiene el valor “TPmPrzicMZB3R3vrFXyt”, que podría ser código base64, pero al decodificarlo no obtengo nada coherente. Sin embargo, entiendo que no es un valor habitual y, además, podría dar respuesta a una pista del reto (#whomadethis), por lo que tendré presente este valor por si lo necesitara más adelante (podría tratarse de una password, etc.).

Otras dos pistas que podrían ser importante son #forensictools y #filecarving, y también lo que dice el enunciado sobre: “¿Crees que contiene únicamente lo que aparenta?”, por lo que pruebo con 'foremost', una herramienta de recuperación de archivos borrados que aplica una técnica de extracción llamada 'file carving':
Y veo que se extrae un fichero comprimido (00148342.zip) que contiene un archivo de texto (flag.txt):
Intento extraer el archivo flag.txt y me pide una contraseña:
Y es aquí donde me acuerdo del valor “TPmPrzicMZB3R3vrFXyt” que contiene el campo "Software" de los metadatos del archivo que se proporciona con el reto (evidence.raw). Pruebo con ese valor como contraseña del archivo zip (00148342.zip) y, efectivamente, es la password correcta y se extrae el archivo flag.txt. Lo abro y ya puedo ver la solución al reto (he sustituido cada uno de los caracteres de la flag por '*'):

Forense (XIII): Solución Reto CyberOlympics 2019 "Identify Me"

$
0
0
En este post la solución a otro de los retos de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Aunque yo diría que el tipo de retos en el que englobar el desafío al que me voy a referir en este post, en los que se ve involucrado el más popular de los analizadores de protocolos, 'Wireshark', debería ser el de "Análisis de tráfico de red", yo lo voy a catalogar, siguiendo el criterio más comúnmente empleado en este tipo de competiciones, en la categoría de "Forense".

Son desafíos, al igual que los pertenecientes a muchas otras categorías, en los que me considero un absoluto lego en la materia, vamos, que no se me dan precisamente bien, pero a cuya resolución le pongo, como a todos ellos, una gran voluntad, aunque siempre o casi siempre sin conseguir nada positivo :). Sí, ya se que las buenas intenciones no me eximen de culpa, por lo que pido de antemano a mis amigos técnicos de sistemas de comunicaciones que me perdonen por el "delito" que voy a perpetrar contra su amada disciplina con las explicaciones que voy a dar en esta entrada.

El desafío en cuestión llevaba por título "Identify Me" y, en mi opinión, presenta un nivel de dificultad medio (☆☆).

Su enunciado decía lo siguiente:

¿Qué está pasando en nuestra red? Al parecer está saliendo información de la empresa, pero lo único que tenemos expuesto al exterior es un servidor web y no vemos que haya nada raro. Hemos hecho una prueba descargando un fichero cualquiera del servidor. ¿Podrías decirnos si encuentras algo raro?.
Utiliza la herramienta Wireshark para encontrar tu pista. Tanto Wireshark como tshark pueden ayudarte en el filtrado de los campos.
#payload #export #fields

Solución: abro con 'Wireshark'el archivo asociado al reto (captura.pcap) y, siguiendo el enunciado y una de las pistas (#export), exporto los objetos HTTP (veo que hay un archivo pdf):
El documento así obtenido trata sobre la especificación actualizada del campo de identificación (ID) de IPv4.

El tema del que trata este documento y la pista #fields hacen que centre mis sospechas en el contenido de dicho campo, por lo que decido visualizar en la lista de paquetes el valor del campo de identificación ('Identification') de IPv4 ('Internet Protocol Version 4'), con objeto de proceder al análisis de su contenido de forma más rápida y fácil:
Tras analizar el contenido del mencionado campo me queda claro que la flag parece esconderse en él:
Es decir, el contenido de ese campo en ciertos paquetes sería el valor hexadecimal correspondiente al carácter ASCII al que representa en la flag.

Pero, ¿de qué paquetes?. Teniendo en cuanta la pista que nos falta de utilizar (#payload) filtro los paquetes con la IP de origen (‘Source’) igual a 192.168.226.129 y con carga útil, y obtengo lo siguiente (he sustituido parte de los valores hexadecimales y los caracteres ASCII a los que los primeros representan por "..." y "*", respectivamente, entre los caracteres de la flag "{" y "}"):
Y lo único que quedaría por hacer para obtener la flag completa sería convertir cada valor hexadecimal al correspondiente carácter ASCII al que representa.

Criptografía (CLXXXIII): Solución Reto CyberOlympics 2019 "Cryptotime"

$
0
0
En esta entrada la solución a otro de los retos de criptografía de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Este desafió, que llevaba por título "Cryptotime", en mi opinión, presenta un nivel de dificultad medio (☆☆).

Su enunciado decía lo siguiente:

Necesitamos conocer el contenido de un fichero cifrado muy importante que hemos conseguido extraer de un sujeto de nuestras investigaciones.
Sin embargo, no sabemos exactamente cuál es, así que hemos sustraído cinco ficheros sospechosos y un módulo de Python que pensamos está relacionado con el método de cifrado de éstos.
Además, encontramos una especie de fichero de log, que parece muy importante. ¿Puedes ayudarnos?.
#asifunciona #RSA #timematters

Solución: como archivos asociados al reto se proporcionan cinco ficheros cifrados (image.png.enc, important.txt.enc, message.txt.enc, mouse.jpg.enc y note.txt.enc), un archivo con un script de python (super_cipher.py) y un fichero de log que supuestamente se obtiene tras la ejecución del anterior (log.txt).

En el fichero con el script de python se observa que los criptosistemas empleados para cifrar son RSA (cifrado asimétrico con el que se cifra la clave de sesión) y AES (cifrado simétrico que emplea la clave de sesión anterior para cifrar el contenido de los diferentes ficheros y obtener así los respectivos archivos cifrados que se nos dan en el reto).

Además, tal y como se ve en el citado script, la clave de sesión es un número aleatorio de 16 bytesy las claves RSA, pública y privada, se generan a partir de un número primo (‘p’) dado y de otro número primo (‘q’) que se obtiene a partir del tiempo del sistema en milisegundos. De ahí la importancia del fichero de log que se nos proporciona (log.txt), ya que a partir de él podremos generar las claves RSA utilizadas y proceder al descifrado de todos los ficheros (sospecho que el archivo important.txt.enc contiene la clave de sesión cifrada con la que posteriormente descifrar el resto de ficheros. Es decir, creo que lo primero es descifrar el contenido de important.txt.enc con la clave privada RSA).

Sé que ‘q’ debe ser un número primo y el último número obtenido para generar 'q' a partir del tiempo del sistema en milisegundos que figura en el archivo log.txt es 1569309559111. Compruebo si se trata de un número primo intentando factorizarlo con una herramienta 'on-line':
Como se observa en la figura anterior, el número mencionado es compuesto, por lo que no puede ser el número ‘q’ empleado en la generación de las claves RSA.

Veo en el script  de python que si el número que se obtiene a partir del tiempo del sistema en milisegundos no es primo se le suma 1 hasta que lo sea. Por tanto, creo un pequeño script en python para obtener el número ‘q’ empleado para generar las claves RSA:

from Crypto.Util.number import *

q = 1569309559111
while not isPrime(q):
         q+=1
print 'q ...', q

Lo ejecuto:
Y veo que el número primo ‘q’ utilizado sería: 1569309559123.

A partir de aquí, para descifrar el contenido del archivo important.txt.enc:

1.- Hago una copia del script en python que se proporciona como fichero asociado al reto (super_cipher.py) y la llamo super_cipher_2.py.

Comento la línea en la que se obtiene el tiempo del sistema en milisegundos para obtener 'q' (q = self.getmillis()) y añado una línea justo debajo de ésta con el valor de 'q' obtenido antes (q = 1569309559123).

2.- Creo un nuevo script en python para descifrar el contenido del archivo important.txt.enc y que sospecho que tiene la clave de sesión para descifrar el resto de archivos:

import super_cipher_2

SuperCipher=super_cipher_2.SuperCipher()
clave_publica, clave_privada = SuperCipher.generate_RSA()
clave_sesion=SuperCipher.decrypt("important.txt.enc", clave_privada,"important.txt_descifrado.txt")

print 'clave sesion ...', clave_sesion

Lo ejecuto y ya puedo ver la solución a este reto (tanto en la pantalla como en el archivo de texto que se obtiene, important.txt_descifrado. He sustituido los caracteres de la flag por el carácter "X"), por lo que, además, no es necesario descifrar el resto de archivos:

Explotación Web (VII): Solución Reto CyberOlympics 2019 "JSAdminPass"

$
0
0
Solución a uno de los retos de la categoría 'Web' de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Este desafió, que llevaba por título "JSAdminPass", en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado decía lo siguiente:

Necesitamos conocer la información que hay detrás de este panel de control. ¿Puedes proporcionar la clave para el acceso?.
#beautiful #javascript #consoleoutput #debugging #stepbystep

Solución: como archivo asociado al reto se proporciona un archivo comprimido (JSAdminPass.tar.gz) que contiene dos archivos (index_megntlow.html y obfuscated_megntlow.js). Ejecuto en el navegador el primero de ellos:
Hago clic en el botón derecho del ratón sobre "Login" y después pulso sobre “Inspeccionar”:

Intento analizar el código (#javascript) de "obfuscated_megntlow.js" en la pestaña 'Sources':
Pero está ofuscado. Voy al mismo código en la pestaña 'Application'. Copio el código y sustituyo con éste el código del segundo archivo que se proporciona con el reto (obfuscated_megntlow.js). Cierro en el navegador el primero de los archivos que se proporciona con el reto (index_megntlow.html) y vuelvo a ejecutarlo. Ahora el código javascript de "obfuscated_megntlow.js" en la pestaña 'Sources' aparece desofuscado:
Y ahora voy a poner unos puntos de interrupción (‘breakpoints’), los que se muestran en la figura siguiente, para inspeccionar el código paso a paso (#stepbystep) mediante técnicas de depuración (#debugging). En los campos "Usuario" y "Clave" del formulario introduzco “user” y “key”, respectivamente, y pulso sobre el botón "Login": 
Se entra en el script, el 'debugging' se detiene en la primera instrucción de la función validar() y voy ejecutando paso a paso el resto de instrucciones:
Como se ve en la figura anterior, en la sentencia "if" se compara el contenido de _0x1ec405, que contiene el valor del campo "Usuario" que hemos introducido ("user") con el contenido de _0x58a3('0x2'), que contiene el valor "admin", y el contenido de _0x50dfa6, que contiene el valor del campo "Clave" que hemos introducido ("key") con el contenido de _0x58a3('0x3'), que contiene el valor “XXXXXXXXXXXXXXXX” (he sustituido los caracteres de este campo por caracteres "X", ya que éste es el valor de la flag). Como la comparación de ambos campos es diferente se bifurca hacia el else y se produce el correspondiente error.


Es decir, sólo cuando el campo "Usuario" es igual a "admin" y el campo "Clave" es igual a “XXXXXXXXXXXXXXXX” se muestra la flag.

La que podemos ver en el 'debugging'o en la consola (#consoleoutput):
Lo que nos indica que la flag es el contenido del campo "Clave" introducido: flag{XXXXXXXXXXXXXXXX}

Criptografía (CLXXXIV): Soluciones Retos criptografía de CyberOlympics 2017

$
0
0
En este post pongo las soluciones a los retos de criptografía que he ido resolviendo de la edición del año 2017 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag' y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

En esta edición la mayoría de los retos presentaron un nivel de dificultad bajo (☆☆☆), lo que entiendo adecuado por el colectivo al que van dirigidos.

Las soluciones al resto de desafíos de criptografía de esta edición, cuyos archivos asociados tenga (no me han pasado todos) y que consiga resolver, las pondré en otra entrada.

Reto 1 (Criptografía):

Enunciado: Todas las mañanas cuando me despierto, me miro en el espejo y no entiendo lo que veo. Hoy me he levantado dando un salto mortal y no voy a apartarme de mi “otro yo” hasta que no descubra el mensaje. Parece que la imagen MagicCrypto.jpg tiene la clave. ¿Serás capaz de descubrir lo que oculta?.

Recursos asociados al reto: archivo de imagen (MagicCrypto.jpg).
Solución: Por el enunciado y el archivo de imagen que se proporciona, parece claro que el cifrado utilizado es el Atbash, también conocido como método espejo.

En este cifrado, bien en el texto en claro para obtener el criptograma o viceversa, la letra "A" se sustituye por la "Z", la "B" por la "Y", la "C" por la  "X",... , la "X" por la "C", la "Y" por la "B" y la "Z" por la "A". Es decir:
Lo podemos resolver muy fácilmente de forma manual:

Criptograma: GSVUOZTRHHZBWVZIVXIZAB

Texto en claro: THEFLAGISSAYDEARECRAZY

Aunque si estamos un poco vagos siempre podemos usar una herramienta 'on-line' de las muchas que hay para este cifrado:
Reto 2 (Criptografía):

Título: Snefru

Enunciado: Hemos de descubrir lo que oculta un mensaje codificado en un sistema que desconocemos. Sabemos que se trata de un personaje de ficción y que se encuentra oculto en el único resultado que no contiene números. Tenemos que ponernos manos a la obra y descubrir su nombre.

Recursos asociados al reto: las siete líneas siguientes.

15b38e865ee1ddefda955939d0bd5c8e
337605c06242c094d64de46e2926fbc6
7548af65aca74df277e75a966fb68c23
10d0a3f80aa1216d13643e26046c164a
416c46988325682c379a0998412f39ea
74c3fe91c70fbae5eb2bd35e1825da19
8b15f1947bd0eb53ebc682a38de89ef1

Solución: Investigando un poco por Internet enseguida vemos que Snefru, además de ser un faraón del antiguo egipto, es una función hash criptográfica inventada por Ralph Merkle en 1990.

Por tanto, para intentar obtener el texto en claro al que corresponde el hash de cada una de las líneas proporcionadas utilizo una herramienta 'on-line', y si hay suerte y el hash figura en su base de datos nos devolverá dicho texto en claro:
Como se observa en la figura anterior, aunque en un caso no se encuentra la correspondencia entre el hash y el texto en claro, el único resultado que no contiene números  y que se corresponde con un personaje de ficción es la quinta, por lo que la flag es "huckleberry".

Reto 6 (Criptografía):

Enunciado: El abuelo de Francisco envió un e-mail desde Estados Unidos con las fotos de su viaje por la ruta 66. Para guardar la confidencialidad del contenido puso un archivo comprimido con password, y le indicó que en la imagen se encuentra la contraseña.
¿Puedes ayudar a Francisco a conocer la password?.

Recursos asociados al reto: la siguiente imagen.
Solución: En este caso, los dibujos que se encuentran a la izquierda del criptograma, en la parte inferior izquierda de la imagen, parecen indicar que para resolver este reto:

1.- Debo disponer los caracteres del criptograma en una tabla de 7 filas x 7 columnas:
2.- Y ya sólo me quedaría seguir el sentido de la lectura, en forma de remolino, que se indica en el dibujo siguiente:
Es decir, el texto en claro es:

HICIMOSLARUTAENMOTOFUEINCREIBLETHEFLAGIS$MAREADOS

Esteganografía (I): Soluciones Retos esteganografía de CyberOlympics 2017

$
0
0
Aunque en este blog los retos de esteganografía han ido siempre ligados a la criptografía, ya que al principio pensaba dedicar pocas entradas a dicha categoría, como evidentemente no son lo mismo y además ya he dedicado muchos posts a retos de este tipo, creo que ha llegado el momento de que tengan sustantividad propia en este blog.

En esta entrada pongo las soluciones a los retos de esteganografía que he ido resolviendo de la edición del año 2017 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag' y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Como dije en el primer post dedicado a esta edición la mayoría de los retos presentaron un nivel de dificultad bajo. pero en el caso de los desafíos esteganográficos creo que hay que subir éste a medio (☆☆) tirando a alto.

Las soluciones al resto de desafíos de esteganografía de esta edición, cuyos archivos asociados tenga (no me han pasado todos) y que consiga resolver, las pondré en otra entrada.

Reto 12 (Esteganografía):

Enunciado: Se están detectando sucesos paranormales en las oficinas. Necesitamos saber quién es el responsable de ellos. Para poder identificarlo hemos dejado una cámara de vigilancia grabando en el interior y exterior del edificio y hemos obtenido la siguiente evidencia. ¿Puedes indicar quién es el responsable de tanta actividad paranormal?.

Recursos asociados al reto: archivo de vídeo "ParanormalActiv.mkv".
En el vídeo se ve a un perrito bailando con la música de la película 'Ghostbusters' sonando de fondo.

Solución: tras examinar en profundidad el vídeo que se proporciona, sin resultado alguno, se me ocurre extraer la pista de audio para analizarla de forma independiente con algún software especializado. Para ello utilizo el programa 'gMKVExtractGUI': abro el fichero, selecciono la pista de audio y pulso el botón "Extract".
Como consecuencia obtengo el fichero de audio "ParanormalActiv_track2_[und]_DELAY 0ms.wav", que paso a analizar con la herramienta 'Sonic Visualiser'. Abro el archivo, añado el espectograma y ya puedo ver la flag:
Reto 14 (Esteganografía):

Enunciado: Los alumnos de un conservatorio musical han sido descubiertos copiando en un examen, la evidencia que el profesor ha descubierto es la de la imagen asociada al reto.
Aparentemente no se trata de una información confidencial, ¿Podrías identificar el mensaje que estaban trasmitiendo los alumnos?.

Recursos asociados al reto: la siguiente imagen.
Solución: tras intentar sin éxito obtener algo de la imagen, investigando por Internet veo que wikipedia nos dice que Bartolomeo Cristoforifue el inventor del piano, y además, tras investigar mucho más por Internet, obtengo la notación inglesa correspondiente a cada una de las teclas de un piano (ver figura alineada a la derecha en los siguientes párrafos. Sólo reproduzco las teclas del número 32 a 88):

A ver si consigo algo:

- A la tecla en notación inglesa G#7 le corresponde el número 84 y ese número en decimal es el que representa a la letra "T" en el código ASCII.

- A la tecla en notación inglesa G#6 le corresponde el número 72 y ese número en decimal es el que representa a la letra "H" en el código ASCII.

- A la tecla en notación inglesa F6 le corresponde el número 69 y ese número en decimal es el que representa a la letra "E" en el código ASCII.

- A la tecla en notación inglesa F#6 le corresponde el número 70 y ese número en decimal es el que representa a la letra "F" en el código ASCII.

- A la tecla en notación inglesa C7 le corresponde el número 76 y ese número en decimal es el que representa a la letra "L" en el código ASCII.

- A la tecla en notación inglesa C#6 le corresponde el número 65 y ese número en decimal es el que representa a la letra "A" en el código ASCII.

- A la tecla en notación inglesa G6 le corresponde el número 71 y ese número en decimal es el que representa a la letra "G" en el código ASCII.

- A la tecla en notación inglesa A6 le corresponde el número 73 y ese número en decimal es el que representa a la letra "I" en el código ASCII.

- A la tecla en notación inglesa G7 le corresponde el número 83 y ese número en decimal es el que representa a la letra "S" en el código ASCII.

- A la tecla en notación inglesa F#7 le corresponde el número 82 y ese número en decimal es el que representa a la letra "R" en el código ASCII.

- A la tecla en notación inglesa C#6 le corresponde el número 65 y ese número en decimal es el que representa a la letra "A" en el código ASCII.

- A la tecla en notación inglesa Eb6 le corresponde el número 67 y ese número en decimal es el que representa a la letra "C" en el código ASCII.

- A la tecla en notación inglesa G#6 le corresponde el número 72 y ese número en decimal es el que representa a la letra "H" en el código ASCII.

 - A la tecla en notación inglesa C#7 le corresponde el número 77 y ese número en decimal es el que representa a la letra "M" en el código ASCII.

 - A la tecla en notación inglesa C#6 le corresponde el número 65 y ese número en decimal es el que representa a la letra "A" en el código ASCII.

- A la tecla en notación inglesa D7 le corresponde el número 78 y ese número en decimal es el que representa a la letra "N" en el código ASCII.

- A la tecla en notación inglesa A6 le corresponde el número 73 y ese número en decimal es el que representa a la letra "I" en el código ASCII.

- A la tecla en notación inglesa D7 le corresponde el número 78 y ese número en decimal es el que representa a la letra "N" en el código ASCII.

- A la tecla en notación inglesa Eb7 le corresponde el número 79 y ese número en decimal es el que representa a la letra "O" en el código ASCII.

- A la tecla en notación inglesa Bb7 le corresponde el número 86 y ese número en decimal es el que representa a la letra "V" en el código ASCII.

Por tanto:

THEFLAGISRACHMANINOV









Explotación Web (VIII): Solución Reto CyberOlympics 2019 "Play Me"

$
0
0
Solución a otro de los retos de la categoría 'Web' de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Este desafió, que llevaba por título "Play Me", en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado decía lo siguiente:

Se ha intentado averiguar cuál es el secreto en la predicción de estos dados, pero no se ha dado con la fórmula que se utiliza para poder ganar en este juego. ¿Serás capaz de conseguir la combinación correcta?.
#browser #breakpoint #console #debugging #javascript

Solución: como archivo asociado al reto se proporciona un archivo comprimido (Play Me.tar.gz) que contiene, entre otros, el archivo casino.html. Tras extraer todos los archivos ejecuto el fichero indicado:
Pulso el botón "Lanzar dado":
Y se realiza una tirada de seis dados. Pulso sucesivamente el mismo botón y se van produciendo tiradas, pero sin mayor resultado. Entiendo que sólo si se produce una tirada con los valores correctos de los seis dados se mostrará la flag.

Para intentar averiguar cuál es la combinación correcta, hago clic en el botón derecho del ratón sobre "Lanzar dado" y después pulso sobre “Inspeccionar”:
Analizo el código de la función "lanzar" en la pestaña 'Sources':
Veo que para cada uno de los dados se obtiene un número pseudo-aleatorio (ver función valor_tirada) y se pasan estos valores a la función "flag":
Del examen del código de esta última función se deduce que

1.- La flag está cifrada utilizando el criptosistema AES.

2.- Para que se produzca el descifrado de la flag y se muestre ésta:

2.1.- En la tirada el valor resultante de cada uno de los dados debe ser mayor que cero y menor que 7.

2.2.- El valor del tercer dado (value2) y del cuarto dado (value3) tienen que ser pares.

2.3.- El valor del primer dado (value0) y del quinto dado (value4) tienen que ser impares.

2.4.- El valor del cuarto dado (value3) dividido entre el valor del sexto dado (value5) debe ser  3; por tanto, el valor del cuarto dado (value3) debe ser 6 y el valor del sexto dado (value5) debe ser 2.

2.5.- El valor del tercer dado (value2) debe ser 4.

2.6.- El valor del segundo dado (value1) debe ser 3.

2.7.- El valor del quinto dado (value4) más el valor del segundo dado (value1) debe ser igual al valor del tercer dado (value2); por tanto, el valor del quinto dado (value4) debe ser = 1.

2.8.- El valor del cuarto dado (value3) menos el valor del quinto dado (value4) debe ser igual al valor del primer dado (value0); por tanto, el valor del primer dado (value0) debe ser 5.

Es decir, para que se muestre la flag la combinación correcta o resultado de la tirada de los dados (valor de cada uno de ello) debe ser: 5, 3, 4, 6, 1 y 2.

Por tanto, basta con abrir el archivo casino.html, por ejemplo con el bloc de notas, y cambiar la función "lanzar" para que en la tirada, en lugar de valores pseudo-aleatorios para cada uno de los dados, se obtenga la combinación correcta:
Grabo el archivo así modificado, lo ejecuto y ya puedo ver la flag (he sustituido los caracteres de la flag por caracteres "X"):

Forense (XIV): Solución Reto CyberOlympics 2019 "Find the Last One"

$
0
0
En este post la solución a otro de los retos forense de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

El desafío en cuestión llevaba por título "Find the Last One" y, en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado decía lo siguiente:

Estamos en medio de una investigación y nos han encomendado la tarea de analizar el registro de Windows. Nos piden que localicemos cuál fue el último fichero abierto por el usuario.
Sabemos que la evidencia proporcionada está en GMT+2 (horario de verano de España).
Para analizar el registro de Windows deberás utilizar la herramienta Registry Explorer
https://f001.backblazeb2.com/file/EricZimmermanTools/RegistryExplorer_RECmd.zip
La flag será el nombre del fichero, sin la extensión: Ej: xxxx.jpg --> xxxx
#registryhive #forensics #windows

Soluciónabro el archivo asociado al reto (70.dat) con el software indicado en el enunciado y busco "Recent":
Hago doble clic sobre la fila correspondiente a “RecentDocs” y veo que el último abierto es un archivo pdf (he sustituido los caracteres del nombre del fichero por caracteres "X"):
La flag es el nombre del fichero resaltado en la figura anterior, sin la extensión.

Criptografía (CLXXXV): Solución Reto CyberOlympics 2019 "Decoders - 6435"

$
0
0
En esta entrada la solución a otro de los retos de criptografía de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag'  y formato 'Jeopardy' dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.

Este desafió, que llevaba por título "Decoders - 6435", en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado decía lo siguiente:

Megan35 es el seudónimo que nos ha proporcionado un mensaje codificado. Necesitamos recuperar esos textos para poder avanzar en la misión. Contamos contigo, ¡eres un cowboy de la consola!.
Nota:
El reto se ha codificado de la siguiente forma:
BASE64_x11_veces (CODIFICACION1(texto_plano))
Solo debes descubrir CODIFICACION1 para decodificarlo.
#encoding #for #loop

Solución: utilizo una herramienta 'on-line', 'CyberChef', para decodificar 11 veces el mensaje que contiene el archivo que se proporciona con el reto (mensaje.txt); 'copy' del mensaje en el archivo, 'paste' en la herramienta y decodificación (11 veces):
A partir de ahí, tras una breve investigación por Internet, veo que Megan-35 es una variante de base64 y busco una herramienta 'on-line' para decodificar el resultado obtenido hasta el momento:
Y ya puedo ver la flag (he sustituido los caracteres de la flag por caracteres "X").
Viewing all 640 articles
Browse latest View live