ARTICLE DETAIL

资讯详情

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

DNS 日志外泄分析实战:基于 Anthropic Cybersecurity Skills 检测 DNS 隧道、DGA 与隐蔽 C2 通道

DNS 日志外泄分析实战:基于 Anthropic Cybersecurity Skills 检测 DNS 隧道、DGA 与隐蔽 C2 通道 DNS 日志外泄分析实战基于 Anthropic Cybersecurity Skills 检测 DNS 隧道、DGA 与隐蔽 C2 通道【免费下载链接】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本文是一份面向 SOC 分析师与 AI Agent 的 DNS 安全检测实战指南基于 Anthropic Cybersecurity Skills 仓库中的 analyzing-dns-logs-for-exfiltration 技能展开。该技能通过熵分析、查询量异常检测与子域名长度分析在 SIEM 平台如 Splunk上识别 DNS 隧道、DGA 域名通信与隐蔽 C2 通道。读完本文你将掌握一套完整的六步检测流程、可直接复制的 Splunk 检索语句与 Python 熵计算实现以及如何将 DNS 发现与端点数据关联、量化外泄数据量。技能定位与适用场景在传统防火墙与代理无法解析加密或隐蔽流量时DNS 往往成为攻击者外泄数据与建立 C2 通信的天然通道。该技能在仓库中归属于soc-operationsSOC 运营子域并映射到 MITRE ATTCK 的 Exfiltration 与 Command and Control 战术下的 T1048.003通过协议隧道外泄、T1071.004DNS 上的应用层协议与 T1567通过 Web 服务外泄以及 NIST CSF 2.0 的 DE.CM-01、DE.AE-02、DE.AE-06 与 RS.MA-01 类别相关覆盖情况可参见 mappings/mitre-attack/coverage-summary.md。何时使用本技能SOC 团队怀疑数据通过 DNS 隧道外泄以绕过防火墙/代理管控威胁情报显示对手使用基于 DNS 的 C2 通道例如 Cobalt Strike 的 DNS beaconUEBA 检测到特定主机产生异常的 DNS 查询量恶意软件分析揭示其具备 DNS-over-HTTPSDoH或 DNS 隧道能力。不要使用本技能的场景常规 DNS 故障排查或可用性监控——本技能只聚焦于与安全相关的 DNS 滥用检测。前置条件开始检测前需要满足以下条件DNS 查询日志已启用支持 Windows DNS Server、Bind、Infoblox 或 Cisco Umbrella日志已接入 SIEMSplunk 配置Stream:DNS或dnssourcetype或使用 Zeek DNS 日志Passive DNS 数据用于历史域名解析分析正常 DNS 行为基线包括查询量、域名分布、TXT 记录频率等Python 环境需要math与collections标准库计算熵值无需第三方依赖。技能目录中 references/api-reference.md 提供了熵计算、Splunk 查询、Zeek 日志字段、隧道工具特征与 Passive DNS API 的速查参考可与本文配合使用。六步检测流程总览检测的核心思想是DNS 隧道、DGA 与隐蔽 C2 通道都会在查询特征上留下痕迹——要么子域名异常长要么域名熵值异常高要么查询量/记录类型分布异常。完整流程如下子域名长度分析检测 DNS 隧道高熵域名查询检测DGA异常 DNS 查询量检测已知 DNS 隧道工具特征检测含 DoH 绕过识别与端点数据关联取证数据外泄量估算。每一步都对应仓库 SKILL.md 中的完整 Splunk 检索以及 scripts/agent.py 中的 Python 实现。Step 1基于子域名长度分析检测 DNS 隧道DNS 隧道将数据编码进子域名标签产生异常长的查询。以下 Splunk 检索将查询拆分为域名部分提取子域名去除注册域名后剩余部分筛选子域名长度超过 50 且总查询数大于 20 的注册域名indexdns sourcetypestream:dns query_type IN (A, AAAA, TXT, CNAME, MX) | eval domain_parts split(query, .) | eval subdomain mvindex(domain_parts, 0, mvcount(domain_parts)-3) | eval subdomain_str mvjoin(subdomain, .) | eval subdomain_len len(subdomain_str) | eval tld mvindex(domain_parts, -1) | eval registered_domain mvindex(domain_parts, -2)...tld | where subdomain_len 50 | stats count AS queries, dc(query) AS unique_queries, avg(subdomain_len) AS avg_subdomain_len, max(subdomain_len) AS max_subdomain_len, values(src_ip) AS sources by registered_domain | where queries 20 | sort - avg_subdomain_len | table registered_domain, queries, unique_queries, avg_subdomain_len, max_subdomain_len, sources阈值说明subdomain_len 50是隧道检测的关键阈值——正常业务查询的子域名极少超过 20~30 个字符而 Base64 编码数据每个字符约承载 6 bit 信息50 字符以上的子域名几乎可以认定是编码数据。queries 20用于过滤偶发长域名聚焦持续性隧道通信。在 scripts/agent.py 中detect_tunneling()函数以subdomain_len_threshold50、min_queries20为默认参数实现了同一逻辑通过extract_subdomain()提取子域名、extract_registered_domain()提取注册域名SLDTLD对超长子域名的查询按注册域名聚合计算平均/最大子域名长度并按平均长度降序输出判定为CRITICAL - Likely DNS tunneling。Step 2检测高熵域名查询DGA 识别域生成算法DGA生成的域名呈随机形态特征是辅音/数字占比高、元音占比低、SLD二级域名偏长。以下 Splunk 检索基于字符组成比率过滤indexdns sourcetypestream:dns | eval domain_parts split(query, .) | eval sld mvindex(domain_parts, -2) | eval sld_len len(sld) | eval char_count sld_len | eval vowels len(replace(sld, [^aeiou], )) | eval consonants len(replace(sld, [^bcdfghjklmnpqrstvwxyz], )) | eval digits len(replace(sld, [^0-9], )) | eval vowel_ratio if(char_count 0, vowels / char_count, 0) | eval digit_ratio if(char_count 0, digits / char_count, 0) | where sld_len 12 AND (vowel_ratio 0.2 OR digit_ratio 0.3) | stats count AS queries, dc(query) AS unique_domains, values(src_ip) AS sources by query | where unique_domains 10 | sort - queriesShannon 熵计算Python 实现字符组成比率只是近似手段更严谨的方法是 Shannon 信息熵。仓库提供了开箱即用的 Python 实现import math from collections import Counter def shannon_entropy(text): Calculate Shannon entropy of a string if not text: return 0 counter Counter(text.lower()) length len(text) entropy -sum( (count / length) * math.log2(count / length) for count in counter.values() ) return round(entropy, 4) # Test with examples normal_domain google # Low entropy dga_domain x8kj2m9p4qw7n # High entropy tunnel_subdomain aGVsbG8gd29ybGQ.evil.com # Base64 encoded data print(fNormal: {shannon_entropy(normal_domain)}) # ~2.25 print(fDGA: {shannon_entropy(dga_domain)}) # ~3.70 print(fTunnel: {shannon_entropy(tunnel_subdomain)}) # ~3.50 # Threshold: entropy 3.5 for subdomain likely tunneling/DGA熵值分类阈值详见 references/api-reference.md熵值分类 2.5正常域名如 google2.5 – 3.5临界建议监控 3.5可疑疑似 DGA/隧道 4.0高置信度恶意Splunk 中的熵评分实现SPL 中可通过字符种类数估算熵log(unique_chars, 2) * (unique_chars / check_len)虽然不及 Python 精确但可用于大规模日志过滤indexdns sourcetypestream:dns | eval domain_parts split(query, .) | eval check_string mvindex(domain_parts, 0) | eval check_len len(check_string) | where check_len 8 | eval chars split(check_string, ) | stats count AS total_chars, dc(chars) AS unique_chars by query, src_ip, check_string, check_len | eval entropy_estimate log(unique_chars, 2) * (unique_chars / check_len) | where entropy_estimate 3.5 | stats count AS high_entropy_queries, dc(query) AS unique_queries by src_ip | where high_entropy_queries 50 | sort - high_entropy_queries在 scripts/agent.py 中detect_dga()以entropy_threshold3.5、min_sld_length12为默认参数对每个查询的 SLD 计算 Shannon 熵聚合后输出HIGH - Possible DGA domain告警shannon_entropy()还封装了空字符串保护返回 0与结果四舍五入保留 4 位小数。Step 3检测异常 DNS 查询量攻击者外泄数据时往往伴随查询量激增。以下检索按小时分桶统计每个来源 IP 的查询量通过eventstats计算均值与标准差进而计算 z-score 识别统计离群点indexdns sourcetypestream:dns earliest-24h | bin _time span1h | stats count AS queries, dc(query) AS unique_domains by src_ip, _time | eventstats avg(queries) AS avg_queries, stdev(queries) AS stdev_queries by src_ip | eval z_score (queries - avg_queries) / stdev_queries | where z_score 3 OR queries 5000 | sort - z_score | table _time, src_ip, queries, unique_domains, avg_queries, z_score阈值语义z_score 3表示该小时查询量偏离该主机自身均值 3 个标准差以上统计学上的显著异常queries 5000作为绝对兜底阈值防止异常基线掩盖突发洪峰。TXT 记录滥用检测TXT 记录被设计为承载文本数据因而成为 DNS 隧道的首选高带宽载体。以下检索按来源 IP 统计 TXT 查询量并分级告警indexdns sourcetypestream:dns query_typeTXT | stats count AS txt_queries, dc(query) AS unique_txt_domains, values(query) AS domains by src_ip | where txt_queries 100 | eval suspicion case( txt_queries 1000, CRITICAL — Likely DNS tunneling, txt_queries 500, HIGH — Possible DNS tunneling, txt_queries 100, MEDIUM — Unusual TXT volume ) | sort - txt_queries | table src_ip, txt_queries, unique_txt_domains, suspicionscripts/agent.py 中的detect_volume_anomaly()默认z_score_threshold3.0与detect_txt_abuse()默认threshold100分别实现了上述两种逻辑。注意detect_volume_anomaly()对样本数小于 2 或标准差为 0 的情况做了保护避免除零这是生产级脚本应有的健壮性处理detect_txt_abuse()则同时兼容TXT文本与16数字两种查询类型标识。Step 4检测已知 DNS 隧道工具与 DoH 绕过常见 DNS 隧道工具iodine、dnscat2、dns2tcp 等会在查询中留下可识别的命名模式。以下检索结合工具签名与特征查询类型NULL 记录、超长 TXT 查询进行匹配indexdns sourcetypestream:dns | eval query_lower lower(query) | where ( match(query_lower, \.dnscat\.) OR match(query_lower, \.dns2tcp\.) OR match(query_lower, \.iodine\.) OR match(query_lower, \.dnscapy\.) OR match(query_lower, \.cobalt.*\.beacon) OR query_typeNULL OR (query_typeTXT AND len(query) 100) ) | stats count by src_ip, query, query_type | sort - count仓库 references/api-reference.md 中整理了各工具对应的 DNS 特征可作为签名维护依据工具DNS 特征iodine*.pirate.seaTXT/NULL 记录dnscat2查询中的*.dnscat.前缀dns2tcp*.dns2tcp.模式Cobalt Strike DNS周期性 TXT 查询携带编码负载检测 DoH 绕过本地 DNSDoH 将 DNS 查询加密在 443 端口上绕过传统 DNS 监控。可通过检测主机与公共解析器Cloudflare、Google、Quad9、OpenDNS之间的大量 443 端口连接来识别indexproxy OR indexfirewall dest IN (1.1.1.1, 1.0.0.1, 8.8.8.8, 8.8.4.4, 9.9.9.9, 149.112.112.112, 208.67.222.222) dest_port443 | stats sum(bytes_out) AS total_bytes, count AS connections by src_ip, dest | where connections 100 OR total_bytes 10485760 | eval alert Possible DoH bypass — DNS queries sent over HTTPS to public resolver | sort - total_bytes注意total_bytes 1048576010 MB与connections 100只是启发式阈值——正常使用 DoH 的员工也可能触发需要结合公司 DNS 策略判断是绕过管控还是合规使用。Step 5将 DNS 发现与端点数据关联检测到可疑 DNS 后需要用端点证据确认是谁的进程在发这些查询。以下检索将 DNS 查询与 Sysmon 网络连接EventCode 3目标端口 53做 join还原进程画像indexdns src_ip192.168.1.105 query*.evil-tunnel.com earliest-24h | stats count AS dns_queries, earliest(_time) AS first_query, latest(_time) AS last_query by src_ip, query | join src_ip [ search indexsysmon EventCode3 DestinationPort53 ComputerWORKSTATION-042 | stats count AS connections, values(Image) AS processes by SourceIp | rename SourceIp AS src_ip ] | table src_ip, query, dns_queries, first_query, last_query, processes关联输出的Image字段会直接暴露发起 DNS 查询的可执行文件路径——这是区分正常系统服务与伪装的恶意进程的关键证据例如svchost_update.exe冒充合法svchost.exe。此步骤将网络层发现升级为端到端取证闭环。Step 6估算数据外泄量确认隧道域名后可量化外泄规模提取每个查询首个子域名的字符数作为编码数据长度乘以 Base64 解码因子 0.75每 4 个 Base64 字符还原为 3 字节再聚合为总量与速率indexdns src_ip192.168.1.105 query*.evil-tunnel.com earliest-24h | eval domain_parts split(query, .) | eval encoded_data mvindex(domain_parts, 0) | eval encoded_bytes len(encoded_data) | eval decoded_bytes encoded_bytes * 0.75 -- Base64 decoding factor | stats sum(decoded_bytes) AS total_bytes_estimated, count AS total_queries, earliest(_time) AS first_seen, latest(_time) AS last_seen | eval estimated_kb round(total_bytes_estimated / 1024, 1) | eval estimated_mb round(total_bytes_estimated / 1048576, 2) | eval duration_hours round((last_seen - first_seen) / 3600, 1) | eval rate_kbps round(estimated_kb / (duration_hours * 3600) * 8, 2) | table total_queries, estimated_mb, duration_hours, rate_kbps, first_seen, last_seen在 scripts/agent.py 中estimate_exfil_volume()实现了对应逻辑按目标域名过滤查询、累加子域名编码字节、乘 0.75 得到估算解码字节数并输出estimated_kb/estimated_mb。该估算存在固有误差——实际编码可能是 hex因子 0.5而非 Base64且未扣除查询中的固定开销如会话 ID因此结果应视为数量级参考而非精确字节数报告中应注明估算方法。关键概念速查术语定义DNS Tunneling将数据编码进 DNS 查询/响应中以外泄数据或建立 C2 通道的技术DGA域生成算法——恶意软件生成伪随机域名的技术用于增强 C2 抗打击性Shannon Entropy字符串随机性的数学度量——域名高熵3.5通常指示 DGA 或隧道TXT Record Abuse将本用于文本数据的 DNS TXT 记录用作高带宽隧道信道DNS over HTTPS (DoH)通过 HTTPS443 端口加密传输 DNS 查询绕过传统 DNS 监控Passive DNS域名解析的历史记录展示域名随时间解析到的 IP 集合工具与系统清单Splunk Stream网络流量捕获插件为 SIEM 分析提供解析后的 DNS 查询数据Zeek (Bro)网络安全监控工具生成详细的 DNS 事务日志dns.logCisco Umbrella (OpenDNS)云端 DNS 安全平台可拦截恶意域名并记录查询数据Infoblox DNS FirewallDNS 层安全方案提供基于 RPZ 的拦截与详细查询日志Farsight DNSDBPassive DNS 数据库用于历史域名解析查询与基础设施映射。关于 Zeekdns.log的字段布局与 CLI 快速分析references/api-reference.md 给出了列号对照如第 2 列id.orig_h为源 IP、第 9 列query为查询域名、第 13 列qtype_name为查询类型与一条高频分析命令cat dns.log | zeek-cut query qtype_name id.orig_h | sort | uniq -c | sort -rnscripts/agent.py 中的parse_zeek_dns_log()正是按照该字段布局解析 Zeek 日志跳过#开头行、按 Tab 切分、提取 timestamp/src_ip/query/query_type可将文本日志直接送入上述各检测函数。常见攻击场景对照Cobalt Strike DNS Beacon周期性 TXT 查询携带编码负载发往 C2 域名——用 Step 4 签名 Step 3 TXT 统计命中数据外泄大量唯一子域名查询以 Base64/hex 编码窃取数据——用 Step 1 长度检测 Step 6 量估算DGA 恶意软件高熵、无 Web 内容对应的算法生成域名——用 Step 2 熵检测命中DNS-over-HTTPS 绕过员工使用 DoH 绕过企业 DNS 过滤与监控——用 Step 4 的 DoH 检索识别慢速滴漏外泄Slow Drip低流量 DNS 隧道刻意保持在阈值之下——需要基线对比而非单点阈值建议将 Step 3 的 z-score 统计窗口拉长并常态化运行。标准输出格式技能定义了结构化的分析输出模板便于分析师与 Agent 生成一致的报告DNS EXFILTRATION ANALYSIS — WORKSTATION-042 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Period: 2024-03-14 to 2024-03-15 Source: 192.168.1.105 (WORKSTATION-042, Finance Dept) Findings: [CRITICAL] DNS tunneling detected to evil-tunnel[.]com Query Volume: 12,847 queries in 18 hours Avg Subdomain Len: 63 characters (normal: 20) Avg Entropy: 3.82 (threshold: 3.5) Query Types: TXT (89%), A (11%) Estimated Data: ~4.7 MB exfiltrated via DNS Rate: 0.58 kbps (slow drip pattern) [HIGH] DGA-like domains resolved Unique DGA Domains: 247 domains resolved Pattern: 15-char random alphanumeric.xyz TLD Entropy Range: 3.6 - 4.1 Process Attribution: Process: svchost_update.exe (masquerading — not legitimate svchost) PID: 4892 Parent: explorer.exe Hash: SHA256: a1b2c3d4... (VT: 34/72 malicious — Cobalt Strike beacon) Containment: [DONE] Host isolated via EDR [DONE] Domain evil-tunnel[.]com added to DNS sinkhole [DONE] Incident IR-2024-0448 created报告包含四个区块时间与来源上下文、分级发现含量化证据、进程归因含哈希与沙箱结论、遏制处置清单。其中熵值与子域名长度等数字均来自前面各步检测输出确保结论可追溯。源码级支撑一键运行的检测 Agent仓库为整套流程提供了可直接运行的参考实现 scripts/agent.py。脚本将六个步骤中的核心算法封装为独立函数并自带演示数据与__main__入口生成 50 条超长子域名 TXT 查询模拟隧道、5 条高熵 DGA 查询与 10 条正常查询依次运行隧道检测subdomain_len_threshold30, min_queries10、DGA 检测entropy_threshold3.0, min_sld_length10、TXT 滥用检测threshold10并打印熵值示例。你可以替换demo_records为真实日志解析结果如parse_zeek_dns_log()的输出即可投入实战。从代码结构可以推断该实现刻意遵循了与 SPL 检索一致的阈值语义与聚合思路——例如detect_tunneling按注册域名聚合、detect_dga按完整查询域名聚合、detect_volume_anomaly按来源 IP 聚合——这使 Python 原型与 SIEM 生产查询之间的结论可以相互验证。框架映射与适用范围本技能在 YAML frontmatter 中声明了完整的框架映射MITRE ATTCK 的 T1048.003通过协议隧道外泄、T1071.004DNS 上的应用层协议、T1567通过 Web 服务外泄MITRE ATLAS 的 AML.T0024、AML.T0056、AML.T0086以及 NIST CSF 2.0 的 DE.CM-01持续监控、DE.AE-02异常活动分析、DE.AE-06跨源信息关联、RS.MA-01响应计划执行。这意味着你的检测结果可以直接映射到合规与响应框架便于汇报与审计。需要明确本文的适用前提所有阈值50 字符、熵值 3.5、z-score 3 等均为经验默认值需要根据所在网络的 DNS 基线SKILL.md 前置条件中要求的正常行为基线校准SPL 语句针对 Splunkstream:dnssourcetype 编写迁移到其他 SIEM 时需要适配字段名。将这些检测语句部署为常态化告警并叠加基线对比才能真正覆盖包括慢速滴漏在内的全部 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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表