Sigma规则驱动:自动化网络空间测绘与威胁狩猎实战指南
1. 项目概述:一个为安全研究量身定制的开源情报工具
如果你是一名安全研究员、渗透测试工程师,或者对网络资产测绘、威胁情报收集感兴趣,那么你很可能听说过或正在寻找像shodan、censys这样的网络空间搜索引擎。它们能帮你发现暴露在公网上的设备、服务及其脆弱性。今天要聊的这个项目——manojmallick/sigmap,可以看作是这类工具的一个强力补充和自动化执行引擎。它不是另一个搜索引擎,而是一个规则驱动的、可扩展的指纹识别与数据提取框架。简单来说,它允许你用一种类似yara的规则语言,去描述你想在互联网上寻找的“特征”,然后它自动调用后端引擎(如shodan、censys、fofa、zoomeye等)进行搜索,并将结果进行结构化解析和输出。
我第一次接触sigmap是在一次内部红队演练中,我们需要快速定位某个特定版本、存在已知漏洞的物联网设备。手动在多个平台编写查询语句、翻页、导出再整理,效率极低且容易遗漏。sigmap的出现,让我们能够将这种“特征”写成一条规则,然后一键批量执行,结果直接以JSON、CSV等格式输出,极大地提升了侦察阶段的效率。它特别适合用于漏洞影响范围评估、特定资产普查、威胁狩猎(如寻找某家族恶意软件的C2服务器)等场景。无论你是想自动化你的攻击面发现流程,还是构建自己的威胁情报源,sigmap都提供了一个非常优雅且强大的解决方案。
2. 核心设计理念与架构拆解
2.1 为什么是“规则驱动”?从手动查询到自动化狩猎的转变
传统的网络空间测绘流程是:分析目标特征 -> 在shodan等平台手动构造查询语法 -> 执行搜索 -> 人工浏览或导出结果 -> 手动解析关键信息(如IP、端口、横幅、证书信息等)。这个过程重复、繁琐,且严重依赖操作者的经验和对不同查询语法的熟悉程度。
sigmap的核心创新在于引入了“Sigma规则”的概念。这里的 Sigma 并非指那个著名的威胁检测规则项目,而是一种项目自创的、用于描述网络服务指纹的领域特定语言(DSL)。一条 Sigma 规则就是一个YAML文件,它清晰地定义了:
- 我们要找什么:通过
detection字段,使用逻辑组合(and,or,not)来匹配HTTP响应头、HTML标题、证书主题、特定关键字等。 - 从哪里找:通过
search字段指定使用哪个后端搜索引擎(如shodan,censys)。 - 怎么输出:通过
fields字段定义从结果中提取哪些感兴趣的字段(如ip,port,org,vulnerabilities)。
这种设计将“特征知识”(规则)与“执行引擎”(sigmap核心)解耦。安全团队可以积累和维护一个规则库,每条规则对应一种设备、一个服务、一个漏洞指纹甚至一个威胁指标。当需要执行某项侦察任务时,只需指定对应的规则文件,sigmap会负责翻译成对应搜索引擎的查询语句,并发起请求、解析结果。这实现了安全研究的“代码化”和“资产化”。
2.2 项目架构:模块化与可扩展性
sigmap的架构体现了清晰的模块化思想,主要分为三层:
- 规则层(Sigma Rules):位于最上层,由用户编写和维护。规则文件存放在
rules/目录下,按类别组织。这是项目的“知识库”,也是其价值所在。 - 核心引擎层(Core Engine):这是
sigmap的主程序。它负责:- 规则解析:读取并验证 Sigma 规则文件的语法和结构。
- 查询翻译:根据规则中的
search配置,将detection逻辑转换为目标搜索引擎(如 Shodan)能理解的查询字符串。这是技术难点之一,因为每个搜索引擎的查询语法和特性都有差异。 - 任务调度与执行:管理并发请求,处理 API 速率限制,优雅地处理错误和超时。
- 结果解析与输出:接收搜索引擎返回的原始数据(通常是 JSON),根据规则中定义的
fields,提取、清洗并格式化数据,输出为指定的格式(JSON, CSV, 表格等)。
- 连接器层(Connectors):位于最底层,负责与具体的搜索引擎 API 进行通信。每个搜索引擎(Shodan, Censys, Fofa, ZoomEye)都有一个对应的连接器模块。连接器封装了 API 的认证、请求构造、分页处理和数据解析等细节。这种设计使得添加新的搜索引擎支持变得相对容易,只需实现一个新的连接器即可。
注意:
sigmap本身不爬取或扫描互联网,它只是一个“智能中介”。所有数据都来源于其集成的第三方搜索引擎。因此,使用sigmap的前提是你拥有这些搜索引擎的有效 API 密钥,并遵守其服务条款和速率限制。
3. 深入Sigma规则:编写你的第一份“狩猎指南”
规则是sigmap的灵魂。理解如何编写一条有效的规则,是发挥其威力的关键。让我们通过一个实际例子来拆解。
假设我们需要寻找暴露在公网上的、版本号小于2.4.50的Apache HTTP Server,因为这个版本存在一个高危漏洞(CVE-2021-41773)。我们的目标是找到所有这类易受攻击的资产。
3.1 规则文件结构解剖
一个完整的 Sigma 规则文件通常如下所示(我们命名为apache_httpd_cve-2021-41773.yml):
title: Apache HTTP Server < 2.4.50 - Path Traversal (CVE-2021-41773) id: 9eeb0f0a-1b5a-4c5e-a3d8-123456789abc # 随机唯一UUID status: test description: Detects Apache HTTP Server versions prior to 2.4.50 vulnerable to path traversal. references: - https://httpd.apache.org/security/vulnerabilities_24.html - https://nvd.nist.gov/vuln/detail/CVE-2021-41773 author: Your Name date: 2023/10/27 tags: - web - cve - apache - rce search: - shodan - censys detection: service: http version: - source: banner match: 'Apache/(2\.4\.[0-4][0-9]?|2\.4\.5[0-9]?|2\.[0-3]\.|1\.|0\.)' # 匹配小于2.4.50的版本 - source: html match: '<address>Apache/(2\.4\.[0-4][0-9]?|2\.4\.5[0-9]?|2\.[0-3]\.|1\.|0\.)' banner: - match: 'Server: Apache/(2\.4\.[0-4][0-9]?|2\.4\.5[0-9]?|2\.[0-3]\.|1\.|0\.)' condition: service and (version or banner) # 服务是HTTP,且版本或Banner信息匹配 fields: - ip - port - hostnames - org - location.country_name - vulns falsepositives: - Version string might be obfuscated in some distributions. level: high逐字段解析:
title,id,description:元信息,用于标识和描述规则。search:指定本规则使用的搜索引擎。可以是一个列表,sigmap会依次使用它们进行查询。detection:这是规则的核心。service: http:限定只搜索 HTTP 服务(端口 80, 443, 8080 等)。这能大幅缩小搜索范围,提升效率。version,banner:定义了多个“匹配源”和对应的正则表达式。这里从banner(服务横幅)和html(页面内容)中匹配Apache版本号。正则表达式Apache/(2\.4\.[0-4][0-9]?|2\.4\.5[0-9]?|2\.[0-3]\.|1\.|0\.)用于匹配所有小于2.4.50的版本。编写精准的正则表达式是规则有效的关键,需要你对目标服务的版本标识方式有深入了解。condition:定义了匹配的逻辑条件。本例中,要求目标必须是http服务,并且其version或banner信息匹配我们的正则表达式。逻辑运算符and,or,not可以构建复杂的条件。
fields:指定输出中需要包含的字段。这些字段名需要与后端搜索引擎返回的字段对应。例如,shodan的location.country_name对应国家名。falsepositives:提醒可能存在的误报情况,这是经验之谈。level:标识规则匹配结果的风险等级。
3.2 规则编写的经验与避坑指南
- 从简单开始,逐步复杂化:不要试图在一条规则里匹配所有特征。先写一条只匹配特定
Server头或HTML标题的简单规则,测试通过后,再逐步增加其他条件(如证书信息、特定路径响应、Cookie 等)来减少误报。 - 善用
service过滤:service字段(如http,ssh,ftp,elasticsearch)是sigmap和底层搜索引擎沟通的“快捷方式”。正确使用它能极大提升查询效率和准确性。你需要查阅sigmap和对应搜索引擎的文档,了解支持的service类型。 - 正则表达式要精确且高效:
- 避免贪婪匹配:尽量使用非贪婪操作符
.*?。 - 注意转义:在 YAML 中写正则,特殊字符如点
.需要转义\.。 - 测试你的正则:在编写规则前,先用在线的正则测试工具或本地用
grep测试你的表达式是否能准确匹配到样本数据。
- 避免贪婪匹配:尽量使用非贪婪操作符
- 理解后端搜索引擎的能力与限制:不同的搜索引擎索引的数据维度不同。
Shodan擅长端口横幅和元数据,Censys在证书和协议握手信息方面更强,Fofa和ZoomEye对 Web 特征支持较好。你的规则中的detection字段,必须基于目标搜索引擎实际提供的数据来设计。例如,一个依赖深度 HTML 内容分析的规则,在Shodan上可能效果不佳,因为Shodan通常只存储有限的页面内容。 - 管理你的规则库:建议按类别(如
cve/,iot/,cloud/,malware-c2/)组织规则文件。为每条规则生成唯一的id(可以用uuidgen命令)。在description中详细说明规则的意图和上下文,方便团队协作和后续维护。
4. 实战部署与核心操作流程
4.1 环境准备与安装
sigmap是一个 Python3 项目,安装相对简单。推荐在 Linux 或 macOS 环境下使用,Windows 可通过 WSL 获得最佳体验。
# 1. 克隆仓库 git clone https://github.com/manojmallick/sigmap.git cd sigmap # 2. 创建并激活虚拟环境(推荐) python3 -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 3. 安装依赖 pip install -r requirements.txt依赖解析:requirements.txt中通常包含requests(HTTP请求)、pyyaml(解析YAML规则)、colorama(彩色输出)、shodan(官方Python库)等。如果遇到缺失库,手动pip install即可。
4.2 配置API密钥
sigmap需要通过配置文件或环境变量来读取各搜索引擎的 API 密钥。最方便的方式是创建配置文件~/.config/sigmap/config.yaml(Linux/macOS)或%USERPROFILE%\.config\sigmap\config.yaml(Windows)。
shodan: api_key: "YOUR_SHODAN_API_KEY" censys: api_id: "YOUR_CENSYS_API_ID" api_secret: "YOUR_CENSYS_API_SECRET" fofa: email: "YOUR_FOFA_EMAIL" key: "YOUR_FOFA_KEY" zoomeye: api_key: "YOUR_ZOOMEYE_API_KEY"重要提示:请妥善保管你的 API 密钥。特别是免费账户的 API 调用次数有限,将密钥提交到公开仓库会导致密钥泄露和资源被盗用。建议将配置文件加入
.gitignore。
4.3 基础命令与使用模式
安装配置完成后,就可以开始使用了。sigmap主要通过命令行操作。
1. 列出所有可用规则:
python sigmap.py -l这会扫描rules/目录,列出所有规则的id、title和description,帮助你快速找到需要的规则。
2. 执行单条规则:
python sigmap.py -r rules/cve/apache_httpd_cve-2021-41773.yml这是最常用的命令。sigmap会读取规则,使用规则中定义的搜索引擎(本例中是shodan和censys)进行查询,并将结果打印到终端(默认表格形式)。
3. 指定输出格式:-o参数支持多种输出格式,便于后续处理。
# 输出为JSON格式,适合用jq等工具进行二次分析 python sigmap.py -r rules/cve/apache_httpd_cve-2021-41773.yml -o json > results.json # 输出为CSV格式,方便导入Excel或数据库 python sigmap.py -r rules/cve/apache_httpd_cve-2021-41773.yml -o csv > results.csv # 输出为简洁的“IP:PORT”列表,用于直接导入扫描工具 python sigmap.py -r rules/cve/apache_httpd_cve-2021-41773.yml -o list4. 批量执行规则(规则链):你可以创建一个文本文件,里面每行写一个规则文件的路径,然后使用-R参数批量执行。
# 创建规则列表文件 echo "rules/iot/camera_hikvision.yml" > rulelist.txt echo "rules/iot/router_tplink.yml" >> rulelist.txt # 批量执行 python sigmap.py -R rulelist.txt -o json --output-folder ./scan_results/--output-folder参数会将每个规则的结果分别保存到指定文件夹,并以规则ID或文件名命名。
5. 限制结果数量与并发:为了避免过量消耗 API 配额,可以使用-L限制每个搜索引擎返回的最大结果数,用-t控制并发线程数。
# 每个搜索引擎最多取100条结果,使用5个线程 python sigmap.py -r my_rule.yml -L 100 -t 54.4 一个完整的实战案例:追踪暴露的 Jenkins 服务器
假设我们需要统计互联网上未授权访问的 Jenkins 服务器(端口8080),并提取其版本号和所在组织。
步骤1:编写规则 (rules/ci/jenkins_unauth.yml)
title: Exposed Jenkins Servers (Unauthenticated) id: a1b2c3d4-5678-90ef-ghij-klmnopqrstuv status: production description: Detects Jenkins CI/CD servers exposed on the internet, often on port 8080. author: Security Researcher date: 2023/10/27 tags: - ci-cd - jenkins - devops search: - shodan detection: service: http port: 8080 html: - match: '<title>Dashboard \[Jenkins\]</title>' # Jenkins 经典标题 - match: 'Jenkins' # 页面内容包含Jenkins headers: - match: 'X-Jenkins: .*' # Jenkins 特有的HTTP头 condition: service and port and (html or headers) fields: - ip - port - hostnames - org - location.country_name - html:title # 提取HTML标题,里面通常包含版本号 falsepositives: - Some internal development pages might have similar titles. level: medium步骤2:执行侦察
python sigmap.py -r rules/ci/jenkins_unauth.yml -o csv -L 500 > jenkins_exposed.csv步骤3:结果分析与后续动作打开jenkins_exposed.csv,你会得到一个包含IP、端口、组织、国家等信息的列表。你可以:
- 用
cut,awk或 Excel 进行排序和统计(如哪个组织暴露最多)。 - 将
ip:port列表导出,用漏洞扫描器(如nuclei)对其进行深度漏洞检测。 - 手动访问几个目标,确认是否存在未授权访问漏洞。
5. 高级技巧、问题排查与生态整合
5.1 性能优化与大规模扫描策略
当规则库庞大或单个规则匹配范围很广时,直接运行可能导致 API 配额迅速耗尽或运行时间过长。
- 分而治之:对于宽泛的规则(如
service: http),可以拆分成基于端口、国家代码、组织等更细粒度的规则,分批执行。 - 利用搜索过滤器:在规则中,除了
detection,还可以在search块下使用搜索引擎特有的过滤器。例如,在 Shodan 连接器中,可以添加filters:
注意:这需要你熟悉每个搜索引擎的过滤语法,并且search: - shodan: query: "port:8080" filters: - "country:US" # 只搜索美国的资产 - "org:Google" # 只搜索谷歌旗下的资产sigmap的连接器可能并未完全暴露所有过滤器参数,有时需要修改连接器代码。 - 离线结果缓存:
sigmap本身没有内置缓存。对于需要反复验证的规则,一个实用的技巧是将首次的json输出保存下来,后续分析直接读取本地文件,避免重复调用 API。 - 分布式执行构想:对于超大规模扫描,可以编写脚本,将目标(如不同的国家代码、IP段)分配给多个
sigmap进程或机器同时执行,最后合并结果。这需要较强的脚本编写能力。
5.2 常见问题与排查实录
问题1:执行规则后无任何输出,也没有报错。
- 排查思路:
- 检查API密钥和配额:首先确认配置文件中的 API 密钥正确无误,并且该密钥在对应的搜索引擎上还有剩余查询额度。可以尝试用搜索引擎官方的命令行工具(如
shodan search 'apache' --limit 1)测试密钥是否有效。 - 检查规则语法:运行
python sigmap.py --check -r my_rule.yml(如果支持语法检查)。仔细检查 YAML 格式,特别是缩进和冒号后的空格。 - 检查查询是否过于宽泛或狭窄:在搜索引擎的 Web 界面上,手动输入你规则预期生成的查询语句,看看是否有结果。可能你的规则逻辑 (
condition) 太严格,或者目标特征在搜索引擎中未被索引。 - 开启调试输出:查看
sigmap是否有-v(verbose)或--debug参数,查看它实际发送的查询请求和接收的响应。
- 检查API密钥和配额:首先确认配置文件中的 API 密钥正确无误,并且该密钥在对应的搜索引擎上还有剩余查询额度。可以尝试用搜索引擎官方的命令行工具(如
问题2:结果误报率很高。
- 解决方案:
- 精炼正则表达式:这是最主要的原因。确保你的正则表达式能唯一标识目标,避免匹配到相似的其他服务。多收集一些正样本和负样本进行测试。
- 增加匹配条件:使用
and组合多个不同来源的特征。例如,同时匹配banner、html中的一个特定图标路径、以及证书中的组织字段。多条件同时满足的概率远低于单条件。 - 利用
service和port:尽可能限定服务类型和端口,这是最有效的过滤手段之一。 - 人工审核与迭代:对初期结果进行抽样检查,分析误报案例的特征,反过来修改你的规则。
问题3:运行过程中报错Rate limit exceeded或Connection error。
- 解决方案:
- 降低并发度:使用
-t 1或-t 2减少并发线程数。 - 增加延迟:如果
sigmap支持,在配置文件中或命令行添加请求间隔延迟。 - 使用付费API:免费API的速率限制通常很严格。对于生产级应用,考虑升级到付费计划。
- 分时段执行:将大型扫描任务拆分成多个小任务,在不同时间执行。
- 降低并发度:使用
5.3 与现有安全工具链的整合
sigmap的价值不仅在于独立使用,更在于它能嵌入到现有的自动化工作流中。
作为侦察阶段输入:将
sigmap的输出(-o list格式)直接管道传递给nmap或masscan进行端口确认和深度扫描。python sigmap.py -r rules/iot/camera.yml -o list | xargs -I {} nmap -sV -p {} -oA scan_result(注意:此命令仅为思路示意,需根据实际情况调整
xargs参数)与漏洞扫描器联动:将
sigmap发现的资产列表(CSV或JSON)作为nuclei、goby等漏洞扫描器的输入目标,进行自动化漏洞检测。python sigmap.py -r rules/cve/xxx.yml -o list > targets.txt nuclei -l targets.txt -t cves/ -o nuclei_results.txt生成动态威胁情报仪表板:定期(例如每天)执行一批关键规则,将
JSON结果导入到Elasticsearch+Kibana或Grafana中。你可以构建一个仪表板,实时监控全球范围内特定漏洞的暴露情况、特定恶意软件家族C2服务器的活跃度等,实现威胁情报的视觉化和监控。集成到CI/CD管道(蓝队视角):安全团队可以编写规则,用于发现公司资产是否被意外暴露在公网。将
sigmap作为定时任务集成到CI/CD中,一旦规则匹配到属于自己公司IP段的暴露资产,立即触发告警,通知相关团队进行修复。
在我个人的使用经验中,sigmap最大的优势在于它将“寻找什么”的知识(规则)固化了下来,并且通过社区可以不断积累。一个成熟的规则库本身就是一份宝贵的威胁情报资产。它的学习曲线主要在于规则编写和对各搜索引擎特性的理解,一旦掌握,它就能成为你网络空间测绘工具箱中一把高效、精准的“手术刀”。
