ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于 Zeek dns.log 的 DNS 数据外泄检测实战:熵分析、长标签与查询量异常识别

基于 Zeek dns.log 的 DNS 数据外泄检测实战:熵分析、长标签与查询量异常识别 基于 Zeek dns.log 的 DNS 数据外泄检测实战熵分析、长标签与查询量异常识别【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills导读DNS 是防火墙与 DLP 最常放行的协议之一攻击者因此将其视为理想的数据外泄隐蔽信道——通过把窃取的数据编码进 DNS 查询子域名绕过传统安全控制。本指南聚焦 Anthropic-Cybersecurity-Skills 仓库中的detecting-exfiltration-over-dns-with-zeek技能系统讲解如何基于 Zeek 生成的dns.logTSV 格式计算 Shannon 熵、检测超长 DNS 标签、统计单父域唯一子域名数量并结合可配置阈值识别 dnscat2、iodine、dns2tcp 等工具产生的 DNS 隧道行为。读完本文你将掌握一套完整的「解析日志 → 计算指标 → 复合风险评分 → 生成 JSON 报告」的可落地分析流程。为什么 DNS 会成为数据外泄通道DNS 隧道与 DNS 外泄之所以难以防御根源在于正常业务解析依赖 DNS安全团队很难直接封禁 53 端口流量而攻击者只需将数据切块编码进子域名Base64、Hex、Base32 等配合一个自己控制的权威域名即可完成双向通信。外泄方向查询侧被窃数据编码为子域名标签发起查询例如dGhlIHNlY3JldCBkYXRh.exfil.attacker.com常用查询类型为 A、AAAA、CNAME、MX、TXT、NULL。命令通道响应侧TXT 记录在响应中携带编码命令/数据CNAME 通过多级标签链式传递数据NULL 记录承载任意二进制数据。正常 DNS 查询具有可预测的熵值与长度模式而外泄查询则表现出高 Shannon 熵、超长子域名标签、单父域大量唯一子域名等特征。本技能正是围绕这些统计差异建立检测模型可识别 dnscat2、iodine、dns2tcp 及各类自定义 DNS 隧道实现。该技能已被映射到 MITRE ATTCK 的 T1046网络服务扫描、T1040网络嗅探、T1557中间人攻击、T1071应用层协议、T1048通过替代协议外泄以及 NIST CSF 2.0 的 PR.IR-01、DE.CM-01、ID.AM-03、PR.DS-02可参见 SKILL.md 的 frontmatter。适用场景安全事件调查中需要检测基于 Zeek 的 DNS 外泄行为为该领域构建检测规则或威胁狩猎查询SOC 分析师需要结构化的分析流程验证安全监控对相关攻击技术的覆盖度检测覆盖矩阵可参考 mappings/README.md。前置条件Python 3.9 及以上版本使用标准库math与collections无需第三方依赖Zeek 生成的dns.log文件TSV 格式含标准字段头由 Zeek 5.0 处理的网络抓包数据对 DNS 协议结构与查询类型的基础理解。核心检测指标与判定阈值在进入具体流程前先明确本技能依赖的五个核心指标及其经验阈值指标正常范围外泄特征默认阈值Shannon 熵低于 3.5编码/加密数据高于 4.03.5标签长度通常较短逼近 63 字符上限52 字符单父域唯一子域名数低大量新增子域名50 个查询速率跟随用户行为持续高频按 IP/域计算异常查询类型分布以 A/AAAA 为主TXT/NULL 占比异常升高TXT 占比 50% 等八步检测工作流该技能在 SKILL.md 中定义了完整的检测流程可概括为以下八个步骤。1. 解析 Zeek dns.log 表头读取 TSV 文件提取#fields表头行确定ts、id.orig_h、query、qtype_name、rcode_name、answers等字段对应的列位置。关于字段的完整定义references/api-reference.md 给出了详尽的字段参考表关键字段摘录如下字段类型说明tstimeDNS 请求的时间戳id.orig_haddr源 IP 地址id.resp_pport目的端口通常 53protoenum传输协议udp/tcpquerystring被查询的域名qtype_namestring查询类型名A、AAAA、TXT、MX、CNAME、NULLrcode_namestring响应码名NOERROR、NXDOMAIN、SERVFAILAA/TC/RD/RAbool权威应答/截断/递归期望/递归可用标志answersvector资源记录应答TTLsvector应答 RR 的 TTL 值rejectedbool查询是否被拒绝2. 提取并分解查询对每条 DNS 查询将 FQDN 拆分为子域名标签与父域名跳过已知安全域名与内部区域。仓库脚本 scripts/agent.py 内置了SAFE_DOMAINS白名单含in-addr.arpa、google.com、microsoft.com、windows.net、amazonaws.com、cloudflare.com等命中白名单的父域直接跳过可显著降低误报。3. 计算 Shannon 熵对每个子域名标签计算信息熵。合法的子域名熵通常低于 3.5而编码/加密数据熵值高于 4.0。agent.py中的实现基于字符频率分布def shannon_entropy(data: str) - float: if not data: return 0.0 freq defaultdict(int) for ch in data: freq[ch] 1 length len(data) entropy 0.0 for count in freq.values(): prob count / length entropy - prob * math.log2(prob) return round(entropy, 4)该函数对所有查询字符逐一遍历计数再按香农公式H -Σ p(x)·log₂(p(x))求和。实现中值得注意的两个细节空字符串返回 0.0避免除零结果四舍五入到 4 位小数保证后续平均熵计算的一致性与报告可读性。4. 检测超长标签标记超过 52 字符的 DNS 标签逼近 63 字符的协议上限。超长标签是数据隧道行为的强指示器——正常的子域名标签极少接近这一长度而隧道工具必须尽量塞满每个标签以提高吞吐。在agent.py中每个子域名标签都会与stats[max_label_len]比较最终记录该父域出现过的最大标签长度。5. 统计每父域的唯一子域名数跟踪每个父域名收到的不同子域名数量。在日志窗口内唯一子域名超过 50 个的父域即为可疑。这对应agent.py中subdomain_threshold默认 50参数通过set数据结构去重计数。6. 识别查询量异常计算每个源 IP 对每个域的每分钟查询数。外泄工具会产生持续的高容量查询流这与正常浏览行为不同。agent.py虽以文件为粒度统计query_count与source_ips集合但其设计目标就是识别这类持续性的异常查询量可在扩展时引入时间窗实现真正的「每分钟」速率统计。7. 评分与排序域名将熵、标签长度、唯一子域名数、查询量组合为复合风险分。agent.py的评分逻辑值得深入拆解位于analyze_dns_log函数末尾risk_score 0.0 if high_entropy in indicators: risk_score min(avg_entropy, 5.0) if long_labels in indicators: risk_score min(max_label / 15.0, 3.0) if high_subdomain_count in indicators: risk_score min(unique_count / 100.0, 3.0) if high_txt_ratio in indicators: risk_score 1.5 if null_queries in indicators: risk_score 1.0 risk_score min(round(risk_score, 1), 10.0)评分体系的特点熵贡献最高封顶 5 分取min(avg_entropy, 5.0)长标签与唯一子域名数各封顶 3 分TXT 比例异常固定加 1.5 分NULL 查询固定加 1 分总分压缩至 10 分制。除 SKILL.md 列出的五类指标外源码还额外实现了两类增强指标高 TXT 比例high_txt_ratioTXT 查询占比超过 50% 且查询总数大于 20 时触发针对用 TXT 记录回传数据的隧道NULL 查询null_queriesNULL 查询占比超过 30% 时触发针对 iodine 等使用 NULL 记录承载二进制数据的工具。最终按风险分降序排序flagged列表只收录至少命中一个指标的域名。8. 生成检测报告输出包含标记域名、证据指标、源 IP 与建议响应动作的 JSON 报告。agent.py的 CLI 接口如下python3 scripts/agent.py --log-file /opt/zeek/logs/current/dns.log全部可选参数与默认值参数类型默认值说明--log-file必填无Zeek dns.log 文件路径--entropy-thresholdfloat3.5熵告警阈值--subdomain-thresholdint50唯一子域名数阈值--label-length-thresholdint52DNS 标签长度阈值--outputstrNone输出 JSON 文件路径预期输出示例运行脚本后得到的 JSON 报告结构如下示例数值{ 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] } ] }在实际实现中每个标记域名的输出还会包含query_count、qtypes各查询类型计数与sample_queries最多 5 条样本查询便于分析师回溯原始流量验证。源码级解析agent.py 如何读取 dns.log理解解析器是正确使用该技能的前提。agent.py的parse_zeek_dns_log函数对 Zeek 日志格式做了严谨处理读取#separator行确定列分隔符默认\x09即制表符兼容自定义分隔符日志读取#fields行建立字段名列表并把每个#开头的元数据行跳过数据行按分隔符拆分后与字段名一一映射为字典字段数不足的行直接跳过防御畸形日志字段缺失时以-填充与 Zeek 对缺失字段的表示方式保持一致。随后extract_parent_domain与extract_subdomain完成 FQDN 分解取末两级作为父域levels2其余部分作为子域名串。这一设计意味着data.evil-c2.com的父域是evil-c2.com子域名是data——所有熵、长度统计都作用在子域名部分避免把公共后缀或注册域计入特征。配套检测手段zeek-cut 快速筛查在运行完整脚本之前可先用zeek-cut对 dns.log 做快速筛查命令来自 references/api-reference.md# 提取关键字段 cat dns.log | zeek-cut ts id.orig_h query qtype_name answers # 过滤 TXT 查询DNS 隧道常用 cat dns.log | zeek-cut query qtype_name | grep TXT # 统计每域名查询次数取末两级作为注册域 cat dns.log | zeek-cut query | rev | cut -d. -f1-2 | rev | sort | uniq -c | sort -rn第三条命令通过revcut技巧只保留域名的末两级即父域再排序去重计数可在一秒内圈出查询量异常的父域候选作为完整分析的输入线索。拓展RITA 信标检测与 DNS 隧道指标references/api-reference.md 还给出了使用 RITAReal Intelligence Threat Analytics对 Zeek 日志做补充分析的方案# 导入 Zeek 日志到 RITA rita import /opt/zeek/logs/current rita-dataset # 分析信标行为 rita show-beacons rita-dataset # 展示 DNS 隧道指标 rita show-dns rita-dataset # 生成 HTML 报告 rita html-report rita-dataset /var/www/html/rita-reportRITA 的show-dns专门输出 DNS 隧道评分与本文的熵/长度分析互为印证show-beacons则用于识别 C2 周期性回连可覆盖 T1071应用层协议所描述的隐蔽 C2 over DNS 场景。拓展Suricata 与 Splunk 检测规则若环境同时部署了 Suricata 或 SIEM可参考 api-reference 中提供的签名与查询Suricata 规则检测长查询与可疑 TXT 查询# 检测长 DNS 查询潜在隧道 alert dns any any - any any (msg:Possible DNS tunneling - long query; \ dns.query; content:|00|; byte_test:1,,50,0,relative; \ sid:1000001; rev:1;) # 检测对异常域名的 TXT 记录查询 alert dns any any - any any (msg:Suspicious DNS TXT query; \ dns_query; pcre:/^[a-z0-9]{30,}\./i; sid:1000002; rev:1;)Splunk SPLZeek DNS 数据源indexzeek sourcetypezeek_dns | eval subdomain_lenlen(mvindex(split(query, .), 0)) | where subdomain_len 50 | stats count dc(query) as unique_queries by id.orig_h query | where unique_queries 100 | sort -unique_queries该查询先计算首个子域名标签长度、筛出超过 50 字符的记录再按源 IP 与查询名统计唯一查询数最后保留超过 100 的条目——与脚本中的label_length_threshold、subdomain_threshold阈值逻辑一一对应可作为生产环境中的实时检测层。结果处置与最佳实践检出可疑域名后建议按以下顺序处置在 DNS 解析器与防火墙层封禁隧道域名隔离源主机进行取证调查对 DNS 流量保留完整 PCAP作为证据解码已捕获的 DNS 查询以确认被外泄的数据内容检查受害主机的持久化机制将 C2 域名与基础设施更新进封禁列表。长期防护层面应保证解析器与网络层完整记录 DNS 查询与响应、强制所有 DNS 走内部解析器并阻断直连外部 53 端口、部署 RPZResponse Policy Zone订阅封锁已知隧道域名、在设定检测阈值前先建立本环境正常 DNS 基线并对 DoH/DoT 加密 DNS 保持感知——这类流量会绕过传统 DNS 检测点。小结本技能将「DNS 外泄检测」从零散的临时查询固化为一套可复现、可参数化、可自动化的分析流水线以 Shannon 熵、标签长度、唯一子域名数、查询量为核心特征辅以 TXT/NULL 查询比例增强指标经复合评分后输出 JSON 报告。配合仓库提供的 scripts/agent.py 可直接在标准库环境下运行无第三方依赖并结合 references/api-reference.md 中的 zeek-cut、RITA、Suricata、Splunk 手段形成纵深检测体系。使用时请务必遵循授权原则仅在自有系统或获得明确书面授权的环境中进行分析。【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表