Post on 25-Jun-2022
Taller de introduccion a lacomputacion
Capture The Flag - Ejemplo
Contents
1 Introduccion 2
2 Ultimos Stages 3
2.1 Herramienta utilizada . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1 Descargar ZIP . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2 Clonar repositorio . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.3 Instalar herramienta . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Ultimo Stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 Comandos utilizados . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Quinto Stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.1 Codificado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Cuarto y tercer Stage . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1 Comandos utilizados . . . . . . . . . . . . . . . . . . . . . . 8
3 Segundo Stage 9
3.1 Editar el codigo HTML . . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Primer Stage 11
4.1 Codigo en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.1.1 Funcion de encriptado . . . . . . . . . . . . . . . . . . . . . 12
4.2 Compilar y generar el ejecutable . . . . . . . . . . . . . . . . . . . . 14
5 Conclusiones 15
1
1 Introduccion
En este documento presentamos el paso a paso de como crear el ejemplo presentado
de Capture The Flag. Se explicara detalladamente como se creo cada stage para
que el estudiante pueda replicarlo. Antes de leer este documento, se recomienda
mirar las diapositivas sobre como resolver el ejemplo. Empezamos a partir del
ultimo stage.
2
2 Ultimos Stages
En estos stages, se busca esconder diferentes archivos dentro de otros. En partic-
ular, tenemos una foto ganadora, que sera escondida dentro de otra foto, que se
encontrara codificada en un archivo de texto, que se escondera dentro de un archivo
de audio. Por ende, es necesario partir desde el ultimo stage, ya que debemos ir
escondiendo la foto original en otros archivos.
2.1 Herramienta utilizada
Se utiliza la siguiente herramienta de Esteganografıa encontrada en [4]. Para poder
utilizarla, es necesario contar con python 3.
Para instalar la herramienta, vamos a la pagina mencionada anteriormente. Ten-
emos dos opciones, descargar la herramienta en un archivo ZIP, o clonar el repos-
itorio. Todas las imagenes que se quieran utilizar con esta herramienta deben ser
posicionadas en el directorio donde se encuentre la herramienta.
2.1.1 Descargar ZIP
Para descargar el ZIP, apretamos donde dice“Code” y luego descargamos donde
dice Download ZIP (descargar ZIP). La carpeta se descargara normalmente en la
carpeta designada para descargas.
Figure 1: Descargar ZIP
3
2.1.2 Clonar repositorio
Si se quiere clonar el repositorio, primero se debe contar con la herramienta git1.
Para clonar el repositorio copiamos el link provisto en la seccion “Code”, apretando
el boton que se encuentra al lado.
Figure 2: Link para clonar el repositorio
En este caso el link es: https://github.com/ragibson/Steganography.git
Luego, en la consola ejecutamos el comando:
git clone <link>
En este caso, git clone https://github.com/ragibson/Steganography.git
La carpeta se encontrara en el lugar donde se ejecuto el comando. Es decir, si
al hacer git clone en la consola, nos encontrabamos en el escritorio, entonces la
herramienta se encontrara en el escritorio.
2.1.3 Instalar herramienta
Una vez descargado el ZIP o clonado el repositorio, utilizando la consola, nos
movemos a la carpeta donde se encuentra la herramienta, lo cual se puede hacer
con el siguiente comando en la consola Linux:
cd <rutaCarpeta>
Por ejemplo, cd Steganography, cd Downloads/Steganography, etc. Y luego
instalamos la herramienta con el comando:
1https://git-scm.com
4
python3 setup.py install
Como se ve en la siguiente imagen
Figure 3: Instalar herramienta
2.2 Ultimo Stage
Tenemos la foto ganadora, que es la siguiente:
Figure 4: Foto ganadora
Y queremos esconder la misma en otra imagen de una caja:
Figure 5: Foto de una caja
Primero, es necesario comprimir la imagen ganadora en formato zip. Una vez
realizado esto, ponemos este archivo zip y la foto de la caja en la carpeta donde
se encuentra la herramienta de Esteganografıa, instalada previamente. Para esta
parte, utilizaremos la herramienta LSBSteg encontrada en el repositorio 2.
2https://github.com/ragibson/Steganography#lsbsteg
5
2.2.1 Comandos utilizados
Antes de esconder los datos en la imagen, podemos ver cuantos datos se pueden
esconder en la imagen deseada, con el siguiente comando:
stegolsb steglsb -a -i caja.jpg -s foto ganadora.zip -n 2
Donde -a indica que se debe analizar, -i caja.png indica el archivo de entrada,
en este caso la foto de la caja, -s foto ganadora.zip indica la ruta al archivo
para esconder, en este caso el archivo zip de la foto ganadora y -n 2 indica cuantos
LSB’s usar. No es necesario comprender que son, pero en caso de ser necesario
aumentarlos, es posible. Este comando debera desplegar una salida similar a la
siguiente:
Figure 6: Salida al analizar caja.png
Como se puede ver en la imagen, es posible esconder el zip en la foto de la caja.
Luego, para realmente esconder la imagen, en la consola utilizamos el siguiente
comando:
stegolsb steglsb -h -i caja.jpg -s archivo.zip -o box.png -n 2
Donde -h indica que se debe esconder, -i caja.png indica el archivo de entrada,
en este caso la foto de la caja, -s foto ganadora.zip indica la ruta al archivo
para esconder, en este caso el archivo zip de la foto ganadora, -o box.png indica
la ruta al archivo de salida, que en este caso llamaremos box.png y -n 2 indica
cuantos LSB’s usar, numero obtenido del comando anterior.
Una vez terminados estos pasos, obtendremos un archivo box.png, que parecera el
mismo archivo que caja.jpg, solo que contiene la foto ganadora escondida.
6
Figure 7: Archivo box.png
2.3 Quinto Stage
Luego, queremos que esa foto de la caja (que contiene la foto ganadora dentro)
se encuentre codificada en base64, es decir que queremos obtener un archivo de
texto.
2.3.1 Codificado
Para codificar el archivo, es posible utilizar el recurso encontrado en 3. Alcanza
con subir el archivo en este sector:
3https://www.base64encode.org
7
Figure 8: Herramienta para codificar en base64
Descargamos el archivo generado y obtendremos un archivo de texto con la imagen
codificada.
2.4 Cuarto y tercer Stage
En estos stages, queremos generar un audio, para luego esconder el archivo de
texto generado anteriormente en el. Entonces, generamos un audio que diga el
mensaje deseado, en este caso“Is this just an audio?” (en espanol “¿Esto es solo un
audio?”). Se puede utilizar una pagina web con este fin, por ejemplo 4, entre otras.
Observar que el formato debe ser .wav, ya que es el requerido por la herramienta
de Esteganografıa5. Tambien es importante generar un audio lo suficientemente
grande, para que pueda contener todos los bytes ocultos necesarios6.
2.4.1 Comandos utilizados
Luego, movemos el archivo de texto y el audio a la carpeta de Esteganografıa, y
utilizamos el siguiente comando:
4https://www.text2speech.org/es.html5https://github.com/ragibson/Steganography#wavsteg6Si se intenta ocultar demasiados datos, la herramienta imprimira el numero mınimo de LSB’s
necesarios para ocultar esos datos.
8
stegolsb wavsteg -h -i speech.wav -s texto.txt -o sound.wav -n 2
Donde -h indica que se debe esconder, -i speech.wav indica el archivo de entrada,
en este caso el audio, -s texto.txt indica la ruta al archivo para esconder, en
este caso el archivo de texto codificado de la foto de la caja, -o sound.wav indica
la ruta al archivo de salida, que en este caso llamaremos sound.wav y -n 6 indica
cuantos LSB’s usar, que en este caso fue necesario incrementar segun pedidos del
programa. Por ejemplo, si se utilizan 2 LSB’s se obtiene la siguiente salida
Figure 9: Salida al necesitar mas LSB’s
Luego, utilizamos el comando con 6 LSB’s como se menciono anteriormente obte-
niendo la siguiente salida
Figure 10: Salida al esconder archivo de texto en audio
Como se ve en la consola, se despliegan la cantidad de bytes ocultos, en el lugar
que dice 1429504 bytes hidden. Este numero es necesario para poder recuperar
los datos ocultos, y es el numero utilizado en el Cifrado Cesar.
Una vez que obtenemos este audio, debemos subirlo a algun lugar donde pueda ser
descargado (por ejemplo, owncloud de la fing). Utilizaremos el link de descarga
para el campo hidden del codigo HTML.
3 Segundo Stage
Para este stage, se busca esconder una pista en un codigo HTML. Para esto, se
utilizo un campo hidden, que permite a los desarrolladores web incluir datos que
9
los usuarios no pueden ver ni modificar cuando se envıa un formulario. Es impor-
tante observar que si bien el valor no se muestra al usuario en el contenido de la
pagina, es visible (y se puede editar) utilizando las herramientas de desarrollo de
cualquier navegador, por ejemplo al inspeccionar el codigo. Por esta razon es muy
importante no utilizar campos hidden, o comentarios como forma de seguridad
(por ejemplo, para guardar contrasenas) [5].
Para este stage, se utilizo un template de una pagina web disponible en 7. Es
posible utilizar cualquier template para este stage, o realizar un codigo propio,
pero la gracia es que sea un codigo bastante grande, para no encontrar el campo
hidden a simple vista al inspeccionar el codigo.
3.1 Editar el codigo HTML
Para poder editar el codigo HTML, simplemente se debe abrir el archivo in-
dex.html en un editor de texto. Se agrega la lınea:
<input type="hidden" id="wget" value="https://bit.ly/3ihBasA">
Como se puede ver, es un input, es decir entrada, pero es del tipo hidden, por ende
no se despliega en la pagina web (podemos usar el tipo parrafo <p>, tıtulo <h1>,
etc.). Normalmente, si fuera un input pero no hidden, podrıamos ver en la pagina
web un sector para ingresar una entrada. Luego, se tiene un id que normalmente
sirve para identificar el campo en el codigo HTML, por ejemplo se puede obtener
el valor del campo a traves del id. En este caso el id es wget, para formar parte de
la pista de que se debe utilizar wget. Por ultimo, se tiene el valor que contiene un
link. Normalmente, este valor puede ser ingresado por el usuario, o escrito como
en el ejemplo. Se vera como se obtiene este link mas adelante en el documento.
La lınea puede ser incluida en cualquier lugar del archivo, luego de la tag <html>
y antes de la tag </html>. En el ejemplo, se encuentra en la lınea 103.
7https://templated.co/intensify
10
4 Primer Stage
En este stage se plantea escribir un programa que recibiendo un numero genere el
cifrado Cesar de un texto, el cual sera la pista. En este ejemplo, queremos cifrar el
mensaje “Recorda este numero 1429504”8, pero en el cifrado Cesar, solo es posible
utilizar las letras del abecedario (A-Z), por lo que no podremos usar numeros ni
espacios, por ende el mensaje a cifrar sera “RECORDAESTENUMEROUNOCU-
ATRODOSNUEVECINCOCEROCUATRO”.
4.1 Codigo en C++
En la Figura 1, se puede ver un programa en C++ que implementa un Cifrado
Cesar para el texto mencionado anteriormente.
Figure 11: Codigo en C++ del Cifrado Cesar
En primer lugar, se cuenta con la funcion main(), que es una funcion especial
encontrada en todos los programas de C ++ y es la funcion llamada cuando se
8Este numero son los bytes escondidos en el audio
11
ejecuta el programa. La ejecucion de todos los programas de C ++ comienza con
la funcion main, independientemente de donde se encuentre realmente la funcion
dentro del codigo [3]. En esta funcion declaramos la variable numero que usaremos
para guardar el numero ingresado por el usuario (que sera el numero de grupo).
Luego, con cout [2] desplegamos en la salida estandar el mensaje “Ingrese el nu-
mero de equipo: ”, como se puede ver en la siguiente imagen de la consola:
Figure 12: Salida desplegada en la consola
Luego, con cin se accede a la entrada estandar (normalmente el teclado) [1], y se
guarda el valor obtenido en la variable numero. Como se puede ver en la siguiente
imagen, es posible ingresar un numero
Figure 13: Ingresar entrada
Luego, se guarda el texto a cifrar en una variable text y se llama a la funcion
encrypt con los valores text y numero, y el valor retornado por esta funcion
se desplegara en la salida estandar utilizando cout. Tambien resulta importante
explicar las primeras dos lıneas del programa:
• #include <iostream>: Permite realizar operaciones estandar de entrada y
salida [1].
• using namespace std: Con esta lınea, nos ahorramos decir a que names-
pace9 pertenece la funcion utilizada. En este caso, nos permite escribir cout
en lugar de std::cout, analogamente con cin.
4.1.1 Funcion de encriptado
La funcion de encriptado es la siguiente:
9https://www.geeksforgeeks.org/namespace-in-c/
12
Figure 14: Funcion de encriptado
Esta funcion recibe el texto a encriptar y el numero de equipo, que representara
el desplazamiento, y retorna un string, lo cual se indica al comienzo de la firma
de la funcion. Es importante mencionar que esta funcion asume que recibira una
letra entre A y Z.
En primer lugar, se crea una variable de tipo string, llamada result que con-
tendra el texto cifrado y que comienza con el string vacıo. Luego, recorremos
el texto a cifrar con la lınea for (int i=0;i<text.length();i++). Con esto
declaramos una variable entera i que comienza teniendo en el valor 0, y decimos
que queremos que crezca de a una unidad (i++ equivale a i = i +1) mientras que
el valor sea menor al largo de la variable text (text.length()). Luego, dentro de
este for tomamos la letra encontrada en text[i], es decir la letra encontrada en
la posicion i y se guarda en la variable ch de tipo char. Luego, nos fijamos si esta
letra se encuentra entre ‘A’ y ‘Z’ con la siguiente lınea if(ch >= ’A’ && ch <=
’Z’). Si se encuentra entre estos valores, simplemente sumamos el desplazamiento
a la variable ch.
Luego, debemos chequear que el valor obtenido no sea mayor a Z, realizado en la
lınea if(ch > ‘Z’). Es decir, que cuando nos pasamos de la letra Z, deberıamos
volver a empezar el abecedario, por ejemplo Z+1 deberıa ser A, Y+3 deberıa ser
B, etc. En tal caso, debemos mirar la tabla ASCII10 para comprender la solucion,
debemos realizar sumas y restas teniendo en cuenta el valor ASCII asociado para
10https://ascii.cl
13
cada letra. Cuando nos pasamos de la letra ‘Z’, comienzan otros caracteres, al-
gunos sımbolos y luego las letras minusculas. Tomaremos un ejemplo para explicar
mejor, donde ch = ‘Y’ y s = 4. En este ejemplo, que querrıamos hacer Y + 4,
deberıamos obtener la letra C.
En primer lugar, se realiza la suma ‘Y’ + 4 (ch = ch + s), esta suma se realiza
tomando el valor de la tabla ASCII de Y, que es 89, y al sumar 4 se obtiene el
numero 93, que es equivalente al sımbolo ]. Luego, restamos ‘Z’, restando el valor
en la tabla ASCII de Z que es 90. Es decir hacemos 93 - 90 obteniendo 3. Luego
sumamos ‘A’ (valor 65) obteniendo 68 (65 + 3), y a esto le restamos 1, obteniendo
67, equivalente a la letra ‘C’.
Por ultimo, se agrega el valor ch obtenido a la variable resultado en la siguiente
lınea result += ch y se retorna el resultado. Observar que la funcion main llama
a la funcion de encriptado, y despliega el resultado en la siguiente lınea cout <<
encrypt(text, numero). Esto se vera de la siguiente manera:
Figure 15: Resultado obtenido del cifrado
4.2 Compilar y generar el ejecutable
Podemos compilar el codigo con el siguiente comando:
g++ -o ejecutable cesar.cpp
Donde cesar.cpp es el nombre del programa en C++ y con la flag -o se indica el
nombre del archivo de salida, en este caso un ejecutable con nombre ejecutable.
Para que la persona que utilice el programa no pueda ver el codigo original, y por
ende el mensaje sin cifrar, se entrega el ejecutable, en lugar del codigo fuente como
parte de los entregables de Capture the Flag.
14
5 Conclusiones
Logramos generar un codigo encargado del Cifrado Cesar en C++, editar codigo
HTML, y esconder varios archivos dentro de otros, utilizando codificado en el
medio. En particular, se entregan a los jugadores de este ejemplo el ejecutable del
codigo en C++ y la carpeta con la pagina HTML. Tambien se decidio entregar
con estos archivos una imagen:
Figure 16: Imagen entrada
Con el fin de dar una pista de que el texto encriptado se encuentra encriptado con
cifrado cesar.
Tambien existen otras herramientas a utilizar para Esteganografıa, como 11 12.
A partir del ejemplo presentado, es posible crear distintos stages, utilizando las
mismas ideas y herramientas, o agregando nuevas.
11https://github.com/evyatarmeged/stegextract12https://github.com/StefanoDeVuono/steghide
15
References
[1] cplusplus.com. Basic input/output. Available at http://www.cplusplus.com/
doc/tutorial/basic_io/.
[2] cplusplus.com. std::cout. Available at http://www.cplusplus.com/
reference/iostream/cout/.
[3] cplusplus.com. Structure of a program. Available at http://www.cplusplus.
com/doc/tutorial/program_structure/.
[4] Peter Justin Ryan Gibson. Steganography. Available at https://github.
com/ragibson/Steganography.
[5] w3schools.com. Html ¡input type=”hidden”¿. Available at https://www.
w3schools.com/tags/att_input_type_hidden.asp.
16