
reconFTW es una herramienta diseñada para realizar reconocimiento automatizado en un dominio objetivo ejecutando el mejor conjunto de herramientas para realizar escaneos y encontrar vulnerabilidades.
reconFTW es una potente herramienta automatizada de reconocimiento diseñada para investigadores de seguridad y testers de penetración. Simplifica el proceso de recopilación de inteligencia sobre un objetivo mediante la enumeración de subdominios, escaneo de vulnerabilidades, OSINT y más. Con un diseño modular, amplias opciones de configuración y soporte para escaneo distribuido a través de AX Framework, reconFTW está diseñado para ofrecer resultados completos de manera eficiente.
reconFTW aprovecha una amplia gama de técnicas, incluyendo descubrimiento pasivo y activo de subdominios, comprobaciones de vulnerabilidades web (ej. XSS, SSRF, SQLi), OSINT, fuzzing de directorios, escaneo de puertos y capturas de pantalla. Se integra con herramientas y API de vanguardia para maximizar la cobertura y precisión, asegurando que te mantengas adelante en tus esfuerzos de reconocimiento.
Características clave:
Descargo de responsabilidad: El uso de reconFTW para atacar objetivos sin consentimiento previo es ilegal. Es responsabilidad del usuario cumplir con todas las leyes aplicables. Los desarrolladores no asumen ninguna responsabilidad por el mal uso o daño causado por esta herramienta. Úsala de manera responsable.
reconFTW está repleto de funcionalidades para hacer que el reconocimiento sea exhaustivo y eficiente. A continuación se muestra un desglose detallado de sus capacidades, actualizado para reflejar la funcionalidad más reciente en el script y la configuración.
IPV6_SCAN está habilitado.nuclei -dast sobre URL recopiladas y candidatos de GF para cobertura DAST adicional.--quick-rescan / QUICK_RESCAN).hotlist.txt) basándose en nuevos hallazgos.SHOW_COMMANDS para registrar cada comando ejecutado en los registros de destino para depuración.reconFTW usa una arquitectura modular. El punto de entrada principal (reconftw.sh) maneja el análisis de argumentos y carga 8 módulos especializados desde el directorio modules/.
reconftw/ ├── reconftw.sh # Entry point — arg parsing, module loading, dispatch ├── reconftw.cfg # Default configuration ├── install.sh # Installer ├── Makefile # Data management, lint, fmt, test targets ├── modules/ │ ├── core.sh # Lifecycle, logging, notifications, cleanup (1024 lines) │ ├── modes.sh # Scan modes, argument parsing, help (902 lines) │ ├── subdomains.sh # Subdomain enumeration (1938 lines) │ ├── web.sh # Web analysis, fuzzing, JS checks (1712 lines) │ ├── vulns.sh # Vulnerability scanning (926 lines) │ ├── osint.sh # OSINT functions (500 lines) │ ├── axiom.sh # Ax/Axiom fleet helpers (143 lines) │ └── utils.sh # Utilities, sanitization, validation (508 lines) ├── tests/ │ ├── run_tests.sh # Test runner │ ├── unit/ # bats-core unit tests │ ├── integration/ # Integration tests │ └── fixtures/ # Test data ├── Docker/ │ └── Dockerfile # Official Docker image └── Terraform/ # AWS deployment
### Referencia de Módulos
| Módulo | Líneas | Propósito |
|--------|------:|---------|
| `core.sh` | 1024 | Gestión del ciclo de vida, registro, notificaciones, trampas de limpieza |
| `modes.sh` | 902 | Definiciones de modos de escaneo, análisis de argumentos, salida de ayuda |
| `subdomains.sh` | 1938 | Todas las funciones de enumeración de subdominios |
| `web.sh` | 1712 | Análisis web, fuzzing, análisis de JS, detección de CMS |
| `vulns.sh` | 926 | Escaneo de vulnerabilidades (XSS, SQLi, SSRF, etc.) |
| `osint.sh` | 500 | Funciones OSINT (WHOIS, correos, dorks, metadatos) |
| `utils.sh` | 508 | Utilidades compartidas, sanitización de entrada, validación |
| `axiom.sh` | 143 | Gestión de flota distribuida Ax/Axiom |
La bandera `--source-only` permite cargar `reconftw.sh` sin ejecutar la lógica principal, habilitando pruebas unitarias de funciones individuales.
---
## 💿 Instalación
reconFTW admite múltiples métodos de instalación para adaptarse a diferentes entornos. Asegúrate de tener suficiente espacio en disco (al menos 10 GB recomendados) y una conexión a Internet estable.
### Inicio rápido
1) Clona e instala```yaml
git clone https://github.com/six2dez/reconftw
cd reconftw
./install.sh --verbose
3) Ejecución mínima (huella solo pasiva)```bash
./reconftw.sh -d example.com -p
Consejo: vuelve a ejecutar
./install.sh --toolsmás tarde para actualizar el conjunto de herramientas sin reinstalar paquetes del sistema.
Requisitos previos:
install_golang habilitado por defecto en reconftw.cfg).sudo echo "${USERNAME} ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/reconFTW
Pasos: ```bash git clone https://github.com/six2dez/reconftw cd reconftw ./install.sh ./reconftw.sh -d target.com -r
Notas:
install.sh instala dependencias, herramientas y configura rutas (GOROOT, GOPATH, PATH).install_golang=false en reconftw.cfg si Golang ya está configurado../install.sh --tools para actualizar los binarios de Go, paquetes pipx y repositorios sin tocar los paquetes del sistema.Para una lista de objetivos, vincule el archivo de lista en el contenedor y haga referencia a la ruta dentro del contenedor: ```bash
docker run -it --rm
-v "${PWD}/domains.txt:/reconftw/domains.txt:ro"
-v "${PWD}/OutputFolder/:/reconftw/Recon/"
six2dez/reconftw:main -l /reconftw/domains.txt -r
3. **Ver resultados**:
- Los resultados se guardan en el directorio `OutputFolder` del host (no dentro del contenedor).
4. **Personalización**:
- Modifica la imagen Docker o crea la tuya propia; consulta la [Guía Docker](https://github.com/six2dez/reconftw/wiki/4.-Docker).
- Para omitir las herramientas Ax en compilaciones personalizadas, pasa `--build-arg INSTALL_AXIOM=false`.
- Monta tu configuración de notificaciones en `~/.config/notify/provider-config.yaml` dentro del contenedor si usas notificaciones.
5. **Secretos en tiempo de ejecución**:
Pasa las claves de API y secretos mediante variables de entorno — nunca los incluyas en la imagen: ```bash
docker run -it --rm \
-e SHODAN_API_KEY="your-key" \
-e PDCP_API_KEY="your-projectdiscovery-key" \
-e COLLAB_SERVER="your-server" \
-e XSS_SERVER="your-server" \
-v "${PWD}/OutputFolder/:/reconftw/Recon/" \
six2dez/reconftw:main -d example.com -r
Consulte SECURITY.md para obtener una guía completa sobre gestión de secretos.
Verificación de Salud:
La imagen Docker incluye un HEALTHCHECK integrado que ejecuta ./reconftw.sh --health-check cada 60 segundos. También puede ejecutarlo manualmente: ```bash
docker exec ./reconftw.sh --health-check
brew install bash, abre una nueva terminal y vuelve a ejecutar ./install.sh.gtimeout mediante brew install coreutils. Los scripts ahora lo detectan y lo usan automáticamente.upgrade_tools=true en reconftw.cfg, ejecuta ./install.sh --tools, o instala la herramienta faltante manualmente (el error la nombrará)./usr/local/bin. Si prefieres no hacerlo, asegúrate de que ~/go/bin esté en tu PATH.~/nuclei-templates y vuelve a ejecutar ./install.sh.subfinder: ~/.config/subfinder/provider-config.yaml~/Tools/.github_tokens (uno por línea)~/Tools/.gitlab_tokens (uno por línea)WHOISXML_API en reconftw.cfg o variable de entornoasnmap): establece PDCP_API_KEY en entorno/config (ASN_ENUM se omite si no está configurado)notify en ~/.config/notify/provider-config.yamlCOLLAB_SERVER en entorno/cfg si se usaXSS_SERVER en entorno/cfg si se usashellcheck y shfmt (opcional) para make lint/make fmtEl archivo reconftw.cfg controla toda la ejecución de reconFTW. Permite una personalización detallada de:
tools, resolvers, fuzz_wordlist).secrets.cfg (ver SECURITY.md).OSINT, SUBDOMAINS_GENERAL, VULNS_GENERAL).FFUF_THREADS, HTTPX_RATELIMIT).ADAPTIVE_RATE_LIMIT, MIN_RATE_LIMIT, MAX_RATE_LIMIT).Ejemplo de configuración:```bash #############################################
#############################################
tools=$HOME/Tools # Path installed tools if [[ -z "${SCRIPTPATH:-}" ]]; then if [[ -n "${BASH_SOURCE[0]:-}" ]]; then SCRIPTPATH="$( cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 ; pwd -P )" # Get current script's path else SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" # Get current script's path fi fi _detected_shell="${SHELL:-/bin/bash}" profile_shell=".$(basename "${_detected_shell}")rc" # Get current shell profile if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then reconftw_version="$(git rev-parse --abbrev-ref HEAD)-$(git describe --tags 2>/dev/null || git rev-parse --short HEAD)" else reconftw_version="standalone" fi # Fetch current reconftw version DATA_DIR="${SCRIPTPATH}/data" WORDLISTS_DIR="${DATA_DIR}/wordlists" PATTERNS_DIR="${DATA_DIR}/patterns" generate_resolvers=false # Generate custom resolvers with dnsvalidator update_resolvers=true # Fetch and rewrite resolvers from trickest/resolvers before DNS resolution resolvers_url="https://raw.githubusercontent.com/trickest/resolvers/main/resolvers.txt" resolvers_trusted_url="https://gist.githubusercontent.com/six2dez/ae9ed7e5c786461868abd3f2344401b6/raw/trusted_resolvers.txt" RESOLVER_DOWNLOAD_CONNECT_TIMEOUT=10 # Seconds to wait for resolver download TCP connection RESOLVER_DOWNLOAD_MAX_TIME=120 # Hard cap in seconds for resolver downloads RESOLVER_DOWNLOAD_RETRY=2 # Retry count for resolver downloads RESOLVER_DOWNLOAD_RETRY_DELAY=2 # Delay in seconds between resolver download retries fuzzing_remote_list="https://raw.githubusercontent.com/six2dez/OneListForAll/main/onelistforallmicro.txt" # Used to send to Ax (if used) on fuzzing proxy_url="http://127.0.0.1:8080/" # Proxy url install_golang=true # Set it to false if you already have Golang configured and ready upgrade_tools=true upgrade_before_running=false # Upgrade tools before running #dir_output=/custom/output/path SHOW_COMMANDS=false # Set true to log every executed command to the per-target log (verbose; may include sensitive data) MIN_DISK_SPACE_GB=0 # Minimum required disk space in GB before starting reconnaissance (0 to disable check)
INCREMENTAL_MODE=false # Only scan new findings since last run (use --incremental flag to enable) MONITOR_MODE=false # Continuous monitor mode (enabled by --monitor) MONITOR_INTERVAL_MIN=60 # Minutes between monitoring cycles MONITOR_MAX_CYCLES=0 # 0 = run forever until interrupted ALERT_SUPPRESSION=true # Suppress repeated monitor alerts by fingerprint history ALERT_SEEN_FILE=".incremental/alerts_seen.hashes" # Store of seen alert fingerprints
ADAPTIVE_RATE_LIMIT=false # Automatically adjust rate limits when encountering 429/503 errors (use --adaptive-rate flag to enable) MIN_RATE_LIMIT=10 # Minimum rate limit (requests per second) MAX_RATE_LIMIT=500 # Maximum rate limit (requests per second) RATE_LIMIT_BACKOFF_FACTOR=0.5 # Multiply rate by this when errors occur (0.5 = half speed) RATE_LIMIT_INCREASE_FACTOR=1.2 # Multiply rate by this on success (1.2 = 20% faster)
CACHE_MAX_AGE_DAYS=30 # Maximum age in days for cached wordlists/resolvers (30 = 1 month) CACHE_MAX_AGE_DAYS_RESOLVERS=7 # Resolver cache TTL CACHE_MAX_AGE_DAYS_WORDLISTS=30 # Wordlist cache TTL CACHE_MAX_AGE_DAYS_TOOLS=14 # Tool cache TTL CACHE_REFRESH=false # Force-refresh cache (or use --refresh-cache)
MAX_LOG_FILES=10 # Maximum number of log files to keep per target MAX_LOG_AGE_DAYS=30 # Delete log files older than this many days
STRUCTURED_LOGGING=false # Enable JSON structured logging for advanced log analysis
export GOROOT="${GOROOT:-/usr/local/go}" export GOPATH="${GOPATH:-$HOME/go}" case ":${PATH}:" in ":$GOPATH/bin:") ;; *) PATH="$GOPATH/bin:$PATH" ;; esac case ":${PATH}:" in ":$GOROOT/bin:") ;; *) PATH="$GOROOT/bin:$PATH" ;; esac case ":${PATH}:" in ":$HOME/.local/bin:") ;; *) PATH="$HOME/.local/bin:$PATH" ;; esac export PATH
export PATH="$HOME/.cargo/bin:$PATH"
#NOTIFY_CONFIG=~/.config/notify/provider-config.yaml # No need to define GITHUB_TOKENS=${tools}/.github_tokens GITLAB_TOKENS=${tools}/.gitlab_tokens #CUSTOM_CONFIG=custom_config_path.txt # In case you use a custom config file, uncomment this line and set your files path
SHODAN_API_KEY="${SHODAN_API_KEY:-}" WHOISXML_API="${WHOISXML_API:-}" PDCP_API_KEY="${PDCP_API_KEY:-}" XSS_SERVER="${XSS_SERVER:-}" COLLAB_SERVER="${COLLAB_SERVER:-}" slack_channel="${slack_channel:-}" slack_auth="${slack_auth:-}"
DEBUG_STD="&>/dev/null" # Skips STD output on installer DEBUG_ERROR="2>/dev/null" # Skips ERR output on installer
OSINT=true # Enable or disable the whole OSINT module GOOGLE_DORKS=true GITHUB_DORKS=true GITHUB_REPOS=true METADATA=true # Fetch metadata from indexed office documents EMAILS=true # Fetch emails from differents sites DOMAIN_INFO=true # whois info IP_INFO=true # Reverse IP search, geolocation and whois API_LEAKS=true # Check for API leaks API_LEAKS_POSTLEAKS=true # Enhance API leaks with postleaksNg THIRD_PARTIES=true # Check for 3rd parties misconfigs SPOOF=true # Check spoofable domains MAIL_HYGIENE=true # Check DMARC/SPF records CLOUD_ENUM=true # Enumerate cloud storage across providers with cloud_enum GITHUB_LEAKS=true # Search for leaked secrets across GitHub with ghleaks GHLEAKS_THREADS=5 # Concurrent download threads for ghleaks SECRETS_ENGINE="gitleaks" # gitleaks|titus|noseyparker|hybrid SECRETS_SCAN_GIT_HISTORY=false # Include git history scans when supported SECRETS_VALIDATE=false # Validate detected secrets when supported (titus) GITHUB_ACTIONS_AUDIT=false # Audit GitHub Actions artifacts/workflows with gato GATO_INCLUDE_ALL_ARTIFACT_SECRETS=false # Include noisy artifact secret matches in gato output
SUBDOMAINS_GENERAL=true # Enable or disable the whole Subdomains module SUBPASSIVE=true # Passive subdomains search SUBCRT=true # crtsh search CTR_LIMIT=999999 # Limit the number of results SUBNOERROR=false # Check DNS NOERROR response and BF on them SUBANALYTICS=true # Google Analytics search SUBBRUTE=true # DNS bruteforcing SUBSCRAPING=true # Subdomains extraction from passive URLs and live web metadata SUBPERMUTE=true # DNS permutations SUBIAPERMUTE=true # Permutations by AI analysis SUBREGEXPERMUTE=true # Permutations by regex analysis GOTATOR_FLAGS=" -depth 1 -numbers 3 -mindup -adv -md" # Flags for gotator PERMUTATIONS_WORDLIST_MODE=auto # auto|full|short (auto: short if subs > threshold, full if DEEP) PERMUTATIONS_SHORT_THRESHOLD=100 # Use short wordlist when subdomain count exceeds this SUBTAKEOVER=true # Check subdomain takeovers, false by default cuz nuclei already check this SUB_RECURSIVE_PASSIVE=false # Uses a lot of API keys queries DEEP_RECURSIVE_PASSIVE=10 # Number of top subdomains for recursion SUB_RECURSIVE_BRUTE=false # Needs big disk space and time to resolve ZONETRANSFER=true # Check zone transfer S3BUCKETS=true # Check S3 buckets misconfigs REVERSE_IP=false # Check reverse IP subdomain search (set True if your target is CIDR/IP) TLS_PORTS="21,22,25,80,110,135,143,261,271,324,443,448,465,563,614,631,636,664,684,695,832,853,854,990,993,989,992,994,995,1129,1131,1184,2083,2087,2089,2096,2221,2252,2376,2381,2478,2479,2482,2484,2679,2762,3077,3078,3183,3191,3220,3269,3306,3410,3424,3471,3496,3509,3529,3539,3535,3660,36611,3713,3747,3766,3864,3885,3995,3896,4031,4036,4062,4064,4081,4083,4116,4335,4336,4536,4590,4740,4843,4849,5443,5007,5061,5321,5349,5671,5783,5868,5986,5989,5990,6209,6251,6443,6513,6514,6619,6697,6771,7202,7443,7673,7674,7677,7775,8243,8443,8991,8989,9089,9295,9318,9443,9444,9614,9802,10161,10162,11751,12013,12109,14143,15002,16995,41230,16993,20003" INSCOPE=false # Uses inscope tool to filter the scope, requires .scope file in reconftw folder
WEBPROBEFULL=true # Unified web probing over configured ports WEBSCREENSHOT=true # Webs screenshooting VIRTUALHOSTS=false # Check virtualhosts by fuzzing HOST header UNCOMMON_PORTS_WEB="81,300,591,593,832,981,1010,1311,1099,2082,2095,2096,2480,3000,3001,3002,3003,3128,3333,4243,4567,4711,4712,4993,5000,5104,5108,5280,5281,5601,5800,6543,7000,7001,7396,7474,8000,8001,8008,8014,8042,8060,8069,8080,8081,8083,8088,8090,8091,8095,8118,8123,8172,8181,8222,8243,8280,8281,8333,8337,8443,8500,8834,8880,8888,8983,9000,9001,9043,9060,9080,9090,9091,9092,9200,9443,9502,9800,9981,10000,10250,11371,12443,15672,16080,17778,18091,18092,20720,32000,55440,55672" WEBPROBE_PORTS="80,443,${UNCOMMON_PORTS_WEB}" # Ports used by webprobe_full
FAVIRECON=true # Favicon-based technology recon for discovered web targets PORTSCANNER=true # Enable or disable the whole Port scanner module GEO_INFO=true # Fetch Geolocalization info PORTSCAN_PASSIVE=true # Port scanner with Shodan PORTSCAN_ACTIVE=true # Port scanner with nmap PORTSCAN_ACTIVE_OPTIONS="--top-ports 200 -sV -n -Pn --open --max-retries 2" PORTSCAN_DEEP_OPTIONS="--top-ports 1000 -sV -n -Pn --open --max-retries 2 --script vulners" PORTSCAN_STRATEGY=legacy # legacy|naabu_nmap NAABU_ENABLE=true NAABU_RATE=1000 NAABU_PORTS="--top-ports 1000" SERVICE_FINGERPRINT=true # Fingerprint exposed services with nerva SERVICE_FINGERPRINT_ENGINE="nerva" # nerva SERVICE_FINGERPRINT_TIMEOUT_MS=2000 # nerva timeout per target (ms) PORTSCAN_UDP=false PORTSCAN_UDP_OPTIONS="--top-ports 20 -sU -sV -n -Pn --open" CDN_IP=true # Check which IPs belongs to CDN CDN_BYPASS=true # Try origin IP discovery on CDN-fronted hosts with hakoriginfinder
WAF_DETECTION=true # Detect WAFs NUCLEICHECK=true # Enable or disable nuclei NUCLEI_TEMPLATES_PATH="$HOME/nuclei-templates" # Set nuclei templates path NUCLEI_SEVERITY="info,low,medium,high,critical" # Set templates criticity NUCLEI_EXTRA_ARGS="" # Additional nuclei extra flags, don't set the severity here but the exclusions like " -etags openssh" #NUCLEI_EXTRA_ARGS="-etags openssh,ssl -eid node-express-dev-env,keycloak-xss,CVE-2023-24044,CVE-2021-20323,header-sql,header-reflection" # Additional nuclei extra flags, don't set the severity here but the exclusions like " -etags openssh" NUCLEI_DAST=true # Run additional nuclei -dast module over webs/urls/gf candidates (forced on when VULNS_GENERAL=true, e.g. -a) URL_CHECK=true # Enable or disable URL collection URL_CHECK_PASSIVE=true # Search for urls, passive methods from Archive, OTX, CommonCrawl, etc URL_CHECK_ACTIVE=true # Search for urls by crawling the websites WAYMORE_TIMEOUT=30m # Timeout for waymore passive URL collection WAYMORE_LIMIT=5000 # Optional URL collection limit for waymore URL_GF=true # Url patterns classification URL_EXT=true # Returns a list of files divided by extension JSCHECKS=true # JS analysis FUZZ=true # Web fuzzing FUZZ_RECURSION_DEPTH=2 # ffuf recursion depth used in DEEP mode IIS_SHORTNAME=true CMS_SCANNER=true # CMS scanner WORDLIST=true # Wordlist generation ROBOTSWORDLIST=true # Check historic disallow entries on waybackMachine (DEEP mode only) PASSWORD_DICT=true # Generate password dictionary PASSWORD_DICT_ENGINE=cewler # cewler|pydictor PASSWORD_MIN_LENGTH=5 # Min password length PASSWORD_MAX_LENGTH=14 # Max password length KATANA_HEADLESS_PROFILE=off # off|smart|full CLOUD_ENUM_S3_PROFILE=optimized # optimized: quickscan (-qs + safe -m/-b paths) | exhaustive: -m/-b ${tools}/cloud_enum/enum_tools/fuzz.txt (missing fuzz => optimized) CLOUD_ENUM_S3_THREADS=20 # Threads used by cloud_enum in s3buckets/cloud enumeration
VULNS_GENERAL=false # Enable or disable the vulnerability module (very intrusive and slow) XSS=true # Check for xss with dalfox TEST_SSL=true # SSL misconfigs SSRF_CHECKS=true # SSRF checks CRLF_CHECKS=true # CRLF checks LFI=true # LFI by fuzzing LFI_MAX_URLS=150 # Max single-parameter LFI candidates to test per target (0 = unlimited) SSTI=true # SSTI by fuzzing SSTI_ENGINE="TInjA" # SSTI engine SQLI=true # Check SQLI SQLMAP=true # Check SQLI with sqlmap GHAURI=false # Check SQLI with ghauri BROKENLINKS=true # Check for brokenlinks BROKENLINKS_ENGINE="second-order" # Broken links engine SPRAY=true # Performs password spraying SPRAY_ENGINE="brutespray" # brutespray|brutus SPRAY_BRUTUS_ONLY_DEEP=true # Run brutus only in DEEP mode unless disabled BRUTUS_USERNAMES="" # Optional comma-separated usernames for brutus BRUTUS_PASSWORDS="" # Optional comma-separated passwords for brutus BRUTUS_KEY_FILE="" # Optional SSH private key path for brutus COMM_INJ=true # Check for command injections with commix SMUGGLING=true # Check for HTTP request smuggling flaws WEBCACHE=true # Check for Web Cache issues WEBCACHE_TOXICACHE=true # Complement web cache checks with toxicache BYPASSER4XX=true # Check for 4XX bypasses FUZZPARAMS=true # Fuzz parameters values
NOTIFICATION=false # Notification for every function SOFT_NOTIFICATION=false # Only for start/end DEEP=false # DEEP mode, really slow and don't care about the number of results DEEP_LIMIT=500 # First limit to not run unless you run DEEP DEEP_LIMIT2=1500 # Second limit to not run unless you run DEEP DIFF=false # Diff function, run every module over an already scanned target, printing only new findings (but save everything) REMOVETMP=false # Delete temporary files after execution (to free up space) REMOVELOG=false # Delete logs after execution PROXY=false # Send to proxy the websites found SENDZIPNOTIFY=false # Send to zip the results (over notify) PRESERVE=true # set to true to avoid deleting the .called_fn files on really large scans FFUF_FLAGS=" -mc all -fc 404 -sf -noninteractive -of json" # Ffuf flags
HEADER="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" # Default header
AVAILABLE_CORES=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) FFUF_THREADS=$((AVAILABLE_CORES * 10)) HTTPX_THREADS=$((AVAILABLE_CORES * 12)) HTTPX_UNCOMMONPORTS_THREADS=$((AVAILABLE_CORES * 25)) KATANA_THREADS=$((AVAILABLE_CORES * 5)) BRUTESPRAY_CONCURRENCE=$((AVAILABLE_CORES * 2)) DNSTAKE_THREADS=$((AVAILABLE_CORES * 25)) DALFOX_THREADS=$((AVAILABLE_CORES * 50)) DNS_RESOLVER=auto # auto|puredns|dnsx (auto: detects NAT/CGNAT → dnsx for home, puredns for VPS) PUREDNS_PUBLIC_LIMIT=0 # Set between 2000 - 10000 if your router blows up, 0 means unlimited PUREDNS_TRUSTED_LIMIT=400 PUREDNS_WILDCARDTEST_LIMIT=30 PUREDNS_WILDCARDBATCH_LIMIT=1500000 DNSX_THREADS=25 # Threads for dnsx when behind NAT (safe for home routers) DNSX_RATE_LIMIT=100 # QPS for dnsx DNSVALIDATOR_THREADS=200 INTERLACE_THREADS=10 LFI_INTERLACE_THREADS=4 # Dedicated interlace concurrency for LFI TLSX_THREADS=1000 XNLINKFINDER_DEPTH=3
HTTPX_RATELIMIT=150 NUCLEI_RATELIMIT=150 FFUF_RATELIMIT=0 LFI_FFUF_THREADS=20 # Dedicated ffuf threads for LFI LFI_FFUF_RATELIMIT=50 # Dedicated ffuf rate limit for LFI
SUBFINDER_ENUM_TIMEOUT=180 # Minutes CMSSCAN_TIMEOUT=3600 # Seconds FFUF_MAXTIME=900 # Seconds LFI_INTERLACE_TIMEOUT=180 # Seconds per LFI interlace worker LFI_FFUF_TIMEOUT=10 # Seconds per LFI HTTP request LFI_FFUF_MAXTIME=90 # Seconds per single LFI ffuf job LFI_FOLLOW_REDIRECTS=false # Follow redirects during LFI fuzzing HTTPX_TIMEOUT=10 # Seconds HTTPX_UNCOMMONPORTS_TIMEOUT=10 # Seconds PERMUTATIONS_LIMIT=21474836480 # Bytes, default is 20 GB DNS_BRUTE_TIMEOUT=0 # timeout/gtimeout duration for DNS bruteforce (0 disables hard-timeout, e.g. 4h) DNS_RESOLVE_TIMEOUT=0 # timeout/gtimeout duration for DNS resolve (0 disables hard-timeout, e.g. 6h) DNS_HEARTBEAT_INTERVAL_SECONDS=20 # Progress heartbeat interval for long DNS jobs
fuzz_wordlist=${WORDLISTS_DIR}/fuzz_wordlist.txt lfi_wordlist=${WORDLISTS_DIR}/lfi_wordlist.txt ssti_wordlist=${WORDLISTS_DIR}/ssti_wordlist.txt subs_wordlist=${WORDLISTS_DIR}/subdomains.txt subs_wordlist_big=${tools}/subdomains_n0kovo_big.txt headers_inject=${WORDLISTS_DIR}/headers_inject.txt resolvers=${tools}/resolvers.txt resolvers_trusted=${tools}/resolvers_trusted.txt
AXIOM_RESOLVERS_PATH="/home/op/lists/resolvers.txt" AXIOM_RESOLVERS_TRUSTED_PATH="/home/op/lists/resolvers_trusted.txt"
AXIOM_FLEET_LAUNCH=true # Enable or disable spin up a new fleet, if false it will use the current fleet with the AXIOM_FLEET_NAME prefix AXIOM_FLEET_NAME="reconFTW" # Fleet's prefix name AXIOM_FLEET_COUNT=10 # Fleet's number AXIOM_FLEET_REGIONS="eu-central" # Fleet's region AXIOM_FLEET_SHUTDOWN=true # # Enable or disable delete the fleet after the execution AXIOM_AUTO_FIX_HOSTKEY=true # Auto-repair known_hosts entries on SSH host-key mismatch before fallback to local mode
#AXIOM_POST_START="~/Tools/axiom_config.sh" # Useful to send your config files to the fleet AXIOM_EXTRA_ARGS="" # Leave empty if you don't want to add extra arguments #AXIOM_EXTRA_ARGS=" --rm-logs" # Example
FARADAY=false # Enable or disable Faraday integration FARADAY_WORKSPACE="reconftw" # Faraday workspace
AI_EXECUTABLE="python3" # Python executable fallback if reconftw_ai venv python is not available AI_MODEL="llama3:8b" # Model to use AI_REPORT_TYPE="md" # Report type to use (md, txt) AI_REPORT_PROFILE="bughunter" # Report profile to use (executive, brief, or bughunter) AI_PROMPTS_FILE="" # Optional custom prompts file (empty uses reconftw_ai default) AI_MAX_CHARS_PER_FILE=50000 # Max chars loaded per file before truncation AI_MAX_FILES_PER_CATEGORY=200 # Max files loaded per category for AI context AI_REDACT=true # Redact sensitive indicators before AI analysis AI_ALLOW_MODEL_PULL=false # Allow reconftw_ai to auto-pull missing model AI_STRICT=false # Fail AI analysis if one or more categories have no data
GRAPHQL_CHECK=true # Detect GraphQL endpoints and introspection GQLSPECTION=false # Run GQLSpection deep introspection on detected GraphQL endpoints (heavier) PARAM_DISCOVERY=true # Parameter discovery with arjun GRPC_SCAN=false # Attempt basic gRPC reflection on common ports LLM_PROBE=false # Probe discovered web/API endpoints for LLM services with julius LLM_PROBE_AUGUSTUS=false # Include augustus generator config in julius output
IPV6_SCAN=true # Attempt IPv6 discovery/portscan where addresses exist
ARJUN_THREADS=10
ASSET_STORE=true # Append assets/findings to assets.jsonl EXPORT_FORMAT="" # Optional exporter at end of scan: json|html|csv|all REPORT_ONLY=false # Rebuild report artifacts from existing results (or use --report-only) QUICK_RESCAN=false # Skip heavy steps if no new subdomains/webs CHUNK_LIMIT=2000 # Split very large lists into chunks (urls, webs) HOTLIST_TOP=50 # Number of top risky assets to highlight
RESOLVER_IQ=false # Prefer fast/healthy resolvers (experimental) PERF_PROFILE="balanced" # low|balanced|max
TIME_EST_NUCLEI=600 TIME_EST_FUZZ=900 TIME_EST_URLCHECKS=300 TIME_EST_JSCHECKS=300 TIME_EST_API=300 TIME_EST_GQL=180 TIME_EST_PARAM=240 TIME_EST_GRPC=120 TIME_EST_IIS=60
bred='\033[1;31m' bblue='\033[1;34m' bgreen='\033[1;32m' byellow='\033[1;33m' red='\033[0;31m' blue='\033[0;34m' green='\033[0;32m' cyan='\033[0;36m' yellow='\033[0;33m' reset='\033[0m'
**Protecciones del resolvedor DNS**:
- Los archivos de resolvedor faltantes/vacíos ahora fallan rápidamente antes de que comience el brute/resolve de DNS.
- Las descargas de resolvedores son configurables con `RESOLVER_DOWNLOAD_CONNECT_TIMEOUT`, `RESOLVER_DOWNLOAD_MAX_TIME`, `RESOLVER_DOWNLOAD_RETRY` y `RESOLVER_DOWNLOAD_RETRY_DELAY`.
- `DNS_BRUTE_TIMEOUT=0` y `DNS_RESOLVE_TIMEOUT=0` deshabilitan el tiempo de espera forzado por defecto (recomendado para conjuntos de objetivos muy grandes). El progreso del heartbeat aún se imprime cada `DNS_HEARTBEAT_INTERVAL_SECONDS`.```bash
DNS_BRUTE_TIMEOUT=4h
DNS_RESOLVE_TIMEOUT=6h
DNS_HEARTBEAT_INTERVAL_SECONDS=20
Detalles completos: Consulte la Guía de configuración.
reconFTW soporta múltiples modos y opciones para un reconocimiento flexible. Use la bandera -h para ver el menú de ayuda.
11. **Forzar actualización de caché**: ```bash
./reconftw.sh -d target.com -r --refresh-cache
13. **Monitoreo continuo (cada 30m, 48 ciclos)**: ```bash
./reconftw.sh -d target.com -r --monitor --monitor-interval 30 --monitor-cycles 48
**Guía completa**: Consulte la [Guía de uso](https://github.com/six2dez/reconftw/wiki/2.-Usage-Guide).
---
## ☁️ Soporte de Ax Framework (anteriormente Axiom)
reconFTW se integra con [Ax](https://github.com/attacksurge/ax) para escaneo distribuido, reduciendo el tiempo de ejecución al distribuir tareas entre múltiples instancias en la nube.
- **Configuración**: Seleccione `reconftw` como provisionador durante la configuración de Ax (`axiom-configure`).
- **Gestión de flotas**: Cree y destruya flotas automáticamente (`AXIOM_FLEET_LAUNCH`, `AXIOM_FLEET_SHUTDOWN`) o use una flota existente.
- **Configuración**: Establezca el tamaño, la región y el nombre de la flota en `reconftw.cfg` (`AXIOM_FLEET_COUNT`, `AXIOM_FLEET_REGIONS`, `AXIOM_FLEET_NAME`).
**Ejemplo**:```bash
./reconftw.sh -d target.com -r -v
Detalles: Consulte la documentación oficial de Ax Docs y el repositorio attacksurge/ax.
reconFTW se integra con Faraday para informes basados en web y gestión de vulnerabilidades.
faraday-cli y configure el espacio de trabajo en reconftw.cfg (FARADAY_WORKSPACE).FARADAY=true en reconftw.cfg.reconFTW utiliza IA para generar informes detallados a partir de los resultados de escaneo con la herramienta reconftw_ai.
llama3:8b mediante AI_MODEL).AI_REPORT_TYPE).AI_REPORT_PROFILE).reconftw almacena un informe legible por máquina en ai_result/reconftw_analysis.json.AI_MAX_CHARS_PER_FILE y AI_MAX_FILES_PER_CATEGORY.AI_REDACT y AI_STRICT.Ejemplo:```yaml AI_EXECUTABLE="python3" AI_MODEL="llama3:8b" AI_REPORT_TYPE="md" AI_REPORT_PROFILE="bughunter" AI_MAX_CHARS_PER_FILE=50000 AI_MAX_FILES_PER_CATEGORY=200 AI_REDACT=true AI_ALLOW_MODEL_PULL=false AI_STRICT=false
## 🗂️ Gestión de Datos
Administre los datos de escaneo y las claves API de forma segura utilizando un repositorio privado.
Cuando `ASSET_STORE=true`, reconFTW agrega los hallazgos clave en `assets.jsonl` durante cada ejecución, facilitando la sincronización de solo los deltas accionables a su repositorio privado.
### Makefile
Utilice el `Makefile` proporcionado para una gestión sencilla del repositorio (requiere [GitHub CLI](https://cli.github.com/)).
1. **Bootstrap**: ```bash
export PRIV_REPO="$HOME/reconftw-data"
make bootstrap
reconFTW utiliza bats-core para pruebas automatizadas.
brew install bats-core
apt install bats
git clone https://github.com/bats-core/bats-core.git /tmp/bats sudo /tmp/bats/install.sh /usr/local
### Ejecutando Pruebas```bash
# Unit tests only
make test
# Unit + integration tests
make test-all
# Via the runner script
./tests/run_tests.sh # unit only
./tests/run_tests.sh --all # unit + integration
tests/ ├── run_tests.sh # Test runner script ├── unit/ # Unit tests (fast, no network) │ ├── test_sanitize.bats │ ├── test_utils.bats │ └── test_validation.bats ├── integration/ # Integration tests (require installed tools) │ └── test_smoke.bats ├── security/ # Security tests (injection, etc.) │ └── test_injection.bats ├── mocks/ # Mock tools for offline testing └── fixtures/ # Shared test data files
### Ejecutando Pruebas de Seguridad```bash
# Test command injection prevention
make test-security
# Or directly
bats tests/security/
Las pruebas usan el patrón --source-only para cargar funciones sin ejecutar el script principal:```bash
#!/usr/bin/env bats
setup() { source ./reconftw.sh --source-only }
@test "sanitize_domain strips invalid chars" { result="$(sanitize_domain 'exam;ple.com')" [ "$result" = "example.com" ] }
### Tubería de CI
El flujo de trabajo de GitHub Actions (`.github/workflows/tests.yml`) se ejecuta en cada push y pull request:
1. **ShellCheck** — analiza `reconftw.sh`, `modules/*.sh` e `install.sh`
2. **Pruebas unitarias** — ejecuta todos los archivos `tests/unit/*.bats`
3. **Pruebas de integración** — instala reconFTW y valida la disponibilidad de las herramientas
---
## Mapa mental/Flujo de trabajo

---
## Video de muestra

---
## 🤝 Cómo contribuir
Consulta [CONTRIBUTING.md](https://github.com/six2dez/reconftw/blob/HEAD/CONTRIBUTING.md) para la guía completa de contribución, que incluye configuración de desarrollo, estilo de código, pruebas y proceso de PR.
Enlaces rápidos:
- [Reportar un error](https://github.com/six2dez/reconftw/issues/new/choose)
- [Enviar un Pull Request](https://github.com/six2dez/reconftw/tree/dev) (dirigido a la rama `dev`)
- [Código de conducta](https://github.com/six2dez/reconftw/blob/HEAD/CODE_OF_CONDUCT.md)
---
## 🔒 Seguridad
Para la política de seguridad, gestión de secretos y reporte de vulnerabilidades, consulta [SECURITY.md](https://github.com/six2dez/reconftw/blob/HEAD/SECURITY.md).
---
## ❓ ¿Necesitas ayuda?
- **Wiki**: Explora la [Wiki de reconFTW](https://github.com/six2dez/reconftw/wiki).
- **FAQ**: Revisa las [FAQ](https://github.com/six2dez/reconftw/wiki/7.-FAQs).
- **Comunidad**: Únete al [servidor de Discord](https://discord.gg/R5DdXVEdTy) o al [grupo de Telegram](https://t.me/joinchat/TO_R8NYFhhbmI5co).
---
## 💖 Apoya este proyecto
Apoya el desarrollo de reconFTW a través de:
- **Buy Me a Coffee**: [buymeacoffee.com/six2dez](https://www.buymeacoffee.com/six2dez)
[<img src="https://assets.kitploit.com/production/public/readmes/670/1177bf77de4c288d45b816dd405a8b5027116f0b1893449986cf200c765707ad.webp">](https://www.buymeacoffee.com/six2dez)
- **Referido de DigitalOcean**: [Enlace de referido](https://www.digitalocean.com/?refcode=f362a6e193a1&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge)
<a href="https://www.digitalocean.com/?refcode=f362a6e193a1&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="https://web-platforms.sfo2.cdn.digitaloceanspaces.com/WWW/Badge%201.svg" alt="Insignia de referido de DigitalOcean" /></a>
- **Patrocinio en GitHub**: [github.com/sponsors/six2dez](https://github.com/sponsors/six2dez)
---
## 🙏 Agradecimientos
Agradecimientos especiales a los siguientes servicios por apoyar a reconFTW:
- [C99](https://api.c99.nl/)
- [CIRCL](https://www.circl.lu/)
- [NetworksDB](https://networksdb.io/)
- [ipinfo](https://ipinfo.io/)
- [hackertarget](https://hackertarget.com/)
- [Censys](https://censys.io/)
- [Fofa](https://fofa.info/)
- [intelx](https://intelx.io/)
- [Whoxy](https://www.whoxy.com/)
---
## 📝 Registro de cambios
Consulta [CHANGELOG.md](https://github.com/six2dez/reconftw/blob/HEAD/CHANGELOG.md) para una lista detallada de cambios en cada versión.
---
## 🛠️ Desarrollo
### Estructura del proyecto```
reconftw/
├── reconftw.sh # Main entry point (~500 lines)
├── reconftw.cfg # Configuration file
├── modules/ # Phase modules
│ ├── utils.sh # Utilities, sanitization, caching, circuit breaker
│ ├── core.sh # Framework core, logging, lifecycle, health check
│ ├── modes.sh # Scan modes, argument parsing
│ ├── subdomains.sh # Subdomain enumeration
│ ├── web.sh # Web analysis, nuclei scans
│ ├── vulns.sh # Vulnerability scanning
│ ├── osint.sh # OSINT functions
│ └── axiom.sh # Ax/Axiom fleet helpers
├── lib/ # Pure utility libraries
│ └── validation.sh # Input validation functions
├── tests/ # Test suite (100+ tests)
│ ├── unit/ # Unit tests (bats)
│ ├── integration/ # Integration/smoke tests
│ └── security/ # Injection prevention tests
├── docs/ # Documentation
│ └── ARCHITECTURE.md # Detailed architecture guide
└── secrets.cfg.example # Template for API keys
make test # Unit tests make test-security # Security tests make test-all # All tests make lint # Shellcheck make lint-fix # Auto-fix with shfmt
### Flujo de trabajo de desarrollo```bash
# 1. Source without executing (for testing)
source ./reconftw.sh --source-only
# 2. Test individual functions
sanitize_domain "test;domain.com"
# 3. Run health check
./reconftw.sh --health-check
# 4. Dry run to preview
./reconftw.sh -d example.com -r --dry-run
Consulte CONTRIBUTING.md para las pautas de desarrollo y docs/ARCHITECTURE.md para los detalles técnicos.
reconFTW está licenciado bajo la Licencia MIT.
cloudhunter_* heredados se eliminaron; usa subdomains/cloud_enum_buckets_trufflehog.txt en su lugar.ws:// y wss://.assets.jsonl para automatización posterior cuando ASSET_STORE está habilitado.report/report.json y report/index.html al final del escaneo.--health-check (también usado por Docker HEALTHCHECK).--incremental).--adaptive-rate).STRUCTURED_LOGGING).--dry-run).--parallel, desactivar con --no-parallel).secrets.cfg y secretos en tiempo de ejecución de Docker (ver SECURITY.md).INCREMENTAL_MODE).NOTIFY_CONFIG).AXIOM_FLEET_NAME, AXIOM_FLEET_COUNT, AXIOM_RESOLVERS_PATH).AI_MODEL, AI_REPORT_PROFILE, AI_REPORT_TYPE, AI_MAX_CHARS_PER_FILE).QUICK_RESCAN, ASSET_STORE, CHUNK_LIMIT, HOTLIST_TOP, SHOW_COMMANDS).MIN_DISK_SPACE_GB), rotación de registros (MAX_LOG_FILES, MAX_LOG_AGE_DAYS), registro estructurado JSON (STRUCTURED_LOGGING).CACHE_MAX_AGE_DAYS).RESOLVER_DOWNLOAD_*), y el tiempo de espera de fuerza bruta/resolución DNS por defecto está deshabilitado (DNS_*_TIMEOUT=0) con progreso de latido.secrets.cfg para sobrescrituras locales o variables de entorno para CI/Docker (ver SECURITY.md).| Flag | Descripción |
|---|
-d | Dominio objetivo único (ej., example.com) |
-l | Archivo con lista de dominios objetivo (uno por línea) |
-m | Objetivo de múltiples dominios (ej., nombre de empresa para dominios relacionados) |
-x | Excluir subdominios (lista fuera del alcance) |
-i | Incluir subdominios (lista dentro del alcance) |
| Flag | Descripción |
|---|
-r | Recon: Reconocimiento completo sin ataques activos |
-s | Subdominios: Enumeración de subdominios, sondeo web y tomas de control |
-p | Pasivo: Solo reconocimiento pasivo |
-a | Todo: Reconocimiento completo más comprobaciones activas de vulnerabilidades |
-w | Web: Comprobaciones de vulnerabilidades en objetivos web específicos |
-n | OSINT: Escaneo OSINT sin enumeración de subdominios ni ataques |
-z | Zen: Reconocimiento ligero con comprobaciones básicas y algunas vulnerabilidades |
-c | Personalizado: Ejecutar una función específica (requiere argumentos adicionales) |
-h | Mostrar menú de ayuda |
| Flag | Descripción |
|---|
--deep | Habilitar escaneo profundo (más lento, se recomienda VPS) |
-f | Ruta personalizada del archivo de configuración |
-o | Directorio de salida para resultados |
-v | Habilitar escaneo distribuido Ax |
--vps-count | Sobrescribir el número de instancias de flota Ax para esta ejecución |
-q | Establecer límite de velocidad (solicitudes por segundo) |
-y | Habilita el análisis de resultados con IA |
--check-tools | Salir si faltan herramientas requeridas |
--quick-rescan | Omitir módulos pesados cuando no se encuentran nuevos subdominios/sitios web |
--health-check | Ejecutar verificación de salud del sistema y salir |
--incremental | Solo escanear nuevos hallazgos desde la última ejecución |
--adaptive-rate | Ajustar automáticamente los límites de velocidad en errores (429/503) |
--dry-run | Mostrar lo que se ejecutaría sin ejecutar comandos |
--parallel | Ejecutar funciones independientes en paralelo (más rápido, más RAM) |
--no-parallel | Forzar ejecución secuencial incluso si el paralelo está habilitado |
--monitor | Modo de monitoreo continuo (objetivo único; -w soporta -l) |
--monitor-interval | Minutos entre ciclos de monitoreo |
--monitor-cycles | Detener después de N ciclos (0 = infinito) |
--report-only | Reconstruir artefactos de informe sin escanear |
--refresh-cache | Forzar actualización de resolutores/listas de palabras en caché |
--export | Exportar artefactos: json, html, csv o all |