Brahim-Fouad/Fellaga-SubDomainFinder

GitHub: Brahim-Fouad/Fellaga-SubDomainFinder

一款基于 Rust 的高性能子域名枚举工具,集成 DNS 暴力破解、被动源采集、AXFR、CT 日志与 SQLite 本地知识库,专为安全侦察场景设计。

Stars: 0 | Forks: 0

# Fellaga SubDomainFinder Fellaga 是一款用 Rust 编写的、专为 Kali Linux 设计的子域名枚举工具。它集成了多种被动源、异步递归的 DNS 暴力破解、自动 AXFR 尝试、SQLite 清单记录以及严格本地的知识库。 项目文档:[贡献指南](CONTRIBUTING.md)、[安全](SECURITY.md)、[更新日志](CHANGELOG.md)、[语料库来源](data/CORPUS_LICENSE.md) 和 [第三方声明](THIRD_PARTY_NOTICES.md)。 ## 0.8.0 版本的功能 - 原生 UDP 引擎关联,支持 EDNS0、TCP 后备、负载均衡、速率限制以及最高五层递归; - DNS 图谱 `MX`、`NS`、`SOA`、`TXT`、`CAA`、`SRV`、`HTTPS` 和 `SVCB`,并提取目标、服务和子区; - 27 个已注册的被动连接器,包括 WhoisXML 和 Netlas,以及一个全局 Certificate Transparency 收集器:每个 CT 条目仅被索引一次,然后在本地分发给所有相关域名; - 通过 TCP 在权威 NS 服务器上自动尝试 AXFR,仅在包含完整传输的两个 SOA 时方视为成功; - 自动 wildcard 检测,每个区进行 5 次探测,提供持久缓存、SOA 序列号控制以及轮询响应识别; - DNSSEC NSEC 检测,对可枚举的区进行有界遍历,识别 NSEC3 以及无法遍历的最小化 NSEC 响应; - 低噪声 HTTP 提取,涵盖 headers、HTML、JavaScript、JSON、manifests 和 source maps; - 基于 DNS 引导的多端口 TLS 检查,并对 SMTP、IMAP 和 POP3 进行最小化的 STARTTLS 协商; - 仅对已确认的 IP 进行有界 PTR 枢轴分析,不进行范围扫描; - 上下文突变:相邻环境、相邻数字、token 排列以及服务/环境组合; - 有界的事件驱动 pipeline:每次 Web、TLS、CT、NSEC 或图谱发现都会被去重、优先级排序、验证,并可能触发后续的丰富操作; - 根据 TLD、深度和 DNS 提供商对每个生成器的产出进行概率学习,并进行受控的探索; - 自适应解析器池,记录延迟和错误,偏好健康服务器,并定期探索其他服务器; - 标准化的 SQLite WAL 模式,分批读取 DNS 并由专用 writer 批量写入证据; - 为每个结果提供可解释的置信度分数,该分数基于独立证据和 wildcard 检测; - 保留正向 DNS 响应和所有获取的观测数据且不过期,并带有明确的 `live`、`historical` 或 `unverified` 状态; - 临时负向缓存,以便之前缺失的名称可以在稍后出现; - 不提供任何共享功能、遥测或本地数据库同步; - 根据密钥、产出和失败历史选择数据源; - 外部源通用 HTTP 层:连接重用、基于提供商的限制、响应限制在 16 Mio、详细错误、带抖动的退避策略以及支持 `Retry-After`; - 通过规范 URL 去重的 Web 缓存,支持 ETag/Last-Modified 重新验证及内容指纹; - 文本、JSON、JSONL 输出以及分阶段的实时进度显示; - 内置压缩语料库,包含恰好一百万个候选项,分批次在 SQLite 中持久化处理; - 恢复执行 `--resume latest`,定期检查点,可靠解析器共识以及权威验证; - 独立的证据族,确保多个 CT 提供商不会被算作多种技术; - Cargo 包 `fellaga-subdomainfinder`,包含 `fellaga` 二进制文件和 Rust 库目标 `fellaga_core`。 ## 发布与验证 仓库的源代码是参考标准。只有在 GitHub Releases 页面上显示并具有成功的 release workflow 时,二进制工件才被视为已发布;仅仅在更新日志中出现编号或具有标签是不够的。该 workflow 配置为附加 Linux/Kali 存档、Debian 包、SBOM、`SHA256SUMS`、其 Sigstore 签名以及 GitHub 证明。 在同一 release 中下载所有文件到同一个文件夹后: ``` sha256sum -c SHA256SUMS gh attestation verify fellaga-v0.8.0-x86_64-unknown-linux-gnu.tar.gz \ --repo Brahim-Fouad/Fellaga-SubDomainFinder ``` 也可以使用 `cosign` 验证指纹列表的无密钥签名: ``` cosign verify-blob \ --bundle SHA256SUMS.sigstore.json \ --certificate-identity "https://github.com/Brahim-Fouad/Fellaga-SubDomainFinder/.github/workflows/release.yml@refs/tags/v0.8.0" \ --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ SHA256SUMS ``` ## 在 Kali 下安装 在此文件夹中: ``` chmod +x install.sh ./install.sh ``` 该脚本会编译优化版本并将 `fellaga` 安装到 `~/.local/bin`。依赖项和编译文件保留在 `target` 中,这可以加快后续更新的速度。如果此文件夹不在您的 `PATH` 中: ``` export PATH="$HOME/.local/bin:$PATH" ``` 手动安装: ``` cargo build --release --locked --features vendored-openssl install -Dm755 target/release/fellaga ~/.local/bin/fellaga ``` 数据库默认位于 `~/.local/share/fellaga/fellaga.db`。您可以使用 `--db CHEMIN` 或环境变量 `FELLAGA_DB`。密钥文件会在 `~/.config/fellaga/config.json` 中自动创建;可以通过 `--config` 或 `FELLAGA_CONFIG` 更改其位置。 配置文件以明文形式包含 API 密钥:它未经过加密。在 Unix 系统上,Fellaga 会将其专用的配置和数据目录保护为 `0700` 权限,然后将配置文件、SQLite 数据库、其 WAL/SHM 日志和备份保护为 `0600` 权限。显式提供的共享父目录不会被重新配置。这些权限不能替代磁盘加密或用户帐户保护。切勿发布、备份到仓库或附加此文件、SQLite 数据库或机密目标结果。 原生引擎默认使用 128 的并发度、每秒 100 次 DNS 请求的全局限制,并且一次仅处理一个活动域名。通过 `fellaga resolvers test` 可以预先排除那些劫持 NXDOMAIN、丢失 DNSSEC 或响应不一致的解析器。 ## 快速入门 包含 CT、快速暴力破解和自动 AXFR 的全面扫描: ``` fellaga scan example.com ``` 此命令启动默认的自适应 `deep` 配置:被动、CT、1M 语料库、最高五层递归、wildcard、AXFR、DNS 图谱、NSEC、Web/JavaScript、存档、TLS/STARTTLS 以及有界 PTR。一次处理一个域名,每秒 100 次 DNS 请求,每个域名最长持续时间为 1800 秒。需要缺失密钥的源将被忽略。暴力破解从最有希望的候选项开始,停止产出不足的批次,并在 SQLite 中处理这些批次以保持有限的内存。如果达到时间限制,请使用 `--resume latest`。 ``` fellaga scan example.com --profile balanced fellaga scan example.com --profile turbo --dns-rate-limit 100 fellaga scan example.com --resume latest fellaga scan example.com --only-live --verification-max-age 6 fellaga scan example.com --stream-jsonl ``` 专家穷举模式,仅在实验室或明确授权的范围内使用。DNS 限制和最长持续时间有意保持激活状态,因为 `--no-adaptive` 可能会产生非常大的负载: ``` fellaga scan example.com \ --all-sources \ --wordlist /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt \ --max-words 110000 \ --dns-rate-limit 100 \ --max-runtime 1800 \ --no-adaptive ``` 在扫描期间,Fellaga 会立即显示: ``` [>] passif: sources locales et distantes disponibles, cache 24 h [P] certspotter: 42 nom(s) (cache frais) [>] wildcard: racine normale, 0 sous-zone(s) wildcard [>] DNS niveau 1: 250 candidat(s) à valider [~] DNS niveau 1 [██████████░░░░░░░░░░] 50% 125/250 | +18 | cache 40 | 24/s | 5.2s [DNS+] 38 requête(s), 16 relation(s), 2 service(s), 1 zone(s) fille(s) [NSEC] 1 zone(s), 0 parcourue(s), 1 protégée(s), 1 requête(s), 0 nom(s) [CT] 2 journaux, 128 entrées, 0 échec, 4 noms cumulés, 1.2s [WEB] 12 hôtes, 18 requêtes, 5 cache, 1 échec, 3 noms, 2.1s [TLS] 22 endpoint(s), 20 réseau, 16 succès, 4 échec(s), 2 cache, 7 nom(s), 3.1s [+] api.example.com A=192.0.2.10 [fort 75] (passive:certspotter:cache cache) ``` 阶段和进度条会写入 `stderr`。验证过的子域名一经发现即会输出到 `stdout`。使用 `--json` 时,所有进度都会转到 `stderr`,最终只有 JSON 文档保留在 `stdout` 上。`--quiet` 会禁用实时显示。 多个域名、文件或标准输入: ``` fellaga scan example.com example.org --jsonl fellaga scan --targets-file domains.txt --output-dir results printf 'example.com\nexample.org\n' | fellaga scan --no-axfr ``` 这些命令一次只处理一个域名。增加 `--domain-concurrency` 会成倍增加网络负载,这应是根据范围做出的明确选择。 大型字典和精确的解析器: ``` fellaga scan example.com \ --wordlist /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt \ --max-words 110000 \ --resolvers 1.1.1.1,8.8.8.8 \ --concurrency 128 \ --dns-rate-limit 100 \ --output example.com.json \ --json ``` 仅被动模式,同时保留 AXFR 尝试: ``` fellaga scan example.com --passive-only ``` 禁用某个组件: ``` fellaga scan example.com --no-passive --no-axfr --no-tls --no-web --no-nsec --no-ct-monitor ``` 即使缓存是最新的,也强制重新验证: ``` fellaga scan example.com --refresh-cache ``` 在发现的子域名下进行搜索: ``` fellaga scan example.com --depth 2 --recursive-words 150 --recursive-hosts 50 ``` `deep` 配置使用 `--depth 5`,但保持自适应:它从 500 个候选项开始,进入 1500 个的批次,然后仅在产出仍然有用时继续。默认的最长持续时间为每个域名 1800 秒。自动递归首先限制父级和单词的数量,然后如果某个级别产生的新名称少于两个,则停止。只有专家模式下的 `--no-adaptive` 才会要求耗尽配置的语料库。 选择被动源或强制更新: ``` fellaga scan example.com --passive-sources crtsh,certspotter fellaga scan example.com --exclude-sources wayback,otx fellaga scan example.com --all-sources fellaga scan example.com --passive-refresh-hours 0 fellaga scan example.com --passive-only --max-passive 1000 fellaga sources fellaga sources --check --target example.com --timeout 10 ``` 在活动之前测试解析器池、解释证据并交换清单: ``` fellaga resolvers test 1.1.1.1 8.8.8.8 9.9.9.9 --json fellaga resolvers benchmark --queries 100000 --concurrency 128 --json fellaga explain api.example.com --json fellaga import example.com subfinder.txt --format subfinder fellaga import example.com amass.json --format amass fellaga export --domain example.com --format jsonl --output example.com.jsonl ``` 导入的 Subfinder、Amass、BBOT 和 massdns 首先会进入 `unverified` 状态。只有在 DNS 验证之后,它们才会变为 `live`。Fellaga 不会发送任何清单、机密、学习数据或统计数据。 ## 清单管理 ``` # 保留所有名称及其状态 fellaga list --domain example.com # 仅保留仍然 live 的验证 fellaga list --domain example.com --only-live # 重新验证所有已知名称,然后使用默认防护措施刷新 SQLite fellaga refresh example.com --concurrency 128 --dns-rate-limit 100 # Historique 和学习统计信息 fellaga history --limit 20 fellaga stats fellaga knowledge --limit 100 # 仅从 cache 中移除过期的负面响应 fellaga cache prune ``` 在正常扫描期间,Fellaga 会在访问网络之前查询 SQLite: 1. 正向响应会被永久保留,但如果其验证时间过旧,则会变为 `historical`; 2. 仍然新鲜的负向响应会阻止不必要的请求; 3. 缺失的条目或过期的负向响应会被重新解析; 4. `--refresh-cache` 会强制进行新的解析,无视永久副本; 5. `refresh` 会重新验证清单,而不会启动新的暴力破解。 为了兼容旧命令,仍接受 `--ttl-cap`,但它不再会使正向响应过期。 ## 0.8 智能发现 首次解析后,Fellaga 会构建一个 DNS 图谱。在 `MX`、`NS`、`SOA`、`SRV`、`HTTPS`、`SVCB`、`TXT` 和 `CAA` 中找到的目标,如果仍处于范围内,将被重新注入为候选项。`NS` 和 `SOA` 委派标志着子区;`SRV`、`HTTPS` 和 `SVCB` 的端口和协议随后会引导 TLS 检查。PTR 枢轴仅限于已经与确认名称关联的 IP。 调度程序不再对每台主机查询每种类型:`NS` 和 `SOA` 针对区域边界,邮件元数据保留在根节点上,而 `HTTPS`/`SVCB` 保留给优先主机。生成的名称会进入一个全局事件队列,该队列会在网络查询之前删除重复项,并在 `--pipeline-budget` 预算内最多执行 `--pipeline-rounds` 轮。 ``` # 默认显示 Graphe 和活动服务;保守限制示例 fellaga scan example.com --graph-hosts 100 --ptr-ips 32 # 减少或禁用事件循环 fellaga scan example.com --pipeline-rounds 1 --pipeline-budget 1000 fellaga scan example.com --no-pipeline # 禁用这两个 pivots fellaga scan example.com --no-dns-graph --no-ptr ``` 候选引擎还会根据已观察到的名称生成变体:`api-dev` 可以生成 `api-stage`、`api-prod` 和 `dev-api`;`node03` 可以生成其数字相邻项。每个建议都带有其生成器的名称。本地 Beta-Bernoulli 模型通过上下文(`global`、公共后缀、可注册域名、深度和 DNS 提供商)进行学习,并结合预期产出、不确定性和探索来对后续活动的生成器进行排序。 `--mutations` DSL 接受每行一个格式为 `score:nom:pattern` 的规则。可用的变量有 `{{word}}`、`{{parent}}`、`{{env}}`、`{{region}}`、`{{cloud}}` 和 `{{n}}`: ``` 950:service-environnement:{{word}}-{{env}} 900:region-parent:{{region}}.{{parent}} 850:cloud-service:{{word}}-{{cloud}}-{{n}} ``` Web 阶段仅访问已确认的主机,并且每个资源最多读取 `--web-max-bytes`。它会检查根目录、范围内的重定向、有用的 headers 以及有限数量的 JS/JSON/maps 资产。规范 URL 每次扫描仅请求一次。其缓存会合并历史名称,保留 ETag/Last-Modified,并在刷新时使用条件请求。 ``` fellaga scan example.com --web-hosts 20 --web-assets 3 --web-max-bytes 262144 fellaga scan example.com --no-web ``` DNSSEC 阶段将其查询直接发送到权威服务器。经典的 NSEC 区域会被遍历至 `--nsec-max-names`;NSEC3 和最小化的 NSEC/“black lies” 响应会被识别为受保护区域,并且不会与空遍历相混淆。仅缓存终端结果。 ``` fellaga scan example.com --nsec-max-names 1000 --nsec-timeout 3 fellaga scan example.com --no-nsec ``` 直接 CT 监控会读取公共日志列表,在第一次通过时恢复少量历史记录,然后由于 `ct_global_state` 的存在,仅读取新条目。X.509 证书和预证书在本地解码。它们所有有效的名称都会进入一个全局后缀索引 `ct_names`,然后当前域名的名称会被合并到其缓存 `ct-direct` 中。因此,游标不再针对每个目标重复。 ``` fellaga scan example.com --ct-logs 2 --ct-entries 256 --ct-backfill 256 fellaga scan example.com --no-ct-monitor ``` ## AXFR AXFR 默认处于启用状态。Fellaga 会: 1. 请求域名的 `NS` 记录; 2. 解析每个服务器的所有 IPv4 和 IPv6; 3. 并行打开 DNS TCP 连接; 4. 请求完整的区域传输; 5. 在 SQLite 中保留每次尝试、成功、拒绝或超时; 6. 成功时将获取的名称重新注入枚举。 可以通过 `--axfr-timeout` 调整每次操作的超时时间。当程序规则明确禁止此测试时,请使用 `--no-axfr`。 ## TLS 证书与 wildcard DNS 发现之后,Fellaga 会向根目录和最相关的活动 endpoint 打开一个短时的 TLS 连接。MX/SRV/HTTPS/SVCB 记录可以添加端口。在明文 SMTP、IMAP 和 POP3 上,Fellaga 会读取 banner 并仅在握手之前请求 STARTTLS 升级。然后它提取 SAN/CN;仅接受目标的真实子域名,并在 DNS 中重新验证。 _BLOCK_23/> 即使是过期、自签名或配置错误的证书也会被录入清单:这是一种观察,而不是信任决策。不会尝试进行任何身份验证或业务应用命令。TLS 检查仍然是目标可见的网络操作。 Wildcard 检测在每个区使用五个随机名称,并要求达到三的多数。它会比较多数值,还会比较某种类型(`A`、`AAAA` 或 `CNAME`)的多数存在情况,以检测轮换其 IP 的 wildcard 池。Fellaga 会探测根目录以及每批次中观察到的多达 20 个子区。如果某个匹配名称仅依赖于弱观察,则会被过滤掉;如果它拥有强有力的证据:被动共识、直接 CT、TLS 证书、AXFR、DNS 图谱或 NSEC,则会被保留并标记为 `wildcard`。`--include-wildcard` 也会保留弱观察。 每个区的配置文件都保留在 `wildcard_cache` 中。在 `--wildcard-refresh-hours`(默认为 6 小时)期间,不会发送任何新的随机名称。随后,Fellaga 会首先检查 SOA 序列号:如果未更改,则延长配置文件而不重新进行五次探测;`--wildcard-refresh-hours 0` 会强制执行检查。 ## 本地缓存记忆 ### 1. 动态 DNS 缓存 `dns_cache` 包含正向和负向响应。正向响应和 `dns_records` 中的相应行是永久性的。只有负向响应会过期,以便今天缺失的名称可以在以后被发现。使用 `refresh` 或 `--refresh-cache` 可以有意更新正向数据。 ### 2. 持久被动缓存 `passive_cache` 保留兼容性和刷新状态,而新证据会作为行写入 `observed_names` 和 `observation_evidence` 中。刷新会将新名称与旧名称合并:因此,空响应、部分响应或变得不可用的数据源都不能删除已获取的知识。通常,只有在 24 小时后才会重新查询数据源。使用 `--passive-refresh-hours` 调整此频率。 `source_stats` 在本地衡量成功、失败、数量和响应时间。连续三次失败会使自动数据源暂停 24 小时;其永久缓存将继续使用。随后的成功会重置其计数器。通过 `--passive-sources` 或 `--all-sources` 显式请求的数据源会忽略此暂停。408、425、429、500、502、503 和 504 错误将在带有抖动的指数退避后重试。预计会等待小于或等于 30 秒的 `Retry-After`;较长的等待时间会准确记录在 SQLite 中,数据源会在请求的时间恢复,而不会阻塞扫描。 Cert Spotter 可选接受 `CERTSPOTTER_API_TOKEN`。OTX 接受 `OTX_API_KEY` 或 `X_OTX_API_KEY`,并在 `X-OTX-API-KEY` 中发送密钥;如果没有密钥,匿名的 429 错误会清楚解释所需的配置。HackerTarget 限制其免费访问;缓存可避免每次扫描都消耗此限制。 ### 3. 永久 TLS 证书缓存 `tls_certificate_cache` 按域名、endpoint 和端口保留最后一个证书的 SHA-256 指纹以及已经观察到的所有 SAN/CN 的并集。因此,续订的证书不会删除旧名称。默认情况下,24 小时后会尝试新连接;`--tls-refresh-hours` 调整此延迟,而 `0` 会强制更新。 ### 4. 永久知识库 每个测试的标签都会提供给 `word_stats`。成功次数、不同目标的数量以及成功/尝试比率决定了下一次扫描的排名。`relative_patterns` 还保留了成功的完整路径,例如 `api.dev`、`admin.internal` 或 `status.eu`。 这两个表没有过期时间:它们构成了最常见结构的“硬”缓存。除了创建数据库时,`candidate_priors` 表还包含内置的常用单词和嵌套路径目录。在下一次扫描时,Fellaga 会首先尝试提供的字典,然后是学习到的路径、学习到的单词,最后是这个永久目录。所有经过验证的被动观察、AXFR 和 DNS 都会充实这些知识。 `generator_stats`、`generator_domains` 和 `generator_context_stats` 保留兼容的历史记录。`generator_bandits` 包含按 TLD、深度和 DNS 提供商划分的概率后验。高产出的生成器会上升;很少尝试的生成器保留少量的探索机会。不会传输任何观察到的域名。 ### 5. 永久 DNS 图谱 `discovery_edges`、`service_endpoints` 和 `child_zones` 保留每个 DNS 关系、引导的 endpoint 和委派,并带有首次/最后一次观察日期和重复计数器。随后的消失不会删除历史证据。 ### 6. Web 和 DNSSEC 缓存 `web_discovery_cache` 和 `dnssec_walk_cache` 合并了所有已观察到的名称。Web 缓存添加了 ETag、Last-Modified 和内容的 SHA-256,以便在不必要时不重新下载资源就能重新验证。最近的状态和刷新日期会发生变化,但历史集合仍会保留。暂时的 DNSSEC 失败不会被记忆为终端结果。 ### 7. 全局 Certificate Transparency 索引 `ct_global_state` 为每个日志记录一个单独的下一个索引。`ct_names` 反向索引名称,以便快速查找所有以请求域结尾的名称。`passive_cache` 并行保留分布在 `ct-direct` 源下的并集。跟踪保持增量且严格在本地;保留 `ct_log_state` 只是为了读取旧数据库。 ### 8. 解析器、Pipeline 和置信度 `resolver_stats` 保留查询、成功、错误、累积延迟和连续失败次数。当提供多个 `--resolvers` 时,资源池会偏好最佳配置文件,同时定期测试其他配置文件;每个解析器均可使用 UDP 和 TCP。`scan_pipeline_metrics` 允许验证事件数量、已删除的重复项、验证以及预算的潜在耗尽情况。 最后,每个结果行和每个 `scan_findings` 条目都会获得 0 到 100 的分数、一个级别(`faible`、`probable`、`fort`、`confirmé`)以及解释它的原因。权威或独立的证据会增加分数;wildcard 匹配会大幅降低分数。 域名在频率表中由 hash 表示。完整的清单必须保留在您的本地 SQLite 中,以便进行 `list` 和 `refresh`。没有任何内容会传输到 Fellaga 服务器,因为二进制文件中不存在共享客户端。 没有遥测机制并代表扫描是匿名的:受查询的被动提供商必然需要接收所请求的域名,而解析器和目标服务可能会观察到活动的 DNS、HTTP 或 TLS 请求。请根据范围规则选择数据源和解析器。 要查看此记忆: ``` fellaga knowledge --limit 100 ``` ## 数据源和输入技术 - `crt.sh`:证书透明度日志,通常富含旧名称; - Cert Spotter:证书和 SAN,带有任意深度的子域名; - HackerTarget Host Search:聚合的 DNS 索引,免费访问受限; - Common Crawl:从五个索引和多个公共爬网页面中提取的主机名; - Wayback CDX:由 Internet Archive 归档的历史主机; - urlscan:来自公共扫描的页面域名(可选 `URLSCAN_API_KEY`); - Anubis DB:专用于子域名的开放数据库; - subdomain.app:观察到的名称的公共 API; - AlienVault OTX:公共被动 DNS 历史; - CIRCL Passive DNS:带有 `CIRCL_PDNS_CREDENTIALS=user:password` 的经过身份验证的连接器; - CertificateDetails、Driftnet 和 Subdomain Center:经过隔离和限制的实验性连接器,在保持可访问性时会在 `deep` 配置文件中激活; - WhoisXML Subdomains Lookup 和 Netlas Domains Search:官方分页 API,在配置了其密钥时激活; - BeVigil、BuiltWith、Censys、Chaos、FullHunt、GitHub Code Search、GitLab global Code Search、Intelligence X、LeakIX、SecurityTrails、Shodan 和 VirusTotal:一旦配置了密钥就会自动激活; - 直接 CT:Chrome 日志的公共列表,增量读取 `get-sth`/`get-entries` 并在本地解析证书; - 原生 AXFR:当权威服务器允许时,提供完整的区域; - DNS 图谱:MX/NS/SOA/TXT/CAA/SRV/HTTPS/SVCB 关系、子区、服务和有界 PTR; - 优先暴力破解:外部字典、上下文突变、永久知识,然后是 1M 语料库; - 递归:在验证过的父级下测试最有效的单词; - DNS 验证:每个被动名称在进入 `live` 状态之前都会得到确认; - Web:重定向、headers、HTML、JavaScript、JSON、manifests 和 source maps; - 直接 TLS 和引导的 STARTTLS:所提供证书的 SAN/CN,具有永久历史记录; - DNSSEC:有界的 NSEC 遍历以及 NSEC3/最小 NSEC 识别; - 分层 wildcard 探测:观察到的根和常见子区; - 本地历史记录:在目标上验证的路径会改进后续验证。 无需启动扫描即可查看目录和密钥状态: ``` fellaga sources fellaga sources --json ``` `fellaga sources` 还会显示成功率、平均延迟、最后一次错误以及自适应暂停结束前的剩余时间。JSON 在 `health` 下添加了这些数据,其中 `next_retry` 采用 Unix 格式。 密钥可以放置在此命令显示的变量中或 `~/.config/fellaga/config.json` 中。接受字符串或列表;多个密钥将轮流使用: ``` { "api_keys": { "github": ["token-1", "token-2"], "censys": "api-id:api-secret", "virustotal": "api-key" } } ``` 上述值为虚构示例。JSON 文件和环境变量并不构成保险箱:避免诊断日志包含环境信息,切勿提交这些机密,并立即撤销任何暴露的密钥。 Common Crawl 是全局序列化的,因此多个域名不会同时命中公共索引。最新索引的 URL 在 `source_metadata_cache` 中保留 30 天;404/410 响应会强制对其进行重新发现。Wayback 首先尝试限制为 2000 行的查询,然后在超时的情况下,尝试四个 1000 行的并行时间窗口,其结果将合并到永久缓存中。 Cert Spotter 现在遍历多达 25 页,并带有游标卡住检测。urlscan 在五页上使用 `search_after`,并像从 URL 中一样从域名中提取主机。Shodan 激活历史记录并跟踪十页上的 `more` 字段。VirusTotal 仅在官方域名上保持 HTTPS 时才跟踪其游标,以便受损的响应无法劫持 API 密钥。对于分页源,较晚页面的不可用不会再导致丢失已获取的名称。 可识别的变量:`BEVIGIL_API_KEY`、`BUILTWITH_API_KEY`、`CENSYS_API_KEY`、`CERTSPOTTER_API_TOKEN`、`CHAOS_API_KEY`、`CIRCL_PDNS_CREDENTIALS`、`FULLHUNT_API_KEY`、`GITHUB_TOKEN`、`GITHUB_TOKENS`、`GITLAB_TOKEN`、`INTELX_API_KEY`、`LEAKIX_API_KEY`、`NETLAS_API_KEY`、`OTX_API_KEY`、`X_OTX_API_KEY`、`SECURITYTRAILS_API_KEY`、`SHODAN_API_KEY`、`URLSCAN_API_KEY`、`VIRUSTOTAL_API_KEY` 和 `WHOISXML_API_KEY`。 ## 枚举的自然演进 扫描现在遵循此本地循环: 1. 重用已知的被动名称和 DNS,无正向过期; 2. 恢复全局 CT 日志并将其后缀索引分发到该域名; 3. 使用本地上下文后验对字典和突变进行排序; 4. 通过 SOA 重用或检查 wildcard 配置; 5. 通过自适应解析器池验证 DNS 批次; 6. 使用精简的查询计划构建图谱,然后检测区域和服务; 7. 将 CT、图谱、PTR、NSEC、Web 和 TLS 注入同一个去重的事件队列中; 8. 只要轮次和预算允许,就继续进行丰富; 9. 解释置信度,批量写入标准化证据并更新学习。 默认情况下,`deep` 配置也是自适应的:与 `balanced` 和 `turbo` 一样,它会停止低产出的批次,同时使用更广泛的深度和覆盖限制。只有 `--no-adaptive` 会要求它耗尽已配置的候选项。随着 SQLite 累积在多个域名上的成功,重复的单词和路径会在测试顺序中上升,而缓慢或长期失败的数据源则会暂时停止对总时间造成负面影响。所有这些决策都保留在机器上。 连接器的架构和几个接口约定受到了在 MIT 许可下分发的 [xsubfind3r](https://github.com/hueristiq/xsubfind3r) 的启发。出处和完整的许可请参见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。Fellaga 保留了自己的 Rust 引擎、DNS 验证、永久 SQLite、AXFR、学习和自适应编排。 ## 开发 ``` cargo fmt --all -- --check cargo test --all-targets --locked cargo clippy --all-targets --locked -- -D warnings tests/dns-lab/verify.sh ``` 基准测试台 `bench/run.sh` 旨在在无密钥和相同密钥模式下比较 Fellaga、Subfinder、Amass、BBOT、puredns 和 dnsx。如果没有明确确认授权范围,它将拒绝启动。CI workflow 配置为检查语料库、MSRV、测试、fuzzing 和 DNS 实验室。`v*` 标签 workflow 配置为构建 Linux/Kali x86-64 和 ARM64 二进制文件、一个 `.deb`、SBOM、校验和、Sigstore 签名以及 GitHub 证明;在宣布发布之前,必须在 GitHub 上验证其结果。 主要结构: - `src/lib.rs`:`fellaga-subdomainfinder` 包的库目标 `fellaga_core`; - `src/dns.rs`:原生 UDP 引擎、共识、权威验证、解析器和 wildcard; - `src/pipeline.rs`:优先事件队列、去重和预算; - `src/confidence.rs`:置信度得分和相关原因; - `src/discovery.rs`:DNS 图谱、子区和服务; - `src/dnssec.rs`:NSEC/NSEC3 检测和有界遍历; - `src/axfr.rs`:DNS TCP 区域传输; - `src/ct_monitor.rs`:直接和增量跟踪 CT 日志; - `src/web_discovery.rs`:低噪声 HTTP/HTML/JS/maps 提取; - `src/tls.rs`:TLS/STARTTLS、SAN/CN 提取和永久缓存; - `src/candidate.rs`:上下文突变和评分; - `src/db.rs`:SQLite schema、缓存、清单和学习; - `src/scanner.rs`:扫描编排和刷新; - `src/passive.rs` 和 `src/passive/extra.rs`:目录、配置、被动源和解析; - `data/candidates-1m.txt.zst`:派生自 SecLists 的一百万个候选项的语料库,其出处和指纹位于 `data/CORPUS_LICENSE.md` 中; - `benchmarks/`:对比基准测试台和发布阈值; - `tests/dns-lab/`:可复现的受控 DNS 服务器。
标签:DNS解析, GitHub, Rust, 可视化界面, 子域名枚举, 实时处理, 底层编程, 开源项目, 系统安全, 网络流量审计, 通知系统