关于 detecting-exfiltration-over-dns-with-zeek
面向 SOC 分析师和威胁猎手的安全分析技能,用于从 Zeek dns.log 数据中检测 DNS 外传。它评估熵、标签长度、子域名唯一性和查询量,对可疑域名排序并生成 JSON 报告。
主要功能
- 01解析 Zeek dns.log TSV 标头
- 02计算子域名熵值
- 03标记异常长的标签
- 04按域名统计唯一子域名
- 05依据查询指标为域名评分
- 06生成 JSON 检测报告
适用场景
- 01调查疑似 DNS 数据外传
- 02制定 DNS 隧道威胁狩猎流程
- 03评估网络监控覆盖情况
- 04为事件响应排列可疑域名
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill detecting-exfiltration-over-dns-with-zeek安装后在 Claude Code 中输入/detecting-exfiltration-over-dns-with-zeek确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
使用 Zeek 检测基于 DNS 的数据外传
概述
DNS 隧道和外传是攻击者通过将窃取的数据编码到 DNS 查询子域中来绕过防火墙和 DLP 控制的一种技术。合法的 DNS 查询具有可预测的熵和长度模式,而外传查询包含编码数据,具有高香农熵、异常长的子域标签,以及每个父域下大量唯一子域的特点。
本技能分析 Zeek dns.log 文件(TSV 格式)以检测外传指标。Agent 会计算每个子域组件的香农熵,识别超过 63 个字符 DNS 标签限制的查询,统计每个父域下的唯一子域数量,并标记超过可配置阈值的域。这些技术可检测 dnscat2、iodine、dns2tcp 以及自定义 DNS 隧道实现等工具。
何时使用
- 在调查需要检测基于 Zeek 的 DNS 外传的安全事件时
- 在为该领域构建检测规则或威胁狩猎查询时
- 当 SOC 分析师需要针对此类分析的结构化流程时
- 在验证相关攻击技术的安全监控覆盖范围时
前置条件
- Python 3.9 或更高版本,包含 math 和 collections 模块(标准库)
- 采用 TSV 格式且带有标准字段头的 Zeek dns.log 文件
- 由 Zeek 5.0+ 或更高版本处理的网络捕获数据
- 了解 DNS 协议结构和查询类型
步骤
-
解析 Zeek dns.log 头部:读取 TSV 文件,提取
#fields头部行以确定ts、id.orig_h、query、qtype_name、rcode_name和answers的列位置。 -
提取并分解查询:对于每个 DNS 查询,将 FQDN 拆分为子域标签和父域。跳过对已知安全域和内部区域的查询。
-
计算香农熵:计算每个子域标签的信息熵。合法子域的熵通常低于 3.5,而编码/加密数据产生的熵高于 4.0。
-
检测长标签:标记超过 52 个字符的 DNS 标签(接近 63 个字符的最大值)。长标签是数据隧道的有力指标。
-
统计每个域的唯一子域数量:跟踪每个父域接收到的不同子域数量。在日志窗口内拥有超过 50 个唯一子域的域是可疑的。
-
识别查询量异常:计算每个源 IP 每个域每分钟的查询数。外传工具会生成持续的高流量查询流,与正常浏览不同。
-
对域进行评分和排名:将熵、标签长度、唯一性计数和查询量组合成综合风险评分。按评分对域进行排名,并输出排名靠前的可疑域。
-
生成检测报告:生成 JSON 报告,包含被标记的域、其证据指标、来源 IP 以及建议的响应措施。
预期输出
{
"analysis_summary": {
"total_queries_analyzed": 145832,
"unique_domains": 3421,
"flagged_domains": 3,
"entropy_threshold": 3.5
},
"flagged_domains": [
{
"domain": "data.evil-c2.com",
"unique_subdomains": 892,
"avg_entropy": 4.72,
"max_label_length": 61,
"source_ips": ["10.0.1.45"],
"risk_score": 9.4,
"indicators": ["high_entropy", "long_labels", "high_subdomain_count"]
}
]
}