
reconFTW est un outil conçu pour effectuer des reconnaissances automatisées sur un domaine cible en exécutant le meilleur ensemble d'outils pour réaliser des scans et découvrir des vulnérabilités.
reconFTW est un outil de reconnaissance automatisé puissant conçu pour les chercheurs en sécurité et les testeurs d'intrusion. Il rationalise le processus de collecte de renseignements sur une cible en effectuant une énumération de sous-domaines, une analyse de vulnérabilités, des opérations OSINT et plus encore. Grâce à une conception modulaire, des options de configuration étendues et le support des scans distribués via AX Framework, reconFTW est conçu pour fournir des résultats complets et efficaces.
reconFTW exploite un large éventail de techniques, notamment la découverte passive et active de sous-domaines, les vérifications de vulnérabilités web (par ex., XSS, SSRF, SQLi), l'OSINT, le fuzzing de répertoires, le scan de ports et la capture d'écran. Il s'intègre avec des outils et API de pointe pour maximiser la couverture et la précision, vous assurant de rester en tête dans vos efforts de reconnaissance.
Fonctionnalités clés :
Avertissement : L'utilisation de reconFTW pour attaquer des cibles sans consentement préalable est illégale. Il est de la responsabilité de l'utilisateur de respecter toutes les lois applicables. Les développeurs déclinent toute responsabilité en cas d'utilisation abusive ou de dommages causés par cet outil. Utilisez-le de manière responsable.
reconFTW regorge de fonctionnalités pour rendre la reconnaissance complète et efficace. Vous trouverez ci-dessous une ventilation détaillée de ses capacités, mise à jour pour refléter les dernières fonctionnalités du script et de la configuration.
IPV6_SCAN est activé.nuclei -dast sur les URL collectées et les candidats GF pour une couverture DAST supplémentaire.--quick-rescan / QUICK_RESCAN).hotlist.txt) en fonction des nouvelles découvertes.SHOW_COMMANDS pour journaliser chaque commande exécutée dans les journaux cibles pour le débogage.reconFTW utilise une architecture modulaire. Le point d’entrée principal (reconftw.sh) gère l’analyse des arguments et charge 8 modules spécialisés depuis le répertoire 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
### Référence des modules
| Module | Lignes | Objectif |
|--------|------:|---------|
| `core.sh` | 1024 | Gestion du cycle de vie, journalisation, notifications, pièges de nettoyage |
| `modes.sh` | 902 | Définitions des modes de scan, analyse des arguments, sortie d'aide |
| `subdomains.sh` | 1938 | Toutes les fonctions d'énumération de sous-domaines |
| `web.sh` | 1712 | Analyse web, fuzzing, analyse JS, détection CMS |
| `vulns.sh` | 926 | Scan de vulnérabilités (XSS, SQLi, SSRF, etc.) |
| `osint.sh` | 500 | Fonctions OSINT (WHOIS, emails, dorks, métadonnées) |
| `utils.sh` | 508 | Utilitaires partagés, nettoyage des entrées, validation |
| `axiom.sh` | 143 | Gestion de flotte distribuée Ax/Axiom |
Le flag `--source-only` permet de sourcer `reconftw.sh` sans exécuter la logique principale, permettant les tests unitaires de fonctions individuelles.
---
## 💿 Installation
reconFTW prend en charge plusieurs méthodes d'installation adaptées à différents environnements. Assurez-vous de disposer d'un espace disque suffisant (au moins 10 Go recommandé) et d'une connexion Internet stable.
### Quickstart
1) Clonez et installez```yaml
git clone https://github.com/six2dez/reconftw
cd reconftw
./install.sh --verbose
3) Exécution minimale (empreinte passive uniquement)```bash
./reconftw.sh -d example.com -p
Astuce : exécutez à nouveau
./install.sh --toolsplus tard pour actualiser la chaîne d'outils sans réinstaller les paquets système.
Prérequis :
install_golang activé par défaut dans reconftw.cfg).sudo echo "${USERNAME} ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/reconFTW
Étapes : ```bash git clone https://github.com/six2dez/reconftw cd reconftw ./install.sh ./reconftw.sh -d target.com -r
Notes:
install.sh installe les dépendances, les outils et configure les chemins (GOROOT, GOPATH, PATH).install_golang=false dans reconftw.cfg si Golang est déjà configuré../install.sh --tools pour actualiser les binaires Go, les paquets pipx et les dépôts sans toucher aux paquets système.Pour une liste de cibles, montez le fichier de liste dans le conteneur et faites référence au chemin à l'intérieur du conteneur : ```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. **Voir les résultats** :
- Les résultats sont enregistrés dans le répertoire `OutputFolder` sur l'hôte (pas à l'intérieur du conteneur).
4. **Personnalisation** :
- Modifiez l'image Docker ou construisez la vôtre ; voir le [Guide Docker](https://github.com/six2dez/reconftw/wiki/4.-Docker).
- Pour ignorer l'outillage Ax dans les constructions personnalisées, passez `--build-arg INSTALL_AXIOM=false`.
- Montez votre configuration notify dans `~/.config/notify/provider-config.yaml` à l'intérieur du conteneur si vous utilisez les notifications.
5. **Secrets au moment de l'exécution** :
Passez les clés API et les secrets via des variables d'environnement — ne les intégrez jamais dans l'image : ```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
Voir SECURITY.md pour les instructions complètes sur la gestion des secrets.
Vérification de l'état de santé:
L'image Docker inclut un HEALTHCHECK intégré qui exécute ./reconftw.sh --health-check toutes les 60 secondes. Vous pouvez également l'exécuter manuellement : ```bash
docker exec ./reconftw.sh --health-check
brew install bash, ouvrez un nouveau terminal, et relancez ./install.sh.gtimeout via brew install coreutils. Les scripts le détectent et l'utilisent désormais automatiquement.upgrade_tools=true dans reconftw.cfg, exécutez ./install.sh --tools, ou installez manuellement l'outil manquant (l'erreur le nommera)./usr/local/bin. Si vous préférez ne pas le faire, assurez-vous que ~/go/bin est dans votre PATH.~/nuclei-templates et relancez ./install.sh.subfinder : ~/.config/subfinder/provider-config.yaml~/Tools/.github_tokens (un par ligne)~/Tools/.gitlab_tokens (un par ligne)WHOISXML_API dans reconftw.cfg ou en variable d'environnementasnmap) : définissez PDCP_API_KEY dans l'environnement/la configuration (ASN_ENUM ignoré si non défini)notify dans ~/.config/notify/provider-config.yamlCOLLAB_SERVER dans env/cfg si utiliséXSS_SERVER dans env/cfg si utiliséshellcheck et shfmt (optionnels) pour make lint/make fmtLe fichier reconftw.cfg contrôle l'intégralité de l'exécution de reconFTW. Il permet une personnalisation fine de :
tools, resolvers, fuzz_wordlist).secrets.cfg (voir SECURITY.md).OSINT, SUBDOMAINS_GENERAL, VULNS_GENERAL).FFUF_THREADS, HTTPX_RATELIMIT).ADAPTIVE_RATE_LIMIT, MIN_RATE_LIMIT, MAX_RATE_LIMIT).Exemple de configuration :```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'
**Gardes-fous du résolveur DNS** :
- Les fichiers de résolveur manquants/vides échouent maintenant rapidement avant que le brute/résolution DNS ne commence.
- Les téléchargements de résolveur sont configurables avec `RESOLVER_DOWNLOAD_CONNECT_TIMEOUT`, `RESOLVER_DOWNLOAD_MAX_TIME`, `RESOLVER_DOWNLOAD_RETRY` et `RESOLVER_DOWNLOAD_RETRY_DELAY`.
- `DNS_BRUTE_TIMEOUT=0` et `DNS_RESOLVE_TIMEOUT=0` désactivent le timeout strict par défaut (recommandé pour de très grands ensembles de cibles). La progression du heartbeat continue de s'afficher toutes les `DNS_HEARTBEAT_INTERVAL_SECONDS`.```bash
DNS_BRUTE_TIMEOUT=4h
DNS_RESOLVE_TIMEOUT=6h
DNS_HEARTBEAT_INTERVAL_SECONDS=20
Détails complets : Voir le Guide de configuration.
reconFTW prend en charge plusieurs modes et options pour une reconnaissance flexible. Utilisez l'option -h pour afficher le menu d'aide.
11. **Forcer le rafraîchissement du cache** : ```bash
./reconftw.sh -d target.com -r --refresh-cache
13. **Surveillance continue (toutes les 30 minutes, 48 cycles)** : ```bash
./reconftw.sh -d target.com -r --monitor --monitor-interval 30 --monitor-cycles 48
**Guide complet** : Voir le [Guide d'utilisation](https://github.com/six2dez/reconftw/wiki/2.-Usage-Guide).
---
## ☁️ Support de l'Ax Framework (anciennement Axiom)
reconFTW s'intègre avec [Ax](https://github.com/attacksurge/ax) pour le scan distribué, réduisant le temps d'exécution en répartissant les tâches sur plusieurs instances cloud.
- **Configuration** : Sélectionnez `reconftw` comme provisionneur lors de la configuration d'Ax (`axiom-configure`).
- **Gestion des flottes** : Créez et détruisez automatiquement des flottes (`AXIOM_FLEET_LAUNCH`, `AXIOM_FLEET_SHUTDOWN`) ou utilisez une flotte existante.
- **Configuration** : Définissez la taille, la région et le nom de la flotte dans `reconftw.cfg` (`AXIOM_FLEET_COUNT`, `AXIOM_FLEET_REGIONS`, `AXIOM_FLEET_NAME`).
**Exemple** :```bash
./reconftw.sh -d target.com -r -v
Détails : Voir la documentation officielle d'Ax et le dépôt attacksurge/ax.
reconFTW s'intègre avec Faraday pour le reporting Web et la gestion des vulnérabilités.
faraday-cli et configurer l'espace de travail dans reconftw.cfg (FARADAY_WORKSPACE).FARADAY=true dans reconftw.cfg.reconFTW utilise l'IA pour générer des rapports détaillés à partir des résultats de scan avec l'outil reconftw_ai.
llama3:8b via AI_MODEL).AI_REPORT_TYPE).AI_REPORT_PROFILE).reconftw stocke un rapport lisible par machine dans ai_result/reconftw_analysis.json.AI_MAX_CHARS_PER_FILE et AI_MAX_FILES_PER_CATEGORY.AI_REDACT et AI_STRICT.Exemple :```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
---
## 🗂️ Gestion des données
Gérez les données de scan et les clés API de manière sécurisée en utilisant un dépôt privé.
Lorsque `ASSET_STORE=true`, reconFTW agrège les résultats clés dans `assets.jsonl` lors de chaque exécution, facilitant la synchronisation des seuls deltas exploitables vers votre dépôt privé.
### Makefile
Utilisez le `Makefile` fourni pour une gestion facile du dépôt (nécessite [GitHub CLI](https://cli.github.com/)).
1. **Amorçage** : ```bash
export PRIV_REPO="$HOME/reconftw-data"
make bootstrap
reconFTW utilise bats-core pour les tests automatisés.
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
### Exécution des tests```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
### Exécution des tests de sécurité```bash
# Test command injection prevention
make test-security
# Or directly
bats tests/security/
Les tests utilisent le motif --source-only pour charger les fonctions sans exécuter le 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" ] }
### Pipeline CI
Le workflow GitHub Actions (`.github/workflows/tests.yml`) s'exécute à chaque push et pull request :
1. **ShellCheck** — vérifie `reconftw.sh`, `modules/*.sh` et `install.sh`
2. **Tests unitaires** — exécute tous les fichiers `tests/unit/*.bats`
3. **Tests d'intégration** — installe reconFTW et valide la disponibilité des outils
---
## Mindmap/Workflow

---
## Vidéo d'exemple

---
## 🤝 Comment contribuer
Consultez [CONTRIBUTING.md](https://github.com/six2dez/reconftw/blob/HEAD/CONTRIBUTING.md) pour le guide complet de contribution, incluant la configuration de développement, le style de code, les tests et le processus de PR.
Liens rapides :
- [Signaler un bug](https://github.com/six2dez/reconftw/issues/new/choose)
- [Soumettre une Pull Request](https://github.com/six2dez/reconftw/tree/dev) (cibler la branche `dev`)
- [Code de conduite](https://github.com/six2dez/reconftw/blob/HEAD/CODE_OF_CONDUCT.md)
---
## 🔒 Sécurité
Pour la politique de sécurité, la gestion des secrets et le signalement des vulnérabilités, consultez [SECURITY.md](https://github.com/six2dez/reconftw/blob/HEAD/SECURITY.md).
---
## ❓ Besoin d'aide ?
- **Wiki** : Explorez le [Wiki de reconFTW](https://github.com/six2dez/reconftw/wiki).
- **FAQ** : Consultez la [FAQ](https://github.com/six2dez/reconftw/wiki/7.-FAQs).
- **Communauté** : Rejoignez le [serveur Discord](https://discord.gg/R5DdXVEdTy) ou le [groupe Telegram](https://t.me/joinchat/TO_R8NYFhhbmI5co).
---
## 💖 Soutenir ce projet
Soutenez le développement de reconFTW via :
- **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)
- **Parrainage DigitalOcean** : [Lien de parrainage](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="DigitalOcean Referral Badge" /></a>
- **Sponsorisation GitHub** : [github.com/sponsors/six2dez](https://github.com/sponsors/six2dez)
---
## 🙏 Remerciements
Remerciements particuliers aux services suivants pour leur soutien à 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/)
---
## 📝 Journal des modifications
Consultez [CHANGELOG.md](https://github.com/six2dez/reconftw/blob/HEAD/CHANGELOG.md) pour une liste détaillée des changements dans chaque version.
---
## 🛠️ Développement
### Structure du projet```
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
### Flux de développement```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
Consultez CONTRIBUTING.md pour les directives de développement et docs/ARCHITECTURE.md pour les détails techniques.
reconFTW est sous licence MIT License.
cloudhunter_* hérités ont été supprimés ; utilisez subdomains/cloud_enum_buckets_trufflehog.txt à la place.ws:// et wss://.assets.jsonl pour l’automatisation en aval lorsque ASSET_STORE est activé.report/report.json et report/index.html à la fin de l’analyse.--health-check (également utilisée par Docker HEALTHCHECK).--incremental).--adaptive-rate).STRUCTURED_LOGGING).--dry-run).--parallel, désactivable avec --no-parallel).secrets.cfg et secrets d’exécution Docker (voir 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), rotation des journaux (MAX_LOG_FILES, MAX_LOG_AGE_DAYS), journalisation JSON structurée (STRUCTURED_LOGGING).CACHE_MAX_AGE_DAYS).RESOLVER_DOWNLOAD_*), et le timeout DNS brute/résolution est désactivé par défaut (DNS_*_TIMEOUT=0) avec une progression par battement de cœur.secrets.cfg pour les surcharges locales ou les variables d'environnement pour CI/Docker (voir SECURITY.md).| Flag | Description |
|---|
-d | Domaine cible unique (ex. example.com) |
-l | Fichier contenant une liste de domaines cibles (un par ligne) |
-m | Cible multi-domaines (ex. nom d'entreprise pour les domaines associés) |
-x | Exclure les sous-domaines (liste hors périmètre) |
-i | Inclure les sous-domaines (liste dans le périmètre) |
| Flag | Description |
|---|
-r | Recon : Reconnaissance complète sans attaques actives |
-s | Subdomains : Énumération des sous-domaines, sondage web et prises de contrôle |
-p | Passive : Reconnaissance passive uniquement |
-a | All : Reconnaissance complète avec vérifications de vulnérabilités actives |
-w | Web : Vérifications de vulnérabilités sur des cibles web spécifiques |
-n | OSINT : Scan OSINT sans énumération de sous-domaines ni attaques |
-z | Zen : Reconnaissance légère avec vérifications de base et quelques vulnérabilités |
-c | Custom : Exécuter une fonction spécifique (nécessite des arguments supplémentaires) |
-h | Afficher le menu d'aide |
| Flag | Description |
|---|
--deep | Activer l'analyse approfondie (plus lent, VPS recommandé) |
-f | Chemin du fichier de configuration personnalisé |
-o | Répertoire de sortie pour les résultats |
-v | Activer l'analyse distribuée Ax |
--vps-count | Remplacer le nombre d'instances de la flotte Ax pour cette exécution |
-q | Définir la limite de débit (requêtes par seconde) |
-y | Active l'analyse des résultats par IA |
--check-tools | Quitter si les outils requis sont manquants |
--quick-rescan | Ignorer les modules lourds lorsqu'aucun nouveau sous-domaine/site web n'est trouvé |
--health-check | Exécuter une vérification de l'état du système et quitter |
--incremental | Analyser uniquement les nouvelles découvertes depuis la dernière exécution |
--adaptive-rate | Ajuster automatiquement les limites de débit en cas d'erreurs (429/503) |
--dry-run | Afficher ce qui serait exécuté sans lancer les commandes |
--parallel | Exécuter les fonctions indépendantes en parallèle (plus rapide, plus de RAM) |
--no-parallel | Forcer l'exécution séquentielle même si le parallèle est activé |
--monitor | Mode de surveillance continue (cible unique ; -w prend en charge -l) |
--monitor-interval | Minutes entre les cycles de surveillance |
--monitor-cycles | Arrêter après N cycles (0 = infini) |
--report-only | Reconstruire les artefacts de rapport sans analyse |
--refresh-cache | Forcer l'actualisation des résolveurs/listes de mots en cache |
--export | Exporter les artefacts : json, html, csv ou all |