发布于10小时前10小时 背景本文记录一次授权内网攻防演练中的 Windows 远控木马排查过程。目标主机出现间歇性外联,但终端防护没有直接报毒。初步线索是某办公终端每隔约 60 秒访问一个非常规 HTTPS 域名,并在用户登录后自动启动未知进程。分析目标不是运行或复现远控能力,而是确定样本如何落地、如何维持权限、是否发生进程注入、C2 通信具有哪些稳定特征,以及如何形成可验证的修复闭环。样本处理应在隔离虚拟机中完成,禁止桥接生产网络;动态分析时建议使用 FakeNet-NG、INetSim 等受控网络模拟服务。问题定位事件响应阶段先固定时间线,不要直接删除文件或重启主机。重启可能破坏进程内存、临时脚本、网络连接和注入痕迹。优先采集以下证据:可疑文件原件及 SHA-256、文件创建时间、Zone.Identifier。进程树、命令行、父子关系、签名状态和网络连接。计划任务、服务、Run 键、WMI 永久事件订阅等持久化入口。Windows 事件日志、Sysmon 日志、PowerShell 日志和终端防护告警。条件允许时采集完整内存镜像,用于检查注入区域和仅驻留内存的载荷。先执行低扰动采集,并将结果写入独立证据目录:$Out = "C:\IR\Case-2025-01" New-Item -ItemType Directory -Force $Out | Out-Null Get-Process | Select-Object Id,ProcessName,Path,StartTime | Export-Csv "$Out\process.csv" -NoTypeInformation -Encoding UTF8 Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine | Export-Csv "$Out\process_detail.csv" -NoTypeInformation -Encoding UTF8 Get-NetTCPConnection | Select-Object State,LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess | Export-Csv "$Out\tcp.csv" -NoTypeInformation -Encoding UTF8 reg.exe query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s > "$Out\run_hkcu.txt" reg.exe query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s > "$Out\run_hklm.txt" schtasks.exe /query /fo LIST /v > "$Out\tasks.txt" Get-CimInstance Win32_Service | Select Name,State,StartMode,PathName | Export-Csv "$Out\services.csv" -NoTypeInformation -Encoding UTF8静态逆向分析样本落地路径为用户目录下的伪装更新程序。静态检查发现 PE 时间戳明显异常,导入表较小,节区熵偏高,符合加壳或运行时解密特征。此时不要只依赖文件名和哈希;同一构建器生成的变种可能每天更换哈希。可使用签名检查、字符串提取和 PE 元数据工具建立初步画像:Get-FileHash .\sample.exe -Algorithm SHA256 Get-AuthenticodeSignature .\sample.exe | Format-List * sigcheck64.exe -accepteula -a -h -i .\sample.exe strings64.exe -n 6 .\sample.exe > strings.txt floss.exe .\sample.exe > floss.txt重点关注以下内容:网络相关 API:WinHttpOpen、WinHttpConnect、InternetOpenUrl、WSAStartup。注入相关 API:VirtualAllocEx、WriteProcessMemory、CreateRemoteThread、NtQueueApcThread。持久化相关字符串:Run、CurrentVersion、schtasks、Win32_Service。配置数据:域名、URI 路径、User-Agent、公钥或证书摘要、心跳周期。反分析逻辑:虚拟机进程名、调试器检测、长时间 Sleep、区域语言检查。在 Ghidra 或 IDA 中,从导入函数交叉引用入手通常比从入口点顺序阅读更快。本例中,程序先解密配置块,再创建互斥体,随后检查启动参数。如果缺少指定参数,程序写入 Run 键并重新启动自身;主循环则以固定周期发送主机标识和当前用户信息。持久化与权限边界分析样本只获得普通用户权限,因此写入 HKCU Run 键,而不是创建系统服务。这一点决定了影响边界:它能够访问当前用户可访问的文件和浏览器数据,但不能天然获得 SYSTEM 权限。排查报告中应区分“已经获得的权限”和“理论上可能提升的权限”,不要把发现远控直接等同于域控失陷。除了常见自启动项,还应检查 WMI 永久事件订阅:Get-CimInstance -Namespace root\subscription -ClassName __EventFilter Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer Get-CimInstance -Namespace root\subscription -ClassName ActiveScriptEventConsumer Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding如果发现可疑项,先导出实例属性并记录对象路径,再执行清理。直接删除订阅而不保留关联关系,后续很难证明持久化链路。动态行为与 C2 通信分析动态分析在带快照的隔离虚拟机中进行。网络侧将默认网关指向受控模拟器,避免真实连接攻击者基础设施。Process Monitor 过滤样本 PID 及其子进程,重点观察 Process Create、RegSetValue、CreateFile 和 TCP Connect。抓包显示样本每 60 秒发起一次 TLS 连接,失败后退避时间依次增加。即使 TLS 内容不可见,仍可利用以下元数据形成检测条件:固定或近似固定的心跳间隔。同一进程持续访问低信誉域名。TLS SNI、证书颁发者、证书有效期和 JA3/JA4 指纹。请求与响应字节数长期稳定。进程路径位于用户可写目录,但对外访问 443 端口。不建议仅按 IP 封禁。远控基础设施经常使用 CDN、动态 DNS 或短周期云主机,IP 指标寿命较短。域名、URI、证书特征、进程链和周期行为组合后更可靠。内存注入验证进程树中,可疑程序启动后短时间退出,但 explorer.exe 随即产生外联。这通常需要验证是否存在进程注入。现场采集内存后,可以使用 Volatility 3 检查进程、网络对象和可疑可执行内存:python vol.py -f memory.raw windows.pslist python vol.py -f memory.raw windows.pstree python vol.py -f memory.raw windows.netscan python vol.py -f memory.raw windows.cmdline python vol.py -f memory.raw windows.malfind --pid 2480 python vol.py -f memory.raw windows.vadinfo --pid 2480malfind 命中不代表一定是恶意代码,JIT、浏览器和安全软件也可能产生私有可执行区域。需要结合 VAD 权限、区域是否映射到合法文件、首部特征、线程起始地址及外联 PID 综合判断。本例中 explorer.exe 内出现未映射文件的 RX 私有区域,线程起始地址落在该区域内,并且该进程对应异常网络连接,证据链较完整。日志留痕与检测配置建议通过组策略统一启用进程创建命令行、PowerShell 脚本块日志,并部署 Sysmon。Sysmon 规则不宜全量记录所有事件,否则会产生大量噪声。针对远控木马,优先关注事件 ID 1、3、7、8、10、11、13、19、20、21、22。<Sysmon schemaversion="4.90"> <EventFiltering> <ProcessCreate onmatch="include"> <Image condition="contains any">\AppData\;\Temp\;\Users\Public\</Image> </ProcessCreate> <NetworkConnect onmatch="include"> <Image condition="contains any">\AppData\;\Temp\;\Users\Public\</Image> </NetworkConnect> <CreateRemoteThread onmatch="include" /> <WmiEvent onmatch="include" /> </EventFiltering> </Sysmon>上述规则适合作为起点,正式上线前应在测试终端评估误报。企业软件安装器、自动更新器也可能从用户目录启动,需要结合签名、父进程和资产白名单收敛。关键检测关联行为建议证据判断要点用户目录程序自启动Sysmon 1、13,Run 键快照无签名程序写入自启动项,父进程异常进程注入Sysmon 8、10,内存 VAD跨进程访问后出现未映射可执行区域周期性 C2Sysmon 3、DNS 日志、流量元数据固定间隔、固定大小、低信誉域名WMI 持久化Sysmon 19 至 21、WMI Operational过滤器与消费者绑定到用户可写路径脚本执行PowerShell 4103、4104编码命令、下载行为、内存加载风险控制与修复建议先隔离后清理。通过 EDR 网络隔离或交换机 NAC 限制通信,同时保留主机供取证。不要只删除样本。同步移除 Run 键、计划任务、WMI 订阅、异常服务及注入进程,并验证重启后是否复现。对受影响账户执行凭据重置,吊销活动会话和令牌。若浏览器配置或凭据库可能被访问,应按凭据泄露处理。排查同源扩散。使用样本路径、签名状态、互斥体、C2 元数据和进程链在全网检索,避免只处理首台主机。限制用户目录程序执行。可使用 WDAC 或 AppLocker 阻止未批准程序从 AppData、Temp、Downloads 等目录运行。收紧本地管理员权限,禁用不必要的脚本解释器和远程管理入口,并及时修补被利用的软件漏洞。清理完成后持续观察至少一个完整业务周期,确认异常 DNS、外联和持久化事件不再出现。涉及远控样本的动态分析应限定在书面授权范围和隔离环境内。不要将真实 C2 地址直接接入测试网络,也不要在生产主机上反复运行样本验证行为。总结远控木马排查的核心不是识别某个文件,而是还原“落地文件—持久化入口—进程执行—内存注入—网络通信”的完整链路。哈希适合确认已知样本,行为关联更适合发现变种。实际处置中,应同时保留磁盘、内存、日志和网络四类证据,明确样本所处权限边界,再根据证据逐项清理和验证。只有在重启后持久化不再出现、全网检索无同源活动、相关凭据完成轮换并持续监控无异常时,事件才能视为闭环。 逆向分析、样本行为与调试流程示意 服务器、云资产与权限边界梳理示意
9小时前9小时 这类事件建议按“时间线 + 进程树”串起来,不要把持久化、外联和注入拆成三个孤立告警。先做内存与日志保全,再处置网络和进程;直接结束可疑进程可能丢失注入载荷、线程起始地址和连接上下文。 1. 先确定入口进程及其持久化来源 Windows 侧优先核对计划任务、服务、注册表启动项、WMI 永久订阅和登录脚本。重点不是只看名称,而是比较创建时间、执行路径、签名、父进程及命令行: schtasks /query /fo LIST /v sc.exe query type= service state= all reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s powershell -NoProfile -Command "Get-CimInstance -Namespace root/subscription -Class __EventFilter" powershell -NoProfile -Command "Get-CimInstance -Namespace root/subscription -Class CommandLineEventConsumer" powershell -NoProfile -Command "Get-CimInstance -Namespace root/subscription -Class __FilterToConsumerBinding" 服务排查时尤其关注 ImagePath 带用户可写目录、UNC 路径、脚本解释器或异常参数的项。若部署了 Sysmon,可围绕事件 ID 1、12/13、19/20/21 建立同一主机时间线;系统日志则补查 4697、7045、106/140/141。 2. 从进程树反查 C2 通信 先把连接映射到 PID,再回溯父子进程、命令行和文件落点。不要仅凭目标 IP 定性,域名解析、TLS SNI、固定心跳周期和出站进程通常更有价值: netstat -abno powershell -NoProfile -Command "Get-NetTCPConnection | Sort-Object OwningProcess | Format-Table -Auto" powershell -NoProfile -Command "Get-CimInstance Win32_Process | Select ProcessId,ParentProcessId,CreationDate,ExecutablePath,CommandLine" ipconfig /displaydns 日志关联建议至少覆盖 Sysmon 事件 ID 3、DNS 事件 ID 22,以及代理、防火墙、EDR 网络遥测。常见异常包括:办公终端周期性访问低信誉域名、非浏览器进程直接访问公网、系统进程连接用户网段外地址、短连接间隔高度稳定。可用“进程 GUID + 目标地址 + 首次出现时间”关联,避免 PID 重用造成误判。 3. 对疑似内存注入进程做活体检查 重点看异常父子关系、无文件映射的可执行内存、线程起始地址落在私有内存,以及进程映像与磁盘文件不一致。现场允许时,先生成转储并记录哈希: mkdir C:\IR procdump64.exe -accepteula -ma <PID> C:\IR\suspect.dmp certutil -hashfile C:\IR\suspect.dmp SHA256 tasklist /m /fi "PID eq <PID>" sigcheck64.exe -a -h -i -m <可疑文件路径> 如果使用 Volatility 3,可对主机内存镜像交叉检查进程、网络、可疑内存区和 DLL: python vol.py -f memory.raw windows.pslist python vol.py -f memory.raw windows.pstree python vol.py -f memory.raw windows.cmdline python vol.py -f memory.raw windows.netscan python vol.py -f memory.raw windows.malfind python vol.py -f memory.raw windows.dlllist --pid <PID> malfind 命中本身不能直接证明恶意,需要结合内存页权限、MZ/PE 头、反汇编结果、线程起始地址和网络连接判断。浏览器、JIT 运行时及安全软件也可能产生 RWX 或私有可执行页。 4. 最后闭环验证 建议输出一条可复核的证据链:持久化对象创建时间 → 启动的进程及父进程 → 外联域名/IP 与周期 → 被注入目标进程 → 内存区或转储哈希。隔离主机后再删除持久化项、阻断 IOC、重置相关凭据,并检查同网段是否存在相同任务名、服务名、文件哈希、域名或 JA3/JA4 特征。这样比单机清除更不容易漏掉横向扩散和重复上线。
创建帐户或登录后发表意见