bdk3000/c2-dns-beacon-detection

GitHub: bdk3000/c2-dns-beacon-detection

C2 DNS信标检测工具,用于识别和防御基于DNS的恶意通信。

Stars: 0 | Forks: 0

# C2 DNS 信标检测 **MITRE ATT&CK:** T1071.004 - 应用层协议:DNS T1557 - 中间人攻击(WPAD 发现) **日志来源:** Sysmon 事件 ID 22 通过 AMA → Sentinel **额外发现:** 域控制器上的 WPAD 暴露 ## 概述 DNS 是攻击者的最爱藏身之处。它很少被阻止,与正常流量混合,并且大多数检测管道只会告诉你发生了查询——而不是哪个进程发起的查询或它要去哪里。 这个检测使用 Sysmon 事件 ID 22 为 DC01 上的每个 DNS 查询添加进程上下文。现在,你不再看到成千上万的 DNS 事件而没有故事,而是可以看到确切哪个进程调用哪个域名。这就是噪音和可操作警报之间的区别。作为额外收获——构建这个检测揭示了 DC01 上一个真实的配置发现,该发现会暴露中间人攻击。 ## 为什么是 DNS DNS 是攻击者首选的 C2 通道,因为它几乎从未被阻止,与合法流量混合,并且可以透明地穿越大多数网络边界。没有进程级别的 DNS 可视性,防御者只能看到 DNS 查询发生了——而不是哪个进程发起的查询或目标是否合法。 ## 检测逻辑 - 解析 Sysmon 事件 ID 22 中的 DNS 查询和进程 - 从完整图像路径中提取进程名称 - 标记高风险进程发起的 DNS 查询 - 通过包含匹配来白名单已知合法域名 - 仅显示未知域名和高风险进程查询 - 排除内部 .local DNS 流量 ## 关键检测工程课程 域白名单匹配需要 contains() 而不是 has_any() 以覆盖子域: has_any() → 精确令牌匹配 "ecs.office.com" 不匹配 "office.com" 产生误报 contains() → 子串匹配 "ecs.office.com" 包含 "office.com" 正确的方法进行域匹配 ## KQL 检测规则 ``` let HighRiskProcesses = dynamic([ "powershell.exe", "cmd.exe", "wscript.exe", "cscript.exe", "mshta.exe", "rundll32.exe", "regsvr32.exe", "certutil.exe" ]); Event | where TimeGenerated > ago(24h) | where Source == "Microsoft-Windows-Sysmon" | where EventID == 22 | parse EventData with * '' DNSQuery '' * | parse EventData with * '' Process '' * | extend ProcessName = iif( isempty(Process), "Unknown", tostring(split(Process, "\\")[-1])) | extend DomainParts = split(DNSQuery, ".") | extend RootDomain = strcat( tostring(DomainParts[-2]), ".", tostring(DomainParts[-1])) | extend IsHighRiskProcess = ProcessName in (HighRiskProcesses) | extend IsKnownDomain = ( DNSQuery contains "microsoft.com" or DNSQuery contains "azure.com" or DNSQuery contains "office.com" or DNSQuery contains "windows.net" or DNSQuery contains "visualstudio.com" or DNSQuery contains "windowsupdate.com" or DNSQuery contains "digicert.com" or DNSQuery contains "msftconnecttest.com" or DNSQuery contains "verizonbusiness.com" ) | where IsHighRiskProcess == true or IsKnownDomain == false | where DNSQuery !endswith ".local" | summarize QueryCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated), Processes = make_set(ProcessName), Domains = make_set(DNSQuery) by Computer, IsHighRiskProcess, IsKnownDomain, RootDomain | order by IsHighRiskProcess desc, QueryCount desc ``` ## 验证结果 规则针对 DC01.lab.local 的实时 Sysmon 遥测执行。所有合法的 Azure、Microsoft 和 Office 域都正确使用 contains() 匹配进行了白名单处理。出现了一个异常发现——DC01 的 WPAD 查询。 ## 额外发现——WPAD 暴露 **严重性:** 中等 **发现:** DC01 发起 WPAD 查询使域控制器暴露于中间人攻击。位于同一网络段的攻击者可以响应 WPAD 查询并通过他们的机器代理所有 DC 网络流量。 **MITRE:** T1557 - 中间人攻击 **补救措施:** 通过组策略禁用 WPAD: ## 那么,这意味着什么 C2 通信是每个活跃攻击者的生命线。切断它,他们就会失明。检测到它,你会在他们达到目标之前就知道他们在哪里。这个规则为 SOC 分析师提供了一个单一的优先级视图,以查看可疑的 DNS 活动——自动将攻击者通信与合法基础设施噪音分开。 ## 身份与信任上下文 基于 DNS 的 C2 代表网络通信层上的信任边界违规。受损害的端点正在使用受信任的协议与攻击者基础设施保持未经授权的信任关系——绕过侧重于连接阻止而不是行为异常的边界控制。 ## 误报考虑因素 - 云管理代理——白名单他们的域名 - 软件更新服务——白名单已知供应商 - VPN 客户端——可能会查询不寻常的 DNS 终端 - 总是针对您的特定环境调整白名单 ## 证据 **C2 DNS 信标检测——WPAD 发现** ![WPAD 检测结果](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2fe2f6011b053101.png) ## 环境 - 日志来源:Sysmon 事件 ID 22,DC01.lab.local - 管道:AMA → Azure Arc → DCR → DetectionLab-LAW → Sentinel - Sysmon 版本:13.23 - 配置:SwiftOnSecurity 基线 - 针对实时生产遥测进行验证 - 实验室:隔离 HyperV 环境
标签:AMSI绕过, asyncio, ATT&CK 框架, C2 通信, DNS 查询, DNS 漏洞, KQL 查询语言, PFX证书, RuleLab, Sysmon, 中间人攻击, 域控制器, 威胁情报, 威胁检测, 开发者工具, 攻击向量, 攻击检测, 日志事件, 白名单, 网络安全, 防御策略, 隐私保护