
Interface utilisateur terminal pour parcourir et rejouer les journaux AWS WAF v2 depuis CloudWatch, S3 et l'API d'échantillonnage, avec filtrage YAML, détection d'authentification et rejeu via curl/navigateur.
Navigateur et rejoueur de journaux AWS WAF v2 avec une TUI interactive. Récupère les journaux depuis CloudWatch, S3 et l'API d'échantillonnage WAF (avec mise en cache SQLite), les affiche dans une interface terminal à volets divisés avec détection d'authentification et filtrage basé sur YAML, et rejoue les requêtes via Firefox, Chrome ou curl avec une fidélité complète des en-têtes/cookies/corps. Prend en charge l'export par lots vers curl, JSON et HAR.
uv pip install waf-fu
pipx install waf-fu
uv pip install git+https://gitrdun.trustedsec.net/cloud/aws/waf-fu.git
pipx install git+https://gitrdun.trustedsec.net/cloud/aws/waf-fu.git
git clone https://gitrdun.trustedsec.net/cloud/aws/waf-fu.git
cd waf-fu
uv pip install .
pipx install .
Le fichier uv.toml inclus configure uv pip pour installer dans le Python
système plutôt que de créer un virtualenv. pipx et uv tool install
utilisent toujours leurs propres environnements isolés.
Python >= 3.12
Identifiants AWS configurés via profil, variables d'environnement ou rôle d'instance. Voir Permissions IAM pour les prérequis par source.
| Paquet | Version min | Requis pour |
|---|---|---|
| boto3 | any | Récupération des journaux AWS |
| selenium | 4.26 | Rejeu Chrome et Firefox |
| trio | any | Internes du rejeu Chrome CDP |
boto3 et selenium sont déclarés dans pyproject.toml et installés
automatiquement. trio est une dépendance transitive du backend Chrome.
Le rejeu navigateur est optionnel. Le rejeu curl fonctionne sans dépendance supplémentaire.
Firefox (recommandé pour la fidélité des en-têtes) :
| Composant | Version min | Installation |
|---|---|---|
| Firefox | 120 | sudo dnf install firefox / sudo apt install firefox |
| geckodriver | 0.35.0 | sudo dnf install geckodriver / sudo apt install firefox-geckodriver ou github.com/mozilla/geckodriver/releases (>= 0.35.0) |
| selenium | 4.26 | uv pip install 'selenium>=4.26' |
Le rejeu Firefox utilise l'interception réseau WebDriver BiDi pour injecter la méthode, les en-têtes, les cookies et le corps de la requête d'origine. Le support réseau BiDi nécessite geckodriver >= 0.35 et selenium >= 4.26. Les versions antérieures se rabattent sur une approche basée sur XHR qui ne peut pas injecter d'en-têtes personnalisés.
Chrome / Chromium :
| Composant | Version min | Installation |
|---|---|---|
| Chrome | 118 | sudo dnf install google-chrome-stable / sudo apt install google-chrome-stable ou Chromium |
| chromedriver | 118 | sudo dnf install chromedriver / sudo apt install chromium-driver ou googlechromelabs.github.io/chrome-for-testing |
| selenium | 4.26 | uv pip install 'selenium>=4.26' |
Le rejeu Chrome utilise le domaine Fetch de CDP (Chrome DevTools Protocol) pour intercepter et modifier les requêtes. La méthode, les en-têtes, le corps et les cookies sont tous injectés via CDP.
Les chemins des pilotes peuvent être remplacés avec --chromedriver PATH et
--geckodriver PATH si la détection automatique ne trouve pas le bon binaire.
# TUI interactive -- parcourir et rejouer
waf-fu --log-group "aws-waf-logs-my-acl"
# Pas de groupe de journaux -- sélection interactive parmi les groupes découverts
waf-fu --profile myprofile --region us-east-1
# Journaux WAF S3 au lieu de CloudWatch
waf-fu --s3-bucket aws-waf-logs-my-bucket
# Découvrir et récupérer toutes les sources de journaux dans toutes les régions
waf-fu --inventory
# Pré-filtrer avant l'ouverture de la TUI
waf-fu --start 4h --action BLOCK
# Mode hors ligne -- enregistrements en cache uniquement, aucun appel AWS
waf-fu --db-only
# Rejouer via un proxy (Burp, mitmproxy, etc.)
waf-fu --log-group "aws-waf-logs-my-acl" --proxy 127.0.0.1:8080
# Export par lots non interactif
waf-fu --log-group "aws-waf-logs-my-acl" --mode batch-curl -o replay.sh
# Exporter les enregistrements en cache vers JSON
waf-fu --export logs.json
# Mode débogage -- journaliser les détails du rejeu dans un fichier (données client expurgées)
waf-fu --log-group "aws-waf-logs-my-acl" --debug
waf-fu récupère les journaux WAF depuis trois sources et les fusionne par requête :
| Source | Option CLI | Données |
|---|---|---|
| CloudWatch | --log-group (par défaut) | JSON complet du journal WAF (en-têtes, URI, requête, action) |
| S3 | --s3-bucket | Identique à CloudWatch, depuis la livraison S3 |
| API WAF | --log-location waf | Requêtes échantillonnées avec champs non expurgés |
Utilisez --log-location cwl|s3|waf pour restreindre à une seule source, ou
--inventory pour découvrir et récupérer automatiquement toutes les sources dans toutes les régions.
Les enregistrements de différentes sources sont fusionnés par clé de corrélation afin que vous voyiez une vue unifiée unique par requête, avec les données les plus riches de chacune.
Chaque source nécessite ses propres permissions IAM, limitées aux options CLI qui la déclenchent.
Requis pour : opération par défaut, --log-location cwl
logs:FilterLogEvents -- récupérer les enregistrements de journaux depuis CloudWatchlogs:DescribeLogGroups -- découvrir les groupes de journaux correspondant à aws-waf-logs-*Requis pour : --s3-bucket, --log-location s3, --inventory
s3:ListAllMyBuckets -- découvrir les buckets de journaux WAF par préfixe de noms3:ListBucket -- lister les objets de journaux dans un bucket de journaux WAFs3:GetObject -- télécharger les fichiers de journaux compressés en gzipRequis pour : --log-location waf, --inventory, enrichissement automatique
wafv2:ListWebACLs -- découvrir les web ACLswafv2:GetWebACL -- énumérer les règles pour les requêtes de demandes échantillonnéeswafv2:GetLoggingConfiguration -- découvrir quelles destinations de journaux (CWL, S3) une ACL utilisewafv2:GetSampledRequests -- récupérer des échantillons de requêtes non expurgés (contourne RedactedFields)Minimum viable : seules les permissions CloudWatch Logs sont requises. Les permissions S3 et WAFv2 sont optionnelles et activent des sources de données supplémentaires. L'outil se rabat gracieusement lorsque les permissions sont manquantes.