Follow the white rabbit CTF – MAY THE TROLL BE WITH YOU

An army of hackers has stolen the flag from our rabbits. Security experts have failed to capture the flag and some have even gone mad. Please…GIMME THE FLAG!!

http://web1.ctf.followthewhiterabbit.es:8001/

En este reto nos encontramos con la siguiente web:

Una de las primeras cosas que siempre pruebo en webs nuevas es ver si existe un robots.txt, y efectivamente:

La abrimos y nos encontramos esta web:

Si nos fijamos en la url veremos que esta incluyendo un archivo, muy probablemente estemos ante un LFI, pero no sabemos la ubicación de la flag, así que vamos con el siguiente paso lógico, mirar el código de la página y ¡sorpresa!:

Ya hemos localizado el path de key2, editamos la url para que nos abra dicho archivo y obtenemos esto:

Vale, pero nos falta localizar key1, viendo la cantidad de comentarios que hay en la web referentes a key me puse a leer el todo el código que pude encontrar en la web, primero html, y luego css … y mirar lo que me encontré en uno de ellos:

¡Ya tenemos las dos keys! Solo nos falta introducirlas en el formulario y obtenemos la flag y una chic chic chica muy guapi:

Como comentario final decir que los comentarios se pueden extraer todos juntos utilizando el engagement de burp, find comments de forma automática lo que facilita esta prueba. Gracias Patatas por el tip.

Una anécdota curiosa de este reto fue que lo terminé en cama con el móvil, ya había sacado key2 desde el portátil pero ya era tarde y me fui a la cama; en lugar de leer un libro como la gente normal, me puse a leer el código de la web desde el propio movil jeje Para los que no lo sepan, yo utilicé firefox en Android y simplemente añadiendo view-source: al principio de la url os mostrará el código de la web.

Publicado en ctf, fwhibbit-ctf, web, writeups | 1 comentario

Follow the white rabbit CTF – Fat Rabbit

One of our rabbits has eaten more than necessary and now it’s about to explode. We need to know what the rabbit has eaten, could you help us? It might be a flag, for sure!

https://mega.nz/#!IlN2BLRa!zigY9gRGzZ_Muvo1ZyC0yofLVUi4azVfvwPkRStMyd0

Esta vez nos encontramos con un bmp que contiene al siguiente conejito:

Lo primero que hice, como suele ser habitual, fue lanzar binwalk contra el archivo, pero este no reconoció más cabeceras que las del bmp, así que siendo estego decidí lanzarle steghide e intentar sacar la contraseña, pero me encontré con algo curioso:

Steghide se queja de que hay una lista bastante larga de bytes de relleno que no son cero, copie las direcciones de dichos bytes en un archivo llamado bit y utilizando el siguiente script (bash en una linea ftw!) extrajé dichos bytes y los guarde en un archivo output.raw para analizarlo posteriormente:

COUNTER=0; for i in $(cat bits); do value=$(printf "%d\n" $i); dd if=CunnyCunny.bmp of=output.raw skip=$i count=1 bs=1 seek=$COUNTER;COUNTER=$[COUNTER + 1] ; done

Para los que el comando os suene a chino os explico lo que va haciendo:

  1. El bucle for va leyendo linea a linea la dirección en hexadecimal del archivo bits.
  2. Utilizo el comando printf para convertir el hexadecimal a decimal y guardarlo en la variable value.
  3. Utilizando dd extraigo el byte donde:
    1. skip: Es la posición a la que dd tiene que saltar donde se encuentra el byte a extraer.
    2. count: Es el número de bytes que quiero extraer, en este caso, 1.
    3. bs: Por seguridad especifico que quiero que dd lea de 1 byte en 1 byte.
    4. seek: La posición en el archivo de salida para que vaya concatenando los bytes en lugar de reescribirlos.
  4. Le sumo 1 al contador de posición del archivo de salida y pasa al siguiente byte.

Una vez que termina le hago un cat al archivo output.raw y ahí esta la flag:

fwhibbit{P4dding_H1d3_4w3s0m3_Th1ngs}

Solución alternativa de Narib, muchas gracias por la info crack:

Uilizar zsteg (https://github.com/zed-0xff/zsteg), una gem de ruby que a pesar de que es de hace 4 años, al menos para este reto hace su labor a la perfección.

Ejecutando el comando ‘zsteg CunnyCunny.bmp’ obtenemos lo siguiente:

scanline extradata .. file: ASCII text, with no line terminators
00000000: 66 77 68 69 62 62 69 74 7b 50 34 64 64 69 6e 67 |fwhibbit{P4dding|
00000010: 5f 48 31 64 33 5f 34 77 33 73 30 6d 33 5f 54 68 |_H1d3_4w3s0m3_Th|
00000020: 31 6e 67 73 7d 00 00 00 00 00 00 00 00 00 00 00 |1ngs}………..|

Publicado en ctf, estego, fwhibbit-ctf, writeups | 2 comentarios

Follow the white rabbit CTF – Magic QR

The rabbit boss of the enemy burrow has sent a QR-encrypted message.
Decode it and get a hash in SHA1, introduce it before the rabbit eats the carrot and you will get your precious flags

http://dev1.ctf.followthewhiterabbit.es:8008

 

En esta prueba nos piden resolver un QR en menos de 4 segundos y devolver el SHA1 que conseguimos:

Lo primero de lo que me di cuenta al intentar leer el QR es que los colores del mismo estaban invertidos, guardamos el QR y utilizamos el siguiente comando para hacerlo legible:

convert -negate qr.png dst.png

Con esto el QR ya es perfectamente valido, al escanearlo nos encontramos con que nos devuelve un string en lo que parece ser morse. Después de pasarlo por mi querido morse.py veo que efectivamente al pasarlo a texto plano me devuelve un SHA1, pero, 4 segundos no es demasiado tiempo para hacer todo a mano, así que vamos a automatizar un poco todo esto.

Lo primero es obtener el QR, el cual esta en base64 dentro del source de la web, así que utilizando curl lo obtenemos y guardamos las cookies para que al enviar la solución no tengamos problemas:

curl -b cookies.txt -c cookies.txt -e dev1.ctf.followthewhiterabbit.es -s http://dev1.ctf.followthewhiterabbit.es:8008/index.php | grep base64 | cut -f2 -d"," | cut -f1 -d'"'| base64 -d > qr.png

El siguiente paso sería convertirlo con el primer comando que mencione y para leerlo utilizamos el siguiente script de python que nos devolverá el contenido del QR:

from qrtools import QR

myCode = QR(filename=u"dst.png")
myCode.decode()
print myCode.data

Este output a su vez se lo pasamos a morse.py y obtenemos el SHA1 que utilizaremos con curl y las cookies que andes guardamos para enviar la solución:

solution=$(python /home/kalrong/tools-sources/kscripts/morse.py -d "$morse"); echo "$solution"; curl -X POST -d "solution=$solution"  -b cookies.txt -c cookies.txt -e dev1.ctf.followthewhiterabbit.es -H "Referer: dev1.ctf.followthewhiterabbit.es" http://dev1.ctf.followthewhiterabbit.es:8008/index.php

Esto nos imprimirá por consola la web resultante que contiene la flag, para hacerlo de forma totalmente automática utilicé el siguiente script en una linea en bash:

curl -b cookies.txt -c cookies.txt -e dev1.ctf.followthewhiterabbit.es -s http://dev1.ctf.followthewhiterabbit.es:8008/index.php | grep base64 | cut -f2 -d"," | cut -f1 -d'"'| base64 -d > qr.png;convert -negate qr.png dst.png; morse=$(python qr.py);  solution=$(python morse.py -d "$morse"); echo "$solution"; curl -X POST -d "solution=$solution" -b cookies.txt -c cookies.txt -e dev1.ctf.followthewhiterabbit.es -H "Referer: dev1.ctf.followthewhiterabbit.es" http://dev1.ctf.followthewhiterabbit.es:8008/index.php

Lo ejecutamos y en unos segundos obtenemos la página de la cual podemos extraer la siguiente flag:

fwhibbit{Qr_1s_y0ur_Fr1end}

Publicado en ctf, dev, fwhibbit-ctf, python, writeups | Deja un comentario

Follow the white rabbit CTF – The Maze

Rabbits are afraid of Mazes.
This time our rabbit is lost and he is looking for his carrot, so you must help him.
In order to scape from the maze you must submit the whole string of movements the rabbit needs to make to reach his goal. Good Luck!
http://dev2.ctf.followthewhiterabbit.es:8008

 

Otra vez estamos limitados en tiempo, pero en este caso tenemos que resolver un laberinto, introducir las intrucciones para resolverlo y resolver un recaptcha, todo en menos de 30 segundos. Vamos a ello.

Como en este caso tenemos un recaptcha no podemos automatizar todo como en el caso del QR así que tendremos que ser rápidos para conseguir meter la solución y resolver el recaptcha. Pero vamos a ir por partes, lo primero que hice fue copiarme el código fuente de la página para hacer pruebas. Pero vamos a ir poco a poco.

Lo primero fue encontrar una manera eficaz de resolver el laberinto, en este caso el algoritmo A* es de lo mejor que pude encontrar, esta web me ayudo mucho:

http://www.laurentluce.com/posts/solving-mazes-using-python-simple-recursivity-and-a-search/

De paso obtenemos el algoritmo ya en python el cual tendremos que adaptar para nuestras necesidades, de paso le añadí un “parser” un poco cutre para que leyera el código de la página de un archivo y se encargara de poner el laberinto en un formato que el algoritmo entendiera. El resultado fue este script:

import heapq


class Cell(object):
    def __init__(self, x, y, reachable):
        """Initialize new cell.

        @param reachable is cell reachable? not a wall?
        @param x cell x coordinate
        @param y cell y coordinate
        @param g cost to move from the starting cell to this cell.
        @param h estimation of the cost to move from this cell
                 to the ending cell.
        @param f f = g + h
        """
        self.reachable = reachable
        self.x = x
        self.y = y
        self.parent = None
        self.g = 0
        self.h = 0
        self.f = 0


class AStar(object):
    def __init__(self):
        # open list
        self.opened = []
        heapq.heapify(self.opened)
        # visited cells list
        self.closed = set()
        # grid cells
        self.cells = []
        self.grid_height = None
        self.grid_width = None

    def init_grid(self, width, height, walls, start, end):
        """Prepare grid cells, walls.

        @param width grid's width.
        @param height grid's height.
        @param walls list of wall x,y tuples.
        @param start grid starting point x,y tuple.
        @param end grid ending point x,y tuple.
        """
        self.grid_height = height
        self.grid_width = width
        for x in range(self.grid_width):
            for y in range(self.grid_height):
                if (x, y) in walls:
                    reachable = False
                else:
                    reachable = True
                self.cells.append(Cell(x, y, reachable))
        self.start = self.get_cell(*start)
        self.end = self.get_cell(*end)

    def get_heuristic(self, cell):
        """Compute the heuristic value H for a cell.

        Distance between this cell and the ending cell multiply by 10.

        @returns heuristic value H
        """
        return 10 * (abs(cell.x - self.end.x) + abs(cell.y - self.end.y))

    def get_cell(self, x, y):
        """Returns a cell from the cells list.

        @param x cell x coordinate
        @param y cell y coordinate
        @returns cell
        """
        return self.cells[x * self.grid_height + y]

    def get_adjacent_cells(self, cell):
        """Returns adjacent cells to a cell.

        Clockwise starting from the one on the right.

        @param cell get adjacent cells for this cell
        @returns adjacent cells list.
        """
        cells = []
        if cell.x < self.grid_width-1:
            cells.append(self.get_cell(cell.x+1, cell.y))
        if cell.y > 0:
            cells.append(self.get_cell(cell.x, cell.y-1))
        if cell.x > 0:
            cells.append(self.get_cell(cell.x-1, cell.y))
        if cell.y < self.grid_height-1:
            cells.append(self.get_cell(cell.x, cell.y+1))
        return cells

    def get_path(self):
        cell = self.end
        path = [(cell.x, cell.y)]
        while cell.parent is not self.start:
            cell = cell.parent
            path.append((cell.x, cell.y))

        path.append((self.start.x, self.start.y))
        path.reverse()
        return path

    def update_cell(self, adj, cell):
        """Update adjacent cell.

        @param adj adjacent cell to current cell
        @param cell current cell being processed
        """
        adj.g = cell.g + 10
        adj.h = self.get_heuristic(adj)
        adj.parent = cell
        adj.f = adj.h + adj.g

    def solve(self):
        """Solve maze, find path to ending cell.

        @returns path or None if not found.
        """
        # add starting cell to open heap queue
        heapq.heappush(self.opened, (self.start.f, self.start))
        while len(self.opened):
            # pop cell from heap queue
            f, cell = heapq.heappop(self.opened)
            # add cell to closed list so we don't process it twice
            self.closed.add(cell)
            # if ending cell, return found path
            if cell is self.end:
                return self.get_path()
            # get adjacent cells for cell
            adj_cells = self.get_adjacent_cells(cell)
            for adj_cell in adj_cells:
                if adj_cell.reachable and adj_cell not in self.closed:
                    if (adj_cell.f, adj_cell) in self.opened:
                        # if adj cell in open list, check if current path is
                        # better than the one previously found
                        # for this adj cell.
                        if adj_cell.g > cell.g + 10:
                            self.update_cell(adj_cell, cell)
                    else:
                        self.update_cell(adj_cell, cell)
                        # add adj cell to open list
                        heapq.heappush(self.opened, (adj_cell.f, adj_cell))

import numpy
f=open("maze","rb").read()
maze=f.split("font>")[1].split("<font")[0]

maze=maze.split("<br>")
maze_final=[]
for i in maze:
    maze_final.append(i.encode("hex").replace("e296a0","1").replace("266e6273703b","0"))

maze_final[0]=maze_final[0][:1]+"01"+maze_final[0][1:]
tam=len(maze_final)-1
maze_final[tam]=maze_final[tam][1:]+"10"+maze_final[tam][:1]

line=0

dic_maze=[]
for i in maze_final:
    column=0
    for x in i:
        if x == "1":
            dic_maze.append((line,column))
        column+=1
    line+=1
#walls=tuple(dic_maze)
walls=dic_maze
maze = AStar()
maze.init_grid(37, 101, walls, (0,1), (36,99))
direcciones=maze.solve()
buff=direcciones[0]
dirs=""
for i in direcciones[1:]:
    if list(numpy.subtract(i,buff)) == [1,0]:
        dirs+="D"
    elif list(numpy.subtract(i,buff)) == [-1,0]:
        dirs+="U"
    elif list(numpy.subtract(i,buff)) == [0,1]:
        dirs+="R"
    elif listn(umpy.subtract(i,buff)) == [0,-1]:
        dirs+="L"
    buff=i
print dirs

Para evitar tener que andar seleccionando y copiando en la consola lo que hice fue utilizar xclip para que me lo copiara directamente al portapapeles y asi en cuanto el script terminara solamente tendría que copiar y resolver el captcha. Al final termine ejecuntandolo así:

nano maze; python a_star_path_finding.py | xclip -selection clipboard

Con nano y el inspect de chrome abiertos recargaba la página copiaba el código a nano y lo guardaba, y ya automaticamente el script lo resolvía y me copiaba el resultado al portapapeles, dejandonos aun ¡¡29 segundos para resolver el recaptcha!! A eso le llamo yo un conejo rápido.

Si todo fue bien este será el resultado con la flag:

Ahí podemos ver la flag:

fwhibbit{M4z3_S0lv3d_by_Sm4rt_R4bb1t}

Publicado en ctf, dev, fwhibbit-ctf, python, writeups | Deja un comentario

Follow the white rabbit CTF – Hash it

This time we have intercepted the list of passwords and the salt used by our rabbit. Help us to decipher these hashes before the rabbit eats the carrot and you will be rewarded with a precious and juicy flag.

http://dev3.ctf.followthewhiterabbit.es:8008

Y seguimos con las contrarrelojes, en este caso tenemos 50 segundos para crackear 10 hashes y resolver un recaptcha (maldito recaptcha que me hizo perder horas en esta prueba jeje).

Siguiendo un poco lo que hice en The Maze decidí volver a usar el truquillo de dejar nano abierto y xclip para ahorrar unos segundos preciosos.

En este caso nos daban una lista de posibles passwords, concretamente 14344391, y un salt que podía estar o bien delante o bien detrás de dicha password y que variaba en cada sesión. La primera intención fue resolverlo con python pero la verdad es que yo y la optimización nos llevamos mal, y no andabamos muy justos de tiempo y de recursos de hardware, así que decidí utilizar hashcat y utilizar la GPU de mi portátil para crackear los hashes.

El problema con hashcat es que tenía que especificarle el modo o tipo de hash en el que trabajar así que tuve que utilizar la herramienta hashid con la opción -m para que me dijera el modo en que hashcat tendría que trabajar.

Con un par de comandos de bash extraía del código fuente la lista de hashes y el salt y los guardaba en sus correspondientes archivos para que hashcat pudiera utilizarlos. El resultado fue este script de una linea en bash:

nano data2; cat data2 | grep '<div class="data">' | tr -d " "> data; python parse.py; for i in $(cat list.hashes);do echo $i > hash.buff; mode=$(hashid -m $i | grep Mode | head -1 | cut -f2 -d":" | cut -f1 -d"]" | tr -d " "); hashcat --outfile=hash.found --outfile-format=2 --potfile-path=my.pot --force -a 1 -m $mode hash.buff dev3.wordlist salt.list; rm hash.buff;done; python prepare.py; cat ready.data | xclip -selection clipboard

Al igual que en The Maze en cuanto se resolvían todos los hashes el script nos copia al portapapeles el resultado en el formato que el reto espera.

A pesar de todo hashcat solo me conseguía crackear los scripts un 90% de las veces y a veces no lo conseguía hacer a tiempo (GPU de portátil) y cuando no era eso el recaptcha me bloqueaba … pero a base de insistencia por fin conseguí hacerlo todo a tiempo y obtuve la siguiente web:

Ahí podemos ver la flag: fwhibbit{I_L0v3_Brut3Forc3}

Publicado en ctf, dev, fwhibbit-ctf, writeups | Deja un comentario

Follow the white rabbit CTF – Mad Rabbit

Our spies are trying to intercept enemy communication, but they could only get this strange file…it’s a funny video!
We tried to get some usefull information but we haven’t found anything suspicious.

https://mega.nz/#!Ah9SiYxS!8KWuCMZ-F24J_rINPedkie63vqlAfW0uFTeiO-Y7dZo

Después de hablar con el creador de esta prueba (djurado) parece que mi solución no era exactamente la esperada y que fui bastante más rápido de lo esperado.

En este caso tenemos un video de un feliz conejo jeje al abrirlo con VLC lo primero que me doy cuenta es de que contiene dos pistas de audio, una que parece ser la original del video y otra que parece ser solamente ruido.

Por costumbre extraje la segunda pista de audio utilizando ffmpeg:

ffmpeg -i m4d_rabb1t.mp4 -vn -map 0:a:1 -acodec libmp3lame m4d_rabb1t.mp3

Por lo general la gente aquí se va a Audacity, y por llevar la contraria siempre me voy primero a Sonic Visualiser a mirar el espectro ya que se ve mucho mejor que en Audacity, aplicamos la capa de espectro entrelazando ambos canales (aunque aquí solo hay uno pero por costumbre), y vamos recorriendo el espectro y nos encontramos con esto:

Vale, parece que hemos acertado pero no lo vemos bien, ajustando la visualización del espectro con las ruedecitas en la esquina inferior derecha del mismo vamos ajustando hasta ver lo siguiente:

Ahí podemos ver la flag:

fwhibbit{4ud1o_sp3c7r0gr4m_f0r_h1d1ng_m3ss4g3s}

Publicado en ctf, estego, fwhibbit-ctf, writeups | 2 comentarios

Follow the white rabbit CTF – Torxicity

We recently found that a group of people are selling female ​​rabbit extract. You need to find their real server, and deanonimize them!

http://rabbit3yfa6dcgka.onion

En este caso nos piden descubrir el servidor real detrás de una dirección onion, como era la primera vez que hacía algo así recurrí a la segunda regla cuando sabes algo (la primera es el bendito RTFM), le pregunté a google. Después de un rato me encontré con el siguiente writeup:

https://ctftime.org/writeup/4601

Este me descubrió la herramienta ssh_keyscanner la cual prácticamente nos da el trabajo hecho.

Para poderla usar necesitamos tener una API key de Shodan y tor corriendo en local.

La clonamos y la editamos para añadir nuestra API key de Shodan:

Guardamos y ejecutamos de la siguiente manera:

torify python keyscanner.py -i rabbit3yfa6dcgka.onion

Después de unos segundos obtenemos la ip:

Abrimos dicha ip en el navegador y obtenemos la flag:

fwhibbit{T0r_c0uld_b3_0wn3d}

Publicado en ctf, fwhibbit-ctf, misc, tor, writeups | 1 comentario

Follow the white rabbit CTF – Rabbit Traffic

Our research center has evolved during this last time. However, they are having some problems while intercepting communications…

Help our investigators to decode the following transmission.

https://mega.nz/#!40tXFBwB!uB4OR7xRhbJ_2YmJN_dCxK81oCPUq2Wwam0NxcfOoYQ

Esta vez obtenemos un archivo pcacp con diverso tráfico capturado, a primera vista no parece nada raro pero hay una traza de paquetes ftp, lo cual no suele ser un tráfico muy habitual, la seguimos para ver que hay:

El nombre del archivo me suena de algo, vamos a ver si podemos ver su contenido:

El siguiente link nos ayuda a entender que estamos viendo un archivo que contiene llaves ssl que podemos utilizar para descifrar el tráfico al que correspondan: https://www.trustwave.com/Resources/SpiderLabs-Blog/How-To-Decrypt-Ruby-SSL-Communications-with-Wireshark/

Copiamos el contenido a un archivo y los configuramos en la sección de SSL de wireshark lo cual descifrará automáticamente todo tráfico ssl que se corresponda con el mismo, y parece que hemos tenido suerte:

Revisando las ip’s veo que solo hay una conexión donde las ip’s estan en el mismo rango, hacemos un follow http stream y obtenemos:

Y ahí podemos ver la flag:

fwhibbit{d3c0d3Th1sIfy0uC4n}

Publicado en ctf, forense, fwhibbit-ctf, writeups | Deja un comentario

Follow the white rabbit CTF – The burrow needs you

The new cryptographic algorithm? Can you help us?

xoCnrQoFNCiIvQImryKTIpLRTsYLSFTEfmWrvdYbJEsPxNWlxygTmHtufmysnGDtTCemYVgGlocDLgObvxeIRQRbvUwPuJoGPJYgjFCCfetUGEqYVcYpBJkpJHKYDUphbWWodHgerNcWxLWsFyleEoqyLFoqlQKJtjMGhsPFXejIiqUGrGOyFjKLNOIUtyrwHeKXOMlRhdOclVQMjIsKfdUMBYgqiWVg==

En este caso nos dan un string que parece ser base64 pero que por supuesto no lo es, sino ¿donde estaría la gracia?

En este caso lo que me ayudo a llegar a la solución fue el siempre bendito Google, después de mucho buscar llegue a este repositorio de git, curiosamente español:

https://github.com/hecky/stegb64

Me cloné el repo y lo ejecute de la siguiente manera:

python stegb64.py -r xoCnrQoFNCiIvQImryKTIpLRTsYLSFTEfmWrvdYbJEsPxNWlxygTmHtufmysnGDtTCemYVgGlocDLgObvxeIRQRbvUwPuJoGPJYgjFCCfetUGEqYVcYpBJkpJHKYDUphbWWodHgerNcWxLWsFyleEoqyLFoqlQKJtjMGhsPFXejIiqUGrGOyFjKLNOIUtyrwHeKXOMlRhdOclVQMjIsKfdUMBYgqiWVg==

Y efectivamente ahí tenemos la flag:

fwhibbit{f4k3_b4s3_64_rul3s}

Publicado en cripto, ctf, fwhibbit-ctf, writeups | Deja un comentario

Follow the white rabbit – Hate

There is a phisher who pretends to be us, can you help us to pwn him?

http://web5.ctf.followthewhiterabbit.es/

En este reto web nos presentan la siguiente web:

Examinamos el código fuente y nos fijamos en el siguiente comentario:

Nos vamos a http://web5.ctf.followthewhiterabbit.es/admin.php:

Volvemos a examinar el código y vemos que nos dan las credenciales en el mismo:

Introducimos admin y admin:

Y nos encontramos con una web que nos permite subir archivos zip, después de hacer varias pruebas con archivos zip corruptos (daba un error de que no lo encontraba) o con zips que contenían archivos de texto dummy (la web me extraía el contenido de dichos archivos), la solución final apareció de la mano de los symlinks.

Con el siguiente archivo vamos a crear un archivo zip que contenga, a su vez, un link simbólico al archivo de la flag:

ln -s /etc/flag test; zip --symlinks test.zip test

Lo seleccionamos en la web y le damos a upload, et voila:

Ahí tenemos la flag:

fwhibbit{#SyMlinK_RUl3S#}

Publicado en ctf, fwhibbit-ctf, web, writeups | 2 comentarios