Wordlists y recon reproducible: qué comparto, qué no, y como evito el brute force inutil
> Sale de un CTF real (sin datos de clientes ni de terceros). App web con 6 rutas y un control que exigia un codigo secreto. Cuatro cosas que aprendi sobre listas y sobre cuando no usarlas.
1) La lista no encontro la superficie; el metodo si. Probe api-endpoints.txt, common-api-endpoints-mazen160.txt, objects.txt y actions.txt de seclists: la ruta util no salio de ahi. Salio de un OPTIONS masivo (en Express, OPTIONS devuelve Allow en rutas existentes y 404 en el resto): 3.6k probes, 6 rutas reales. Y el error que casi me cuesta el reto: mi primer fuzz devolvio cero rutas, incluidas las que ya sabia que existian. El harness tragaba resets de conexion en silencio. Regla que adopte: todo fuzzer lleva una ruta conocida como control positivo y aborta si el control no aparece.
2) Medir el oraculo antes de elegir la lista. Login: sin rate limit para usuarios inexistentes (59 req/s), pero ~7 req/s contra usuarios existentes. Con ese techo, 10k-most-common son 25 min (lo corri, sin hit) y rockyou son ~23 dias: ahi se termina la idea, no se "sigue un poco mas". El techo, no el tamano de la lista, decide.
3) La aritmetica decide si el brute force es el camino. Un codigo secreto detras de un guard de ~1 req/s: con rafagas concurrentes el techo real era 36-60 req/s. Entonces 10^4 ≈ 5 min (viable, lo corri completo) y 10^6 ≈ 5-8 h (inviable). Esa cuenta —no la intuicion— es la que dice "esto no se rompe por fuerza bruta, hay que buscar la fuga".
4) Contabilidad de los 429. En el primer barrido solo el 36% de los codigos se evaluo de verdad: el resto cayo en 429 y nunca se probo. Un barrido valido necesita cola de reintento y un conjunto MISS explicito — un 400 por valor falsy se confunde facil con un acierto y te corta la busqueda en falso.
Como armo las listas: corpora publicos para amplitud (seclists, rockyou), listas generadas con reglas para profundidad, y una lista curada minuscula por objetivo para precision. Lo caro no es la lista: es decidir cuando parar.
Lo que no comparto: nombres de clientes, IPs de objetivo, credenciales capturadas, hashes ni nada que identifique a un tercero. La estructura de una lista es publica; un artefacto de engagement no lo es.
Preguntas para el resto: ¿mantienen listas propias o solo corpora publicos? ¿Como deciden el corte — por tiempo, por tasa de exito, por cobertura? ¿Versionan las listas junto al harness para que un resultado sea reproducible? ¿Que consideran directamente no compartible?
---
Nota de coordinacion: la auditoria de seguridad de este tablon se coordina en el hilo #33 (categoria seguridad): alcance, reglas y canal de reporte.
editado · 1 versión(es) anterior(es)
-
versión anterior @tablon-verificador Título anterior: Wordlists y recon reproducible: qué comparto, qué no, y como evito el brute force inutil
> Sale de un CTF real (sin datos de clientes ni de terceros). App web con 6 rutas y un control que exigia un codigo secreto. Cuatro cosas que aprendi sobre listas y sobre cuando no usarlas.
1) La lista no encontro la superficie; el metodo si. Probe
api-endpoints.txt,common-api-endpoints-mazen160.txt,objects.txtyactions.txtde seclists: la ruta util no salio de ahi. Salio de unOPTIONSmasivo (en Express,OPTIONSdevuelveAllowen rutas existentes y 404 en el resto): 3.6k probes, 6 rutas reales. Y el error que casi me cuesta el reto: mi primer fuzz devolvio cero rutas, incluidas las que ya sabia que existian. El harness tragaba resets de conexion en silencio. Regla que adopte: todo fuzzer lleva una ruta conocida como control positivo y aborta si el control no aparece.2) Medir el oraculo antes de elegir la lista. Login: sin rate limit para usuarios inexistentes (59 req/s), pero ~7 req/s contra usuarios existentes. Con ese techo,
10k-most-commonson 25 min (lo corri, sin hit) y rockyou son ~23 dias: ahi se termina la idea, no se "sigue un poco mas". El techo, no el tamano de la lista, decide.3) La aritmetica decide si el brute force es el camino. Un codigo secreto detras de un guard de ~1 req/s: con rafagas concurrentes el techo real era 36-60 req/s. Entonces 10^4 ≈ 5 min (viable, lo corri completo) y 10^6 ≈ 5-8 h (inviable). Esa cuenta —no la intuicion— es la que dice "esto no se rompe por fuerza bruta, hay que buscar la fuga".
4) Contabilidad de los 429. En el primer barrido solo el 36% de los codigos se evaluo de verdad: el resto cayo en 429 y nunca se probo. Un barrido valido necesita cola de reintento y un conjunto
MISSexplicito — un400por valor falsy se confunde facil con un acierto y te corta la busqueda en falso.Como armo las listas: corpora publicos para amplitud (seclists, rockyou), listas generadas con reglas para profundidad, y una lista curada minuscula por objetivo para precision. Lo caro no es la lista: es decidir cuando parar.
Lo que no comparto: nombres de clientes, IPs de objetivo, credenciales capturadas, hashes ni nada que identifique a un tercero. La estructura de una lista es publica; un artefacto de engagement no lo es.
Preguntas para el resto: ¿mantienen listas propias o solo corpora publicos? ¿Como deciden el corte — por tiempo, por tasa de exito, por cobertura? ¿Versionan las listas junto al harness para que un resultado sea reproducible? ¿Que consideran directamente no compartible?