Crawlector(名称 Crawlector 是 Crawler(爬虫)与 Detector(检测器)的组合)是一个威胁狩猎框架,专门用于扫描网站中的恶意对象。
注意-1:该框架于 2022 年 10 月 22 日在意大利贝加莫的 No Hat 会议上首次展示(幻灯片,YouTube 录像)。此外,它于 2022 年 12 月 2 日在新加坡的 AVAR 会议上第二次展示。
注意-2:演讲中提到的配套工具 EKFiddle2Yara(该工具可将 EKFiddle 规则转换为 Yara 规则)也同时在这两次会议上发布。
注意-3:2.0 版本(Photoid Build:180923)是一个里程碑版本,于 2023 年 9 月 18 日发布。
注意-4:2.1 版本(Universe-647 Build:031023)于 2023 年 10 月 3 日发布。主要新增功能是 Slack 警报通知功能。
注意-5:2.2 版本(Hallstatt Build:051123)于 2023 年 11 月 5 日发布。主要新增功能是 Slack 远程控制功能。
注意-6:2.3 版本(Munich Build:241123)于 2023 年 11 月 24 日发布。主要新增功能是 DNS 名称服务器功能。
注意-6:2.3.1 版本(Nero Build:131225)于 2025 年 12 月 13 日发布。这是一个维护版本。
此功能用于针对每个被扫描页面检查恶意 URL。框架可以从 URLHaus 服务器查询恶意 URL 列表(配置项:url_list_web),或者从磁盘上的文件查询(配置项:url_list_file);如果指定了后者,则后者优先。
其工作原理是将每个页面的内容与 url_list_web 或 url_list_file 中的所有 URL 条目进行匹配,检查所有出现的位置。此外,如果匹配成功,且配置选项 check_url_api 设置为 true,Crawlector 将向 url_api 配置选项中设置的 API URL 发送 POST 请求,该请求返回一个包含匹配 URL 额外信息的 JSON 对象。此类信息包括 urlh_status(例如 online、offline、unknown)、urlh_threat(例如 malware_download)、urlh_tags(例如 elf、Mozi)和 urlh_reference(例如 https://urlhaus.abuse.ch/url/1116455/)。仅当 check_url_api 设置为 true 时,这些信息才会包含在日志文件 cl_mlog_<当前日期><当前时间><(上午|下午)>.csv(见下文)中。否则,日志文件将包含列 urlh_url(匹配的恶意 URL 列表)和 urlh_hit(每个匹配恶意 URL 的出现次数),前提是 check_url 设置为 true。
通过将配置选项 check_url 设置为 false,可以完全禁用 URLHaus 功能。
需要指出的是,考虑到需要检查的恶意 URL数量巨大(在撰写本文时约有 1.3 亿条),以及从 URLHaus 服务器获取额外信息所需的时间(如果选项 check_url_api 设置为 true),此功能可能会拖慢扫描速度。
在运行任何会话之前,您必须熟悉配置文件 cl_config.ini。所有部分和参数均在配置文件中提供了文档。
Yara 离线扫描功能是一个独立选项,意味着如果启用,Crawlector 将仅执行此功能,而不管其他已启用的功能。同样,爬取域名/站点数字证书的功能也是如此。无论如何,建议您在配置文件中禁用所有未使用的功能。
log_to_file 或 log_to_cons),如果 Yara 规则仅引用模块的属性(例如 PE、ELF、Hash 等),则 Crawlector 在匹配时将仅显示规则名称,不包含偏移量和长度数据。注意:对于任何需要路径的选项,请始终提供绝对路径。
要访问/扫描一个网站,URL 列表必须存储在“cl_sites”目录下的文本文件中。
Crawlector 接受三种类型的 URL:
[a-zA-Z0-9_-]{1,128} = <url><id>[depth:<0|1>-><\d+>,total:<\d+>,sleep:<\d+>] = <url>
例如:
mfmokbel[depth:1->3,total:10,sleep:0] = https://www.mfmokbel.com
这等价于:
mfmokbel[d:1->3,t:10,s:0] = https://www.mfmokbel.com
其中,<id> := [a-zA-Z0-9_-]{1,128}
depth、total 和 sleep 也可以分别用其缩写形式 d、t 和 s 代替。
40 (10 + (10*3)) 个 URL。注意 1:通过将配置文件 [spider] 部分中的配置参数 live_crawler 设置为 false,可以将类型 3 的 URL 转换为类型 1 的 URL。
注意 2:空行以及以“;”、“#”或“//”开头的行将被忽略。
爬虫功能赋予 Crawlector 在目标页面上查找额外链接的能力。爬虫支持以下功能:
Type 3 才能使爬虫功能生效。exclude_url 配置选项指定一个通配符模式列表(以竖线分隔),以防止爬取匹配的 URL。例如:*.zip|*.exe|*.rar|*.zip|*.7z|*.pdf|.*bat|*.db。include_url 配置选项指定一个通配符模式列表(以竖线分隔),以仅爬取匹配该模式的 URL。例如:*/checkout/*|*/products/*。exclude_https 配置选项排除 HTTPS URL。add_ext_links 配置选项将出站/外部链接也纳入考虑(仅限主页面)。该功能遵循 exclude_url 和 include_url 配置选项。ext_links_only 配置选项仅考虑主页面的出站/外部链接,排除所有其他 URL。该功能遵循 exclude_url 和 include_url 配置选项。在 2.0 版本中,ID 通过将以下类型之一附加到 ID 本身来显式分配其类型:
每个 ID 都携带其类型,使得浏览和过滤结果更加容易。此外,此信息在内部出于各种原因使用。
site_ranking 部分提供了一些选项,用于更改 CSV 文件的读取方式。site 部分提供了通过尝试查找同一域名的所有可用顶级域名 (TLD) 和/或子域名来扩展给定站点的能力。如果找到,新的 TLD/子域名将像任何其他域名一样进行检查。rapid_api_key 键。find_tlds 后,除了 Omnisint Labs API 的 tld 结果外,框架还会尝试通过遍历 tlds_file 或 tlds_url 中的每个 tld 条目来查找其他活动/已注册的域名。tlds_url,则应指向一个托管 tld 的 URL,每行一个 tld(以 ';'、'#' 或 '//' 开头的行将被忽略)。tlds_file 包含 tld 列表的文件名(与 tlds_url 相同;仅包含 tld,不包括 '.',例如“com”、“org”)。tlds_file,则其优先级高于 tlds_url。tld_dl_time_out,用于设置尝试检查相关域名是否解析时 dnslookup 函数的最大超时时间。tld_use_connect,此选项启用通过选项 中定义的端口列表连接相关域名的功能。先前版本中的 URL 重定向功能存在缺陷。此版本对重定向功能进行了完全重写,并提供了高度参数化以控制其操作。在 2.0 版本中,重定向在配置文件中拥有一个专用部分,名为 [redirect]。整个重定向功能可以通过 [default] 部分下的选项 follow_redir 开启/关闭。
重定向函数检查 HTTP 响应状态码:301、302、303、307 和 308。如果匹配,Crawlector 将解析 Location 头部以获取重定向到的 URL,同时处理绝对和相对重定向 URL。Crawlector 中的重定向功能专为性能和敏捷性而设计。[redirect] 部分提供以下选项列表:
depth 选项接受值 last 或 all。它控制根据 visit 选项是否启用而访问哪些找到的重定向 URL。all 用于访问所有找到的重定向 URL。last 用于访问最后一个重定向 URL。这些 URL 的访问发生在同一/当前会话中。请记住,无论 depth 值如何,Crawlector 都会记录所有找到的重定向 URL 列表及其总数,以绝对形式存储。它们将写入 cl_mlog CSV 文件的 redirect_urls 和 redirect_total 列中。
选项 max_redirect 设置了要发现的 URL 重定向总数的上限。
选项 skip_similar 通过以下示例进行最佳解释:
假设赋予 Crawlector 爬取的原始 URL 是 "https://www.mfa.gov.law",而找到的重定向 URL 之一是 "https://mfa.gov.law/"。如您所见,唯一区别是 URL 末尾的正斜杠。这两个 URL 是相同的,服务器将返回相同的页面。如果选项 visit 设置为 true,Crawlector 将爬取这两个 URL,从而浪费资源并重复执行相同任务。对于 1 或 2 个 URL 这可能不是问题,但如果您有数千个要爬取的 URL,并且启用了 visit 选项,那么超过一半的 URL 很可能会有这样的发现,这时这就成为一个紧迫的问题。因此,将 skip_similar 选项设置为 true 可以通过跳过访问相似的 URL 来帮助解决此问题。除了正斜杠情景外,skip_similar 选项还考虑以下两种情景:如果重定向 URL 仅因前缀 "https://" 和/或 "www." 不同。
2.0 版本的主要新增功能之一是能够从页面中提取不同类型的对象,将其保存到磁盘,执行 Yara 和 URLHaus 扫描,并将结果保存到 CSV 文件。要启用此功能,请在 [page] 部分下将选项 extract_obj 设置为 true。深度对象提取功能的实现方式是从网页创建一个 MHT Web 存档文件,其中包含外部脚本、图像和 CSS 文件。所有嵌入的文件都将被提取到选项 obj_dir 指定的路径中(路径:obj_dir/objects/),每个文件都会被扫描。不要将此实现与无头浏览器功能混淆。DOE 有所不同,它不涉及加载页面来检索所有动态查询的 URL。因此,它有其局限性。
所有提取的对象都会将其部分元数据写入 CSV 文件中。读取 CSV 文件时需要注意:包含提取对象的域 ID 具有唯一格式,如下所示:<domain_id>_<type>_p_obj_<counter>(例如,_mfa_gov_cef40bc5-ba6a-41_t1_p_obj_0_)。并且 URL 将具有以下格式:<url>__<object_filename>(例如,_https://www.mfa.gov.law\_\_bilmur.min.js_)。
如果选项 delete_obj 设置为 true,则所有未被 Yara 检测到的提取对象将从磁盘中删除。 如果选项 log_all_objs 设置为 true,则将所有提取对象的元数据记录到同一个 cl_mlog CSV 文件中。 如果 [page] 部分下的选项 check_urlhaus 设置为 true,则每个提取的对象都将被 URLHaus 扫描。请注意,此选项的选项继承自 [urlhaus] 部分。
注意:如果要爬取的域重定向到另一个域,则必须将最后一次重定向到的 URL 传递给 DOE 才能工作。此外,域必须以 "HTTP(S)://" 开头 DOE 才能工作。
有时候,你可能希望运行可能需要数天才能完成的 Crawlector 会话,例如,爬取 Alexa 前 100 万网站,在这种情况下,你需要一种远程监控框架运行和进度的方法。因此,在 2.1 版本中,我添加了 Slack 警报通知功能,提供一种实时监控 Crawlector 执行的机制,将 Yara 警报、std::exit() 事件以及进程警告和错误发送到你选择的 Slack 频道。除此之外,Crawlector 还安装了一个控制台处理程序,用于尝试监控某些事件类型,包括 ctrl_c、ctrl_close、ctrl_break、ctrl_logoff 和 ctrl_shutdown。重要的是要记住,Crawlector 不会更改/改变默认处理程序的行为;它只是向 Slack 频道报告收到任何列出的事件。将来可以扩展此功能以处理其他类型的事件。
此功能使用 Slack REST API,并使用 OAuth 2.0 进行服务器身份验证。你需要一个 Slack API 令牌才能使用它,以及一个配置了正确权限的频道。此功能仅向 Slack 频道发布消息,不接收或处理任何传入消息。
[slack_alert] 部分提供以下选项列表:
要禁用或启用此功能,只需将选项 alert 设置为 true 或 false。此外,你需要指定 api_token 和 channel 名称。
注意-1:在 Crawlector 的初始化阶段,它会测试提供的身份验证令牌是否有效,以及频道是否已设置,如果失败,此功能将自动禁用。
所有报告到 Slack 频道的警报都以用户名 Crawlector v<版本号> 报告,例如 Crawlector v2.1。该用户的图标是蜘蛛网。此外,所有警报都是线程化的,意味着从第一条开始消息之后的所有后续警报都以回复形式发布。这是一个设计决策,有助于同时运行多个会话并报告到同一频道。某些警报使用 markdown 标记语言进行格式化。
当进程成功完成并即将退出时,它会发布以下消息:
Crawlector 已完成并正在成功关闭
注意-2:Slack 对发布消息 API 的速率限制是每秒一条消息,允许一些突发余量。Crawlector 不会对消息进行排队以应对每秒更多发布。如果将来需要,这可能会改变;但是,选项 sleep 允许进程在每次成功发布消息后休眠指定时间。
在 2.2 版本(代号 Hallstatt)中,我引入了通过一组专门设计的控制命令远程控制 Crawlector 的能力。引入此功能的原因是为了监控和控制计划运行数小时或数天的会话的某些行为。例如,你可能希望打开/关闭 Slack 警报功能、终止 Crawlector、上传配置文件等。
此功能使用 Slack REST API,并使用 OAuth 2.0 进行服务器身份验证。你需要一个 Slack API 令牌才能使用它,以及一个配置了正确权限的频道。API 令牌与 [slack_alert] 部分中选项 api_token 使用的相同。
[slack_alert] 部分为远程控制功能提供以下附加选项列表:
要禁用或启用此功能,只需将选项 control 设置为 true 或 false。ctrl_channel 名称必须是频道 ID 名称,而不是频道名称。你可以通过右键单击频道名称 -> 查看频道详情 -> 向下滚动到窗口底部,你将看到频道 ID:<channel_id> 字段来获取它。
选项 ctrl_sleep 决定了向 ctrl_channel 选项中指定的控制频道发出调用以检索控制命令的频率。你也可以通过控制命令 cl_update_delay <time_in_ms> 来更新此选项。
支持的控制命令列表如下:
注意-1:在 Crawlector 的初始化阶段,它会测试提供的身份验证令牌是否有效,以及频道是否已设置,如果失败,此功能将自动禁用。
如果启用了此功能,并且一旦通过 API 令牌验证,Crawlector 会将消息 "Crawlector 已准备好接收控制命令。输入命令 cl_help 以获取支持的控制命令列表。" 发送到指定的 ctrl_channel。
对给定控制命令的所有回复都是线程化的。此外,控制命令是按会话读取的,从会话启动时开始。
注意-2:Slack 对检索(对话历史记录)消息 API 的速率限制是每秒一个请求,允许一些突发余量。因此,如果 ctrl_sleep 选项设置为小于一秒或大于一秒的值,Crawlector 确实会排队 消息以应对每秒更多 控制命令,并按接收顺序执行它们。
在 2.3 版本(代号 Munich)中,引入了为 Crawlector 尝试的所有 DNS 查询和 DNS 到 IP 解析指定 DNS 名称服务器列表的功能,具有高度控制能力。这在爬取被屏蔽或恶意网站时非常重要。此功能适用于 Crawlector 中所有进行 DNS 查询或 DNS 到 IP 请求的函数。更重要的是,它能够为每个支持 TLS 的名称服务器执行 DNS over TLS。
[dns_ns] 部分提供以下选项列表来管理此功能:
选项 name_servers 接受一个参数化的 DNS 名称服务器列表,以逗号分隔。此选项的值格式为:<IPv4_address>(<tls_option>),其中 <tls_option> 取值为 "d_tls" 或 "e_tls"。选项 "d_tls" 或 "e_tls" 分别指示相关的名称服务器是否支持 DNS over TLS。此选项将根据选项 dns_tls 设置的值强制执行。例如,条目 8.8.8.8(e_tls) 指示使用支持 TLS 的 Google DNS 服务器 8.8.8.8,而条目 12.13.14.15(d_tls) 指示使用不支持 TLS 的 DNS 服务器 12.13.14.15。
选项 dns_tls 指定所需的 TLS 强制级别。此选项取值 "yes"、"no" 或 "force"。
选项 keep_default 用于是否将默认名称服务器添加到名称服务器列表中。默认名称服务器假定不支持 TLS。
选项 conn_time_out 指定等待 DNS 查询答案的时间(以毫秒为单位)。
选项 enable 打开或关闭此功能。
cl_sites 中重复域/URL。欢迎提交拉取请求和问题。非常感谢评论和建议。
Mohamad Mokbel (@MFMokbel)
| id_postfix (类型) | 描述 |
|---|
| _t1_p | 类型 1,无 ID 的普通 URL |
| _sd | 子域名子类型 |
| _tld | TLD 子类型 |
| _t2_p | 类型 2,有 ID 的普通 URL |
| _t3_s | 类型 3,爬取到的域名 |
| _t3_sc | 类型 3,带子节点的爬取到的域名 |
| _t3_ss | 类型 3,当类型 3(_t3_s)URL 转换为类型 1 URL |
| _t3_s_e | 类型 3,爬取到的域名外部链接 |
| _obj_ | 用于深度扫描和对象提取 |
| _t4_ru | 用于重定向 URL(适用于所有类型) |
tlds_connect_portstlds_connect_ports 接受一个逗号分隔的端口列表,或一个范围列表,例如 25-40,90-100,80,443,8443(范围起始和结束包含)。
tld_con_time_out,用于设置连接函数的最大超时时间。tld_con_use_ssl,启用/禁用尝试连接域名时使用 SSL。save_to_file_subd 设置为 true,发现的子域名将保存到 "\expanded\exp_subdomain_<日期><时间><上午|下午>.txt"。save_to_file_tld 设置为 true,发现的域名将保存到 "\expanded\exp_tld_<日期><时间><上午|下午>.txt"。exit_here 设置为 true,则 Crawlector 在执行完此 [site] 功能后退出,而不管其他已启用的选项。这意味着找到的站点将不会被爬取/爬行。| 控制命令 | 描述 |
|---|
| cl_get_date | 检索 Crawlector 启动时的日期和时间以及当前日期和时间。 |
| cl_ping | 发送回复消息 "Pong..."。用于检查 C&C 频道是否正常工作。 |
| cl_get_config | 将当前使用的配置(例如 cl_config.ini)文件作为文本文件上传。 |
| cl_update_delay <毫秒整数> | 更新每次拉取控制命令请求之间的签到时间。 - 仅更改当前会话的值 (ctrl_sleep)。 |
| cl_turn_off_slack_alert | 关闭当前活动会话的 Slack 警报功能。 |
| cl_turn_on_slack_alert | 打开当前活动会话的 Slack 警报功能。 |
| cl_help | 列出此帮助消息。 |
| cl_exit | 强制终止 Crawlector。 |