资讯动态

BBOT 内部模块(Internal Modules)完全指南:常驻扫描引擎的 speculate、excavate、dnsresolve 与 cloudcheck

发布时间:2026/9/15 20:08:23 来源:尧图企业网站定制
BBOT 内部模块Internal Modules完全指南常驻扫描引擎的 speculate、excavate、dnsresolve 与 cloudcheck【免费下载链接】bbotThe recursive internet scanner for hackers. 项目地址: https://gitcode.com/GitHub_Trending/bb/bbot导读BBOT递归互联网扫描器中的**内部模块Internal Modules**是一组默认常驻运行、无需显式启用的核心功能模块负责 DNS 解析、被动数据挖掘、云厂商标记与数据推断等基础工作。本文基于 docs/modules/internal_modules.md 展开结合源码逐一剖析aggregate、cloudcheck、dnsresolve、excavate、speculate等模块的职责、配置开关与底层实现帮助读者掌握如何按需禁用、调优这些模块并理解 BBOT 扫描管线中数据如何被推断、挖掘与流转的关键机制。什么是内部模块内部模块Internal Modules与普通模块Scan Modules行为类似区别在于始终运行它们不需要显式启用每次扫描都会默认加载可显式禁用如果某些功能不需要可以通过根级配置将其关闭。在 bbot/modules/internal/base.py 中所有内部模块继承自BaseInternalModule其核心属性为class BaseInternalModule(BaseModule): in_scope_only False _type internal # Priority, 1-5, lower numbers higher priority _priority 3其中_type internal是内部模块的标志扫描器在加载时会据此将其与普通模块区分。从 bbot/scanner/scanner.py 的加载逻辑可以看到内部模块与普通模块分开加载并统计internal_modules sorted([m for m in self.preset.internal_modules if m in succeeded]) self.verbose(fLoading {len(internal_modules):,} internal modules: {,.join(internal_modules)}) loaded_internal_modules, failed_internal self._load_modules(internal_modules) self.modules.update(loaded_internal_modules)这些模块承载着典型 BBOT 扫描中必不可少的核心功能例如 DNS 解析、被动信息挖掘、事件推断等。禁用的方式非常简单——在根级配置中把对应选项设为False即可详见 bbot/defaults.yml# Infer certain events from others, e.g. IPs from IP ranges, DNS_NAMEs from URLs, etc. speculate: True # Passively search event data for URLs, hostnames, emails, etc. excavate: True # Summarize activity at the end of a scan aggregate: True # DNS resolution dnsresolve: True # Cloud provider tagging cloudcheck: True注意以上配置键是**根级root-level**选项直接写在配置文件顶层即可生效无需嵌套在modules:之下。从源码结构看内部模块目录 bbot/modules/internal/ 目前包含 7 个模块文件aggregate.py、base.py、cloudcheck.py、dnsresolve.py、excavate.py、speculate.py和unarchive.py。下面逐一介绍各模块的功能。aggregate扫描结束时的统计汇总aggregate模块的功能是在扫描结束时汇总统计数据也就是打印一张扫描统计表。如果你不希望看到这张表可以禁用aggregate: False。其实现位于 bbot/modules/internal/aggregate.py它继承了BaseReportModule报告类模块核心逻辑非常简洁class aggregate(BaseReportModule): watched_events [] flags [passive, safe] meta { description: Summarize statistics at the end of a scan, created_date: 2022-07-25, author: TheTechromancer, } async def report(self): self.log_table(*self.scan.stats._make_table(), table_namescan-stats)可以看到它把scan.stats中收集的统计信息事件数量、各模块产出等格式化为一组表格行并以scan-stats为表名输出。由于它不监听任何事件watched_events []只在扫描收尾阶段执行一次report()因此不会对扫描过程产生任何干扰。cloudcheck云厂商标记与云资源识别文档中称之为cloud模块在配置中对应键为cloudcheck。它的职责有两方面云厂商标记检查事件关联的主机/IP 是否属于某个云厂商如 AWS、Azure、GCP 等并据此为事件打上对应标签云资源识别识别某些特定云资源例如存储桶Storage Bucket。实现位于 bbot/modules/internal/cloudcheck.pyCloudCheck继承自BaseInterceptModule监听所有事件watched_events [*]并设置scope_distance_modifier 2即可对距离目标最多 2 跳的事件进行标记class CloudCheck(BaseInterceptModule): watched_events [*] meta { description: Tag events by cloud provider, identify cloud resources like storage buckets, created_date: 2024-07-07, author: TheTechromancer, } # tag events up to and including distance-2 scope_distance_modifier 2 _priority 3 async def setup(self): self._cloud_hostname_regexes None self._cloud_hostname_regexes_lock asyncio.Lock() # perform a test lookup during setup to force signature update await self.helpers.cloudcheck.lookup(8.8.8.8) return Truesetup()阶段会主动做一次cloudcheck.lookup(8.8.8.8)测试查询以强制更新云端签名该能力封装在 bbot/core/helpers/helper.py 的helpers.cloudcheck中底层依赖cloudcheckPython 库。在handle_event中它会对事件的原始主机及所有已解析主机resolved_hosts逐个执行helpers.cloudcheck.lookup(host)然后根据返回的 provider 信息为事件添加标签通用标签tag与{tag}-{provider_name}IP 主机额外打上{provider_name}-ip域名主机原始主机打上{provider_name}-domain其余解析出的子主机通常为 CNAME 链上的节点打上{provider_name}-cname。对于距离在max_scope_distance以内的事件它还会用云厂商提供的STORAGE_BUCKET_HOSTNAME正则逐一匹配主机名一旦命中例如bucket-name.s3.amazonaws.com就会从中提取存储桶名与域名合成 URL 并发射STORAGE_BUCKET事件bucket_name, bucket_domain match.groups() bucket_url fhttps://{bucket_name}.{bucket_domain} await self.emit_event( { name: bucket_name, url: bucket_url, context: f{{module}} analyzed {event.type} and found {{event.type}}: {bucket_url}, }, STORAGE_BUCKET, parentevent, )这些云资源正则通过cloud_hostname_regexes()从cloudcheck库的providers中动态收集并编译缓存便于后续其他模块如 bucket 枚举类模块消费。dnsresolveDNS 解析与通配符检测文档中称之为dns模块配置键为dnsresolve。它控制 BBOT 执行的基础 DNS 解析行为以及通配符检测等配套机制。它是内部模块中优先级最高的模块之一_priority 1实现位于 bbot/modules/internal/dnsresolve.py。核心职责DNSResolve监听所有事件watched_events [*]产出DNS_NAME、IP_ADDRESS、RAW_DNS_RECORD事件。其工作流程大致为找到或创建 DNS 父事件通过get_dns_parent()在事件祖先链中寻找同主机的IP_ADDRESS/DNS_NAME事件找不到则新建最小化解析先解析A/AAAAIP 事件则为PTR记录用于范围判断检查解析结果是否命中白名单/黑名单完整解析对于在dns_search_distance范围内的事件解析其余所有记录类型TXT、MX、NS、CNAME、SOA等通配符检测对新建事件调用handle_wildcard_event()通过helpers.is_wildcard()进行通配符验证发射 DNS 子事件将各记录类型中提取的主机作为DNS_NAME子事件发射单跳内标记为affiliate必要时发射RAW_DNS_RECORD原始记录事件标签处理对无法解析的主机打上unresolved标签并转换为DNS_NAME_UNRESOLVED类型对解析距离过长的失控 DNS 链打上runaway-dns-{distance}标签并停止继续解析。相关的 DNS 配置dnsresolve的行为受 bbot/defaults.yml 中dns:配置段控制常用的有dns: # Completely disable DNS resolution (careful if you have IP whitelists/blacklists, consider using minimaltrue instead) disable: false # Speed up scan by not creating any new DNS events, and only resolving A and AAAA records minimal: false # How many instances of the dns module to run concurrently threads: 25 # How far away from the main target to explore via DNS resolution (independent of scope.search_distance) # This is safe to change search_distance: 1 # Limit how many DNS records can be followed in a row (stop malicious/runaway DNS records) runaway_limit: 5 # DNS query timeout timeout: 5 # How many times to retry DNS queries retries: 1 # Completely disable BBOTs DNS wildcard detection wildcard_disable: False # How many sanity checks to make when verifying wildcard DNS wildcard_tests: 10在 bbot/modules/internal/dnsresolve.py 的setup()中这些配置被读取并生效threads决定并发解析线程数minimalTrue时只解析A、AAAA、CNAME三种记录search_distance决定向目标外探索几跳。从源码看module_threads属性直接返回self.dns_config.get(threads, 25)默认 25 个并发线程。通配符处理handle_wildcard_event()是通配符检测的核心。它对每个 DNS 记录类型判断是否为通配符若某类型确认为通配符事件会被打上wildcard或wildcard-{类型}标签若事件所有记录均为通配符且不是扫描目标无target标签事件数据会被改写为_wildcard.{父域名}形式例如www.evilcorp.com→_wildcard.evilcorp.com从而避免对海量通配子域进行无效扫描。excavate从扫描数据中被动挖掘宝藏excavate是内部模块中最复杂、信息产出最丰富的一个。它被设计用于从 HTTP 响应数据中被动提取有价值的信息主要使用YARA 正则进行匹配并对 YARA 命中结果进行后处理最终发射出多种类型的事件。实现位于 bbot/modules/internal/excavate.py。工作机制概览excavate监听HTTP_RESPONSE与RAW_TEXT两类事件声明产出URL_UNVERIFIED和WEB_PARAMETER。其核心流程是对响应 body、响应头字符串分别运行编译好的 YARA 规则集self.yara_rules.match(data...)每个命中的规则名在yara_preprocess_dict中查找对应的预处理函数把 YARA 原始命中结果转交给对应子模块ExcavateRule子类做后处理后处理产物统一通过report()发射为事件。在 bbot/modules/internal/excavate.py 中有一段颇具风格的BBOT 正则戒律注释概括了该模块的性能原则1) Thou shalt employ YARA regexes in place of Python regexes, save when necessity doth compel otherwise. 2) Thou shalt neer wield a Python regex against a vast expanse of text. 3) Whensoever it be possible, thou shalt favor string matching oer regexes.即优先使用 YARA 正则而非 Python 正则、绝不对大段文本跑 Python 正则、能用字符串匹配就尽量不用正则——这保证了 excavate 在海量响应数据上依然高效。setup()阶段会遍历扫描中的所有模块通过find_subclasses()收集所有继承ExcavateRule的子模块并注册它们的 YARA 规则然后将全部规则一次性编译并打印编译耗时。此外还会读取parameter_blacklist与parameter_blacklist_prefixes见 bbot/defaults.yml用于过滤掉__VIEWSTATE、PHPSESSID、BIGipServer*、utm_*这类无价值参数。URLs爬虫的一半通过从所有访问过的页面中提取 URLexcavate 实际上已经完成了半个网络爬虫的工作——另一半递归能力内置于 BBOT 底层。为了防止递归失控导致扫描无限蔓延BBOT 默认通过web_spider_distance和web_spider_depth设置加以限制对应 bbot/defaults.yml 中的web.spider_distance与web.spider_depthweb: # Set the maximum number of HTTP links that can be followed in a row (0 no spidering allowed) spider_distance: 0 # Set the maximum directory depth for the web spider spider_depth: 1 # Set the maximum number of links that can be followed per page spider_links_per_page: 25从源码看URL 提取由URLExtractor子模块负责url_full规则匹配完整 URLurl_attr规则匹配带href/src/action属性的 HTML 标签提取出的相对 URL 会通过urljoin与源页面 URL 重组为绝对地址再经过严格校验后发射为URL_UNVERIFIED事件。若一页内提取的链接数超过web_spider_links_per_page事件还会被打上spider-max标签以限制爬取。不过在合适的场景下受控使用爬虫能力会非常强大——例如配合spider预设进行深度目录挖掘。Parameter ExtractionWeb 参数提取参数提取功能从 HTTP 响应中识别并提取关键 Web 参数产出WEB_PARAMETER事件。覆盖范围包括GET / POST 请求中的参数直接解析 URL query stringHTML 表单参数GetForm/PostForm子模块解析form标签内的input、select、textarea、button元素jQuery 请求参数GetJquery/PostJquery/AjaxJquery子模块解析$.get()、$.post()、$.ajax()调用Location 重定向头与 Set-Cookie重定向 URL 中的参数、服务端下发的 Cookie 也会被提取自定义 Header/Cookie当参数提取启用时配置的http_headers/http_cookies会被发射为WEB_PARAMETER。值得注意的是参数提取是按需启用的setup()中会检查当前扫描是否有模块监听WEB_PARAMETER事件只有在存在消费者时才加载parameter_extraction规则。从源码注释看目前WEB_PARAMETER事件主要被hunt模块使用paramminer模块也会在有限程度上使用它们而未来的功能将大量依赖这类事件。excavate 还提供两个相关选项speculate_params默认False启用后会对 JSON/XML 内容进行推测性参数提取发射SPECULATIVE类型的WEB_PARAMETERparameter_blacklist/parameter_blacklist_prefixes过滤无价值参数名。Email Extraction邮箱提取EmailExtractor子模块通过 YARA 正则/[^\W_][\w\-\.\\]{0,100}[a-zA-Z0-9\-]{1,100}(\.[a-zA-Z0-9\-]{1,100})*\.[a-zA-Z]{2,63}/检测HTTP_RESPONSE数据中的邮箱地址并发射EMAIL_ADDRESS事件。Error Detection错误信息检测ErrorExtractor子模块扫描 HTTP 响应与原始文本数据中的冗余错误信息。通过识别来自各种编程语言与框架的特定错误签名帮助发现配置错误、调试信息残留与潜在漏洞。内置签名覆盖了以下平台见 bbot/modules/internal/excavate.pyPHP如Fatal error:、.php on line [0-9]Microsoft SQL Server如[ODBC SQL Server Driver|SQL Server|ODBC Driver Manager]Java如.java:[0-9]、.java(Inlined )?Compiled CodePython如File [...], line [0-9], inRuby如.rb:[0-9]:inASP.NET如Exception of type、--- End of inner exception stack trace ---Perl如.pm line [0-9]。命中后统一发射FINDING事件描述中包含具体签名标识如(PHP_1)。这类信息对定位 Web 应用的薄弱点或异常极为有价值。CSP 提取从 Content-Security-Policy 中发现域名CSPExtractor子模块聚焦于从Content-Security-Policy响应头中提取域名。通过分析 CSP 头BBOT 可以发现更多域名并反馈回扫描流程发射为DNS_NAME事件从而扩展资产覆盖面。序列化检测识别危险的反序列化对象序列化对象是严重安全漏洞的常见来源。SerializationExtractor子模块旨在检测 Java、.NET、PHP 应用中出现的序列化数据其内置特征包括JavarO0...Java 序列化魔术头RubyBAh....NETAAEAAAD//...PHP数组/字符串/对象YTo...、czo...、Tzo...疑似压缩数据H4sIAAAA...gzip 魔术头。命中后发射FINDING事件并标注具体类型。功能性检测定位易受攻击的功能点FunctionalityExtractor子模块查找特定的 Web 功能元素帮助 BBOT 定位可能需要进一步安全审查的区域包括文件上传字段input typefile标签WSDL URL匹配https?://[^\s]*\.wsdl并利用emit_match把命中的 URL 内容包含进事件描述中。非 HTTP Scheme 检测发现其他攻击向量NonHttpSchemeExtractor子模块提取带有非 HTTP scheme 的 URL如ftp、mailto、javascript等。命中后会发射两类事件FINDING描述为Non-HTTP URI: ...PROTOCOL事件携带协议名与主机若有端口则一并给出。同时规则内置了 scheme 黑名单javascript、mailto、tel、data、vbscript、about、file并参考 bbot/wordlists/valid_url_schemes.txt 中的合法 scheme 列表进行校验。通过识别这些 URLBBOT 可以揭示额外的攻击面或信息泄露向量。其他提取器JWTExtractor匹配eyJ...形式的 JSON Web Tokenemit_match开启时会把 token 原文写入事件描述HostnameExtractor基于扫描目标动态生成 YARA 规则从响应中提取目标域名的子域/相关域名发射DNS_NAMELoginPageExtractor检测同时包含用户名与密码输入框的登录页面并为事件打上login-page标签。自定义 YARA 规则excavate 支持使用自定义 YARA 规则它们会在扫描开始前被合并进其他规则中一并编译。有两种提供方式命令行选项--custom-yara-rules/-cy定义于 bbot/scanner/preset/args.py后跟存放规则的本地文件路径配置项excavate.custom_yara_rules模块选项值可以是规则文件路径或规则内容本身。从 bbot/modules/internal/excavate.py 的setup()逻辑可以看到加载细节若路径指向文件则读取文件内容否则把配置值当作规则内容每条规则先经yara.compile()验证语法再从规则体中提取规则名注册到CustomExtractor中加载成功后打印Successfully added N custom Yara rule(s)。自定义规则的编写与 meta 选项description、tags、emit_match的详细用法参见 docs/modules/custom_yara_rules.md核心要点如下description规则的描述会出现在最终事件的 description 字段中tags逗号分隔的字符串会被原样传递到产出事件的标签上emit_match设为true时YARA 正则命中并提取的内容会包含在FINDING事件中。一个最简单的规则示例rule find_string { strings: $str1 AAAABBBB condition: $str1 }配合命令使用bbot -m httpx --custom-yara-rulestest.yara -t http://example.com/另外excavate 模块还有两个可调选项见 bbot/modules/internal/excavate.pyyara_max_match_data默认 2000单个 YARA 正则最多可提取的文本长度speculate_params默认 False是否从 JSON/XML 内容中做推测性参数提取。需要留意YARA 使用自己的正则引擎与 Python 正则并非一一对应现有 Python 正则往往需要改造才能工作但 YARA 引擎速度极快远胜 Python 正则。speculate基于常识的数据推断speculate模块的核心思想是用一种数据类型推断另一种数据类型尤其是在未启用端口扫描器等工具时。对于大多数 BBOT 扫描而言这是必不可少的功能——它允许在仅有 DNS 目标列表且没有端口扫描器的情况下发现 Web 资源通过利用现有信息弥合数据缺口提供更全面的目标视图。实现位于 bbot/modules/internal/speculate.py。关键选项options {max_hosts: 65536, ports: 80,443, essential_only: False} options_desc { max_hosts: Max number of IP_RANGE hosts to convert into IP_ADDRESS events, ports: The set of ports to speculate on, essential_only: Only enable essential speculate features (no extra discovery), }max_hosts默认 65536IP_RANGE 转 IP_ADDRESS 时最多转换的主机数上限ports默认80,443推测开放端口时使用的端口集合essential_only默认 False只启用必要推测功能关闭额外发现。setup()中还会动态判断若当前扫描没有启用主动端口扫描器则默认假定这些端口开放并打印No portscanner enabled. Assuming open ports: 80, 443若目标主机数超过max_hosts且无端口扫描器会给出启用portscan模块的强烈建议。推测规则明细IP_RANGE → IP_ADDRESS将 IP 网段展开为单个 IP 地址发射为IP_ADDRESS事件。展开前会做随机打乱random.shuffle避免对同一网段的连续 IP 按固定顺序探测。DNS_NAME → 父域名从 DNS 名称生成父域名如sub.example.com→example.com发射为新的DNS_NAME事件。URL / URL_UNVERIFIED → OPEN_TCP_PORT 与子目录推测从 URL 推断开放的 TCP 端口OPEN_TCP_PORT事件——若该端口不在默认推测端口集合中从已验证的 URL 推测其子目录 URL发射为URL_UNVERIFIED继承父事件的web_spider_distance不递增。通用 URL 推测对URL事件或任何带有url属性的字典型事件若该 URL 尚未出现在事件历史中则发射URL_UNVERIFIED事件。IP_ADDRESS / DNS_NAME → OPEN_TCP_PORT若未启用主动端口扫描则为 IP 或已解析的 DNS_NAME 推测开放端口发射OPEN_TCP_PORT标记为内部事件。ORG_STUB 推导从以下来源推导组织代号ORG_STUB事件TLD 域名对距离为 0 的DNS_NAME通过tldextract提取公共后缀下的主域部分含 punycode 解码与 unidecode 规范化SOCIAL 事件取stub字段AZURE_TENANT 事件取tenant-names字段列表。USERNAME → EMAIL_ADDRESS将用户名转换为邮箱地址——若该用户名能通过邮箱软校验validators.soft_validate则发射为EMAIL_ADDRESS事件标记affiliate。从 bbot/core/event/base.py 的注释可知speculate 产生的大量OPEN_TCP_PORT属于内部事件internalTrue它们只用于模块间的正常流转不进入输出模块避免干扰扫描结果的可读性同时支撑诸如sslcert等模块对 distance-1 端口的需求。unarchive文件解压补充除文档列出的 5 个模块外从源码目录 bbot/modules/internal/ 还可以看到第 6 个内部模块unarchive。它监听FILESYSTEM事件将下载的压缩文件解压到文件系统文件夹中并重新发射FILESYSTEM事件以便后续模块如 extractous、excavate 的 RAW_TEXT 管道继续处理解压出的内容。其支持的压缩格式见 bbot/modules/internal/unarchive.pyzip、bzip2、xz、7z、tar、gzip分别调用7z或tar完成解压并有 1GB 的解压大小上限保护Java ArchiveJAR与 Android APK 默认跳过交由jadx等专用模块处理。如何管理内部模块通过配置文件禁用在配置文件的根级如 bbot/defaults.yml将对应项设为Falsespeculate: False # 关闭数据推断 excavate: False # 关闭被动挖掘 aggregate: False # 关闭扫描结束统计表 dnsresolve: False # 关闭 DNS 解析谨慎会影响白/黑名单判断可考虑 dns.minimaltrue cloudcheck: False # 关闭云厂商标记使用注意事项dnsresolve关闭会显著影响扫描的范围控制能力若仅想提速官方建议优先使用dns.minimal: true只解析 A/AAAA 记录、不创建新 DNS 事件而不是完全禁用excavate关闭后--custom-yara-rules也将失去作用speculate关闭后仅凭 DNS 目标列表且无端口扫描器的扫描将很难发现 Web 资源上述配置项均以根级配置键的形式出现与普通模块的modules: {name: {...}}嵌套结构不同。小结BBOT 的内部模块构成了扫描的基础设施层模块配置键核心职责关键源码aggregateaggregate扫描结束统计汇总bbot/modules/internal/aggregate.pycloudcheckcloudcheck云厂商标记、存储桶识别bbot/modules/internal/cloudcheck.pydnsresolvednsresolveDNS 解析、通配符检测bbot/modules/internal/dnsresolve.pyexcavateexcavate被动挖掘 URL/参数/邮箱/错误/CSP 等bbot/modules/internal/excavate.pyspeculatespeculate事件类型间数据推断bbot/modules/internal/speculate.pyunarchive随内部模块自动加载压缩文件解压bbot/modules/internal/unarchive.py理解这些模块的职责与配置是掌控 BBOT 扫描行为、定制扫描范围与性能的关键一步。它们默认全开、按需可关合理的组合例如配合dns.minimal、speculate.essential_only、excavate 的自定义 YARA 规则可以让扫描在速度、深度与覆盖面之间取得理想的平衡。若想进一步了解自定义 YARA 规则的 meta 选项与正则编写技巧可直接阅读 docs/modules/custom_yara_rules.md更多扫描预设与配置细节可参考 docs/scanning/presets.md 与 docs/scanning/configuration.md。【免费下载链接】bbotThe recursive internet scanner for hackers. 项目地址: https://gitcode.com/GitHub_Trending/bb/bbot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价