$ ./introduccion_ctf.sh

Introducción a
Capture The Flag

Cripto · OSINT · Web · Reversing · Forense

flag{bi3nv3n1d0s}
// agenda · 90 min

Lo que vamos a ver hoy

HoraTema
0:00 – 0:08¿Qué es un CTF? + ética
0:08 – 0:23Terminal y codificaciones
0:23 – 0:38Criptografía
0:38 – 0:48OSINT
0:48 – 1:03Web
1:03 – 1:13Reversing
1:13 – 1:23Forense / Misc
1:23 – 1:30Cierre y recursos
01 · ¿Qué es un CTF? 0:00 – 0:08

Resolver retos para encontrar una flag

🧩

El reto

Un archivo, una página web, un texto raro o un programa.

🔎

Tu trabajo

Encontrar el texto secreto escondido dentro.

🚩

La flag

Tiene un formato fijo: flag{algo_aqui}. La envías y ganas puntos.

Jeopardy ← el que vamos a jugar

Retos independientes por categoría. Cada uno vale puntos según su dificultad.

Attack / Defense

Equipos atacan los servidores de otros y defienden los propios. Para más adelante.

01 · ¿Qué es un CTF? 0:00 – 0:08

Las categorías

🔐

Cripto

Descifrar mensajes y romper cifrados débiles.

🌍

OSINT

Investigar con información pública: fotos, redes, mapas.

🌐

Web

Encontrar fallas en páginas y aplicaciones web.

⚙️

Reversing

Entender qué hace un programa sin su código fuente.

🔬

Forense

Analizar archivos, imágenes y tráfico de red.

🎲

Misc

Todo lo demás: acertijos, programación, lógica.

01 · Reglas 0:00 – 0:08

Reglas del juego

✓ Sí se vale

  • Buscar en Google (es la habilidad principal)
  • Trabajar en equipo y repartirse categorías
  • Atorarse, cambiar de reto y regresar
  • Tomar notas de cómo resolviste cada reto

✗ No se vale

  • Atacar la plataforma o el scoreboard
  • Compartir flags con otros equipos
  • Investigar a personas reales fuera del reto
  • Usar esto fuera de un entorno autorizado (es delito)
02 · Terminal 0:08 – 0:23

Los comandos que más vas a usar

ComandoPara qué
ls -laListar, incluso ocultos
cd carpetaMoverse
cat archivoVer contenido
file archivo¿Qué es de verdad?
strings archivoSacar texto legible
grep "texto"Buscar
a | bPasar la salida de a hacia b

El combo que resuelve más retos fáciles:

$ strings reto.bin | grep "flag{"
flag{3st4b4_4h1_t0d0_3l_t13mp0}

¿Sin Linux? WSL, una VM de Kali o shell.cloud.google.com

02 · Codificaciones 0:08 – 0:23

Codificar ≠ cifrar

Codificar

Solo cambia cómo se representa el texto. No hay llave: cualquiera lo revierte.

Cifrar

Oculta el texto. Para leerlo necesitas la llave.

CodificaciónCómo reconocerlaEjemplo → flag
BinarioSolo 0 y 1 en grupos de 801100110 01101100 …
HexadecimalSolo 0-9 y a-f66 6c 61 67
Base64Letras, números, + / y a veces = al finalZmxhZw==
Decimal ASCIINúmeros entre 32 y 126102 108 97 103

🪄 Herramienta: CyberChef → gchq.github.io/CyberChef (prueben la receta Magic)

02 · Práctica 0:08 – 0:23

🏁 Decodifica las flags

RETO 1
ZmxhZ3tiNHMzXzY0X24wXzNzX2MxZnI0ZDB9
From Base64 → flag{b4s3_64_n0_3s_c1fr4d0}
RETO 2
666c61677b6833787d
From Hex → flag{h3x}
RETO 3 · pista: no siempre es una sola capa
Wm14aFozdGtNR0pzTTE5ak5IQTBmUT09
From Base64 × 2 → flag{d0bl3_c4p4}
03 · Criptografía 0:23 – 0:38

Cifrado César

Cada letra se recorre N posiciones en el abecedario. ROT13 es César con N = 13.

A B C D E F G H I J K L M ...
↓ +3
D E F G H I J K L M N O P ...
RETO 4 · pista: "iodj" debería ser "flag"
iodj{mxolr_fhvdu_hvwduld_rujxoorvr}
Desplazamiento 3 → flag{julio_cesar_estaria_orgulloso}

💡 Si conoces parte del texto (flag{) puedes deducir la llave: known plaintext.

03 · Criptografía 0:23 – 0:38

XOR: la operación favorita de los CTF

ABA ^ B
000
011
101
110

A ^ K ^ K = A

Cifrar dos veces con la misma llave = descifrar

RETO 5 · llave de un solo byte
4c464b4d51521a587519597558195c1958591b48461957
0x4c ^ 'f' = 0x2a → flag{x0r_3s_r3v3rs1bl3}
# CyberChef: From Hex → XOR Brute Force
data = bytes.fromhex("4c46...")
print(bytes(b ^ 0x2a for b in data))
03 · Criptografía 0:23 – 0:38

Hashes: huellas digitales

No se revierten

De un hash no se puede regresar al texto original…

…pero se adivinan

Se prueban millones de contraseñas comunes hasta que una coincide.

Reconócelos

MD5 = 32 hex
SHA-1 = 40 hex
SHA-256 = 64 hex

RETO 6 · ¿qué contraseña es? (MD5)
8621ffdbc5698829397d97767ac13db3
crackstation.net → dragon

Online: crackstation.net · Offline: john / hashcat + rockyou.txt

04 · OSINT 0:38 – 0:48

Investigar con información pública

📷

Metadatos

Las fotos guardan GPS, fecha y cámara.
exiftool foto.jpg

🖼️

Búsqueda inversa

Google Lens, Yandex Images, TinEye.

🕰️

Wayback Machine

Versiones viejas de una página en web.archive.org.

Google dorkQué hace
site:uni.edu.mxSolo resultados de ese dominio
filetype:pdfSolo ese tipo de archivo
"texto exacto"Coincidencia exacta
intitle:"index of"Directorios abiertos
04 · Práctica 0:38 – 0:48

🏁 ¿Dónde se tomó esta foto?

$ exiftool foto_campus.jpg
...
Make         : Apple
Model        : iPhone 13
GPS Position : 19 deg 19' 54.20" N,
               99 deg 11' 2.40" W
Comment      : flag{l0s_m3t4d4t0s_h4bl4n}

Sin terminal: jimpl.com o exif.tools

Pasos

  • Descarga la foto del reto
  • Saca sus metadatos
  • Pega las coordenadas en Google Maps

⚠️ WhatsApp y las redes borran los metadatos. En un CTF, el archivo original casi siempre los conserva.

05 · Web 0:48 – 1:03

Todo lo que está en tu navegador, lo controlas tú

Navegador  ── GET /login HTTP/1.1  ──▶  Servidor
           ◀──  200 OK + HTML + Cookie  ──

Ctrl + U

Código fuente y comentarios escondidos

F12 · Network

Cada request y response

F12 · Application

Ver y editar cookies

/robots.txt

Rutas que el sitio "no quiere" que veas

05 · Práctica 0:48 – 1:03

🏁 Tres flags en una página

RETO 7 · el código fuente

Alguien olvidó borrar un comentario.

Ctrl+U → <!-- flag{l33_3l_c0d1g0_fu3nt3} -->
RETO 8 · el login

La contraseña se valida con JavaScript…

atob("c3VwZXJzZWNyZXRv") = supersecreto → flag{l4_v4l1d4c10n_3n_3l_cl13nt3_n0_s1rv3}
RETO 9 · los robots

¿Qué páginas no quiere el sitio que Google indexe?

/robots.txt → /panel-oculto.html → flag{r0b0ts_txt_r3v3l4_c0s4s}
05 · Web 0:48 – 1:03

SQL Injection

El servidor arma la consulta pegando lo que escribe el usuario:

SELECT * FROM usuarios WHERE user = '$usuario' AND pass = '$password';

Si en el usuario escribimos ' OR 1=1 -- la consulta queda:

SELECT * FROM usuarios WHERE user = '' OR 1=1 -- ' AND pass = '';

1=1 siempre es verdadero → regresa a todos los usuarios

-- comenta el resto → la contraseña ya no se revisa

RETO 12 · entra como admin sin saber su contraseña
Usuario: ' OR 1=1 -- (o admin' -- ) → flag{1ny3cc10n_sql_cl4s1c4}
06 · Reversing 1:03 – 1:13

Escalera de técnicas

Siempre empieza por el escalón más fácil.

1

file

¿Qué tipo de programa es?

2

strings

¿La contraseña está a simple vista?

3

ltrace

Ver las funciones que llama, como strcmp

4

Ghidra

Convertir el binario a pseudocódigo en C

$ strings crackme | grep -A3 clave
Introduce la clave:
%63s
r3v3rs1ng_3s_f4c1l
Correcto! flag{%s}
06 · Práctica 1:03 – 1:13

🏁 Lee el código y encuentra la flag

secreto = input("Flag: ")
if secreto[::-1] == "}s3v3r_la_r33l{galf":
    print("Correcto!")
else:
    print("Nop")
RETO 10 · pista: ¿qué hace [::-1] en Python?
[::-1] voltea la cadena → flag{l33r_al_r3v3s}
07 · Forense 1:13 – 1:23

La extensión miente, los bytes no

TipoMagic bytesTexto
PNG89 50 4E 47.PNG
JPGFF D8 FF
ZIP50 4B 03 04PK
PDF25 50 44 46%PDF
$ file tarea.txt
tarea.txt: PNG image data, 800 x 600

$ xxd tarea.txt | head -1
00000000: 8950 4e47 0d0a 1a0a  .PNG....
07 · Práctica 1:13 – 1:23

🏁 Un gato muy sospechoso

La imagen se ve normal… ¿o trae algo más?

$ binwalk gato_inocente.png
DECIMAL  DESCRIPTION
0        PNG image, 800 x 600
6414     Zip archive data, flag.txt

$ binwalk -e gato_inocente.png
RETO 11
unzip gato_inocente.png → flag{h4y_un_z1p_d3ntr0_d3l_g4t0}

Más herramientas

  • aperisolve.com: corre todo a la vez
  • zsteg: esteganografía en PNG
  • steghide: JPG con contraseña
  • Wireshark: archivos .pcap → Follow TCP Stream
// learn.cylabacademy.org

Ahora en picoCTF

CategoríaRetos
GeneralObedient Cat · First Grep
CriptoMod 26 · interencdec
OSINT / metadatosinformation
WebInsp3ct0r · where are the robots
Reversingvault-door-training
ForenseGlory of the Garden

De tarea: Cookies · caesar · crackme-py · Matryoshka doll · SQLiLite

08 · Cierre 1:23 – 1:30

¿Atorado? Sigue esta lista

1

file
¿Qué es realmente?

2

strings | grep flag

3

CyberChef
Magic

4

Googlear el texto raro o el nombre del reto

5

Preguntar al equipo o cambiar de reto

Para seguir practicando

picoCTFlearn.cylabacademy.orgTodas las categorías, el mejor para empezar
OverTheWire Banditoverthewire.orgTerminal de Linux
CryptoHackcryptohack.orgCriptografía
PortSwigger Academyportswigger.netWeb
CTFtimectftime.orgCalendario de CTFs reales
$ exit

¿Preguntas?

Nos vemos en el CTF.

flag{gr4c14s_y_su3rt3}
← → navegar · S solución · F pantalla completa