Este fin de semana me he entretenido participando en un evento CTF de formato 'Jeopardy' en modalidad 'On-line' a través de la plataforma CTFTime.
El evento en concreto es TUCTF y se trata de una competición por equipos para desarrollar capacidades en las típicas categorías incluidas en este tipo de eventos: Criptografía, Forense, Web, Reversing, etc.
Tal y como vengo diciendo en este humilde blog, una de las categorías que más me gustan de los retos en este tipo de competiciones es la de criptografía, por lo que en este post comienzo con la solución a uno de los retos correspondientes a dicha categoría en la citada competición.
El título del reto es "Sonic" y su enunciado es el siguiente:
Me conecto y se me muestra un criptograma que se me pide que descifre. El tiempo que se me da para ello es muy corto y como no soy capaz de hacerlo tan rápido como se requiere enseguida se muestra un mensaje de error ('Too slow!'):
Tras diferentes pruebas compruebo que el criptograma que se me pide descifrar es cada vez diferente y que éste está cifrado utilizando el cifrado César. Por ejemplo en el ejemplo que se muestra en la figura anterior el texto en claro sería 'DUSTY':
Por tanto, me queda claro que con un poco de programación este reto se resuelve fácilmente. Para ello, creo el siguiente script en Python:
import socket
s=socket.socket()
s.connect(('chal.tuctf.com', 30100))
while True:
recibido=s.recv(512).decode().strip()
print recibido
if 'Hey, decode this:' in recibido:
break
criptograma = recibido[296:512]
print ''
print '[+] Criptograma:', criptograma
print ''
alfabeto = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for desplazamiento in range(26):
texto_en_claro = ''
for caracter in criptograma:
if caracter in alfabeto:
pos_caracter_cifrado = alfabeto.index(caracter)
pos_caracter_descifrado = (pos_caracter_cifrado - desplazamiento) % len(alfabeto)
texto_en_claro += alfabeto[pos_caracter_descifrado]
else:
texto_en_claro += caracter
print '[+] ROT', desplazamiento,':', texto_en_claro
s.send(texto_en_claro)
s.send('\n')
recibido=s.recv(512).decode()
print recibido
if "Here's your prize:" in recibido:
break
s.close
Lo ejecuto:
Para descifrar el criptograma el script va probando todos los posibles desplazamientos hasta encontrar el correcto y que se muestre la flag, que tal y como se puede observar en la figura anterior es: TUCTF{W04H_DUD3_S0_F4ST_S0N1C_4PPR0V3S}.
El evento en concreto es TUCTF y se trata de una competición por equipos para desarrollar capacidades en las típicas categorías incluidas en este tipo de eventos: Criptografía, Forense, Web, Reversing, etc.
Tal y como vengo diciendo en este humilde blog, una de las categorías que más me gustan de los retos en este tipo de competiciones es la de criptografía, por lo que en este post comienzo con la solución a uno de los retos correspondientes a dicha categoría en la citada competición.
El título del reto es "Sonic" y su enunciado es el siguiente:
Y en mi opinión presenta un nivel de dificultad bajo (★★☆☆☆).
Tras diferentes pruebas compruebo que el criptograma que se me pide descifrar es cada vez diferente y que éste está cifrado utilizando el cifrado César. Por ejemplo en el ejemplo que se muestra en la figura anterior el texto en claro sería 'DUSTY':
Por tanto, me queda claro que con un poco de programación este reto se resuelve fácilmente. Para ello, creo el siguiente script en Python:
import socket
s=socket.socket()
s.connect(('chal.tuctf.com', 30100))
while True:
recibido=s.recv(512).decode().strip()
print recibido
if 'Hey, decode this:' in recibido:
break
criptograma = recibido[296:512]
print ''
print '[+] Criptograma:', criptograma
print ''
alfabeto = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for desplazamiento in range(26):
texto_en_claro = ''
for caracter in criptograma:
if caracter in alfabeto:
pos_caracter_cifrado = alfabeto.index(caracter)
pos_caracter_descifrado = (pos_caracter_cifrado - desplazamiento) % len(alfabeto)
texto_en_claro += alfabeto[pos_caracter_descifrado]
else:
texto_en_claro += caracter
print '[+] ROT', desplazamiento,':', texto_en_claro
s.send(texto_en_claro)
s.send('\n')
recibido=s.recv(512).decode()
print recibido
if "Here's your prize:" in recibido:
break
s.close
Lo ejecuto:
Para descifrar el criptograma el script va probando todos los posibles desplazamientos hasta encontrar el correcto y que se muestre la flag, que tal y como se puede observar en la figura anterior es: TUCTF{W04H_DUD3_S0_F4ST_S0N1C_4PPR0V3S}.
Comentarios
Publicar un comentario