[Steganography] audios #HackTheFDI

Como los retos de esteganografía de audio son bastante fáciles y cortos de resolver, voy a poner la solución de los 3 en un mismo post.

Audio 1:

stegoaudio_web

El reto ya nos da una pista enorme que dice que se trata de un DTMF (Dual-Tone Multi-Frequency) que según wikipedia es usado para la señalización de telecomunicaciones sobre líneas telefónicas analógicas en la banda de frecuencia vocal entre teléfonos u otros equipos de comunicaciones y la central telefónica.

Primero busqué por internet si existía algún decodificador DTMF online pero no encontré nada, luego me fui a github y allí encontré un programa en python que decodificaba los tonos, hice unas pequeñas modificaciones para que pidiera el audio por parámetro y mostrara los resultados en la misma linea.

Justo después del main añadimos:

if __name__ == '__main__':
  # load wav file
  if len(sys.argv) != 2:
    print "Usage " + sys.argv[0] + " file.wav"
    sys.exit(1)
  wav = wave.open(sys.argv[1], 'r')

y en el print de la cuarta línea empezando por el final:

print value,

Ahora ejecutamos el programa y le pasamos como parámetro el audio:

$ python dtmf_decoder.py dtmf.wav

stegoaudio1_done

y ahí tenemos la flag del audio 1: 2003A09B11C

 


 

Audio 2:

El segundo audio no hice captura de pantalla de la página del reto, pero daba información acerca del hundimiento del Acorazado Maine, y una pista para que buscaras en internet sobre quién fue uno de los causantes de acusar a España y que premio importante lleva su nombre.

Buscando en la Wikipedia encontramos el nombre de dos personas William Randolph Hearst y Joseph Pulitzer, de los cuales buscando por el nombre y apellido con la palabra premio delante encontramos los premios Pulitzer.

Probamos con el steghide a meter las contraseñas Pulitzer y pulitzer.

$ steghide extract -sf audio2.wav -p Pulitzer

$ steghide extract -sf audio2.wav -p pulitzer

La contraseña buena es pulitzer y obtenemos nuestra flag:

stegoaudio2_done

La flag es: WUUoMUuZ

 


 

Audio 3:

Del reto 3 tampoco tengo captura de pantalla de la página web, pero creo que no tenía ninguna pista, solo el siguiente audio:

Esta vez como es un fichero mp3 descarté steghide ya que no soporta este tipo de ficheros para ocultar datos, así que probé strings audio.mp3 y hexdump -C audio.mp3 sin obtener nada interesante.

Luego probé en Windows DeepSound, programa usado por Elliot en la serie de Mr. Robot para ocultar datos en ficheros de audio los cuales luego grababa en cds, pero sin obtener resultados.

Por último lo abrí con Sonic Visualiser, y al ver el gráfico de la frecuencia del audio vi algo raro.

stegoaudo3_freq

Reproduzco el sonido justo donde está mas verde en el gráfico, y suena unos pitidos que parece código morse, amplio en la ventana principal y me pongo a transcribir las barras finas por puntos y las barras mas gruesas por guiones.

stegoaudio3_morse

Obteniendo el siguiente código morse: ..-. -.. .. ..- -.-. — ..-. — .-. . …- . .-.

Para decodificarlo usé un programa que me hice en python hace tiempo:

# -*- coding: utf-8 -*-

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': '----.'
	   }

if __name__ == '__main__':
	print " 1) Encode"
	print " 2) Decode"
	opc = int(raw_input("Option: "))

	if opc > 0 and opc < 3:
		if opc == 1:
			line = raw_input("Insert string to morse encode: ")
			if not line.isalnum():
				print "The string must be alphanumeric"
			else:
				result = ""
				for c in line:
					result += morse[c.upper()] + " "
                        print result
		elif opc == 2:
			line = raw_input("Insert morse code: ")
			result = ""
			for code in line.split(" "):
				result += [k for k,v in morse.iteritems() if v == code][0]
			print result

stegoaudio3_done

Ejecutamos el programa, seleccionamos decode y obtenemos la flag: FDIUCMFOREVER

Publicado en CTF, HackTheFDI, Steganography | Deja un comentario

[Steganography] imagen dedsec #HackTheFDI

Voy a mostrar como resolví el reto de esteganografía de la imagen de dedsec que tantos problemas de cabeza ha dado.

stego_img_web

La imagen que te daban para el reto es la siguiente:

dedsec-sf

Lo primero que hice al bajarme la imagen fue hacer un strings [img], y un hexdump -C [img] para ver si salia alguna string interesante o que la imagen tuviera otro fichero dentro, pero no vi nada.

Luego subí la imagen a TinEye para buscar la imagen original y descargármela para comprobar las diferencias entre ellas con el comando:

compare -compose src output.png

Abrimos output.png

stegoimg_diff

Con el resultado obtenido podemos ver que existen diferencias en la imagen pero en este caso no devuelve la flag.

Lo siguiente que pruebo es steghide con el flag info, primero con una imagen que creo yo aleatoria y luego con la imagen descargada del reto para ver si la reconoce.

stegoimg_steginfo

Como se puede ver la imagen del reto es detectada por steghide, por lo que para sacar la contraseña del fichero necesitamos crear un diccionario y hacer fuerza bruta.

Para ello usé un programa que había creado hace tiempo en python que a través de un diccionario hace fuerza bruta al fichero.

#!/usr/bin/env python
import sys
import commands

if __name__ == '__main__':
    if len(sys.argv) == 3:
        filename = sys.argv[1]
        wordlist = sys.argv[2]
    else:
        print "Usage: {0} &amp;lt;filename&amp;gt; &amp;lt;wordlist&amp;gt;".format(sys.argv[0])
        sys.exit()

    f = open(wordlist, 'r')
    lines = f.readlines();
    found = False
    cont = 1
    for line in lines:
        if line.strip().isalnum():
            output = commands.getoutput("steghide extract -sf " + filename.strip() + " -p " + line.strip())
            if output.find("steghide") == -1:
                print "Password found: ", line
                found = True
                break

    if not found:
        print "Password not found"

Link en github del programa

Ahora nos queda generar diccionarios, en un principio cree un diccionario con crunch.

$ crunch 1 5 -o wordlist.txt

Esto genera un diccionario con todas las combinaciones de letras minúsculas de 1 a 5 caracteres pero no tuve éxito.

Luego usé el programa brutescrape que es un web scraper el cual genera diccionarios de las palabras que obtiene de las páginas que incluyas en el fichero sites.scrape, en este caso use todas las páginas que tenía referentes al torneo HackTheFDI, pero tampoco obtuve resultados.

Leyendo bien la página del reto, daban una pista (o eso me imaginé), que decía así: “Sitara es un crack, siempre le gusta jugar con lo oculto en su arte” por lo que me fui a la wiki del juego Watch Dogs 2 al perfil del jugador Sitara, y me hice un diccionario otra vez con el programa brutescrape.

$ echo “http://watchdogs.wikia.com/wiki/Sitara_Dhawan&#8221; > sites.scrape

$ python brutescrape.py

stegoimg_brutescrape

Esto nos genera un diccionario en el fichero passwordList.txt con 1913 palabras, lo malo es que muchas palabras tienen coma al final o dos puntos o punto y coma o caracteres raros que steghide no admite para las contraseñas, por lo que toca crearse un comando en bash para que elimine todos estos caracteres y sustituya las tildes.

$ cat passwordList.txt | tr -d “:” | tr -d “,” | tr -d “.” | tr -d “;” | tr -d “-” | tr -d “_” | tr -d “\[” | tr -d “\]” | tr -d “+” | tr -d “\(” | tr -d “\)” | tr -d “#” | tr -d “\/” | tr -d “?” | tr -d “¿” | tr -d “\“” | tr -d “\”” | tr á a | tr é e | tr í i | tr ó o | tr ú u | tr -d “-” | tr -d “_” | tr -d “\[” | tr -d “\]” | tr -d “+” | tr -d “\(” | tr -d “\)” | tr -d “#” | tr -d “\/” > final_wordlist.txt

Ahora que ya tenemos el nuevo diccionario creado solo queda pasárselo al programa que hice brute_steghide.py.

$ python brute_steghide.py imagen_watch_dogs.jpg brutescrape/final_wordlist.txt

stegoimg_done

Y ahí tenemos la flag: YhZasvbZ

Publicado en CTF, HackTheFDI, Steganography | Deja un comentario

[Misc] juego #HackTheFDI

En esta entrada voy a explicar como obtuve los flags del reto del juego en el torneo #HackTheFDI.

Link del juego

juego

Tras jugar un rato y escuchar a la gente que estaba tardando unas 3 horas en resolverlo, me planteé buscar otras alternativas para obtener las flags.

Gracias a @SadFud que me dijo que pulsando el botón derecho del ratón podías acceder al menú y desde ahí a una terminal cmd, ya se me puso una sonrisa en la cara y un alivio por que me iba a quitar tres horas de juego o más… 🙂

juego_salir

Como podéis ver si pulsas el botón derecho del ratón, accedemos al menú del juego. Si pulsamos en salir nos lleva directamente a una terminal cmd del emulador dosbox, también desde el menú de cargar si introducimos un nombre y pulsamos Intro, nos accede directamente a la terminal en el directorio images, escribiendo cls se limpiará la pantalla para que no se quede con la imagen del juego de fondo.

juego_terminal

Antes de ponerme a trastear con la terminal, me miré un poco el funcionamiento de dosbox en la página oficial, y que comandos admitía.

Lo primero que ejecute fue el comando help para ver que comandos admite:

juego_help

Vemos que para mostrar una lista más completa de comandos debemos ejecutar help /all

juego_helpall

No hay muchos comandos, pero si que hay algunos un tanto peligros para estar accesibles a todo el mundo, como CALL, DEL, ERASE, RMDIR, RENAME, SET…. con TYPE podemos sacar la configuración de ficheros, pero bueno no vamos a hacer nada malo… nos centraremos en los flags.

Luego hice un DIR para mostrar todos los ficheros en el directorio pero solo era capaz de ver los últimos sin poder subir en la terminal, lo bueno es que esta terminal tiene autocompletado de comandos, por lo que si pulsamos TAB podemos ir recorriendo los ficheros del directorio.

Me resulto uno muy interesante, PICTVIEW.EXE, lo ejecuté y booom, todas las imágenes del juego a mi alcance.

juego_imagenes

Me coloqué en la primera imagen adiosm y fui pulsando Intro para pasar por todas las imágenes hasta que encontré las que tenían los flags del reto.

juego_ipsum

juego_rmrfjuego_mushobeti

juego_mushobeti2

Ahí tenemos los 3 flags: IPSUM, RM-RF y MUSHOBETI

Como soy un poco curioso, me dio por indagar que más se podía hacer desde este menú, si nos fijamos abajo del todo da varias opciones.juego_opciones

Si pulsamos F1 nos muestra una ventana con todas las funcionalidades que se pueden realizar en PictView.

juego_config

Algunas un tanto peligrosas como Ctrl-D, Del, Ctrl-N, también busqué si se podía modificar las imágenes, y así es, pulsando F8 sobre una imagen accedemos a otro menú.

juego_rotate

Probé a rotar la imagen y ver si afectaba al juego y mi sorpresa es que si, pero aun así no quise trolear a nadie y seguir con los retos, aunque hoy me enteré que eso no hubiera sido posible.

juego_fail

juego_fail2

Hoy escribí al profesor que creó el juego Jorge Gomez para avisarle del problema antes de subir el writeup, pero me comentó que no pasaba nada, ya que cada jugador jugaba sobre ficheros diferentes y no afectaban los cambios.

 

Publicado en CTF, HackTheFDI, Misc | Deja un comentario

[Reversing] ctos2 #HackTheFDI

Este es el último reto de reversing, en este caso el binario es el ctos2 contenido en el zip de reversing.

Como en los anteriores retos de reversing, lo primero que hago es ver el tipo de ejecutable para ver en que tipo de S.O. lo puedo ejecutar, al igual que los anteriores vemos que es un binario de tipo ELF de 64 bits, ejecutable en sistemas de tipo UNIX.

ctos2_file

Al ejecutar el programa podemos ver que es diferente a los demás, en este caso ya no tenemos un delay después de meter la contraseña, y además dan una pista al preguntar por el número de serie por lo que seguramente solo sean dígitos lo que tengamos que introducir.

ctos2_prog

Para este reto con los datos que tenemos creo que la forma más rápida de sacar la flag es haciendo fuerza bruta, por lo que me hice un script en bash para que probara dígitos desde 0 a 99999.


#!/bin/bash
for i in {0..99999}; do
    output=`echo $i | ./ctos2 | grep -v ERROR | grep -v ctOS | grep -v Todos | sed '/^$/d';`
    if [ "$output" != "" ]; then
        echo "Codigo: " $i
        echo $output
        break
    fi
done

Este script lo que hace es pasarle al programa ctos2 números del 0 al 99999, quitando de la salida con grep las líneas que contienen ERROR, ctOS, Todos y cualquier linea en blanco, para que al ejecutarlo no nos salgan miles de lineas con los datos del programa y solo nos muestre la salida cuando encuentre el número de serie.

Al ejecutarlo, tras unos poco minutos, obtiene el número de serie y la flag: SPQSPQSP

ctos2_done

Publicado en CTF, HackTheFDI, Reversing | Deja un comentario

[Reversing] ctos1 #HackTheFDI

Vamos con el segundo reto de reversing, en este caso el binario es el ctos1 contenido en el zip de reversing.

Como en el reto anterior ctos0, con el comando file vemos que es un binario para sistemas UNIX de 64 bits, por lo que procedo a ejecutarlo en Linux para saber que pide.

ctos1_prog

Vemos que el funcionamiento del programa es el mismo que el anterior, nos pide una contraseña y se produce un delay de unos 5 segundos, por lo que también descartamos el uso de fuerza bruta.

Para este reto voy a usar gdb con peda que es un script en python que facilita la tarea a la hora de hacer reversing o exploiting.

$ gdb -q ./ctos1

ctos1_pdisass

Al desensamblar el binario podemos ver como el modulo de peda colorea las llamadas a funciones, saltos, comparaciones … para poder diferenciarlos rápidamente.

Se pueden distinguir varias funciones interesantes como:

my_getpass

obfuscate

strncmp

Lo primero que voy a comprobar es la función strncmp, la cual es la que compara si la contraseña introducida es correcta o no. Para ello ponemos un breakpoint justo en dicha función para poder examinar los parámetros que le son pasados y así poder ver si damos con la contraseña.

ctos1_strncmp

Vemos como con el módulo peda al correr el binario muestra dos zonas, la de las instrucciones actuales en ejecución y la del contenido del Stack.

Al mostrar los valores de los parámetros de la función strncmp almacenados en los registros rcx y rax vemos que las string tienen un formato extraño y a parte no concuerda con la contraseña que hemos introducido (“AAAA”), por lo que seguramente nuestra contraseña antes de compararla pase por la función obfuscate.

Para no perder mucho tiempo desensamblando la función obfuscate para ver como modifica la contraseña, directamente ponemos un breakpoint en el salto después de la función strncmp para así alterar el flujo del programa y que nos muestre la flag.

ctos1_call

En este caso el breakpoint lo asignamos a la dirección de memoria main+252, para que cuando se pare la ejecución ahí, como la comparación de la contraseña que introducimos con la original no va a coincidir, el salto (jne) irá a la dirección de memoria 0x400d7f, ahí es donde nosotros cambiaremos en el registro rip (siguiente instrucción a ejecutar) la siguiente instrucción, que sería la que se ejecutaría si coincidiera la contraseña (dirección de memoria 0x400d44).ctos1_done

Como se puede ver simplemente modificando el registro rip podemos alterar el flujo del programa y así bypasear la contraseña del programa, obteniendo así la flag: PSRPSRPS

 

Publicado en CTF, HackTheFDI, Reversing | Deja un comentario

[Reversing] ctos0 #HackTheFDI

Voy a mostrar los pasos que realicé para sacar el primer reto de reversing, del torneo organizado por mi universidad UCM en la semana de la informática sobre el juego de Watch Dogs 2, organizado por mi ex-profesor de redes y seguridad @jlvazpol.

El primer ejecutable que nos dan es el ctos0 que se encuentra comprimido en el zip reversing.

Lo primero que miro es el tipo de fichero que es, con el comando file:

ctos0_file

Es un ELF (Executable and Linkable Format) usado en los sistemas tipo UNIX, en este caso de 64 bits.

Lo ejecuto para darme una idea de como puede estar programado el binario y que es lo que pide para poder obtener la flag.

ctos_prog

El programa pide una contraseña la cual seguramente la esté comparando con el valor de una variable interna y al introducirla veo que hay un delay de unos 5 segundos, por lo que descarto el uso de fuerza bruta.

Voy a debuguearlo con gdb para ver el funcionamiento interno del programa:

$ gdb -q ./ctos0

ctos0_disass

Al fijarme en las llamadas a funciones que realiza el programa, veo que una de ellas, la que he marcado en un recuadro rojo, llama a la función strncmp, la cual compara la contraseña que hemos introducido con la real,  y si no es igual salta a la dirección de memoria de 0x400d64.

Si miramos el man 3 de la función strncmp podemos ver que recibe tres parámetros, cadena1, cadena2 y el número de bytes a comparar de la cadena.

$ man 3 strncmp

strncmp

Con estos datos podemos deducir que antes de la llamada a la función strncmp se va a pasar al Stack los tres parámetros en orden inverso (marcado como rectángulo azul), en este caso el tercer parámetro se almacena en el registro rdx y contiene 0x20 que son 32 bytes, rcx que es el registro que almacenará el parámetro 2 y rax que contendrá el parámetro 1.

Lo que hice fue poner un breakpoint antes de la llamada a la función strncmp que se corresponde con 218 bytes a partir de la función main como sale en el desensamblado, para luego consultar el contenido de los registros rax y rcx.

ctos0_registers

La contraseña que introduje fue AAAA y es la que se guardó en el registro rax, por lo que la contraseña estará en el registro rcx y es: TodoEstaConectado

ctos0_done

Una vez introducida la contraseña en el programa obtenemos la flag: QRSQRSQR

Publicado en CTF, HackTheFDI, Reversing | Deja un comentario