发布于6小时前6小时 背景在一次已授权的内网安全检查中,终端侧发现某 Windows 主机每隔约 90 秒向固定外部地址发起 TLS 连接。对应进程位于 C:\ProgramData\WinCache\updater.exe,无有效数字签名,并通过计划任务 UpdateCheck 启动。本文以这类疑似远控木马为例,说明如何完成样本保全、静态逆向、动态验证、权限边界判断和修复闭环。以下操作应在隔离网络、快照虚拟机或专用分析环境中完成。不要直接在办公终端双击未知样本,也不要允许分析环境连接真实互联网。一、现场保全与问题定位发现可疑进程后,不建议立即删除文件。先隔离主机并记录进程、网络、父子进程和持久化信息,否则容易丢失攻击入口与横向活动证据。# 计算样本哈希 Get-FileHash 'C:\ProgramData\WinCache\updater.exe' -Algorithm SHA256 # 查看签名与文件元数据 Get-AuthenticodeSignature 'C:\ProgramData\WinCache\updater.exe' | Format-List Get-Item 'C:\ProgramData\WinCache\updater.exe' | Format-List Name,Length,CreationTime,LastWriteTime # 记录进程、命令行及父进程 Get-CimInstance Win32_Process | Where-Object {$_.ExecutablePath -like '*WinCache*'} | Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine # 网络连接及关联 PID Get-NetTCPConnection | Where-Object {$_.State -eq 'Established'} | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess # 导出计划任务定义 schtasks /query /tn UpdateCheck /xml > C:\IR\UpdateCheck.xml # 检查常见自启动位置 reg query 'HKCU\Software\Microsoft\Windows\CurrentVersion\Run' reg query 'HKLM\Software\Microsoft\Windows\CurrentVersion\Run' # 收集事件日志,避免后续滚动覆盖 wevtutil epl Security C:\IR\Security.evtx wevtutil epl Microsoft-Windows-TaskScheduler/Operational C:\IR\TaskScheduler.evtx wevtutil epl Microsoft-Windows-Sysmon/Operational C:\IR\Sysmon.evtx同时记录当前登录用户、进程完整性级别和令牌权限。若木马只运行在标准用户上下文,其访问范围通常受当前用户 ACL 限制;如果进程处于高完整性级别、以 SYSTEM 运行,或持有 SeDebugPrivilege,则需要按凭据泄露和全机失陷处理。whoami /user whoami /groups whoami /priv Get-Process -Id <PID> -IncludeUserName | Format-List *二、静态分析:确认样本类型与加载方式第一轮静态分析重点不是立即反编译全部逻辑,而是回答四个问题:样本由什么技术栈编写、是否加壳、配置放在哪里、运行后会调用哪些系统能力。使用 Detect It Easy、PE-bear 或 pefile 检查架构、编译时间、节区权限和导入表。使用 FLOSS 提取栈字符串、解码字符串和静态字符串,避免只依赖普通 strings。使用 capa 判断样本是否具有进程注入、屏幕采集、键盘记录、注册表持久化或 HTTP 通信能力。检查资源段、Overlay 数据和高熵节区。高熵不等于恶意,但常见于压缩、加密配置或壳。floss.exe updater.exe > floss.txt capa.exe updater.exe > capa.txt sigcheck64.exe -a -h -i updater.exe 7z l updater.exe本例样本为 PE32+ 原生程序,导入表非常精简,只直接导入 LoadLibraryW、GetProcAddress 和少量内存管理函数。FLOSS 输出中出现 winhttp.dll、WinHttpConnect、WinHttpSendRequest、TaskCache 等字符串,说明样本可能在运行时解析 API,以减少静态特征。在 .rdata 节尾部还能找到标记 CFG1。其后两个字节为小端配置长度,再后一个字节为循环异或密钥。解码后内容采用以分号分隔的键值结构,例如域名、端口、休眠时间和客户端标识。该结构应通过反编译交叉引用确认,不能仅凭字符串猜测。三、离线提取远控配置下面的脚本只读取样本文件,不执行样本。它适用于已经通过逆向确认的 CFG1 + 长度 + 单字节密钥 + 密文 格式。真实样本中应根据反编译结果修正长度字段、字节序和解码算法。from pathlib import Path import struct import sys raw = Path(sys.argv[1]).read_bytes() marker = b'CFG1' pos = raw.find(marker) if pos < 0: raise SystemExit('CFG1 marker not found') header = pos + len(marker) length = struct.unpack_from('<H', raw, header)[0] key = raw[header + 2] start = header + 3 enc = raw[start:start + length] if len(enc) != length: raise SystemExit('truncated config') dec = bytes(b ^ key for b in enc) print(dec.decode('utf-8', errors='replace'))执行方式:python extract_cfg.py updater.exe如果配置输出包含地址、URI、互斥体、证书指纹或上线间隔,应作为待验证 IOC,而不是直接作为定论。攻击者可能放置无效域名、备用节点或用于干扰分析的字符串。四、动态分析:验证 C2 和行为链动态分析环境建议使用 Windows 虚拟机快照,并将网络连接到内部模拟器。可使用 FakeNet-NG 或 INetSim 返回可控的 DNS、HTTP 和 TLS 响应,但不要把流量转发至公网。运行前启动 Procmon、Wireshark 和进程监控工具。在 x64dbg 中,样本早期可能尚未加载 winhttp.dll,因此先对 LoadLibraryW 和 GetProcAddress 设置断点。模块加载后,再观察以下 API:WinHttpConnect:读取目标主机和端口。WinHttpOpenRequest:读取请求方法、URI 和标志位。WinHttpSendRequest:检查请求头及首个发送缓冲区。WinHttpWriteData:捕获分块发送或二次加密后的数据。WinHttpSetOption:确认是否关闭证书校验或设置代理。CryptUnprotectData:判断是否读取浏览器、客户端或系统保存的 DPAPI 数据。命中 WinHttpConnect 时,x64 Windows 调用约定下前四个参数通常位于 RCX、RDX、R8、R9。对该函数而言,RDX 指向主机名宽字符串,R8 为端口。命中 WinHttpSendRequest 时,应结合调用栈检查请求头和发送缓冲区,避免只看寄存器而误判。如果样本存在进程注入迹象,可重点观察 VirtualAllocEx、WriteProcessMemory、CreateRemoteThread、NtMapViewOfSection 和 QueueUserAPC。发现跨进程写入后,需要记录源进程、目标进程、写入地址、内存权限变化和线程入口。不要仅以出现某个 API 就断言存在注入,因为部分调试器、辅助工具也会使用这些接口。五、持久化与权限边界本例计划任务 XML 中的触发器为用户登录,执行主体是当前普通用户,未配置 RunLevel=HighestAvailable。这说明持久化本身没有直接越权,但仍需确认任务创建时是否使用了被盗管理员凭据。检查对象重点证据相关日志计划任务创建者、执行账户、动作路径、隐藏属性Security 4698、TaskScheduler 106/140/141Windows 服务服务二进制路径、启动账户、未引用路径System 7045、Security 4697注册表自启动Run、RunOnce、Winlogon、IFEOSysmon 12/13/14WMI 持久化Filter、Consumer、BindingWMI-Activity 5857 至 5861进程与网络父子关系、命令行、目标地址Sysmon 1、3、22若样本由 Office、浏览器、脚本解释器或压缩软件直接拉起,应继续回溯初始入口。如果父进程是 winword.exe,子进程经过 powershell.exe 或 mshta.exe 落地,就不能只清理最终木马,还要排查恶意文档、下载缓存、邮件附件和脚本日志。六、日志关联与影响范围确认建议以样本 SHA-256、文件路径、计划任务名称、配置中的主机名、目标 IP、互斥体和请求 URI 为主线,在 EDR、DNS、代理和防火墙日志中检索。网络侧应注意域名可能轮换,单纯封禁一个 IP 通常不足以完成处置。# 检索同名文件及计算哈希,适合受控范围内执行 Get-ChildItem 'C:\Users','C:\ProgramData' -Filter 'updater.exe' -Recurse -ErrorAction SilentlyContinue | ForEach-Object { Get-FileHash $_.FullName -Algorithm SHA256 } # 查询本机计划任务事件 Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4698} | Select-Object TimeCreated,Id,Message # 查询 Sysmon 网络连接事件中的可疑目标 Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=3} | Where-Object {$_.Message -match '198\.51\.100\.24|example\.invalid'} | Select-Object TimeCreated,Message198.51.100.0/24 和 example.invalid 在此仅作为文档示例。实际排查应替换为分析所得 IOC。七、风险判断若样本具备凭据读取、浏览器数据访问或 LSASS 访问行为,应重置受影响账户密码并撤销会话令牌。若以 SYSTEM 权限运行,应检查本地管理员组、服务、驱动、WMI 订阅和安全软件排除项。若发现横向工具调用、远程服务创建、SMB 登录或 WinRM 活动,应扩大范围至相邻主机及域控制器日志。如果样本使用 HTTPS,不能因流量加密就忽略。SNI、证书指纹、JA3/JA4、连接周期、请求长度和进程归属仍可用于关联。系统时间戳可能被篡改。应将文件时间、事件日志、MFT、Prefetch、Amcache 和网络侧时间进行交叉验证。八、修复与加固建议推荐按“隔离、取证、阻断、清理、恢复、复盘”的顺序处置,而不是直接删除文件。先从网络侧隔离终端,保留与管理平台或取证通道的最小通信。保全样本、内存、计划任务 XML、事件日志、DNS 缓存和网络连接信息。在 DNS、代理、防火墙和 EDR 中阻断确认后的 C2 域名、IP、证书或 URI 特征。禁用并删除恶意计划任务、服务或 WMI 订阅,再隔离样本文件。轮换受影响用户及高权限账户凭据,撤销 VPN、邮箱、云平台和浏览器会话。修复初始入口,例如补丁缺失、弱口令、恶意附件、暴露的远程管理服务或脚本执行策略问题。开启 Sysmon 或等效 EDR 日志,确保进程创建、网络连接、文件落地、注册表修改和 DNS 查询可关联。# 完成证据保全后再禁用任务 Disable-ScheduledTask -TaskName 'UpdateCheck' Unregister-ScheduledTask -TaskName 'UpdateCheck' -Confirm:$false # 将样本移动到受控隔离目录,不建议直接永久删除 New-Item -ItemType Directory -Path 'C:\IR\Quarantine' -Force Move-Item 'C:\ProgramData\WinCache\updater.exe' 'C:\IR\Quarantine\updater.exe.quarantined' # 再次确认不存在关联进程与外联 Get-CimInstance Win32_Process | Where-Object {$_.ExecutablePath -like '*WinCache*'} Get-NetTCPConnection | Where-Object {$_.State -eq 'Established'}总结逆向远控木马的关键不是单独找出一个 C2 地址,而是还原完整行为链:样本如何落地、以什么权限启动、配置如何解密、通过什么协议通信、是否注入其他进程、如何持久化,以及是否发生凭据访问和横向移动。静态分析用于快速定位配置和能力,动态调试用于验证参数与真实行为,主机及网络日志则用于确定影响范围。只有把逆向结果转换成可检索 IOC、权限判断和修复动作,才能形成有效的处置闭环。 逆向分析、样本行为与调试流程示意 服务器、云资产与权限边界梳理示意
4小时前4小时 建议把“确认恶意”与“分析样本”分开做,避免在生产机上直接运行或动态调试。先留存可疑进程的 PID、父进程、启动时间和命令行,再采集文件哈希、签名及相关事件日志;必要时先隔离主机,但保留内存和磁盘证据。 快速梳理进程与网络关系可以从这几条开始: Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, ExecutablePath, CommandLine Get-NetTCPConnection -State Established | Select-Object OwningProcess, LocalAddress, LocalPort, RemoteAddress, RemotePort Get-FileHash "C:\path\to\suspicious.exe" -Algorithm SHA256 Get-AuthenticodeSignature "C:\path\to\suspicious.exe" 分析 C2 配置时,优先在隔离的虚拟机里做静态提取,记录域名、IP、端口、URI、加密参数及其来源偏移;动态验证应使用受控 DNS/网络环境,避免样本连到真实基础设施。持久化检查不要只看 Run 键,还应覆盖计划任务、服务、WMI 订阅、启动目录和常见登录脚本,并把发现项与进程创建、网络连接、注册表变更时间线对齐。 最后把 IOC 转成可验证的检测规则,并用历史日志回溯:Sysmon 重点看进程创建、网络连接、注册表和文件创建事件;Windows 安全日志可辅助核对登录与任务创建。封堵前先确认是否存在同一哈希、父进程链或 C2 特征的其他主机,处置后再复查持久化项和外联是否复现。
创建帐户或登录后发表意见