========================================================
 GHOSTRACE - laboratorio de practicas de Burp Suite
========================================================

Que es esto
-----------
GhostRace es una tienda de recargas y codigos digitales para
videojuegos (ficticia) con 3 Race Conditions metidas a proposito,
para practicar con Burp Suite:

  1. Comprar gratis              -> POST /api/checkout/<id>/aplicar-cupon
  2. Saltarse el limite del plan -> POST /api/plan/canjear-invitacion
  3. Reputacion de productos     -> POST /api/productos/<id>/valorar

Los 3 retos son la MISMA familia de fallo (una comprobacion y su
confirmacion no son atomicas) aplicada a tres superficies distintas
de la tienda: el punto pedagogico es aprender a reconocer el patron,
no memorizar un payload distinto cada vez.

Corre en tu propio equipo (localhost). No necesita internet una vez
instalada, no envia datos a ningun sitio y no debe exponerse fuera
de tu maquina (no tiene ninguna proteccion real).


Requisitos
----------
  - Windows, macOS o Linux
  - Python 3.10 o superior instalado y accesible desde la terminal
    (compruebalo con:  python --version   o   python3 --version)
  - Unos 40 MB libres en disco (para el entorno virtual)
  - Ningun otro programa escuchando en el puerto 5002
  - Burp Suite Community (u otro proxy) con capacidad de mandar
    varias peticiones en paralelo (Repeater: "Send group in parallel")


Como desplegarlo
-----------------
1. Descomprime este ZIP en una carpeta de tu equipo.

2. Arranca el servidor:
     - Windows:      doble clic en "run.bat"
     - macOS/Linux:  abre una terminal en esta carpeta y ejecuta:
                        chmod +x run.sh
                        ./run.sh

   La primera vez tardara un poco: crea un entorno virtual Python
   (carpeta "venv") e instala Flask dentro de el. Las siguientes
   veces arranca en segundos. Tambien crea la base de datos
   "app/ghostrace.db" (SQLite, catalogo y resenas de partida) al
   primer arranque.

3. Cuando veas el mensaje "Arrancando GhostRace en
   http://127.0.0.1:5002", abre esa direccion en tu navegador
   (o en el navegador embebido de Burp) y crea una cuenta desde
   "Crear cuenta gratis".

4. Deja la ventana de la terminal abierta mientras uses la app.
   Para detenerla, pulsa Ctrl+C en esa misma ventana.


Como se juega cada reto (resumen, el detalle esta en el writeup)
------------------------------------------------------------------
En los 3 casos el fallo es el mismo patron: la app COMPRUEBA algo
(¿ya se aplico este cupon? ¿ya canjeaste tu invitacion? ¿ya votaste
este producto?) y tarda un segundo en CONFIRMARLO. Si mandas muchas
peticiones identicas a la vez (agrupadas en Burp Repeater y enviadas
con "Send group in parallel"), todas pasan la comprobacion antes de
que la primera termine de confirmarse.

  1. Añade productos al carrito, tramita el pedido y en la pagina
     del pedido aplica el cupon BIENVENIDA50 muchas veces en
     paralelo: el descuento del 50% se acumula y el total se
     desploma hacia 0€.
  2. En "Mi plan", canjea cualquier codigo de invitacion muchas
     veces en paralelo: acumulas mas de 1 mes de Premium.
  3. En la pagina de un producto, vota 5 estrellas muchas veces en
     paralelo con la misma cuenta: infla su nota media de forma
     visible (o hundela con 1 estrella, en un producto rival).


Si algo falla
--------------
run.bat / run.sh estan pensados para NO fallar en silencio: si falta
Python, si no se puede crear el entorno virtual, si falla la
instalacion de Flask o si el propio servidor se cae, veras un
mensaje [ERROR] explicando que ha pasado y la ventana se quedara
abierta (con una pausa) para que puedas leerlo con calma en vez de
cerrarse sola.

Los casos mas frecuentes:
  - "No se ha encontrado python en el PATH"
      -> Instala Python desde https://www.python.org/downloads/
         y marca la casilla "Add python.exe to PATH" (Windows).
  - Fallo al arrancar el servidor / puerto ocupado
      -> Cierra cualquier otra cosa que use el puerto 5002, o edita
         PORT en app/app.py, o arranca con:
           Windows:      set PORT=5052 && run.bat
           macOS/Linux:  PORT=5052 ./run.sh
  - Las peticiones en paralelo no consiguen colar la carrera
      -> Comprueba que las mandas realmente agrupadas y en paralelo
         (no una detras de otra) y que apuntan al mismo pedido /
         mismo producto. El servidor espera 1 segundo a proposito
         entre la comprobacion y la confirmacion para dar margen.


Reiniciar el laboratorio entre intentos
----------------------------------------
Este laboratorio usa una base de datos SQLite para el catalogo y las
resenas de partida, ademas de 3 diccionarios en memoria (uno por
reto) para el estado que se ataca. Para volver a dejarlo todo en su
estado inicial sin reiniciar el servidor, visita:

    http://127.0.0.1:5002/reset

Esto reconstruye la base de datos desde cero, vacia los 3 estados en
memoria y cierra tu sesion.


Estructura del paquete
-----------------------
  app/              codigo de la aplicacion (backend Flask + paginas)
                     app/ghostrace.db se genera sola al primer arranque
  requirements.txt  dependencias Python (solo Flask)
  run.bat / run.sh  arranque con comprobaciones de errores
  LEEME.txt         este archivo

El writeup con la solucion guiada de los 3 retos (con capturas de
Burp) se entrega aparte, no dentro de este ZIP.
