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

Esteganografía (II): Solución Reto CyberOlympics 2019 "Colorblind?"

$
0
0
En esta entrada la solución a uno de los retos de esteganografí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 "Colorblind?", en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado decía lo siguiente:

Mira la imagen. ¿Tú también lo has notado verdad?. Para mí que los colores no encajan o su diseñador tiene muy mal gusto ¿Podrás averiguar qué está pasando?. Para ello deberás utilizar la herramienta steghide disponible en Kali con una contraseña vacía.
#python #swap #pixel

Solución: la verdad es que cuando leí el reto lo tuve claro, ya que dan demasiadas pistas. Por el título (‘colorblind’ significa daltónico en inglés, y como bien es sabido las personas daltónicas tienen dificultades para distinguir ciertos colores, entre ellos el rojo y el verde), el archivo de imagen asociado al reto, "image.bmp" (cuyo contenido se muestra en la siguiente figura y en el que se ve claramente que la “R”, red, y la “G”, green, tienen el color de fondo intercambiado), y por la etiqueta #swap (intercambiar en inglés), no me quedó ninguna duda de que como paso previo a utilizar el software esteganográfico 'steghide' para obtener la flag hay que intercambiar los colores verde y rojo de la imagen:
La etiqueta #python parece sugerir que se utilice un script de python para intercambiar ambos colores, pero, aunque sería muy fácil crear un script para ello, ni siquiera es necesario. Abro el archivo "image.bmp" con 'Paint' y selecciono el color verde de fondo de la letra "R"con la herramienta "Selector de color" y pulso sobre "Editar colores":
Pulso sobre "Aceptar" y la información de ese color verde se guarda en la primera posición de la siguiente linea de "Colores":
Repito lo anterior con el color rojo de la imagen, es decir, selecciono el color rojo de fondo de la letra "G"con la herramienta "Selector de color" y pulso sobre "Editar colores":
Pulso sobre "Aceptar" y la información de ese color rojo se guarda en la segunda posición de la siguiente linea de "Colores":
A partir de ahí, utilizando la herramienta "Relleno con color" relleno con un color cualquiera diferente del rojo que hemos obtenido en el paso anterior (por ejemplo: el amarillo) el fondo de la letra "R", obteniendo el siguiente resultado:
Selecciono el color verde haciendo clic sobre la primera posición de la segunda fila de "Colores" y utilizando la herramienta "Relleno con color" relleno con dicho color el fondo de la letra "G", obteniendo el siguiente resultado:
Y finalmente, para intercambiar ambos colores, selecciono el color rojo haciendo clic sobre la segunda posición de la segunda fila de "Colores" y utilizando la herramienta "Relleno con color" relleno con dicho color el fondo de la letra "R", obteniendo el siguiente resultado:
Grabo la imagen obtenida y ya tengo el archivo listo para utilizar el software esteganográfico 'steghide' (tal y como dice el enunciado, sin contraseña):
Y veo que se han extraído datos en un fichero de texto, "flag.txt". Abro este último archivo y ya puedo ver la flag (he sustituido los caracteres de la flag por caracteres "X"):


Forense (XV): Solución Reto 4 CyberOlympics 2018

$
0
0
Comienzo en este post a poner soluciones a los retos de la edición de 2018 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 este caso se trata de un desafío de la categoría "Forense" que, en mi opinión, presentaba un nivel de dificultad medio (☆☆), pero tirando a alto.

Su enunciado decía lo siguiente: Te remiten un fichero pcap para que averigües que datos esconde detrás ya que nadie sabe de qué se trata, ¿Qué son exactamente estos datos?.

Soluciónabro con 'Wireshark' el archivo asociado al reto (data.pcap) y veo que los paquetes capturados se corresponden con el tráfico de un dispositivo USB (teclado, ratón, memoria, etc.):
No veo paquetes que me puedan indicar el tipo de dispositivo USB al que corresponde este tráfico.

En cada uno de los paquetes el campo 'Leftover Capture Data' contiene los datos capturados del dispositivo USB:
Para ver en la sección superior de wireshark los valores de este campo en todos los paquetes, y así poder analizarlos más cómodamente, incluyo este campo como una columna más y veo que todos ellos muestran un valor hexadecimal de longitud 8 Bytes. La mayor parte de los Bytes contienen el valor '00' y cuando contienen un valor diferente éste se encuentra en el tercer Byte:
Pero sigo sin saber lo fundamental, ¿qué tipo de dispositivo USB ha generado el tráfico?. Investigando por Internet con relación a este aspecto en los dispositivos USB más frecuentes llego a la conclusión de que se podría tratar del tráfico generado por un teclado USB.

Si es así, el formato de los 8 Bytes capturados en cada paquete seria el siguiente:

- Byte 0: bits modificadores del teclado (SHIFT, ALT, CTRL, etc.).
- Byte 1: reservado.
- Byte 2-7: hasta seis ID o códigos que representan las teclas que se pulsan en un momento dado.

Los códigos presentes en el tercer Byte se corresponderían con las siguientes teclas:
Compruebo si estoy en lo cierto:
0000090000000000 f
00000f0000000000 l
0000040000000000 a
00000a0000000000 g
00002c0000000000 ''
00000c0000000000 i
0000160000000000 s
00002c0000000000 ''
00001a0000000000 w
0000200000000000 3
0000110000000000 n
0000200000000000 3
0000200000000000 3
0000070000000000 d
0000100000000000 m
0000120000000000 o
0000150000000000 r
0000200000000000 3
0000090000000000 f
0000150000000000 r
0000080000000000 e
0000080000000000 e
0000070000000000 d
0000120000000000 o
0000100000000000 m

Es decir: flag is w3n33dmor3freedom.

Forense (XVI): Solución Reto 10 CyberOlympics 2018

$
0
0
En este post la solución a otro de los retos de la categoría "Forense" de la edición de 2018 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 mi opinión este desafío presentaba un nivel de dificultad alto ().

Su enunciado decía lo siguiente: Realizando una serie de pruebas forenses en el equipo de unos presuntos grupos de ciberdelincuentes de la Depp Web relacionados con el tráfico de armas se localizan ciertos ficheros de los que se sospecha que se transmiten mensajes secretos. Nadie ha sido capaz de revelar un mensaje detrás de estas capturas, por lo que te envían una muestra confiando en tu pericia en análisis forense.

Soluciónabro con 'Wireshark' el archivo asociado al reto (captura.pcapng) y veo que, al igual que en este reto, los paquetes capturados se corresponden con el tráfico de un dispositivo USB (teclado, ratón, memoria, etc.):
Al igual que en el reto mencionado anteriormente, tampoco veo paquetes que me puedan indicar el tipo de dispositivo USB al que corresponde este tráfico.

En esta ocasión el número de paquetes capturados es mucho mayor y, como ya dije en dicho reto, el campo  'Leftover Capture Data' contiene los datos capturados del dispositivo USB. Inicialmente, actúo de la misma forma que en el citado desafío, es decir, para ver en la sección superior de wireshark los valores de este campo en todos los paquetes, y así poder analizarlos más cómodamente, incluyo ese campo como una columna más y veo que todos ellos muestran un valor hexadecimal de longitud 4 Bytes y cuando contienen un valor diferente a '00'éstos se encuentran en los tres primeros Bytes (además, el primero de ellos parece ser siempre '00' o '01'):
Descartado el teclado USB como dispositivo, ya que si así fuera el valor del campo 'Leftover Capture Data' debería tener 8 Bytes de longitud (ver formato en el post del citado reto), ¿qué tipo de dispositivo USB ha generado el tráfico?. En esta ocasión llego a la conclusión, me sirve mucho la investigación ya realizada por Internet para el reto mencionado, de que se podría tratar del tráfico generado por un ratón USB.

Tal y como se ha indicado, el primer Byte es siempre 0x00 o 0x01 (se correspondería con el botón del ratón), el segundo Byte sería el valor "X" (es decir, mediría el movimiento horizontal del ratón), el tercer Byte sería el valor "Y" (es decir, mediría el movimiento vertical del ratón) y el resto de Bytes (en nuestro caso un Byte) es siempre 0x00 (el resto de Bytes, del cuarto al enésimo serían opcionales).
Una vez explicado esto, a partir del archivo proporcionado en el reto (captura.pcapng), utilizo 'tshark' para extraer esos 4 Bytes de los paquetes de tráfico:

$ tshark -r captura.pcapng -T fields -e usb.capdata > mouse.txt
Y, finalmente, a partir de esta información creo que sólo quedaría plotear los movimiento del ratón para obtener la flag. Investigando por Internet encuentro dos scripts en python para ello, e incluso software como 'gnuplot'. En este post voy a utilizar los dos scripts y pongo el resultado obtenido con cada uno de ellos:

Primer script:
Segundo script:
Es decir: Flag{verdadero_arte}.

Forense (XVII): Solución Reto 11 CyberOlympics 2018

$
0
0
Continúo en este post con las soluciones a retos de la categoría "Forense" de la edición de 2018 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 este caso, en mi opinión, el desafío en cuestión presentaba un nivel de dificultad muy bajo (☆☆☆☆).

Su enunciado decía lo siguiente: En tu empresa, la cual se tratan datos muy confidenciales, se ha detectado una posible fuga de información por parte de un empleado enfadado. Se cree que está vendiendo secretos a la inteligencia de otro país, por lo que tu labor es averiguar el dato que ha sido filtrado para ayudar a las autoridades locales.

Soluciónabro con 'Wireshark' el archivo asociado al reto (Medium_11.pcap) y, como suele ser habitual en este tipo de desafíos, en primer lugar busco en los paquetes una palabra que pueda inferir que contiene la solución al reto (en este caso la propia palabra "flag"):
Y veo que el paquete nº 4168 contiene la cadena "Flag" dentro de lo que parece ser código python:
Extraigo el fichero de datos de ese paquete (1.917 Bytes):
Abro el archivo exportado (object4168) y veo que, efectivamente, se trata de un script de python:
Renombro este archivo como "11_Medium.py" y lo ejecuto; me pide una password, introduzco cualquiera (por ejemplo: "contraseña") y se muestra el mensaje de error: "Password incorrect !".
Tras un primer y rápido análisis del código introduzco la sentencia "print NTLM+MD4+SHA1+MD5+MD2" justo antes de la instrucción "if" que figura al final del código, ya que en ella se compara ese valor con el de la password que se introduce, y si ambos son iguales se muestra la flag.

Vuelvo a ejecutar el script, introduzco como password el valor que se muestra justo antes y ya puedo ver la flag:
Por tanto: Flag{ELINFERNOPUEDEESPERAR}.

Miscelánea (I): Solución Reto 1 CyberOlympics 2018

$
0
0
En esta entrada la solución a uno de los retos de la categoría "Miscelánea" u "Otros" de la edición de 2018 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 este tipo de competiciones, en la categoría "Miscelánea" se suelen incluir los desafíos que son mezcla o incorporan características de varias categorías, e incluso aquellos que no encajan en ninguna otra.

El desafío objeto de esta entrada, en mi opinión, presenta un nivel de dificultad medio (☆☆).

Su enunciado decía lo siguiente: Se ha recuperado un archivo de datos de un servidor de unos presuntos ciberdelincuentes de la red TOR. Nadie de tu equipo sabe de qué se trata, tu tarea es interpretar estos datos para conseguir la FLAG y cazar a los delincuentes.

Solución: abro el archivo que se proporciona (data) y veo una lista de grupos de tres valores, cada uno de ellos del 0 al 255, que podrían corresponderse con los valores de los canales RGB (Red-Green-Blue) de los píxeles de una imagen.

Es decir, si esto es así, puedo intentar reconstruir la imagen a partir de los valores que contiene el archivo asociado al reto (data); una lista de grupos de tres valores, un grupo por píxel y en los que cada uno de los valores se correspondería con un elemento de una tupla de tres elementos para los canales 'RGB'.

Para ello creo el siguiente script de python:

from PIL import Image

def factorizacion_2(n):
# Descomponer un numero en dos factores no triviales
    factores=[]
    i=2
    while i<=int(n**(1/2)):
        if (n%i==0):
           factores.append(i)
           factores.append(int(n/i))
        i+=1
    return factores

# Abrir y leer fichero
fichero=open('data','r')
data=fichero.read()

# Contar numero de pixeles
numero_pixeles=int((data.count('(')))
print('Numero de pixeles......................................',numero_pixeles)

data=data.replace('[','')
data=data.replace('(','')
data=data.replace('','')
data=data.replace(')','')
data=data.replace(']','')
data=data.split(",")

factores=factorizacion_2(numero_pixeles)
print('Los pares de posibles valores para alto y ancho son...',factores)
x=0
y=x+1
#Crear imagenes considerando los posibles valores para alto y ancho de la imagen y a partir de los valores de los pixeles
imagen_ok='N'

while x < len(factores) and (imagen_ok=='N' or imagen_ok=='n'):
    print('*** Probamos con:*************************************')
    print('Ancho imagen..........................................',factores[y])
    print('Alto imagen...........................................',factores[x])
    imagen=Image.new('RGB',(factores[y],factores[x]))
    pixeles=imagen.load()
    k=0
    for i in range(factores[x]):
        for j in range(factores[y]):
            pixeles[j,i]=(int(data[k]),int(data[k+1]),int(data[k+2]))
            k+=3
    imagen.show()
    imagen_ok= str(input('La imagen es correcta (S/N)?.......................... '))
    if imagen_ok=='N' or imagen_ok=='n':
       if x%2==0:
          x+=1
          y-=1
       else:
          x+=1
          y+=3
    else:
       if imagen_ok=='S' or imagen_ok=='s':
          imagen.save('flag.png','PNG')

# Cerrar fichero e imagen
fichero.close()
imagen.close()


Lo ejecuto:
Como se observa en la figura anterior, la imagen tendría 528.601 pixeles y el script empieza a probar todos los posibles valores para el ancho y alto de la imagen. Tras cada una de las pruebas que realiza muestra la imagen resultado y pregunta si es correcta. En este caso, al primer intento (ancho = 929 y alto = 569) se muestra la siguiente imagen:
Como esta imagen parece correcta contesto que Sí ("S") a la pregunta y la imagen se graba (flag.png).

Y ya puedo ver la flag, FLAG{EPIC_WIN_AL_PILPIL}, en la parte inferior derecha de esta imagen:

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

$
0
0
En este post pongo la solución al último de los retos de criptografía que me han pasado 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.

Este desafío, en mi opinión, presenta un nivel de dificultad bajo (☆☆☆), y yo no lo hubiera catalogado en la categoría de "Criptografía", ya que me parece que tiene poco encaje en ella, sino en "Miscelánea" u "Otros".

Reto 8 (Criptografía):

Enunciado: La ingeniería social es una técnica habitual para tratar de obtener información a través de la manipulación de usuarios. A través de un engaño hemos conseguido que un empleado de una empresa de publicidad nos envíe por correo ordinario el pendrive de su jefe cuando nos hemos hecho pasar por él. Dentro encontramos un archivo que parece tener información sobre el personaje en el que basarán su próxima campaña. ¿Podrías averiguar el nombre del personaje?.

Recursos asociados al reto: archivo comprimido (Burrow.zip).

Solución: el archivo comprimido que se proporciona contiene un fichero de texo (FLAG.txt), que parece evidente que contiene la solución a este desafío. Intento extraerlo, pero el .zip está protegido con una contraseña.

En estos casos siempre me acuerdo en primer lugar de 'John the Ripper', posiblemente el mejor software de 'crackeo' de contraseñas, y que suelo utilizar para realizar ataques de fuerza bruta mediante diccionario (suelo usar 'Rockyou').

Voy a ver si hay suerte.

En primer lugar ejecuto el siguiente comando para obtener el hash correspondiente:
Y después ejecuto el siguiente comando:
Con la password "crackeada" ("patrickowenbreeding") extraigo el fichero "FLAG.txt" del archivo "Burrow.zip". Abro el fichero extraído y ya puedo ver la flag:

Esteganografía (III): Reto 36

$
0
0
En este post un  reto de esteganografía en el que el protagonista es el coronavirus, como no puede ser de otra manera dadas las lamentables circunstancias que nos tocan vivir.

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.

En este punto, justo antes de formular este reto, debo pedir la indulgencia de cualquier estudioso de la genética molecular por las "patadas" que me dispongo a dar a esa disciplina en el enunciado y/o solución de este desafío, y que se deben, única y exclusivamente, a mi absoluta ignorancia sobre la materia.

Reto 36: "Encuentra la solución al COVID-19".

Como bien sabemos todos, el coronavirus es el causante de una pandemia a nivel mundial de la infección o enfermedad (COVID-19) por este virus.
Tal y como nos cuenta wikipedia, el coronavirus tiene como material genético una sola cadena o cadena sencilla de ARN de sentido positivo, por lo que se clasifica como un virus de ARN monocatenario positivo y, si no lo he entendido mal, el ARN de los virus de cadena positiva es idéntico al ARNm viral (ARN mensajero, que es el encargado de "transferir o comunicar" el código genético), por lo tanto, funciona como tal y puede ser inmediatamente traducido por la célula huésped.
El ARNm contiene la codificación para generar una cadena específica de aminoácidos de acuerdo con las reglas especificadas por el código genético, que está formado por un grupo de tres bases nitrogenadas (triplete) o codones (unidades de codificación), cuya presencia en la cadena polinucleotídica del ARNm codifica o da lugar a la presencia de un aminoácido en la cadena polipeptídica.
Por favor, si alguien ha entendido algo que me lo explique. No me he enterado de nada de lo que he dicho :).
Bueno, asumiendo el riesgo altamente probable de decir alguna tontería, que espero no se me tenga en cuenta, explico de forma simplificada lo que he entendido: una molécula de ARNm está compuesta por moléculas más pequeñas, llamadas nucleótidos, cada una de ellas formada por tres bases nitrogenadas, de entre las siguientes: adenina (A), citosina (C), guanina (G) y uracilo (U). Es decir, podemos imaginarnos una hebra compuesta por una larga serie de grupos de tres letras, por ejemplo: AUGUCCUAC ... CACUGA.
El conocimiento y utilización del ARNm es fundamental para obtener la solución al COVID-19. ¿Puedes decirme cuál es la solución para detener la pandemia?.

Dificultad:
Tipo:       Esteganografía.

Recursos: - coronavirus.png.

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

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

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

Esteganografía (IV): Solución Reto 36

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

El enunciado del reto decía lo siguiente:

"
Como bien sabemos todos, el coronavirus es el causante de una pandemia a nivel mundial de la infección o enfermedad (COVID-19) por este virus.
Tal y como nos cuenta wikipedia, el coronavirus tiene como material genético una sola cadena o cadena sencilla de ARN de sentido positivo, por lo que se clasifica como un virus de ARN monocatenario positivo y, si no lo he entendido mal, el ARN de los virus de cadena positiva es idéntico al ARNm viral (ARN mensajero, que es el encargado de "transferir o comunicar" el código genético), por lo tanto, funciona como tal y puede ser inmediatamente traducido por la célula huésped.
El ARNm contiene la codificación para generar una cadena específica de aminoácidos de acuerdo con las reglas especificadas por el código genético, que está formado por un grupo de tres bases nitrogenadas (triplete) o codones (unidades de codificación), cuya presencia en la cadena polinucleotídica del ARNm codifica o da lugar a la presencia de un aminoácido en la cadena polipeptídica.
Por favor, si alguien ha entendido algo que me lo explique. No me he enterado de nada de lo que he dicho :).
Bueno, asumiendo el riesgo altamente probable de decir alguna tontería, que espero no se me tenga en cuenta, explico de forma simplificada lo que he entendido: una molécula de ARNm está compuesta por moléculas más pequeñas, llamadas nucleótidos, cada una de ellas formada por tres bases nitrogenadas, de entre las siguientes: adenina (A), citosina (C), guanina (G) y uracilo (U). Es decir, podemos imaginarnos una hebra compuesta por una larga serie de grupos de tres letras, por ejemplo: AUGUCCUAC ... CACUGA.
El conocimiento y utilización del ARNm es fundamental para obtener la solución al COVID-19. ¿Puedes decirme cuál es la solución para detener la pandemia?".

Y como recurso asociado al reto se proporcionaba el siguiente: coronavirus.png.


Solución: es fácil darse cuenta de que al final del fichero de imagen asociado al reto (coronavirus.png) hay un archivo comprimido, ya que para ello basta con abrirlo con un editor hexadecimal:
Abro el archivo de imagen con un software de compresión de archivos (en mi caso utilizo '7-Zip') e intento extraer el archivo que contiene el fichero comprimido (Codons_mRNA.txt), pero el archivo comprimido está protegido con una contraseña.

En este tipo de retos y con ficheros de imagen .png suelo utilizar el software 'zsteg' a ver si obtengo algo de información oculta, y veo que éste no sólo detecta el archivo comprimido (.zip) que hay al final del archivo de imagen, sino que, además, detecta que hay una cadena de texto ("SARS-Cov-2") oculta en los bits menos significativos de la imagen, es decir, que se ha utilizado la técnica conocida como LSB (bit menos significativo o, en inglés 'least significant bit') para ocultar esa cadena de texto:
Para aquellos que prefieran utilizar herramientas en windows, también se podría haber detectado la cadena de texto oculta utilizando el software 'StegSolve':
E incluso para aquellos que no quieren instalar nada, también se podría haber detectado la cadena de texto oculta utilizando alguna herramienta 'on-line', como la siguiente:
Pero, ¿qué significa "SARS-CoV-2"?. Es el nombre científico del coronavirus (no confundir con COVID-19, que es el nombre científico de la infección o enfermedad por coronavirus, no del virus). Pues bien, intento extraer de nuevo el archivo de texto (Codons_mRNA.txt) que contiene el archivo comprimido utilizando "SARS-CoV-2" como contraseña, y efectivamente es la password correcta.


Abro el archivo de texto extraído (Codons_mRNA.txt) y veo una "hebra" compuesta por una larga serie de letras (se utilizan las siguientes: "A", "C", "G" y "U"), que tal y como dice el enunciado del reto sería  una molécula de ARN mensajero (ARNm o, en inglés, mRNA) compuesta por grupos de tres letras (codones o, en inglés, codons). Cada uno de estos grupos da lugar a la presencia de un aminoácido.

Para decodificar los aminoácidos que están codificados en los grupos de tres letras o codones - grupos de tres bases nitrogenadas: adenina (A), citosina (C), guanina (G) y uracilo (U) - que se observan en la molécula de ARN mensajero investigo por Internet y doy con la siguiente tabla:
La decodificación es muy fácil:
En primer lugar lo hago manualmente con los grupos de tres letras que se observan en el fichero Codons_mRNA.txt (al final de este post pongo un script en python que lo hace):

AUG: METIONINA (START)
CUA: LEUCINA
UCU: SERINA
AAA: LISINA
CCA: PROLINA
GUU: VALINA
CAG: GLUTAMINA
GGG: GLICINA
CAU: HISTIDINA
AUC: ISOLEUCINA
AAA: LISINA
CUA: LEUCINA
UCU: SERINA
GGA: GLICINA
CCU: PROLINA
UCG: SERINA
UUC: FENILALANINA
AGA: ARGININA
AAU: ASPARAGINA
GUG: VALINA
ACU: TREONINA
AAG: LISINA
AUU: ISOLEUCINA
CUC: LEUCINA
GUA: VALINA
GGG: GLICINA
ACG: TREONINA
UGU: CISTEINA
GCA: ALANINA

UGA: STOP CODON

Y, finalmente,  lo único que queda es saber la relación entre la lista de aminoácidos y la clave que aparece al final del archivo Codons_mRNA.txt:

CLAVE: 1 6 3 3 3 3 4 5 3 5 2 1 4 3 5 1 4 9 2 2 3 5 2 5 4 8 3 1

El primer codón, "AUG", es el codón de inicio de la traducción que indica a la maquinaria celular el lugar de la cadena en el que comienza la traducción del ARN mensajero, mientras que el último codón, "UGA", es un codón de terminación, codón de parada, codón sin sentido o codón stop que no identifica a ningún aminoácido según el código genético y su función es acotar el mensaje cifrado del ARN mensajero.

Pues bien, si excluidos el primer y último codones contamos el número de aminoácidos nos da un total de 28 aminoácidos, lo que coincide con el número de dígitos de la clave. ¿Casualidad?. Yo diría que no, y ¿si cada uno de los dígitos determinara, a modo de índice, una letra de la denominación del aminoácido correspondiente?.

Pruebo a ver si es así:

AUG METIONINA (START)
CUA: LEUCINA, 1, "L"
UCU: SERINA, 6, "A"
AAA: LISINA, 3, "S"
CCA: PROLINA, 3, "O"
GUU: VALINA, 3, "L"
CAG: GLUTAMINA, 3, "U"
GGG: GLICINA, 4, "C"
CAU: HISTIDINA, 5, "I"
AUC: ISOLEUCINA, 3, "O"
AAA: LISINA, 5, "N"
CUA: LEUCINA, 2, "E"
UCU: SERINA, 1, "S"
GGA: GLICINA, 4, "C"
CCU: PROLINA, 3, "O"
UCG: SERINA, 5, "N"
UUC: FENILALANINA, 1, "F"
AGA: ARGININA, 4, "I"
AAU: ASPARAGINA, 9, "N"
GUG: VALINA, 2, "A"
ACU: TREONINA, 2, "R"
AAG: LISINA, 3, "S"
AUU: ISOLEUCINA, 5, "E"
CUC: LEUCINA, 2, "E"
GUA: VALINA, 5, "N"
GGG: GLICINA, 4, "C"
ACG: TREONINA, 8, "A"
UGU: CISTEINA, 3, "S"
GCA: ALANINA, 1, "A"
UGA: STOP CODON

Y ya he obtenido la solución a este retoLASOLUCIONESCONFINARSEENCASA

Es decir: LA SOLUCION ES CONFINARSE EN CASA

Y a mí no me queda duda de que mientras llega la solución contra el virus (el coronavirus o "SARS-CoV-2") en forma de vacuna, no antes de un año o año y medio, la única solución para detener la pandemia de la infección o enfermedad (COVID-19) por coronavirus es el confinamiento, ya que sólo de esta manera se conseguirá detener la propagación del virus, con el fin último de evitar contagios, no colapsar el sistema sanitario y salvar vidas.

Y ya, para terminar este post, dejo un pequeño script en python para decodificar los aminoácidos que están codificados en los grupos de tres letras o codones y obtener la solución a este reto utilizando la clave proporcionada:

#!/usr/bin/env python

rnam_code=[
'UUU','FENILALANINA','UUC','FENILALANINA','UUA','LEUCINA','UUG','LEUCINA',
'CU','LEUCINA',
'AUU','ISOLEUCINA','AUC','ISOLEUCINA','AUA','ISOLEUCINA',
'AUG','METIONINA (START)',
'GU','VALINA',
'UC','SERINA',
'CC','PROLINA',
'AC','TREONINA',
'GC','ALANINA',
'UAU','TIROSINA','UAC','TIROSINA','UAA','STOP CODON','UAG','STOP CODON',
'CAU','HISTIDINA','CAC','HISTIDINA','CAA','GLUTAMINA','CAG','GLUTAMINA',
'AAU','ASPARAGINA','AAC','ASPARAGINA','AAA','LISINA','AAG','LISINA',
'GAU','ACIDO ASPARTICO','GAC','ACIDO ASPARTICO','GAA','ACIDO GLUTAMICO','GAG','ACIDO GLUTAMICO',
'UGU','CISTEINA','UGC','CISTEINA','UGA','STOP CODON','UGG','TRIPTOFANO',
'CG','ARGININA',
'AGU','SERINA','AGC','SERINA','AGA','ARGININA','AGG','ARGININA',
'GG','GLICINA',
]

def decode_rnam(rnam,key):
   string=""
   j=0
   for i in range(0,len(rnam),3):
      codon=rnam[i:i+3]
      if codon in rnam_code:
         codon_index=rnam_code.index(codon)
         if codon=='AUG' or codon=='UAA' or codon=='UAG' or codon=='UGA':
            print '[+]',codon,rnam_code[codon_index+1]
         else:
            key_index=int(key[j])
            aminoacido=rnam_code[codon_index+1]
            print '[+]',codon,aminoacido,key_index,aminoacido[key_index-1:key_index]
            string+=aminoacido[key_index-1:key_index]
            j+=1
      elif rnam[i:i+2] in rnam_code:
         key_index=int(key[j])
         aminoacido=rnam_code[rnam_code.index(rnam[i:i+2])+1]
         print '[+]',codon,aminoacido,key_index,aminoacido[key_index-1:key_index]
         string+=aminoacido[key_index-1:key_index]
         j+=1
      else:
         print '[-] Codon no encontrado',codon
         j+=1
   print '[+] Texto decodificado:',string

while True:
   rnam=raw_input('Introduzca el codigo RNAm a decodificar: ')
   if len(rnam)%3!=0:
      print '[-] La longitud del codigo RNAm a decodificar debe ser multiplo de 3'
   else:
       key=raw_input('Introduzca los digitos de la clave para decodificar separados por un espacio: ').split()
       decode_rnam(rnam,key)
       break

Si se ejecuta se ve la solución al reto:
******** PRÓXIMO RETO
Reto 37:   Por publicar.

Criptografía (CLXXXVII): Reto 37

$
0
0
En este post un  reto decriptografíacon algo de esteganografía y una pizca de codificación para entretenerse un poco en tiempos de confinamiento por COVID-19.

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 37: "Transposición 3D".

En el análisis forense del ordenador de un delincuente has podido recuperar dos archivos sospechosos (ver recursos asociados al reto) que habían sido borrados y que parecen estar relacionados. Ahora sólo te queda terminar tu trabajo y averiguar que ocultan esos ficheros.

Dificultad:
Tipo:       Codificación, Criptografía y Esteganografía.

Recursos: - criptograma.txt.
                 - cubo_rubik.png

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

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

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

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

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

Criptografía (CLXXXVIII): Solución Reto 37

$
0
0
Solución al último reto de criptografía que he puesto en este blog, pero que también tiene algo de esteganografía y una pizca de codificación.

El enunciado del reto decía lo siguiente: En el análisis forense del ordenador de un delincuente has podido recuperar dos archivos sospechosos (ver recursos asociados al reto) que habían sido borrados y que parecen estar relacionados. Ahora sólo te queda terminar tu trabajo y averiguar qué ocultan esos ficheros.

Y como recursos asociados al reto se proporcionaban los siguiente: criptograma.txt y cubo_rubik.png.


Solución: tal y como decía en la primera pista que puse para ayudar a resolver este desafío, lo primero que hago es establecer la relación entre el texto cifrado que figura en el archivocriptograma.txty el cubo de Rubik. Para ello, investigo un poco por Internet y enseguida encuentro diversas páginas con la notación de este último. Las letras U, L, F, R, B y D se corresponden con las iniciales en inglés de las diferentes capas del cubo:

- U ('Up'): capa superior.
- L ('Left'): capa izquierda.
- F ('Front'): capa frontal.
- R ('Right'): capa derecha.
- B ('Back'): capa trasera.
- D ('Down'): capa inferior.

Por tanto, ya puedo disponer los caracteres del criptograma en las distintas caras del cubo, de la siguiente manera (los colores que aparecen en el cubo no son importantes, el reto puede y debe resolverse sin tenerlos en cuenta, es decir, supón que en la imagen asociada al reto, cubo_rubik.png, se muestra un cubo enteramente blanco o, lo que es lo mismo, que no se proporciona ningún cubo, el desafío podría resolverse exactamente de la misma forma):
Pero, para descifrar el criptograma necesito algo más: la clave, y en este caso ésta está formada por los movimientos realizados al cubo en el cifrado.

Sospecho que la clave se puede ocultar en el archivo cubo_rubik.png que se proporciona como recurso asociado al reto. En la solución al desafío anterior decía que con ficheros de imagen .png suelo utilizar el software 'zsteg' a ver si obtengo algo de información oculta, y veo que en este caso éste detecta que hay una cadena de texto (la encuadrada en amarillo en la figura siguiente) oculta en los bits menos significativos de la imagen, es decir, que se ha utilizado la técnica conocida como LSB (bit menos significativo o, en inglés, 'least significant bit') para ocultar esa cadena de texto:
A simple vista, la primera parte de esa cadena parece ser el valor hexadecimal correspondiente a caracteres del código ASCII, mientras que la segunda parte parece ser código base64. Intento decodificar ambas partes: 

La decodificación de la segunda parte de la cadena no me dice gran cosa, pero la de la primera me da una pista importante; se trataría de ROT47:
Y, tras la investigación por Internet que he realizado al principio del reto, enseguida reconozco la notación empleada para los movimientos del cubo de Rubik, con lo que, tal y como dice la decodificación de la primera parte de la cadena, se trataría de la clave utilizada en el cifrado del texto en claro (una letra sola significa giro en el sentido horario de la capa correspondiente a la letra, una letra seguida de ' significa giro antihorario de esa capa y una letra seguida de "2" significa doble giro de la capa). Por ejemplo:

- B: giro horario de la capa trasera ('Back').
- F: giro horario de la capa frontal ('Front').
- D': giro antihorario de la capa inferior ('Down').
- L2: doble giro horario de la capa izquierda ('Left').
...


Y ya sólo queda descifrar el criptograma, pero no exactamente con la clave hallada (la clave de cifrado), sino que la clave a utilizar (clave de descifrado) es exactamente la contraria, es decir, aquella que permitirá deshacer los movimientos realizados en el proceso de cifrado o revertir el estado del cubo a su posición inicial.

Para ello, leemos la clave de derecha a izquierda: una letra sola en la clave de cifrado (giro horario) se sustituye en la clave de descifrado por esa misma letra seguida de ' (giro antihorario), una letra seguida de ' (giro antihorario) se sustituye por esa misma letra sola (giro horario) y una letra seguida de "2" (doble giro) se deja igual en la clave de descifrado (ya que un doble giro horario es igual que un doble giro antihorario). Por ejemplo:


L en la clave de cifrado se sustituye por L' en la clave de descifrado.
- U2 en la clave de cifrado se deja igual (U2) en la clave de descifrado.
- F' en la clave de cifrado se sustituye por F en la clave de descifrado.
- D en la clave de cifrado se sustituye por D' en la clave de descifrado.
...

Una vez dicho esto, descifro de forma manual el criptograma:
...
Con lo que la solución a este reto es:
Es decir: Transposicion_3D_filas_y_columnas_con_el_cubo_de_Rubik.

En esta entrada he resuelto de forma manual el desafío, pero, aún siendo pocos los movimientos, ha resultado bastante laborioso, por lo que en un próximo post me propongo automatizar tanto el cifrado como el descifrado.

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

Criptografía (CLXXXIX): Reto 38

$
0
0
En esta entrada un reto de criptografía con relación a un método de cifrado irrompible, es decir, al secreto perfecto.

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 38: "Por favor, nO Te rePitas".

El otro día un amigo mío me dijo que había estado leyendo sobre el cifrado OTP (del inglés ‘one-time pad’) o libreta de un solo uso y me comentó que, por lo que había entendido, este método proporciona lo que se llama el secreto perfecto, es decir, el criptograma es indescifrable si no se conoce la clave de cifrado. Yo le contesté: Depende…; lo que pareció no sentarle muy bien y no continuó hablando sobre el tema. Algunos días después recibí un correo electrónico de mi amigo en el que me decía lo siguiente: “como eres 'muy listo', te envío los dos siguientes criptogramas cifrados con OTP a ver si eres capaz de: descifrarlos, obtener la clave y decirme cuál es la solución a este reto, y como estoy seguro de que no vas a poder resolver este desafío, te doy una pista: SECRETO PERFECTO".

Dificultad:
Tipo:       Criptografía.

Recursos: - criptogramas.txt

******** 08/05/2020
Pista 1:    En el cifrado OTP la clave (K) debe tener una longitud igual o superior al texto en claro a cifrar (M) y el criptograma (C) se obtiene realizando la siguiente operación ⊕ (XOR):
C = M ⊕ K
Para descifrar el criptograma (C) el receptor utilizaría la misma clave (K) para obtener el texto en claro (M), de la siguiente forma:
M = C ⊕ K
Por el correo que me envió mi amigo parece ser que, primero, efectivamente no le sentó muy bien mi comentario - ya que me dice: “como eres ‘muy listo’, …” :) - y, segundo, que no tiene muy claro por qué este método de cifrado se llama OTP (‘one-time pad’), porque si, como parece, ha utilizado la misma clave para cifrar ambos mensajes (“a ver si eres capaz de: descifrarlos, obtener la clave y …”) ha dejado abierta la puerta al criptoanálisis y, por tanto, de secreto perfecto nada de nada.
Es decir, en el caso de que se cometa el error de reutilizar la clave, un criptoanalista que se haga con dos criptogramas cifrados con la misma clave puede obtener los textos en claro correspondientes sin demasiados problemas utilizando la técnica ‘crib dragging’.
Pero, ¿cómo?. Si se utiliza la misma clave (K) para cifrar dos textos en claro (M1 y M2) resulta que:
- C1 = M1 ⊕ K
- C2 = M2 ⊕ K
Si hago XOR de ambos criptogramas (C1 y C2):
C1 ⊕ C2 = M1 ⊕ K ⊕ M2 ⊕ K = M1 ⊕ M2
Con lo que, con independencia de la clave utilizada (K), si voy deduciendo o infiriendo partes de uno u otro de los textos en claro (‘cribs’) iré obteniendo las partes correspondientes del otro mensaje en claro.
En resumen, como creo que mi amigo ha reutilizado la clave, para atacar este cifrado y descubrir los mensajes en claro correspondientes a ambos criptogramas se puede actuar de la siguiente manera:
1.- Realizar la operación ⊕ de los dos criptogramas.
2.- Intentar deducir parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro y codificar la parte inferida (‘crib’) como una cadena hexadecimal (los criptogramas dados están codificados en hexadecimal).
3.- Realizar la operación ⊕ de la ‘crib’ en hexadecimal a partir de la primera posición del resultado de la operación ⊕ realizada a los dos criptogramas.
3.1.- Si el resultado obtenido es un texto legible puedo pensar que, efectivamente, la ‘crib’ empleada aparece en uno de los textos en claro y que he obtenido la parte del texto en claro correspondiente a ésta en el otro texto en claro, e intento adivinar otra ‘crib’ repitiendo el punto 3.
3.2.- Si el resultado no es un texto legible, realizo una operación ⊕ de la ‘crib’ en hexadecimal a partir de la siguiente posición del resultado de la operación ⊕ realizada a los dos criptogramas.
Para llevar a cabo todo lo anterior te recomiendo que utilices la siguiente herramienta de ‘crib dragging’ interactiva.

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

******** PRÓXIMO RETO
Reto 39:  Por publicar

Criptografía (CXC): Solución Reto 38

$
0
0
Solución al último reto de criptografía que he puesto en este blog y que hacía referencia al método de cifrado OTP, y, en la medida que éste se implemente correctamente, al secreto perfecto.

El enunciado del reto decía lo siguiente: El otro día un amigo mío me dijo que había estado leyendo sobre el cifrado OTP (del inglés ‘one-time pad’) o libreta de un solo uso y me comentó que, por lo que había entendido, este método proporciona lo que se llama el secreto perfecto, es decir, el criptograma es indescifrable si no se conoce la clave de cifrado. Yo le contesté: Depende…; lo que pareció no sentarle muy bien y no continuó hablando sobre el tema. Algunos días después recibí un correo electrónico de mi amigo en el que me decía lo siguiente: “como eres 'muy listo', te envío los dos siguientes criptogramas cifrados con OTP a ver si eres capaz de: descifrarlos, obtener la clave y decirme cuál es la solución a este reto, y como estoy seguro de que no vas a poder resolver este desafío, te doy una pista: SECRETO PERFECTO".

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

Solución: Antes de poner la solución al reto conviene recordar en qué consiste el método de cifrado OTP y qué condiciones deben reunirse para que se pueda decir que éste presenta las características propias de lo que Claude Shannon llamó secreto perfecto.

En el cifrado OTP la clave (K) debe tener una longitud igual o superior al texto en claro a cifrar (M) y el criptograma (C) se obtiene realizando la siguiente operación ⊕ (XOR):
C = M ⊕ K

Para descifrar el criptograma (C) el receptor utilizaría la misma clave (K) para obtener el texto en claro (M), de la siguiente forma:
M = C ⊕ K

Por otra parte, para que se pueda hablar de cifrado perfecto el criptograma no debe proporcionar absolutamente ninguna información acerca del texto en claro, es decir, dado un  texto cifrado todos los textos en claro posibles tienen que ser equiprobables, y para ello no hay que perder que de vista que su implementación debe considerar necesariamente los siguientes tres requisitos esenciales con respecto a la clave de cifrado (K):

- Tal y como ya he indicado: debe tener, al menos, la misma longitud que el mensaje a cifrar.

- Debe ser perfectamente aleatoria.

- Nunca debe reutilizarse, ni total ni parcialmente, y, evidentemente, debe permanecer en el más estricto secreto (intercambio seguro y eliminación confidencial tras su uso).
  
Volviendo al reto, por el correo que me envió mi amigo parece ser que, primero, efectivamente no le sentó muy bien mi comentario - ya que me dice: “como eres ‘muy listo’, …” :) - y, segundo, que no tiene muy claro por qué este método de cifrado se llama OTP (‘one-time pad’), porque si, como parece, ha utilizado la misma clave para cifrar ambos mensajes (“a ver si eres capaz de: descifrarlos, obtener la clave y …”) ha dejado abierta la puerta al criptoanálisis y, por tanto, de secreto perfecto nada de nada.

Es decir, en el caso de que se cometa el error de reutilizar la clave, un criptoanalista que se haga con dos criptogramas cifrados con la misma clave puede obtener los textos en claro correspondientes sin demasiados problemas utilizando la técnica ‘crib dragging’.

Pero, ¿cómo?. Si se utiliza la misma clave (K) para cifrar dos textos en claro (M1 y M2) resulta que:
- C1 = M1 ⊕ K
- C2 = M2 ⊕ K

Si hago XOR de ambos criptogramas (C1 y C2):
C1 ⊕ C2 = M1 ⊕ K ⊕ M2 ⊕ K = M1 ⊕ M2

Con lo que, con independencia de la clave utilizada (K), si voy deduciendo o infiriendo partes de uno u otro de los textos en claro (‘cribs’) iré obteniendo las partes correspondientes del otro mensaje en claro.

En resumen, como creo que mi amigo ha reutilizado la clave, para atacar este cifrado y descubrir los mensajes en claro correspondientes a ambos criptogramas se puede actuar de la siguiente manera:

1.- Realizar la operación ⊕ de los dos criptogramas.

2.- Intentar deducir parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro y codificar la parte inferida (‘crib’) como una cadena hexadecimal (los criptogramas dados están codificados en hexadecimal).

3.- Realizar la operación ⊕ de la ‘crib’ en hexadecimal a partir de la primera posición del resultado de la operación ⊕ realizada a los dos criptogramas.

3.1.- Si el resultado obtenido es un texto legible puedo pensar que, efectivamente, la ‘crib’ empleada aparece en uno de los textos en claro y que he obtenido la parte del texto en claro correspondiente a ésta en el otro texto en claro, e intento adivinar otra ‘crib’ repitiendo el punto 3.

3.2.- Si el resultado no es un texto legible, realizo una operación ⊕ de la ‘crib’ en hexadecimal a partir de la siguiente posición del resultado de la operación ⊕ realizada a los dos criptogramas.
Para llevar a cabo todo lo anterior recomiendo utilizar la siguienteherramienta de ‘crib dragging’ interactiva:

C1 ⊕ C2:
Deducir una 'crib', es decir, parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro, con la que se obtenga un texto legible en las mismas posiciones del otro texto en claro, y repetir este proceso con las 'cribs' que sean necesarias hasta obtener los textos en claro correspondientes a los dos criptogramas.

Crib = "SECRETO PERFECTO":
Crib = "EL SECRETO PERFECTO":
Crib = "CIFRAR":
Crib = "CRIPTOGRAMA":
Crib = "EL SECRETO PERFECTO SE PRODUCE CUANDO EL TEXTO":
Y así sucesivamente; ir adivinando más partes de palabras, palabras completas y/o varias palabras que probablemente aparezca/n en uno de los dos textos en claro hasta conseguir descifrar ambos criptogramas, ejercicio que dejo a quien esté interesado en resolver completamente este reto y/o en el manejo de la herramienta utilizada.

Y, finalmente, a medida que se vayan descifrando los dos criptogramas o una vez descifrados completamente ambos se puede ir obteniendo la clave de cifrado parcial o totalmente, respectivamente, sin más que que realizar la operación ⊕ entre la parte hallada de uno de los dos textos en claro y la misma parte del criptograma correspondiente. Ejemplo:
Con lo que la solución a este reto, que está en la clave, es: CLAUDE_SHANNON.

Binary Exploitation (I): Solución Reto TG:HACK 2020 "Boofy"

$
0
0
En esta ocasión pongo la solución a un reto de la categoría 'Binary Exploitation' de TG:HACK 2020, competición en modalidad 'on-line', estilo 'Capture the Flag' y formato 'Jeopardy'.

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

Su enunciado dice lo siguiente: This program looks like it's password protected, but we can't seem to find the correct password.

nc boofy.tghack.no 6003

Y se proporcionan dos archivos: un ejecutable (boofy) y otro con un código fuente (boofy.c).

Solución: lo primero que hago es ejecutar el programa (boofy); se me pide una contraseña, introduzco 'A' y se muestra un mensaje que me indica que esa no es la contraseña correcta.
 Después, echo un vistazo al código fuente (boofy.c):

#include
#include
#include

void get_flag()
{
printf("TG20{the real flag is on the server}\n");
}

void try_password()
{
char password[20] = { 0 };
int correct = 0;
printf("Please enter the password?\n");
gets(password);
if (correct == 1) {
get_flag();
} else {
printf("Sorry, but that's not the right password...\n");
}
}

int main()
{
setvbuf(stdout, NULL, _IONBF, 0);
try_password();
return 0;
}

Y me queda claro que en este reto se trata de explotar la vulnerabilidad de desbordamiento de 'buffer' (en inglés, 'buffer overflow').

En este caso se trata de un reto muy sencillo de este tipo en el que creo que para obtener la 'flag'  basta con introducir como password una cadena de 20 bytes o caracteres cualesquiera (tamaño del espacio asignado a la password a introducir) más cuatro bytes con los siguientes valores en  hexadecimal: \x01\x00\x00\x00 (formato de almacenamiento en memoria 'little-endian', es decir, del byte menos significativo al más significativo), con lo que el 'buffer' asignado a la password se rellenará con los primeros 20 caracteres de la password introducida, se producirá su desbordamiento, el valor de la variable 'correct' se sobrescribirá con el valor 1 (cuatro últimos caracteres de la password introducida) y como el valor de 'correct' es igual 1 se mostrará la 'flag'.

Compruebo si estoy en lo cierto mediante una pequeña línea codificada en python: python -c "print 'A'*20 + '\x01\x00\x00\x00'" | nc boofy.tghack.no 6003, y obtengo lo siguiente:
Con lo que la 'flag' es: TG20{The real flag is much boofier than the other one}

Binary Exploitation (II): Solución Reto picoCTF 2018 "buffer overflow 1"

$
0
0
En el post anterior puse la solución a un reto de la categoría 'Binary Exploitation' en la que expliqué brevemente cómo explotar la vulnerabilidad de desbordamiento de 'buffer' (en inglés, 'buffer overflow') para sobrescribir el valor de una variable con el objetivo de que al ejecutarse el programa vulnerable éste muestre la 'flag'. Pues bien, en este post doy un paso más para ilustrar cómo se puede explotar dicha vulnerabilidad para tomar el control del flujo de un programa vulnerable y conseguir que éste ejecute lo que lo que nosotros queramos.

Para ello utilizo uno de los retos de la plataforma picoCTF 2018.

El desafío en cuestión, que lleva el título "buffer overflow 1", presenta un nivel de dificultad medio (☆☆).

buffer overflow 1 - Points: 200:

Su enunciado dice lo siguiente: '
Okay now you're cooking! This time can you overflow the buffer and return to the flag function in this program? You can find it in /problems/buffer-overflow-1_4_9d46ad1b74894db5d4831b91e19ee709 on the shell server. Source'.

Se proporcionan dos archivos: un ejecutable (vuln) y un fichero con el código fuente (vuln.c).

Y como pistas ('Hints') se nos dan las siguientes:

- 'This time you're actually going to have to control that return address!'.
- 'Make sure you consider Big Endian vs Little Endian'.

Solución: como en el post anterior al que he hecho referencia, lo primero que hago es ejecutar el programa; se me pide que introduzca un cadena, incluyo 'A' y se muestra un mensaje en el que se indica una dirección a la que bifurca o salta el programa.
Echo ahora un vistazo al código fuente (vuln.c):

#include
#include
#include
#include
#include
#include "asm.h"

#define BUFSIZE 32
#define FLAGSIZE 64

void win() {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
    exit(0);
  }

  fgets(buf,FLAGSIZE,f);
  printf(buf);
}

void vuln(){
  char buf[BUFSIZE];
  gets(buf);

  printf("Okay, time to return... Fingers Crossed... Jumping to 0x%x\n", get_return_address());
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);

  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  puts("Please enter your string: ");
  vuln();
  return 0;

}

La dirección que se indica tras introducir la cadena es la dirección de retorno a la que el programa salta tras finalizar la ejecución de la función vuln. Por tanto, si mediante un desbordamiento de 'buffer' sobrescribo esa dirección puedo controlar el flujo del programas y, por consiguiente, decidir dónde salta el programa tras ejecutar dicha función, pudiendo hacer que bifurque, por ejemplo, al inicio de la función win, lo que mostraría la 'flag'.

Lo primero que debo hacer es calcular la diferencia o desplazamiento que existe entre la posición de inicio del 'buffer', que tiene 32 bytes de tamaño asignado, y la de inicio de la dirección de retornoya que ese será el tamaño en bytes del "relleno" de la cadena a introducir antes de incluir como parte final de dicha cadena la dirección de inicio de la función win.

Para calcular el "relleno" indicado en el párrafo anterior ejecuto el programa e introduzco una cadena que me pueda indicar que parte de la misma sobrescribe la dirección de retorno y obtener así el desplazamiento que necesito, por ejemplo: 32 caracteres 'A' (tamaño del 'buffer') + '111122223333...':
Ejecuto el programa e introduzco esa cadena:
Y veo que la dirección de retorno se ha sobrescrito con cuatro bytes: 0x34343434 (valores hexadecimales que se corresponden en ASCII con '4444'), con lo que el desplazamiento es de 32 + 12 bytes y, por tanto, el "relleno" de la cadena a introducir antes de incluir como parte final de dicha cadena la dirección de inicio de la función win es de 44 bytes.

Lo segundo que debo hacer es obtener la dirección de inicio de la función win. Para ello utilizo los comandos objdump y grep, de la siguiente manera:
Con lo que para ver la 'flag' la dirección a la que debo forzar que bifurque el programa cuando finalice la ejecución de la función vuln es 0x080485cb.

Y, finalmente, mediante una pequeña línea codificada en python (hay que tener en cuenta que el formato de almacenamiento en memoria es 'little-endian', es decir, del byte menos significativo al más significativo): python -c "print 'A' * 44 + '\xcb\x85\x04\x08'" | ./vuln, obtengo lo siguiente:
Con lo que la 'flag' es: picoCTF{addr3ss3s_ar3_3asyd69e032d}

Binary Exploitation (III): Solución Reto picoCTF 2018 "buffer overflow 2"

$
0
0
En los dos posts anteriores puse sendas soluciones a dos retos tipo CTF de la categoría 'Binary Exploitation' ("Boofy" y "buffer overflow 1") en las que expliqué brevemente cómo explotar la vulnerabilidad de desbordamiento de 'buffer' (en inglés, 'buffer overflow'para sobrescribir el valor de una variable y para tomar el control del flujo de un programa vulnerable, respectivamente.

Pues bien, en esta entrada doy un paso más que se puede considerar como la suma de los dos casos anteriores.

Para ello, como en el post anteriorutilizo uno de los retos de la plataforma picoCTF 2018.

En este desafío debo obtener el control sobre el flujo del programa, para que éste salte o bifurque a una función determinada, y sobre el contenido de dos variables, que debo pasar como parámetros a dicha función.

El desafío en cuestión, que lleva el título "buffer overflow 2", presenta un nivel de dificultad medio (☆☆).

buffer overflow 2 - Points: 200:

Su enunciado dice lo siguiente: '
Alright, this time you'll need to control some arguments. Can you get the flag from this program? You can find it in /problems/buffer-overflow-2_0_738235740acfbf7941e233ec2f86f3b4 on the shell server. Source'.

Se proporcionan dos archivos: un ejecutable (vuln) y un fichero con el código fuente (vuln.c).

Y como pista ('Hint') se nos da la siguiente:

'Try using gdb to print out the stack once you write to it!'.

Solución: como en los dos posts anteriores a los que he hecho referencia, lo primero que hago es ejecutar el programa; se me pide que introduzca una cadena, incluyo 'A' y se muestra la cadena que he introducido.
Echo ahora un vistazo al código fuente (vuln.c):

#include < stdio.h>
#include < stdlib.h>
#include < string.h>
#include < unistd.h>
#include < sys/types.h>

#define BUFSIZE 100
#define FLAGSIZE 64

void win(unsigned int arg1, unsigned int arg2) {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
    exit(0);
  }

  fgets(buf,FLAGSIZE,f);
  if (arg1 != 0xDEADBEEF)
    return;
  if (arg2 != 0xDEADC0DE)
    return;
  printf(buf);
}

void vuln(){
  char buf[BUFSIZE];
  gets(buf);
  puts(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);

  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  puts("Please enter your string: ");
  vuln();
  return 0;
}

Como se observa es un código fuente muy similar al del post anterior, con la principal diferencia de que para que se muestre la 'flag' la función windebe recibir dos parámetros (arg1 y arg2) con los valores 0xDEADBEEF y 0xDEADC0DE, respectivamente.

Es decir, al igual que en el post anterior, debo tomar el control del flujo del programa para que se ejecute la funciónwiny, de forma parecida que en el primer post, tengo que sobrescribir los valores de ambos parámetros para que éstos contengan los valores deseados.

Para que se comprenda la explicación sobre cómo sobrescribir los valores de los dos parámetros citados debo referirme a la pila de ejecución, que es un espacio de memoria que el sistema operativo reserva cuando carga un programa y que se utiliza durante su ejecución.

La pila (en inglés, 'stack'contiene los parámetros de las funciones, sus variables locales y sus direcciones de retorno, y también algunos valores de registros.

En nuestro caso, sin entrar en mayores detalles de cómo se almacenan los datos en la pila, inmediatamente después de la dirección de retorno de la función vuln se encontrarían: la dirección de retorno de la función win, primer parámetro de la función win (arg1) y segundo parámetro de la función win (arg2).

Por tanto, para tomar el control del flujo del programa y que tras finalizarse la ejecución de la función vuln el programa salte la función win actúo de la misma manera que en el post anterior (hay que tener en cuenta que en este caso el 'buffer' tiene asignado un tamaño de 100 bytes, es decir, hasta el momento tengo una cadena de 112 bytes de "relleno" + dirección de inicio de la función win en formato de almacenamiento 'little-endian'), y para sobrescribir los valores de ambos parámetros basta con añadir a la cadena obtenida hasta este momento un "relleno" de 4 bytes que sobrescribirá la dirección de retorno de la función win + el valor deseado para el primer parámetro de la función win (arg1en formato de almacenamiento 'little-endian'+ el valor deseado para el segundo parámetro de la función win (arg2en formato de almacenamiento 'little-endian'.

Utilizo una pequeña línea codificada en python para obtener la 'flag': python -c "print 'A' * 112 + '\xcb\x85\x04\x08' + 'A' * 4 + '\xef\xbe\xad\xde' + '\xde\xc0\xad\xde'" | ./vuln:
Con lo que la 'flag' es: picoCTF{addr3ss3s_ar3_3asyada28e9b}

Binary Exploitation (IV): Solución Reto picoCTF 2019 "NewOverFlow-1"

$
0
0
Hasta ahora en los retos de la categoría 'Binary Exploitation' que he puesto en este blog se han visto involucrados ejecutables de 32 bits, ¿se explotaría igual la vulnerabilidad  de desbordamiento de 'buffer' (en inglés, 'buffer overflow') con ejecutables de 64 bits?. Voy por partes. En este primer post explico cómo tomar el control del flujo de un ejecutable de 64 bits vulnerable y conseguir que el programa ejecute una determinada parte de él que nosotros queramos.

Para ello utilizo uno de los retos de la plataforma picoCTF 2019.

El desafío en cuestión, que lleva el título "NewOverFlow-1", presenta en mi opinión un nivel de dificultad alto (). Para saber por qué le asigno ese nivel de dificultad hay que esperar al final de esta entrada :).

NewOverFlow-1 - Points: 200:

Su enunciado dice lo siguiente: '
Lets try moving to 64-bit, but don't worry we'll start easy. Overflow the buffer and change the return address to the flag function in this program. You can find it in /problems/newoverflow-1_3_e53f871ba121b62d35646880e2577f89 on the shell server. Source'.

Se proporcionan dos archivos: un ejecutable (vuln) y un fichero con el código fuente (vuln.c).

Y como pista ('Hint') se nos da la siguiente:

'Now that we're in 64-bit, what used to be 4 bytes, now may be 8 bytes'.

Solución: lo primero que hago es comprobar el tipo de fichero que es vuln:

Como se observa en la figura anterior se trata de un ejecutable de 64 bits.

Después lo ejecuto en local; se me pide que introduzca una cadena que me dé la 'flag', incluyo 'A' y el programa finaliza.
Echo ahora un vistazo al código fuente (vuln.c):

#include < stdio.h>
#include < stdlib.h>
#include < string.h>
#include < unistd.h>
#include < sys/types.h>

#define BUFFSIZE 64
#define FLAGSIZE 64

void flag() {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("'flag.txt' missing in the current directory!\n");
    exit(0);
  }

  fgets(buf,FLAGSIZE,f);
  printf(buf);
}

void vuln(){
  char buf[BUFFSIZE];
  gets(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);
  gid_t gid = getegid();
  setresgid(gid, gid, gid);
  puts("Welcome to 64-bit. Give me a string that gets you the flag: ");
  vuln();
  return 0;
}

Como se observa, en este caso el tamaño del 'buffer' asignado para la cadena a introducir es de 64 bytes. Además, veo que para que el programa muestre la 'flag' debo tomar el control del flujo para que se ejecute la funciónflag. Para ello, la idea es la misma que en el caso del post que escribí sobre el reto titulado "buffer overflow 1", es decir, mediante un desbordamiento de 'buffer' sobrescribir la dirección de retorno de la función vuln para que el programa salte al inicio de la función flag.

Lo primeros que hago es obtener la dirección de inicio de la función flag. Para ello utilizo los comandos objdump y grep, de la siguiente manera:
Para ver la 'flag'la dirección a la que debo forzar que bifurque el programa cuando finalice la ejecución de la función vuln es 0x0000000000400767.

Ahora calculo la diferencia o desplazamiento que existe entre la posición de inicio del 'buffer', que tiene 64 bytes de tamaño asignado, y la de inicio de la dirección de retorno de la función vuln, ya que ese será el tamaño en bytes del "relleno" de la cadena a introducir antes de incluir como parte final de dicha cadena la dirección de inicio de la función flag.

Para calcular el "relleno" indicado en el párrafo anterior utilizo como 'debugger' el software gdb. Desensamblo la función principal (main):
Y veo que la dirección de retorno de la funciónvulnes 0x000000000040084a.

Desensamblo la función vulnpongo un punto de ruptura ('breakpoint'en la última instrucción (vuln+27)ejecuto el programa, introduzco 'A' como cadena e inspecciono la información del 'frame' en la pila.
Como se ve la dirección de la siguiente instrucción a ejecutar es 0x4007e7 y la dirección de retorno de la función vulnes la que he indicado antes, 0x40084a, es decir, la instrucción inmediatamente siguiente a la llamada a la función vuln en la función principal main.

Ahora, finalizo la ejecución del programa, ejecuto otra vez el programa, introduzco una cadena que me pueda indicar que parte de la misma sobrescribe la dirección de retorno de la función vuln, por ejemplo: 64 caracteres 'A' (tamaño del 'buffer') + '111111112222222233333333...'y cuando éste se detiene inspecciono la información del 'frame' en la pila:
Como se observa,  la dirección de retorno de la función vuln se ha sobrescrito con ocho bytes: 0x3232323232323232 (valores hexadecimales que se corresponden en ASCII con '22222222''), con lo que el desplazamiento es de 64 + 8 bytes y, por tanto, el "relleno" de la cadena a introducir antes de incluir como parte final de dicha cadena la dirección de inicio de la función flag es de 72 bytes.

Y, finalmente, mediante una pequeña línea codificada en python (hay que tener en cuenta que el formato de almacenamiento en memoria es 'little-endian', es decir, del byte menos significativo al más significativo): python -c "print 'A' * 72 + '\x67\x07\x40\x00\x00\x00\x00\x00'" | ./vuln, obtengo lo siguiente:
Con lo que parece que este 'exploit' funciona; el programa ha bifurcado a la función flagel mensaje que se muestra se debe a que estoy ejecutando el programa en local. Utilizo la misma línea codificada en python en el servidor:
Sin embargo, no se muestra la 'flag', ¿por qué?. Pues no lo tengo nada claro y después de investigar por Internet aún menos :(.

No obstante, y aunque como digo no me queda nada claro, parece ser que el problema se produce porque si los operandos no están alineados correctamente en la pila se genera una excepción, y en nuestro caso creo entender que para solucionar este problema bastaría con incluir 8 bytes más en la pila después del "relleno" con la dirección de inicio de otra función.

Voy a ver si consigo solucionarlo. Para ello, después de los 72 caracteres 'A' de relleno incluyo 8 bytes adicionales con la dirección de inicio de la función vuln 0x00000000004007cc (hay que tener en cuenta que el formato de almacenamiento en memoria es 'little-endian') y después introduzco los 8 bytes con la dirección de inicio de la función flag 0x0000000000400767 (de igual forma hay que tener en cuenta que el formato de almacenamiento en memoria es 'little-endian'). Es decir:
python -c "print 'A' * 72 + '\xcc\x07\x40\x00\x00\x00\x00\x00\x67\x07\x40\x00\x00\x00\x00\x00'" | ./vuln
Con lo que la 'flag' es: picoCTF{th4t_w4snt_t00_d1ff3r3nt_r1ghT?_bfd48203}

Como se ve ha funcionado, pero no lo comprendo del todo :(, por lo que si algún amable lector de este blog lo tiene claro agradecería la explicación del por qué.

Criptografía (CXCI): Reto 39

$
0
0
En esta entrada vuelvo a referirme a la máquina de cifrado más famosa de la historia; la utilizada por el ejército alemán durante la Segunda Guerra Mundial, la máquina Enigma.

En este blog ya he escrito muchas entradas sobre ella, y, sin duda, se trata del criptosistema con cuyo aprendizaje más me he entretenido, al estar relacionada esta máquina, además de con un sistema criptográfico complejo que se suponía invulnerable para su época, con la apasionante historia del criptoanálisis de los mensajes secretos de los alemanes por parte de los aliados y con la decisiva influencia que tuvo el éxito de éste para adelantar el final de la WWII.

Pues bien, en este post pongo un reto de criptografía en el que se ve involucrada lamáquina enigma.

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 39: "Geheim!".

El título de este reto, 'Geheim!' (en alemán, "¡Secreto!"), no es casualidad, ya que los alemanes sabían perfectamente que el secreto de sus comunicaciones residía en la seguridad de la clave; eran plenamente conscientes de que su máquina, más tarde o más temprano, caería en manos de los aliados y, por tanto, que éstos dispondrían de réplicas de la misma, pero esto no era un problema mientras las claves para descifrar sus mensajes permanecieran secretas.

Mensualmente, cada operador recibía una hoja de configuración (en inglés, 'Setting Sheet') con las claves de cada uno de los días. Un ejemplo de una hoja de este tipo es la que vamos a utilizar para este reto:
La primera columna es la fecha (en alemán, 'Datum') o día del mes en el que la configuración de la máquina que se indica a continuación está vigente para el cifrado/descifrado de todos los mensajes emitidos ese día; la segunda de las columnas se corresponde con los rotores a utilizar ese día y su orden (en alemán, 'Walzenlage'); la tercera columna es el ajuste de los anillos (en alemán, 'Ringstellung') a realizar en cada uno de los rotores identificados en la columna anterior; y la cuarta columna se corresponde con los 10 pares de letras a conectar entre sí en el tablero de conexiones (en alemán, 'Steckerverbindungen').

Al final de cada día los operadores alemanes arrancaban y destruían la fila correspondiente a la configuración de ese día, razón por la que las fechas se indican en la hoja en orden inverso, es decir, desde el último día del mes (primera fila) al primero (última fila), ya que, como he dicho, los alemanes sabían que sólo podrían mantener secretas sus comunicaciones si esta información no caía en manos de sus enemigos y, por tanto, la destrucción confidencial de las configuraciones empleadas también jugaba un papel fundamental para ello.

Pues bien, supongamos que los aliados se hacen con esta hoja de configuración correspondiente al mes de julio de 1941, y que el día 29 de ese mes, al principio de la operación Barbarroja, campaña para la invasión de la Unión Soviética, se intercepta el mensaje cifrado enviado desde el frente oriental por una división Panzer de las SS armadas (en alemán, las 'Waffen SS') que se muestra en los recursos asociados al reto; mensaje cifrado utilizando el modelo M3 de la máquina y empleando el reflector "B".

Lamentablemente, la configuración correspondiente al día 29 no está completa. Tal y como se ve en la imagen anterior y en los recursos asociados al reto, faltan la fecha (pero evidentemente se corresponde al día 29 del mes) y la segunda columna; ésta última es la que identifica los rotores empleados y su orden. ¿Puedes ayudar a los criptoanalistas de Bletchley Park a descifrar el mensaje interceptado?.

Dificultad:
Tipo:       Criptografía.

Recursos:

- Configuración recuperada parcialmente:
Configuración para el día 29 de julio de 1941:

Datum  Walzenlage  Ringstellung  ---- Steckerverbindungen ----
 ***    ** ** **    11  17  26   CI OK PV ZL HX NB AW DJ FE ST
- Mensaje (cabecera sin cifrar y texto cifrado):
Cabecera del mensaje:

1840 - 1TLE 343 - WXC YKW

Significado de la información en la cabecera del mensaje:
1840: Hora en la que se envía el mensaje (18:40).
1TLE: Número de partes de las que se compone el mensaje (1 parte. TLE, del alemán ‘Teile’o “Partes”).
Tamaño del texto cifrado: 343.
Posición inicial de los rotores: WXC
Clave de sesión cifrada: YKW.

Texto cifrado:

FPYUZ TZMRI EAVHJ NSSUL FOHYO NKFDO AHHJB QSOAR KZPFN JUABF ZXUBY YKTEY KBVYO MIPCO HNIRK RIDVJ UBTSG EJOKF QEQEH PATKZ NCCZN PALUC JIEZT AKCXO PFDXF TZOAT HKZVF WMJXI RJXCW AVSYF XGYDS NQZDA LFZRB EDAKK GNIXZ IQBOM XSNXK NGJFH ZXVHC MJAQO PUGZE IXPIJ PTAFK AMKPN MFOSH WHKLX PHYSU DDDXI ZLDVF XXDWQ OGWSR RVVYL YDYKZ MHWMZ DPEUW BDSPI BVQPV FGHTB TXXNC AEKKX XCTTX HMLMO ORLZE GNBHA IIOIP ZFGSM ZDWFK HWQTT JNI
******** __/__/____
Pista 1:    Por publicar.

******** __/__/____
SoluciónPor publicar.

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

Criptografía (CXCII): Solución Reto 39

$
0
0
Solución al último reto de criptografía que he puesto en este blog y en el que se ve involucrada la máquina de cifrado más famosa de la historia; la utilizada por el ejército alemán durante la Segunda Guerra Mundial, la máquina Enigma.

El enunciado del reto decía lo siguiente: El título de este reto, 'Geheim!' (en alemán, "¡Secreto!"), no es casualidad, ya que los alemanes sabían perfectamente que el secreto de sus comunicaciones residía en la seguridad de la clave; eran plenamente conscientes de que su máquina, más tarde o más temprano, caería en manos de los aliados y, por tanto, que éstos dispondrían de réplicas de la misma, pero esto no era un problema mientras las claves para descifrar sus mensajes permanecieran secretas.

Mensualmente, cada operador recibía una hoja de configuración (en inglés, 'Setting Sheet') con las claves de cada uno de los días. Un ejemplo de una hoja de este tipo es la que vamos a utilizar para este reto:

La primera columna es la fecha (en alemán, 'Datum') o día del mes en el que la configuración de la máquina que se indica a continuación está vigente para el cifrado/descifrado de todos los mensajes emitidos ese día; la segunda de las columnas se corresponde con los rotores a utilizar ese día y su orden (en alemán, 'Walzenlage'); la tercera columna es el ajuste de los anillos (en alemán, 'Ringstellung') a realizar en cada uno de los rotores identificados en la columna anterior; y la cuarta columna se corresponde con los 10 pares de letras a conectar entre sí en el tablero de conexiones (en alemán, 'Steckerverbindungen').

Al final de cada día los operadores alemanes arrancaban y destruían la fila correspondiente a la configuración de ese día, razón por la que las fechas se indican en la hoja en orden inverso, es decir, desde el último día del mes (primera fila) al primero (última fila), ya que, como he dicho, los alemanes sabían que sólo podrían mantener secretas sus comunicaciones si esta información no caía en manos de sus enemigos y, por tanto, la destrucción confidencial de las configuraciones empleadas también jugaba un papel fundamental para ello.

Pue
s bien, supongamos que los aliados se hacen con esta hoja de configuración correspondiente al mes de julio de 1941, y que el día 29 de ese mes, al principio de la operación Barbarroja, campaña para la invasión de la Unión Soviética, se intercepta el mensaje cifrado enviado desde el frente oriental por una división Panzer de las SS armadas (en alemán, las 'Waffen SS') que se muestra en los recursos asociados al reto; mensaje cifrado utilizando el modelo M3 de la máquina y empleando el reflector "B".

Lamentablemente, la configuración correspondiente al día 29 no está completa. Tal y como se ve en la imagen anterior y en los recursos asociados al reto, faltan la fecha (pero evidentemente se corresponde al día 29 del mes) y la segunda columna; ésta última es la que identifica los rotores empleados y su orden. ¿Puedes ayudar a los criptoanalistas de Bletchley Park a descifrar el mensaje interceptado?.

Y como recursos asociados al reto se proporcionaban los siguientes:






Configuración para el día 29 de julio de 1941:

Datum  Walzenlage  Ringstellung
 ***    ** ** **    11  17  24

---- Steckerverbindungen ----
CI OK PV ZL HX NB AW DJ FE ST
Cabecera del mensaje:

1840 - 1TLE 347 - WXC YKW

Significado de la información en la cabecera del mensaje:
1840: Hora en la que se envía el mensaje (18:40).
1TLE: Número de partes de las que se compone el mensaje (1 parte. TLE, del alemán ‘Teile’o “Partes”).
Tamaño del texto cifrado: 347.
Posición inicial de los rotores: WXC
Clave de sesión cifrada: YKW.

Texto cifrado:

FPYUZ TZMRI EAVHJ NSSUL FOHYO NKFDO AHHJB QSOAR KZPFN JUABF ZXUBY YKTEY KBVYO MIPCO HNIRK RIDVJ UBTSG EJOKF QEWQL BDYQH QAVTI OKPYH NUGOA TTXEX YGICX SQNRM IEBQX OWOQP FVGHE HEVAD PHIFG WPXHG FSJVS ATTRG CCMIK GKRTP BNFUS ESNOG QAPGC PLEEL CMMLH ENIUZ ZLBAY KYFKM CCHZV FXAKB WZYFN DOSEQ MLWOF DPBEN HYURT MDRCM EIYGO AJNYI DBEHH ZXGRF NMWPY RELYL TOTRP JFWQO LFRQF ANQBB RRVUA KXYIS OAEOY WPIJO SMQCJ FLJOL IPUVM DN
Solución: Antes de poner la solución al reto conviene recordar cómo era el procedimiento de operación de la máquina.

Al inicio de cada día los operadores establecían la configuración inicial de la máquina para el cifrado y descifrado de todos los mensajes a enviar y recibir durante ese día, respectivamente.

Para ello, a partir de la hoja de configuración (en inglés, 'Setting Sheet') que habían recibido al principio del mes con las claves de cada uno de los días del mismo, cada uno de ellos actuaba de la siguiente manera:

1.- Abría la cubierta de la máquina y colocaba, en las ranuras dispuestas para alojarlos, los tres rotores identificados en la hoja para ese día en el orden indicado ('Walzenlage') y a los que previamente había realizado el ajuste del anillo ('Ringstellung').
En el reto nos falta la información correspondiente a los tres rotores utilizados y su orden, pero ya adelanto que éstos son: IV, I y V.

Por tanto, en nuestro reto, para el rotor "IV" establecía el ajuste del anillo en la posición 11 (letra "K") y lo colocaba en la primera ranura (rotor lento):
Después repetía este mismo proceso para los dos rotores restantes (para el rotor "I" establecía el ajuste del anillo en la posición 17, letra "Q", y para el rotor "V" en la posición 24, letra "X", y los colocaba en la segunda y tercera ranuras, rotores medio y rápido, respectivamente). Con el reflector "B" tendríamos hasta este momento lo siguiente:
2. Finalmente, cerraba la cubierta y conectaba entre sí en el tablero de conexiones ('Steckerverbindungen'), situado en la parte frontal de la máquina, los 10 pares de letras indicados para ese día en la hoja:
Y ya tenía lista la configuración inicial de la máquina para enviar (cifrar) y recibir (descifrar) todos los mensajes de ese día. En el reto el día 29 de julio de 1941.

Cuando recibía un mensaje cifrado:

1.- Establecía la posición inicial de los rotores indicada para cada uno de ellos en la cabecera del mensaje recibido. En nuestro reto en las posiciones "W" (23), "X" (24) y "C" (3), respectivamente:
2.- Tecleaba los tres caracteres de la clave de sesión cifrada que aparecían justo después de la posición inicial de los rotores en la cabecera del mensaje recibido. En nuestro reto "YKW",  y tras pulsar cada tecla se iluminaba en el panel de luces el carácter correspondiente a la clave de sesión descifrada:
3.- Cambiaba la posición inicial de los rotores a los tres caracteres correspondientes a la clave de sesión descifrada, es decir, a los tres caracteres que se habían iluminado en el paso anterior. En nuestro reto ya adelanto que éstos son "MGL":
4.- Tecleaba los caracteres del texto cifrado que había recibido y tras pulsar cada tecla se iluminaba en el panel de luces el carácter correspondiente al texto en claro:
Volviendo a nuestro reto y tal y como dije en la primera pista que puse para facilitar su resolución, como lo único que falta para conocer completamente la configuración inicial de la máquina para el día 29 de julio de 1941 (un día de un mes tal y como el de hoy, pero de hace 79 años) son los rotores utilizados y su orden, lo que tengo que hacer es utilizar la fuerza bruta para ir probando los 60 grupos distintos posibles de tres rotores hasta dar con un texto en claro legible.

Para ello, creo el siguiente script en python:

from enigma.machine import EnigmaMachine

encrypted_session_key = 'YKW'
rotors = ['I','II','III','IV','V']
ciphertext = 'FPYUZTZMRIEAVHJNSSULFOHYONKFDOAHHJBQSOARKZPFNJUABFZXUBYYKTEYKBVYOMIPCOHNIRKRIDVJUBTSGEJOKFQEWQLBDYQHQAVTIOKPYHNUGOATTXEXYGICXSQNRMIEBQXOWOQPFVGHEHEVADPHIFGWPXHGFSJVSATTRGCCMIKGKRTPBNFUSESNOGQAPGCPLEELCMMLHENIUZZLBAYKYFKMCCHZVFXAKBWZYFNDOSEQMLWOFDPBENHYURTMDRCMEIYGOAJNYIDBEHHZXGRFNMWPYRELYLTOTRPJFWQOLFRQFANQBBRRVUAKXYISOAEOYWPIJOSMQCJFLJOLIPUVMDN'

for slow_rotor in rotors:
    for middle_rotor in rotors:
        for fast_rotor in rotors:
            test_rotors = slow_rotor+''+middle_rotor+''+fast_rotor
            machine = EnigmaMachine.from_key_sheet(
                rotors = test_rotors,
                reflector = 'B',
                ring_settings = [11, 17, 24],
                plugboard_settings = 'CI OK PV ZL HX NB AW DJ FE ST')

            machine.set_display('WXC')
            decrypted_session_key = machine.process_text(encrypted_session_key)
            machine.set_display(decrypted_session_key)
            plaintext = machine.process_text(ciphertext)

            print(decrypted_session_key)
            print(test_rotors)
            print(plaintext)
            print('----------')

Lo ejecuto, y cuando finaliza compruebo el texto en claro que se ha obtenido para cada una de las combinaciones posibles de rotores y su orden. Para los rotores "IV", "I", "V" veo lo siguiente:
Es decir el texto en claro es el siguiente:

UNIDADXDEXRECONOCIMIENTOXDEXKURTINOWAXNOROESTEXDEXSEBEZXENXELXCORREDORXDEXVUELOXENXDIRECCIONXAXDUBROWKIXOPOTSCHKAXEMPEZOXAXMOVERSEXAXLASXDIECIOCHOXTREINTAXATAQUEXREGIMIENTOXDEXINFANTERIAXTRESXAVANZAXDESPACIOXPEROXSEGUROXHORAXDIECISIETEXSEISXIXREGIMIENTOXDEXINFANTERIAXTRESXENXELXCORREDORXDEXVUELOXCOMENZANDOXAXDIECISEISXKMXHACIAXELXESTEXDEXKAMENEC

Quitando los caracteres "X", que se utilizaban como espacios, quedaría el siguiente texto en claro, que he "tomado prestado" de la entrada en wikipedia sobre la máquina enigma:

UNIDAD DE RECONOCIMIENTO DE KURTINOWA NOROESTE DE SEBEZ EN EL CORREDOR DE VUELO EN DIRECCION A DUBROWKI OPOTSCHKA EMPEZO A MOVERSE A LAS DIECIOCHO TREINTA ATAQUE REGIMIENTO DE INFANTERIA TRES AVANZA DESPACIO PERO SEGURO HORA DIECISIETE SEIS I REGIMIENTO DE INFANTERIA TRES EN EL CORREDOR DE VUELO COMENZANDO A DIECISEIS KM HACIA EL ESTE DE KAMENEC

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

Criptografía (CXCIII): Reto 40

$
0
0
Ayer vi una película bélica en la que aparece la máquina Enigma, "U-571". Hasta ahora la única película que había visto en la que la máquina de cifrado más famosa de la historia tuviera una "aparición estelar" era "The imitation Game" (titulada en España como "Descifrando Enigma"). Aunque he visto otras películas ambientadas en la Segunda Guerra Mundial en las que se puede ver la máquina, en la mayoría de ellas su aparición es puro atrezo.

En la última de las películas citadas se cuenta la importancia que tuvo el descifrado por parte de los aliados de los mensajes secretos del ejército alemán, que éstos transmitían tras cifrarlos previamente mediante esta máquina, para conseguir anticiparse a sus movimientos y, por consiguiente, derrotar a los nazis lo antes posible y poner fin a la WWII en Europa. No obstante lo dicho, creo que pese a tener la máquina una presencia muy importante en la película, lo verdaderamente sustancial es lo que nos cuenta sobre la persecución absolutamente injusta que sufrió por su condición de homosexual uno de los principales participantes en el logro de "romper" el cifrado de la máquina, Alan Turing (tal y como se decía en la promoción de la película: "El verdadero enigma fue el hombre que descifró el código"), pese a ser un héroe de guerra y sus aportaciones a la ciencia, y que fue la causa más que probable de su trágico final.

En la película que vi ayer lo que se cuenta era la importancia que tenía para los aliados el hacerse con el modelo M4 de la máquina, que era el utilizado en exclusiva por la sección de submarinos (U-boat) de la armada alemana (Kriegsmarine). El resto de la marina alemana usaba el modelo M3, al igual que la Wehrmacht y la Luftwaffe (las fuerzas de tierra y aéreas del ejército alemán, respectivamente).

Karl Dönitz, que durante la guerra llegó a ser el mando más alto de la Kriegsmarine, insistió mucho y de forma reiterada a Adolf Hittler en  la vital importancia de hacerse con el control del Atlántico para destruir los convoyes de los aliados que abastecían a Gran Bretaña y sacar a ésta de la guerra, para lo que insistía en que era necesario que la potencia de la Kriegsmarine se basara en un número de U-boats suficiente para ello y, por tanto, en aumentar la producción de submarinos, a lo que el Führer finalmente accedió.

Además, parece ser que Karl Dönitz no se fiaba del todo de la invulnerabilidad del modelo M3 de la máquina Enigma, y algo de razón tenía :) (los británicos habían conseguido criptoanalizarla con éxito), por lo que en febrero de 1942 entró en servicio el modelo M4 en la sección de submarinos (U-boats) de la armada alemana (Kriegsmarine); un modelo más sofisticado y aún mucho más difícil de 'crackear' que el M3. A partir de ese momento y desgraciadamente para los aliados, las comunicaciones de la armada alemana volvieron a ser opacas y, en consecuencia, los ataques de los U-boats a los convoyes aliados, basados en la táctica de "manada de lobos" (ataque coordinado de varios submarinos), obtuvieron un éxito aplastante que a punto está de doblegar la resistencia de Gran Bretaña y de forzar su rendición.

Por tanto, no es de extrañar la obsesión de los aliados por hacerse con una máquina del modelo M4 y con las hojas de claves correspondientes, ya que de ello dependía en gran medida el poder revertir la situación de supremacía de la armada nazi en el Atlántico, y ese es el punto de partida de la película que vi ayer, pero que no deja de ser "la excusa" para hacer una entretenida película bélica de acción, sin más, ya que ni siquiera se explica qué era la máquina Enigma y, por tanto, aún menos se hace hincapié en la importancia de su captura y, además y en mi opinión, carece del mínimo rigor histórico sobre el episodio que realmente propició el que los aliados se hicieran con el modelo M4 de la máquina.

Dicho todo lo anterior, en este post pongo otro reto decriptografíaen el que se ve involucrada lamáquina Enigma.

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 40: "Pero, ¿qué me dices?".

Las diferencias fundamentales entre el modelo M3 de la máquina Enigma utilizado por la Wehrmacht y la Luftwaffe (las fuerzas de tierra y aéreas del ejército alemán, respectivamente) y el modelo M4 empleado en exclusiva en la sección de submarinos (U-boat) de la Armada alemana (Kriegsmarine) eran:

1.- El modelo M3 utilizado por la Wehrmacht y la Luftwaffe disponía de 5 rotores (identificados con los números romanos I, II, III, IV y V) y que eran utilizables de tres en tres en las ranuras dispuestas para alojarlos, mientras que el modelo M4 disponía de 3 rotores adicionales, es decir, de un total de 8 rotores (identificados con los números romanos I, II, III, IV, V, VI, VII y VIII) y que igualmente eran utilizables de tres en tres en las ranuras dispuestas para alojar los rotores "normales".

2.- El tamaño de la máquina (de su carcasa) era el mismo para los dos modelos, pero en el modelo M4 se deseaba utilizar un rotor más y, por tanto, el problema era que dicho rotor tenía que caber en el mismo espacio que el que había en el modelo M3. Para resolver ésto, los dos reflectores existentes en el modelo M3 ("B" y "C") fueron estrechados, dando origen a los reflectores "B fino o estrecho" (en inglés, 'B Thin') y "C fino o estrecho" (en inglés, 'C Thin') del modelo M4.

3.- Consecuencia de lo anterior, el modelo M4 podía utilizar un rotor adicional de entre dos rotores también "finos o estrechos" (en inglés, 'Thin Rotors'), de menor grosor que los "normales" y que no giraban, pero que al igual que estos últimos y los reflectores podían ser configurados en 26 posiciones diferentes, y que se identificaban con las letras griegas Beta y Gamma. Para alojar este rotor adicional el modelo M4 disponía de 1 ranura más para alojar uno de estos dos rotores "finos o estrechos".

Pues bien, supón que el día 8 de marzo de 1942 un U-boat de la Kriegsmarine que se encuentra en pleno Atlántico Norte recibe el mensaje cifrado desde un acorazado alemán (recordar que la M4 se usaba sólo en la sección de submarinos; en el resto de la Kriegsmarine se utilizaba el modelo M3, aunque con 8 rotores utilizables de tres en tres) que se muestra en los recursos asociados al reto. Además, imagina que eres el operador de la máquina Enigma destinado en ese U-boat, por lo que dispones de la hoja de configuración (en inglés, 'Setting Sheet') de ese mes (la configuración inicial correspondiente al día 8 figura en los recursos asociados al reto) y sabes que el mensaje se cifró utilizando el reflector "B". ¿Puedes descifrar el mensaje recibido, que ha sido cifrado con una máquina de modelo M3, utilizando tu máquina de modelo M4?

Se recomienda utilizar el simulador que se indica en los recursos asociados al reto, aunque este desafío se puede resolver también utilizando cualquier otro de los muchos simuladores existentes en Internet e incluso mediante scripts implementados en diversos lenguajes de programación.

Dificultad:
Tipo:       Criptografía.

Recursos:
- Rotores y orden de los mismos, ajuste de los anillos y pares de letras a conectar entre sí para el día 8 de marzo de 1942:
Datum  Walzenlage  Ringstellung  ---- Steckerverbindungen ----
 08.    V II III      A  K  E    CI OK PV ZL HX NB AW DJ FE ST
- Mensaje (cabecera sin cifrar y texto cifrado):
Cabecera del mensaje:

1425 - 1TLE 109 - ZYX DPP

Significado de la información en la cabecera del mensaje:
1425 Hora en la que se envía el mensaje (14:25).
1TLE: Número de partes de las que se compone el mensaje (1 parte. TLE, del alemán ‘Teile’ o “Partes”).
Tamaño del texto cifrado: 109.
Posición inicial de los rotores: ZYX
Clave de sesión cifrada: DPP.

Texto cifrado:
CDCLQ CXNQI YSMXU AFBJC DUBMR MKVDD XQDXZ KILKC EYTHE TNEZC ZVMYS LLOCA UQRNN GUHYE ORNCX HUSRF NHRHN OCVJZ FEUYE ORWFR RSSAO JNYX
- Simulador máquina Enigma:
https://summersidemakerspace.ca/projects/enigma-machine/.

******** 28/07/2020
Pista 1:    Para aquellos casos en los que había que intercambiar mensajes cifrados en los que el emisor y el receptor utilizaban modelos diferentes de la máquina (uno de ellos el M3 y el otro el M4), los alemanes idearon una configuración por cada reflector utilizado que hacía compatibles ambos modelos, es decir, en la que un mensaje cifrado utilizando un modelo M3 podía descifrarse empleado un modelo M4 y viceversa.

Si investigas un poco por Internet enseguida encontrarás de qué configuraciones se trata. Prueba la correspondiente al reflector "B" y descifrarás sin problemas el mensaje :).

******** 29/07/2020
Solución.

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

Criptografía (CXCIV): Solución Reto 40

$
0
0
Solución al último reto de criptografía que he puesto y en el que se ve involucrada la máquina de cifrado más famosa de la historia; la utilizada por el ejército alemán durante la Segunda Guerra Mundial, la máquina EnigmaEn este blog ya he escrito muchas entradas sobre dicha máquina, incluso he puesto algunos retos sobre ella, pero siempre haciendo referencia al modelo M3 de la misma. En este reto, además del mencionado modelo, aparece también el modelo empleado por la sección de submarinos (U-boat) de la armada alemana (Kriegsmarine), el modelo M4 o la llamada Enigma Naval.


El enunciado del reto decía lo siguiente: Las diferencias fundamentales entre el modelo M3 de la máquina Enigma utilizado por la Wehrmacht y la Luftwaffe (las fuerzas de tierra y aéreas del ejército alemán, respectivamente) y el modelo M4 empleado en exclusiva en la sección de submarinos (U-boat) de la Armada alemana (Kriegsmarine) eran:

1.- El modelo M3 utilizado por la Wehrmacht y la Luftwaffe disponía de 5 rotores (identificados con los números romanos I, II, III, IV y V) y que eran utilizables de tres en tres en las ranuras dispuestas para alojarlos, mientras que el modelo M4 disponía de 3 rotores adicionales, es decir, de un total de 8 rotores (identificados con los números romanos I, II, III, IV, V, VI, VII y VIII) y que igualmente eran utilizables de tres en tres en las ranuras dispuestas para alojar los rotores "normales".

2.- El tamaño de la máquina (de su carcasa) era el mismo para los dos modelos, pero en el modelo M4 se deseaba utilizar un rotor más y, por tanto, el problema era que dicho rotor tenía que caber en el mismo espacio que el que había en el modelo M3. Para resolver ésto, los dos reflectores existentes en el modelo M3 ("B" y "C") fueron estrechados, dando origen a los reflectores "B fino o estrecho" (en inglés, 'B Thin') y "C fino o estrecho" (en inglés, 'C Thin') del modelo M4.

3.- Consecuencia de lo anterior, el modelo M4 podía utilizar un rotor adicional de entre dos rotores también "finos o estrechos" (en inglés, 'Thin Rotors'), de menor grosor que los "normales" y que no giraban, pero que al igual que estos últimos y los reflectores podían ser configurados en 26 posiciones diferentes, y que se identificaban con las letras griegas Beta y Gamma. Para alojar este rotor adicional el modelo M4 disponía de 1 ranura más para alojar uno de estos dos rotores "finos o estrechos".

Pues bien, supón que el día 8 de marzo de 1942 un U-boat de la Kriegsmarine que se encuentra en pleno Atlántico Norte recibe el mensaje cifrado desde un acorazado alemán (recordar que la M4 se usaba sólo en la sección de submarinos; en el resto de la Kriegsmarine se utilizaba el modelo M3, aunque con 8 rotores utilizables de tres en tres) que se muestra en los recursos asociados al reto. Además, imagina que eres el operador de la máquina Enigma destinado en ese U-boat, por lo que dispones de la hoja de configuración (en inglés, 'Setting Sheet') de ese mes (la configuración inicial correspondiente al día 8 figura en los recursos asociados al reto) y sabes que el mensaje se cifró utilizando el reflector "B". ¿Puedes descifrar el mensaje recibido, que ha sido cifrado con una máquina de modelo M3, utilizando tu máquina de modelo M4?

Se recomienda utilizar el simulador que se indica en los recursos asociados al reto, aunque este desafío se puede resolver también utilizando cualquier otro de los muchos simuladores existentes en Internet e incluso mediante scripts implementados en diversos lenguajes de programación.

Y como recursos asociados al reto se proporcionaban los siguientes:

- Rotores y orden de los mismos, ajuste de los anillos y pares de letras a conectar entre sí para el día 8 de marzo de 1942:
Datum  Walzenlage  Ringstellung  ---- Steckerverbindungen ----
 08.    V II III      A  K  E    CI OK PV ZL HX NB AW DJ FE ST
- Mensaje (cabecera sin cifrar y texto cifrado):
Cabecera del mensaje:

1425 - 1TLE 109 - ZYX DPP

Significado de la información en la cabecera del mensaje:
1425 Hora en la que se envía el mensaje (14:25).
1TLE: Número de partes de las que se compone el mensaje (1 parte. TLE, del alemán ‘Teile’ o “Partes”).
Tamaño del texto cifrado: 109.
Posición inicial de los rotores: ZYX
Clave de sesión cifrada: DPP.

Texto cifrado:
CDCLQ CXNQI YSMXU AFBJC DUBMR MKVDD XQDXZ KILKC EYTHE TNEZC ZVMYS LLOCA UQRNN GUHYE ORNCX HUSRF NHRHN OCVJZ FEUYE ORWFR RSSAO JNYX
- Simulador máquina Enigma:
https://summersidemakerspace.ca/projects/enigma-machine/.

Solución: tal y como dije en la pista que puse para ayudar a resolver este reto, para aquellos casos en los que había que intercambiar mensajes cifrados en los que el emisor y el receptor utilizaban modelos diferentes de la máquina (uno de ellos el M3 y el otro el M4), los alemanes idearon una configuración por cada reflector utilizado que hacía compatibles ambos modelos, es decir, en la que un mensaje cifrado utilizando un modelo M3 podía descifrarse empleando un modelo M4 y viceversa. Si se investiga un poco por Internet enseguida se encuentra de qué configuraciones se trata. Después, basta con probar la correspondiente al reflector "B" y se ve que se descifra el mensaje sin problemas :).

En primer lugar, como en los recursos asociados al reto se da toda la información necesaria para configurar una máquina del modelo M3, aquel con el que se cifró el texto en claro, voy a utilizar el simulador que también se indica entre los recursos asociados al reto para descifrar el mensaje utilizando una máquina M3. Tal y como sabemos (ver solución al reto anterior), con la máquina configurada con la información inicial que venía para ese día en la hoja de configuración (en inglés, 'Setting Sheet'), lo primero que hacía el operador era establecer la posición inicial de los rotores indicada para cada uno de ellos en la cabecera del mensaje recibido y descifrar la clave de sesión que aparecía justo después:
Como se observa en la figura anterior, la clave de sesión descifrada es "MGL". Además, nótese que el  rotor rápido (el situado más a la derecha) ha girado tres veces, una por cada tecla pulsada correspondiente a la clave de sesión cifrada ("DPP"), pasando de la posición "X" a "A".

Y, finalmente, el operador cambiaba la posición de los rotores a los tres caracteres correspondientes de la clave de sesión descifrada ("MGL") y tecleaba los caracteres del mensaje cifrado que había recibido. Tras pulsar cada tecla se iluminaba en el panel de luces el carácter correspondiente al texto en claro:
Es decir, el texto en claro es el siguiente (nótese que el  rotor rápido, el situado más a la derecha, ha girado 109 veces, una por cada tecla pulsada correspondiente al texto cifrado, y el roto medio, el situado en el centro, ha girado una vez por cada 26 giros o por cada giro completo del rotor rápido, pasando de la posición "L" a "Q" y de "G" a "K", respectivamente):

MENSAJEXDEXPRUEBAXPARAXEXPLICARXLAXCOMPATIBILIDADXDELXMODELOXMTRESXCONXELXMODELOXMCUATROXDEXLAXMAQUINAXENIGMA

Quitando los caracteres "X" que no tienen sentido, que se utilizaban como espacios, quedaría el siguiente texto en claro:

MENSAJE DE PRUEBA PARA EXPLICAR LA COMPATIBILIDAD DEL MODELO MTRES CON EL MODELO MCUATRO DE LA MAQUINA ENIGMA

Y ahora para resolver este reto sólo tengo que dar con la configuración del modelo M4 que lo haría compatible con el modelo M3. Para ello, utilizando el mismo simulador, cambio el modelo de la máquina a M4. Entiendo que ahora en lugar de utilizar el reflector "B" tengo que utilizar el "B fino o estrecho" (en inglés, 'B Thin'), pero ¿qué rotor empleo como rotor "fino o estrecho" (en inglés, 'Thin Rotor'), el Beta o el Gamma, y cómo lo configuro?


Investigando un poco por Internet enseguida doy con una interesante página en la que, entre otra mucha información, veo las dos configuraciones, una por cada reflector, que hacen que el modelo M4 sea compatible con el modelo M3 y viceversa. Si no lo entiendo mal, cuando se configura el modelo M4 con el reflector "B fino o estrecho" (en inglés, 'B Thin') y el rotor "fino o estrecho" Beta con el ajuste del anillo en "A" y posición del rotor en "A" es igual (compatible) a un modelo M3 con el reflector "B", y lo mismo ocurre cuando se configura el modelo M4 con el reflector "C fino o estrecho" (en inglés, 'C Thin') y el rotor "fino o estrecho" Gamma con el ajuste del anillo en "A" y posición del rotor en "A".

Por tanto, en el reto para descifrar el mensaje secreto cifrado con el modelo M3 sólo tengo que utilizar el modelo M4 con el reflector "B fino o estrecho" y el rotor "fino o estrecho" Beta puesto en la posición "A", y repetir los dos pasos anteriores:
Y ya puedo ver el texto en claro.

******** PRÓXIMO RETO
Reto 41:  Por publicar.
Viewing all 640 articles
Browse latest View live