只有客户端侧能绑到进程
想把域名解析绑定到具体进程,必须使用客户端侧对进程级可见的记录源。Windows 上最常用的是 Sysmon 的事件 22,它记录查询的域名、发起查询的进程映像路径以及解析结果。DNS 服务器的查询日志只有客户端地址与域名,无法回答「是哪个程序发起的查询」。
对齐时间后再看行为
拿到进程级 DNS 记录后,先把该进程在同一时刻的其他行为(进程创建、网络连接、文件写入)调出来看,才能形成完整链条。反之,只看到「某进程查询过某域名」不足以说明它就是外联主体,还需要看它随后是否与该域名对应的地址建立连接。
基本信息
| 适用平台 | Windows(Sysmon);DNS 侧为各类 DNS 服务与网关设备 |
|---|---|
| 客户端事件 | Sysmon 事件 22,字段含 QueryName、Image、QueryResults、QueryStatus |
| 服务器侧局限 | 只有客户端地址与域名,无进程信息 |
| 前置条件 | Sysmon 已部署且其配置启用了 DNS 查询记录 |
| 关联方向 | 域名 → 解析时间 → 进程 → 同刻其他动作 |
典型使用场景
- 样本释放出域名:确认是哪个进程查询的,锁定可疑程序
- 排查钓鱼域名解析:把域名查询时刻与邮件的接收时间对齐
- 识别非常规程序的联网行为:非浏览器进程查询外部域名值得深查
- 与流量日志互补:DNS 记录给出域名,流量日志给出实际连接
- 确认解析失败:QueryStatus 异常时说明域名可能已被下线或被拦截
取进程级 DNS 事件
取进程级 DNS 事件
# 按事件 ID 取最近的 DNS 查询事件
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=22} -MaxEvents 20 |
Select-Object TimeCreated, Id, Message | Format-List
# 提取结构化字段(Sysmon 事件 22 为 XML,可按字段名筛)
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=22} -MaxEvents 200 |
ForEach-Object {
$x = [xml]$_.ToXml()
[pscustomobject]@{
Time = $_.TimeCreated
Query = ($x.Event.EventData.Data | Where-Object Name -eq 'QueryName').'#text'
Image = ($x.Event.EventData.Data | Where-Object Name -eq 'Image').'#text'
}
} | Where-Object Query -like '*example*'Sysmon 事件 22 字段读法
| 字段 | 含义 | 分析用法 |
|---|---|---|
| QueryName | 被查询的域名 | 常带尾部点,需归一化后比对 |
| Image | 发起查询的进程路径 | 用户目录下的路径更可疑 |
| QueryResults | 解析结果 | 可与流量日志里的目标地址对照 |
| QueryStatus | 查询结果状态 | 非零通常表示失败或被拦截 |
| UtcTime | 事件时间(UTC) | 与主机本地时间字段区别对待 |
Sysmon 未部署或未启用 DNS 记录时,退而求其次只能靠DNS 服务器日志加防火墙连接记录推断,结论强度明显下降,报告里要写明这一限制。
递归解析链路中客户端到本地缓存、缓存到上游服务器的查询时间是不同的,比较时应使用同一层级的记录,避免把缓存命中的时间差当成攻击延迟。