# Detecting Exfiltration Over Dns With Zeek

> 通过分析 Zeek dns.log 中的高熵值子域名和异常查询模式，检测基于 DNS 的数据渗出

- Skill: `killvxk/detecting-exfiltration-over-dns-with-zeek` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/detecting-exfiltration-over-dns-with-zeek`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/detecting-exfiltration-over-dns-with-zeek/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/detecting-exfiltration-over-dns-with-zeek

---


## 概述

DNS 隧道与渗出（DNS tunneling/exfiltration）是攻击者绕过防火墙和 DLP（数据泄露防护）控制的技术，通过将窃取的数据编码到 DNS 查询的子域名中来实现。合法 DNS 查询的熵值和长度具有可预测的规律，而渗出查询的编码数据具有高香农熵（Shannon entropy）、异常长的子域名标签，以及每个父域名下大量唯一子域名。

本技能分析 Zeek dns.log 文件（TSV 格式）以检测渗出指标。智能体对每个子域名组件计算香农熵，识别超过 63 字符 DNS 标签限制的查询，统计每个父域名的唯一子域名数量，并标记超过可配置阈值的域名。这些技术可检测 dnscat2、iodine、dns2tcp 以及自定义 DNS 隧道工具。

## 前置条件

- Python 3.9 或更高版本，使用标准库中的 math 和 collections 模块
- 标准字段头的 TSV 格式 Zeek dns.log 文件
- 由 Zeek 5.0+ 处理的网络捕获数据
- 了解 DNS 协议结构和查询类型

## 步骤

1. **解析 Zeek dns.log 头部**：读取 TSV 文件，提取 `#fields` 头部行，确定 `ts`、`id.orig_h`、`query`、`qtype_name`、`rcode_name` 和 `answers` 的列位置。

2. **提取并分解查询**：对每个 DNS 查询，将 FQDN 拆分为子域名标签和父域名。跳过已知安全域名和内部区域的查询。

3. **计算香农熵**：计算每个子域名标签的信息熵。合法子域名的熵值通常低于 3.5，而编码/加密数据的熵值高于 4.0。

4. **检测长标签**：标记超过 52 字符的 DNS 标签（接近 63 字符上限）。长标签是数据隧道的强烈指标。

5. **统计每域名唯一子域名数量**：跟踪每个父域名收到的不同子域名数量。在日志窗口内超过 50 个唯一子域名的域名为可疑域名。

6. **识别查询量异常**：按源 IP 和域名计算每分钟查询数。渗出工具会产生持续的高频查询流，不同于正常的浏览行为。

7. **评分并排名域名**：将熵值、标签长度、唯一性数量和查询量合并为综合风险评分。按评分对域名排名并输出最可疑的域名。

8. **生成检测报告**：输出包含标记域名、证据指标、来源 IP 及建议响应操作的 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"]
    }
  ]
}
```

