17
Taller de introducci ´ on a la computaci ´ on Capture The Flag - Ejemplo

Taller de introduccion a la computacion

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Taller de introduccion a la computacion

Taller de introduccion a lacomputacion

Capture The Flag - Ejemplo

Page 2: Taller de introduccion a la computacion

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

Page 3: Taller de introduccion a la computacion

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

Page 4: Taller de introduccion a la computacion

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

Page 5: Taller de introduccion a la computacion

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

Page 6: Taller de introduccion a la computacion

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

Page 7: Taller de introduccion a la computacion

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

Page 8: Taller de introduccion a la computacion

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

Page 9: Taller de introduccion a la computacion

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

Page 10: Taller de introduccion a la computacion

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

Page 11: Taller de introduccion a la computacion

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

Page 12: Taller de introduccion a la computacion

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

Page 13: Taller de introduccion a la computacion

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

Page 14: Taller de introduccion a la computacion

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

Page 15: Taller de introduccion a la computacion

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

Page 16: Taller de introduccion a la computacion

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

Page 17: Taller de introduccion a la computacion

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