Cripto · OSINT · Web · Reversing · Forense
| Hora | Tema |
|---|---|
| 0:00 – 0:08 | ¿Qué es un CTF? + ética |
| 0:08 – 0:23 | Terminal y codificaciones |
| 0:23 – 0:38 | Criptografía |
| 0:38 – 0:48 | OSINT |
| 0:48 – 1:03 | Web |
| 1:03 – 1:13 | Reversing |
| 1:13 – 1:23 | Forense / Misc |
| 1:23 – 1:30 | Cierre y recursos |
Un archivo, una página web, un texto raro o un programa.
Encontrar el texto secreto escondido dentro.
Tiene un formato fijo: flag{algo_aqui}. La envías y ganas puntos.
Retos independientes por categoría. Cada uno vale puntos según su dificultad.
Equipos atacan los servidores de otros y defienden los propios. Para más adelante.
Descifrar mensajes y romper cifrados débiles.
Investigar con información pública: fotos, redes, mapas.
Encontrar fallas en páginas y aplicaciones web.
Entender qué hace un programa sin su código fuente.
Analizar archivos, imágenes y tráfico de red.
Todo lo demás: acertijos, programación, lógica.
| Comando | Para qué |
|---|---|
ls -la | Listar, incluso ocultos |
cd carpeta | Moverse |
cat archivo | Ver contenido |
file archivo | ¿Qué es de verdad? |
strings archivo | Sacar texto legible |
grep "texto" | Buscar |
a | b | Pasar 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
Solo cambia cómo se representa el texto. No hay llave: cualquiera lo revierte.
Oculta el texto. Para leerlo necesitas la llave.
| Codificación | Cómo reconocerla | Ejemplo → flag |
|---|---|---|
| Binario | Solo 0 y 1 en grupos de 8 | 01100110 01101100 … |
| Hexadecimal | Solo 0-9 y a-f | 66 6c 61 67 |
| Base64 | Letras, números, + / y a veces = al final | ZmxhZw== |
| Decimal ASCII | Números entre 32 y 126 | 102 108 97 103 |
🪄 Herramienta: CyberChef → gchq.github.io/CyberChef (prueben la receta Magic)
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 ...
💡 Si conoces parte del texto (flag{) puedes deducir la llave: known plaintext.
| A | B | A ^ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
A ^ K ^ K = A
Cifrar dos veces con la misma llave = descifrar
# CyberChef: From Hex → XOR Brute Force
data = bytes.fromhex("4c46...")
print(bytes(b ^ 0x2a for b in data))
De un hash no se puede regresar al texto original…
Se prueban millones de contraseñas comunes hasta que una coincide.
MD5 = 32 hex
SHA-1 = 40 hex
SHA-256 = 64 hex
Online: crackstation.net · Offline: john / hashcat + rockyou.txt
Las fotos guardan GPS, fecha y cámara.exiftool foto.jpg
Google Lens, Yandex Images, TinEye.
Versiones viejas de una página en web.archive.org.
| Google dork | Qué hace |
|---|---|
site:uni.edu.mx | Solo resultados de ese dominio |
filetype:pdf | Solo ese tipo de archivo |
"texto exacto" | Coincidencia exacta |
intitle:"index of" | Directorios abiertos |
$ 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
⚠️ WhatsApp y las redes borran los metadatos. En un CTF, el archivo original casi siempre los conserva.
Navegador ── GET /login HTTP/1.1 ──▶ Servidor ◀── 200 OK + HTML + Cookie ──
Código fuente y comentarios escondidos
Cada request y response
Ver y editar cookies
Rutas que el sitio "no quiere" que veas
Alguien olvidó borrar un comentario.
La contraseña se valida con JavaScript…
¿Qué páginas no quiere el sitio que Google indexe?
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
Siempre empieza por el escalón más fácil.
file¿Qué tipo de programa es?
strings¿La contraseña está a simple vista?
ltraceVer las funciones que llama, como strcmp
Convertir el binario a pseudocódigo en C
$ strings crackme | grep -A3 clave Introduce la clave: %63s r3v3rs1ng_3s_f4c1l Correcto! flag{%s}
secreto = input("Flag: ")
if secreto[::-1] == "}s3v3r_la_r33l{galf":
print("Correcto!")
else:
print("Nop")
| Tipo | Magic bytes | Texto |
|---|---|---|
| PNG | 89 50 4E 47 | .PNG |
| JPG | FF D8 FF | |
| ZIP | 50 4B 03 04 | PK |
25 50 44 46 |
$ file tarea.txt tarea.txt: PNG image data, 800 x 600 $ xxd tarea.txt | head -1 00000000: 8950 4e47 0d0a 1a0a .PNG....
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
zsteg: esteganografía en PNGsteghide: JPG con contraseña.pcap → Follow TCP Stream| Categoría | Retos |
|---|---|
| General | Obedient Cat · First Grep |
| Cripto | Mod 26 · interencdec |
| OSINT / metadatos | information |
| Web | Insp3ct0r · where are the robots |
| Reversing | vault-door-training |
| Forense | Glory of the Garden |
De tarea: Cookies · caesar · crackme-py · Matryoshka doll · SQLiLite
file
¿Qué es realmente?
strings | grep flag
CyberChef
Magic
Googlear el texto raro o el nombre del reto
Preguntar al equipo o cambiar de reto
| picoCTF | learn.cylabacademy.org | Todas las categorías, el mejor para empezar |
| OverTheWire Bandit | overthewire.org | Terminal de Linux |
| CryptoHack | cryptohack.org | Criptografía |
| PortSwigger Academy | portswigger.net | Web |
| CTFtime | ctftime.org | Calendario de CTFs reales |
Nos vemos en el CTF.