Cybercamp 2016 – Crypto 1

Según tenga tiempo iré subiendo los writeups de aquellas pruebas de la fase online de la cybercamp 2016 que haya conseguido resolver.

En esta prueba nos daban el siguiente enunciado:

CRYPTO 1

https://challenge.cybercamp.es/challenge/46/

Descripción:

La prensa amarilla de Reino Unido no para de publicar por adelantado los resultados de las deliberaciones de los jueces, nadie sabe cómo se producen las filtraciones. Parece que hay un topo. Hemos capturado tráfico de red de la Wifi del hotel.

¿Sabes cómo lo hacen?.

Mirror1: https://mega.nz/#!icplyAzI!0lUpw3dB38BzJ7a7nu8FvEFIgQbbFpYjHEl88JryBV4

Mirror2: https://mega.nz/#!zpdAiZTI!0lUpw3dB38BzJ7a7nu8FvEFIgQbbFpYjHEl88JryBV4

Y un archivo file.pcap el cual procedimos a abrir con wireshark para ver que contenía. La verdad es que el análisis fue bastante corto, el archivo contenía mayoritariamente llamadas DNS y HTTP; por aquello de que valía pocos puntos (ya debería saber que no debo fiarme) me centre en las llamadas HTTP y utilizando el filtro correspondiente de wireshark me quede solo con esas:

crypto1-1

Los Continuation y las respuestas 200 parece que sobran, vamos a seguir filtrando:

crypto1-2

Esto ya parecía mucho mas prometedor, pero, esas llamadas no contenían ninguna información en especial, los puertos eran siempre los mismos…. Espera, el año pasado nos quedamos bloqueados en una prueba en la que utilizaban morse, y veo que las urls contienen . y – si consideramos esas llamadas con los diferentes símbolos del morse y los / como espacios quizás veamos algo.

Tengo que reconocer que en su momento ni esto fue tan claro ni tan bonito como lo pinto, además de que en lugar de utilizar los siguientes scripts todo se hizo a mano, pero entonces no quedaríamos tan bien jeje

Lo primero que necesitábamos era una manera de extraer el mensaje, para ello utilice este pequeño script en bash:

#!/bin/bash

INPUT=$(tshark -2 -R 'http.request.method=="GET"' -r file.pcap  | tr -s " " | cut $

for i in $INPUT
do
        if [ $(echo $i | grep -c "insert") -eq 1 ]
        then
                MORSE=$MORSE"."
        elif [ $(echo $i | grep -c "publish") -eq 1 ]
        then
                MORSE=$MORSE"-"
        else
                MORSE=$MORSE" "
        fi
done

echo $MORSE

Ejecutando este script en la misma carpeta donde teníamos el pcap obtenemos la siguiente secuencia:

.-. ..- ... .. .- - . -. .--. --- .. -. - ... .-.-.

Prometedor, ahora vamos a utilizar un pequeño script en python que me escribí para lidiar con morse, aquí os dejo el código:

import argparse

morse = {'A': '.-',     'B': '-...',   'C': '-.-.',
        'D': '-..',    'E': '.',      'F': '..-.',
        'G': '--.',    'H': '....',   'I': '..',
        'J': '.---',   'K': '-.-',    'L': '.-..',
        'M': '--',     'N': '-.',     'O': '---',
        'P': '.--.',   'Q': '--.-',   'R': '.-.',
     	'S': '...',    'T': '-',      'U': '..-',
        'V': '...-',   'W': '.--',    'X': '-..-',
        'Y': '-.--',   'Z': '--..',
        '0': '-----',  '1': '.----',  '2': '..---',
        '3': '...--',  '4': '....-',  '5': '.....',
        '6': '-....',  '7': '--...',  '8': '---..',
        '9': '----.'
        }


parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("-e","--encode", help="Encode text to morse.")
group.add_argument("-d","--decode", help="Decode morse to text")
args = parser.parse_args()

output=""

if args.encode is not None:
	for letter in args.encode:
		if not letter.isspace():
			output+=morse[letter.upper()]+" "
elif args.decode is not None:
	inv_morse = {v: k for k, v in morse.iteritems()}
	buff=""
	for letter in args.decode:
		if not letter.isspace():
			buff+=letter
			continue
		try:
			output+=inv_morse[buff]
		except:
			pass
		buff=""
	try:
		output+=inv_morse[buff]
	except:
		pass
        buff=""

print output

Si utilizais vuestro propio script o alguno online seguramente os encontrareis conque el último grupo de símbolos no corresponde con ningún carácter morse, para evitar este problema decidí modificar mi script y que en caso de no hallar un valor adecuado se limitase a seguir procesando el resto de la información.

Lanzamos el script con el código morse que obtuvimos anteriormente y recibimos el siguiente resultado:

morse.py -d ".-. ..- ... .. .- - . -. .--. --- .. -. - ... .-.-."
RUSIATENPOINTS

¡Y ahí está la flag!

Espero os haya gustado este writeupt, como siempre, gracias por vuestra visita!

Esta entrada fue publicada en cripto, ctf, cybercamp. Guarda el enlace permanente.

Deja un comentario