
Una herramienta CLI ligera para detectar y explotar sistemáticamente condiciones de carrera en aplicaciones web, APIs y servicios modernos.
Las condiciones de carrera representan una de las vulnerabilidades de seguridad de mayor impacto en las aplicaciones modernas, sin embargo siguen estando mal cubiertas por los escáneres automatizados. Mientras que herramientas como Nuclei, ffuf y sqlmap sobresalen en encontrar vulnerabilidades estáticas, son fundamentalmente ciegas a problemas basados en concurrencia.
Los pentesters de hoy se enfrentan a una elección: escribir manualmente scripts desechables para cada compromiso, o saltarse las pruebas de condiciones de carrera. Ninguna opción es escalable ni profesional.
RatRace resuelve esto proporcionando un flujo de trabajo pulido y repetible para las pruebas de condiciones de carrera, transformando lo que antes era scripting ad hoc en un proceso sistemático que se integra con pipelines CI/CD y genera informes profesionales.
Las vulnerabilidades de condiciones de carrera aparecen con frecuencia en áreas de alto impacto:
Estos errores consistentemente obtienen las mayores recompensas en programas de bug bounty porque amenazan directamente los ingresos del negocio y la confianza del cliente.
Define escenarios de carrera una vez en YAML, reutilízalos entre proyectos. El formato refleja las plantillas de Nuclei para familiaridad:
id: checkout-race
info:
name: Checkout Duplicate Order Race
severity: critical
race:
mode: burst
concurrency: 20
request:
method: POST
path: /api/v1/checkout
headers:
Authorization: "Bearer {{session}}"
body: '{"item_id": "SKU-001"}'
validate:
follow_up:
method: GET
path: /api/v1/orders?user={{user_id}}
expect:
json_field: "orders.length"
condition: equals
value: 1
Modo Burst — Solicitudes paralelas basadas en goroutines con sincronización precisa (estable, listo para producción)
Sincronización de último byte — Ataque a nivel TCP HTTP/1.1 (implementación lista, fase de pruebas)
Paquete único — Ataque basado en tramas HTTP/2 (implementación lista, fase de pruebas)
RatRace automáticamente:
equals, not_equals, greater_than, containsImportar solicitudes existentes:
# Desde comandos curl
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o template.yaml
# Desde archivos HAR exportados de Burp
ratrace import --har session.har -o template.yaml
Automatización CI/CD:
ratrace race -u $TARGET -t template.yaml --silent
echo $? # Código de salida 10 = carrera encontrada, 0 = limpio
Informes profesionales:
# JSON para automatización
ratrace race -u $TARGET -t template.yaml -o results/
# Informes HTML (planeado V2)
ratrace report --input results.json --format html
git clone https://github.com/bogdanticu88/ratrace.git
cd ratrace
go build ./cmd/ratrace
./ratrace --help
Requisitos: Go 1.24+
docker build -t ratrace:latest .
docker run --rm -it ratrace:latest race -u https://api.example.com -t template.yaml
# 1. Importar desde curl o usar plantilla existente
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o checkout.yaml
# 2. Ejecutar la carrera
ratrace race -u https://api.example.com -t checkout.yaml -m burst -c 20
# 3. Revisar hallazgos
# La salida muestra:
# 🔴 [CRITICAL] Checkout Duplicate Order Race
# Tasa de anomalía: 91.7%
# Confianza: 84%
ratrace race \
-u https://shop.example.com \
-t examples/templates/checkout-race.yaml \
-m burst \
-c 25 \
--output results/
# Ejecuta sin registros detallados, sale con código semántico
ratrace race -u https://api.example.com -t template.yaml --silent
# Verificar código de salida
if [ $? -eq 10 ]; then
echo "¡Condición de carrera encontrada!"
exit 1
fi
ratrace race -u <url> -t <template> [options]
Options:
-m, --mode string burst|lastbyte|singlepacket (por defecto desde plantilla)
-c, --concurrency int Cantidad de goroutines (por defecto 20)
-H, --header strings Cabeceras personalizadas (repetible)
-x, --proxy string URL del proxy para solicitudes
-o, --output string Directorio de salida para resultados
--timeout duration Tiempo de espera de solicitud (por defecto 10s)
--insecure Omitir verificación de certificado TLS
--dry-run Analizar plantilla y salir
--silent Suprimir registros, mostrar solo hallazgos
ratrace import [--curl <command> | --har <file>] -o <output.yaml>
Convierte solicitudes existentes (comandos curl o exportaciones HAR) en plantillas RatRace.
Útil para integrar con flujos de trabajo existentes.
ratrace report --input results.json --format [html|json] --output report.html
Genera informes legibles por humanos a partir de los resultados de las pruebas de carrera.
ratrace ratelimit -u <url> -c <concurrency>
Prueba si los endpoints son vulnerables a bypass concurrente del límite de tasa.
Las plantillas son archivos YAML que definen un escenario de carrera. Referencia completa:
id: unique-identifier
info:
name: "Nombre legible por humanos"
severity: critical|high|medium|low|info
tags: [tag1, tag2]
race:
mode: burst|lastbyte|singlepacket
concurrency: 20
request:
method: POST|GET|PUT|DELETE|PATCH
path: /api/endpoint
headers:
Authorization: "Bearer {{token}}"
Custom-Header: "value"
body: '{"json": "body", "user": "{{user_id}}"}'
validate:
follow_up:
method: GET
path: /api/orders?user={{user_id}}
expect:
json_field: "orders.length"
condition: equals|greater_than|contains|not_equals
value: 1
Variables (usa marcadores {{name}}):
ratrace race ... -H "Authorization: Bearer {{session_token}}"Registro limpio y con códigos de colores que muestra el progreso de la prueba:
[INF] Loading template path=checkout-race.yaml
[INF] Template loaded id=checkout-race mode=burst
[RUN] Firing burst attack concurrency=20
[INF] All requests completed total=20
[RUN] Clustering responses baseline=17 anomalous=3
[RACE] Race condition detected anomaly_rate=15% confidence=94%
[CONF] Validation passed field=orders.length expected=1
[INF] Race test complete findings=1
Templates: 1 Requests: 20 Time: 3.2s
🔴 [CRITICAL] Checkout Duplicate Order Race
Anomaly Rate: 15.0%
Confidence: 94%
Status Diff: 201 → 200
Field Diffs: order_id (100 → 101)
Resultados completos guardados en results_<timestamp>.json para automatización y archivo:
{
"TemplateID": "checkout-race",
"Target": "https://api.example.com/api/v1/checkout",
"Mode": "burst",
"Concurrency": 20,
"TotalRequests": 20,
"Duration": 3200000000,
"Findings": [
{
"TemplateName": "Checkout Duplicate Order Race",
"Severity": "critical",
"AnomalyRate": 0.15,
"Confidence": 0.94,
"Diff": {
"StatusChanged": true,
"BaselineStatus": 201,
"AnomalousStatus": 200
}
}
]
}
Usados para integración CI/CD y automatización:
| Código | Significado |
|---|---|
| 0 | Éxito — no se encontraron condiciones de carrera |
| 3 | Error de datos — plantilla no encontrada, error de análisis |
| 4 | Error de ejecución — fallo de red, error del motor |
| 10 | Condición de carrera encontrada — se requiere acción |
| 11 | Bypass de límite de tasa confirmado |
| 12 | Anomalía detectada pero validación no concluyente |
make build # Compilar binario
make test # Todas las pruebas
make test-unit # Solo pruebas unitarias
make test-int # Pruebas de integración
make coverage # Informe de cobertura (HTML)
make lint # Ejecutar linter
make run-race # Compilar y ejecutar ejemplo
cmd/ratrace/
└── main.go Punto de entrada, definición de CLI
internal/
├── cmd/ Implementaciones de subcomandos
├── engine/ Modos de ataque de carrera (burst, lastbyte, singlepacket)
├── validator/ Agrupación de respuestas, diferencias, comprobaciones de seguimiento
├── importer/ Analizadores HAR y curl
├── reporter/ Salida JSON y HTML
├── template/ Análisis YAML y plantillas
├── log/ Registro estructurado con colores
└── models/ Tipos de datos compartidos
Se aceptan issues, PRs y contribuciones de plantillas. Por favor asegúrate de:
make testmake lintMIT
RatRace está diseñado para pruebas de seguridad autorizadas, programas de bug bounty y pruebas de penetración. Úsalo solo en sistemas que poseas o para los que tengas permiso explícito por escrito para realizar pruebas. Probar sistemas de otros sin autorización es ilegal.
Bogdan Ticu — Investigación e Ingeniería de Seguridad
Para issues, preguntas o informes de seguridad: GitHub Issues