AWS WAF v2 日志浏览器与重放器,带交互式 TUI。从 CloudWatch、S3 和 WAF 采样 API 拉取日志(带 SQLite 缓存),在分屏终端 UI 中显示,支持认证检测和基于 YAML 的过滤,并通过 Firefox、Chrome 或 curl 重放请求,完整保留 header/cookie/body。支持批量导出为 curl、JSON 和 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 .
附带的 uv.toml 将 uv pip 配置为安装到系统 Python,而不是创建 virtualenv。pipx 和 uv tool install 始终使用它们自己的隔离环境。
Python >= 3.12
AWS 凭证通过 profile、环境变量或实例角色配置。各数据源的要求见 IAM 权限。
| 包 | 最低版本 | 用途 |
|---|---|---|
| boto3 | 任意 | AWS 日志获取 |
| selenium | 4.26 | Chrome 和 Firefox 重放 |
| trio | 任意 | Chrome CDP 重放内部实现 |
boto3 和 selenium 在 pyproject.toml 中声明并自动安装。trio 是 Chrome 后端的传递依赖。
浏览器重放是可选的。Curl 重放无需额外依赖即可工作。
Firefox(推荐用于 header 保真):
| 组件 | 最低版本 | 安装 |
|---|---|---|
| Firefox | 120 | sudo dnf install firefox / sudo apt install firefox |
| geckodriver | 0.35.0 | sudo dnf install geckodriver / sudo apt install firefox-geckodriver 或 github.com/mozilla/geckodriver/releases(>= 0.35.0) |
| selenium | 4.26 | uv pip install 'selenium>=4.26' |
Firefox 重放使用 WebDriver BiDi 网络拦截来注入原始请求的方法、header、cookie 和 body。BiDi 网络支持需要 geckodriver >= 0.35 和 selenium >= 4.26。较旧版本会回退到基于 XHR 的方法,无法注入自定义 header。
Chrome / Chromium:
| 组件 | 最低版本 | 安装 |
|---|---|---|
| Chrome | 118 | sudo dnf install google-chrome-stable / sudo apt install google-chrome-stable 或 Chromium |
| chromedriver | 118 | sudo dnf install chromedriver / sudo apt install chromium-driver 或 googlechromelabs.github.io/chrome-for-testing |
| selenium | 4.26 | uv pip install 'selenium>=4.26' |
Chrome 重放使用 CDP(Chrome DevTools Protocol)Fetch 域来拦截和修改请求。方法、header、body 和 cookie 均通过 CDP 注入。
如果自动检测未找到正确的二进制文件,可以使用 --chromedriver PATH 和 --geckodriver PATH 覆盖驱动路径。
# 交互式 TUI -- 浏览和重放
waf-fu --log-group "aws-waf-logs-my-acl"
# 无日志组 -- 从发现的日志组中交互式选择
waf-fu --profile myprofile --region us-east-1
# 使用 S3 WAF 日志而非 CloudWatch
waf-fu --s3-bucket aws-waf-logs-my-bucket
# 发现并获取所有区域中的每个日志源
waf-fu --inventory
# 在 TUI 打开前预过滤
waf-fu --start 4h --action BLOCK
# 离线模式 -- 仅使用缓存记录,不调用 AWS
waf-fu --db-only
# 通过代理重放(Burp、mitmproxy 等)
waf-fu --log-group "aws-waf-logs-my-acl" --proxy 127.0.0.1:8080
# 非交互式批量导出
waf-fu --log-group "aws-waf-logs-my-acl" --mode batch-curl -o replay.sh
# 将缓存记录导出为 JSON
waf-fu --export logs.json
# 调试模式 -- 将重放详情记录到文件(客户端数据已脱敏)
waf-fu --log-group "aws-waf-logs-my-acl" --debug
waf-fu 从三个源拉取 WAF 日志,并按请求合并:
| 源 | CLI 标志 | 数据 |
|---|---|---|
| CloudWatch | --log-group(默认) | 完整 WAF 日志 JSON(header、URI、query、action) |
| S3 | --s3-bucket | 与 CloudWatch 相同,来自 S3 交付 |
| WAF API | --log-location waf | 带未脱敏字段的采样请求 |
使用 --log-location cwl|s3|waf 限制为单一源,或使用 --inventory 自动发现并获取所有区域中的所有源。
来自不同源的记录按关联键合并,因此每个请求会显示为单一统一视图,并包含来自各源的最丰富数据。
每个源需要自己的 IAM 权限,范围限定为触发它的 CLI 标志。
所需场景:默认操作、--log-location cwl
logs:FilterLogEvents -- 从 CloudWatch 获取日志记录logs:DescribeLogGroups -- 发现匹配 aws-waf-logs-* 的日志组所需场景:--s3-bucket、--log-location s3、--inventory
s3:ListAllMyBuckets -- 按名称前缀发现 WAF 日志桶s3:ListBucket -- 列出 WAF 日志桶中的日志对象s3:GetObject -- 下载 gzip 压缩的日志文件所需场景:--log-location waf、--inventory、自动富化
wafv2:ListWebACLs -- 发现 web ACLwafv2:GetWebACL -- 枚举规则以进行采样请求查询wafv2:GetLoggingConfiguration -- 发现 ACL 使用哪些日志目标(CWL、S3)wafv2:GetSampledRequests -- 检索未脱敏的请求样本(绕过 RedactedFields)最低可行:仅需要 CloudWatch Logs 权限。S3 和 WAFv2 权限是可选的,用于启用额外数据源。当权限缺失时,工具会优雅降级。