发布于2小时前2小时 背景本文记录一个授权内网排查场景:终端告警显示 powershell.exe 拉起了名称近似系统组件的可执行文件,随后该进程以固定周期访问外部 HTTPS 地址。样本具备注册表自启动、主机信息收集、命令执行和文件回传能力,行为符合典型 Windows 木马远控特征。分析目标不是单纯判断文件是否恶意,而是回答四个问题:样本如何启动、持久化落在哪里、远控通信如何识别、清除后如何验证没有残留。所有动态操作均应在隔离虚拟机和受控网络中完成,不要直接运行来源不明的样本。问题定位初始告警中的进程链如下:WINWORD.EXE └─ powershell.exe -NoProfile -WindowStyle Hidden ... └─ C:\Users\Public\Libraries\RuntimeBroker.exe这里有三个值得优先核验的异常点:RuntimeBroker.exe 正常路径通常位于 Windows 系统目录,出现在用户可写目录时应检查签名和哈希。父进程为隐藏窗口的 PowerShell,而不是常见的系统进程启动链。进程启动后建立外连,并写入当前用户的 Run 注册表项,形成登录持久化。先不要急于删除文件。直接终止或清除可能破坏内存中的解密配置、网络指标和父子进程关系。建议先隔离网络,再保存现场。现场保全与基础排查以下 PowerShell 命令应在管理员终端中执行。输出目录放在独立取证盘或受控共享中,并记录系统时间、时区和执行人员。$Case = 'C:\IR\case-20250308' New-Item -ItemType Directory -Force $Case | Out-Null Get-Date | Out-File "$Case\time.txt" Get-TimeZone | Format-List * | Out-File "$Case\timezone.txt" Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine | Export-Csv "$Case\process.csv" -NoTypeInformation -Encoding UTF8 Get-NetTCPConnection | Select-Object State,LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess | Export-Csv "$Case\tcp.csv" -NoTypeInformation -Encoding UTF8 Get-CimInstance Win32_StartupCommand | Select-Object Name,Command,Location,User | Export-Csv "$Case\startup.csv" -NoTypeInformation -Encoding UTF8 schtasks.exe /query /fo CSV /v > "$Case\tasks.csv" sc.exe query type= service state= all > "$Case\services.txt" reg.exe query HKCU\Software\Microsoft\Windows\CurrentVersion\Run /s > "$Case\hkcu-run.txt" reg.exe query HKLM\Software\Microsoft\Windows\CurrentVersion\Run /s > "$Case\hklm-run.txt" Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'} | Select-Object TimeCreated,Id,RecordId,Message | Export-Csv "$Case\powershell-operational.csv" -NoTypeInformation -Encoding UTF8对可疑文件计算哈希、检查签名,并保留文件系统元数据:$Sample = 'C:\Users\Public\Libraries\RuntimeBroker.exe' Get-Item $Sample | Format-List FullName,Length,CreationTimeUtc,LastWriteTimeUtc,Attributes Get-FileHash $Sample -Algorithm SHA256 Get-AuthenticodeSignature $Sample | Format-List Status,StatusMessage,SignerCertificate哈希用于样本关联和复核,不应单独作为恶意结论。无签名也不等于恶意,但“系统组件名称、非系统路径、签名缺失、异常父进程、持续外连”组合出现时,可信度会明显提高。静态逆向分析将样本复制到隔离分析机后,先确认 PE 基本属性,不要双击运行。可使用 PE-bear、Detect It Easy、Ghidra 或 IDA 检查节区、导入表、资源和入口点。节区熵值明显偏高、导入表很小、入口点存在解压循环,通常意味着加壳或运行时解密。导入 WinHTTP、WinINet、WS2_32 或动态解析网络 API,说明需要继续跟踪通信初始化函数。出现 RegSetValueExW、CreateServiceW、Task Scheduler COM 接口时,应定位持久化分支。出现 CreateProcessW、ShellExecuteW、CreatePipe、ReadFile 和 WriteFile 的组合时,重点查看命令执行及回显路径。出现 CryptDecrypt、BCryptDecrypt 或自实现轮函数时,配置和通信内容可能经过加密。本案例中,入口函数先构造互斥体,随后解密嵌入配置。配置结构包含服务器域名、端口、心跳间隔和安装路径。字符串不是完整明文,而是逐字节异或后存放在只读节中。识别这类逻辑时,可以从调用网络 API 前的参数回溯,通常比全局搜索字符串更有效。一个常见的异或解码循环在反编译结果中类似下面的形式:for (i = 0; i < config_len; i++) { decoded[i] = encoded[i] ^ key[i % key_len]; } decoded[config_len] = 0;确认解码算法后,可编写离线脚本处理从样本中提取的字节。脚本只做配置恢复,不执行样本:from pathlib import Path blob = Path('config.bin').read_bytes() key = bytes.fromhex('2f 19 a4 73') plain = bytes(b ^ key[i % len(key)] for i, b in enumerate(blob)) Path('config.dec').write_bytes(plain) print(plain.decode('utf-8', errors='replace'))实际分析时不要直接套用示例密钥,应从反汇编中的初始化常量、循环边界和调用参数中恢复。还要注意样本可能在解码后继续做 Base64、压缩或 AES 解密。动态行为与远控链路确认动态分析环境至少应具备快照、主机隔离、受控 DNS、流量捕获和时间同步。可使用 INetSim 或 FakeNet-NG 模拟网络服务,避免样本连接真实控制端。Procmon 建议按样本进程及其子进程过滤,并重点观察 Process Create、RegSetValue、CreateFile 和 TCP Connect。本案例执行后的关键行为包括:复制自身到 C:\Users\Public\Libraries\RuntimeBroker.exe。写入 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 下的 RuntimeBroker 值。创建命名互斥体,避免同一用户会话重复运行。采集主机名、用户名、操作系统版本和网卡信息。每 60 秒发起一次 HTTPS 请求,失败后按固定间隔重试。接收任务后创建隐藏子进程,并通过匿名管道收集标准输出。如果通信使用 TLS,仅靠抓包通常看不到应用层内容,但仍可提取 DNS 查询、目的地址、端口、SNI、证书、连接周期和每次会话的字节数。固定心跳周期、长期低流量连接和非常规客户端指纹,均可作为检测特征,但不宜脱离进程上下文单独定性。进程与网络映射可以通过 PID 交叉确认:$pidToCheck = 4120 Get-CimInstance Win32_Process -Filter "ProcessId=$pidToCheck" | Select-Object ProcessId,ParentProcessId,ExecutablePath,CommandLine Get-NetTCPConnection -OwningProcess $pidToCheck | Select-Object State,RemoteAddress,RemotePort,CreationTime Get-Process -Id $pidToCheck -Module -ErrorAction SilentlyContinue | Select-Object ModuleName,FileName若样本疑似将配置仅保存在内存,可在完成现场授权后采集进程转储。Windows 自带任务管理器可以生成用户态转储,也可使用经过审批的 ProcDump:procdump64.exe -accepteula -ma 4120 C:\IR\case-20250308\rat-4120.dmp转储文件可能包含口令、令牌、个人数据和解密后的通信内容,应按敏感证据管理,限制访问并计算哈希。日志关联与攻击链还原仅分析样本本身无法判断初始入口。应将进程、文件、注册表和网络事件放到同一时间线上。启用 Sysmon 的环境可重点查询以下事件:事件 1:进程创建,确认父进程、命令行、哈希和登录会话。事件 3:网络连接,将外联地址关联到具体进程。事件 11:文件创建,定位样本首次落盘和复制路径。事件 12、13、14:注册表对象创建、值设置和重命名。事件 22:DNS 查询,确认域名及查询进程。事件 25:进程篡改,用于发现部分注入或映像替换行为。下面的查询用于提取指定时间范围内的 Sysmon 关键事件:$Start = Get-Date '2025-03-08 09:00:00' $End = Get-Date '2025-03-08 12:00:00' Get-WinEvent -FilterHashtable @{ LogName='Microsoft-Windows-Sysmon/Operational' Id=1,3,11,12,13,14,22,25 StartTime=$Start EndTime=$End } | Select-Object TimeCreated,Id,RecordId,Message | Export-Csv 'C:\IR\case-20250308\sysmon-timeline.csv' -NoTypeInformation -Encoding UTF8若没有 Sysmon,可结合安全日志 4688、PowerShell 4103/4104、任务计划日志、DNS 客户端日志、防火墙日志、EDR 遥测和代理日志补全。注意 4688 是否包含命令行取决于审计策略,事后临时开启无法补回历史数据。检测规则示例静态规则应选取相对稳定的代码或配置特征,避免只使用文件名、时间戳或单个易变字符串。下面是用于实验室样本族归类的 YARA 框架,部署前必须用已知正常文件做误报测试,并将占位字符串替换为逆向得到的真实特征。rule Win_RAT_RuntimeBroker_Masquerade_Lab { meta: description = "Lab rule for a RAT family using RuntimeBroker masquerading" scope = "authorized incident response" strings: $mutex = "Global\\RBClient_" ascii wide $path = "\\Public\\Libraries\\RuntimeBroker.exe" ascii wide $cfg1 = "heartbeat_interval" ascii $cfg2 = "client_identifier" ascii condition: uint16(0) == 0x5A4D and filesize < 8MB and 3 of ($mutex, $path, $cfg1, $cfg2) }主机侧检测不应只依赖 YARA。更稳妥的组合是:非系统路径中的系统组件同名文件、签名异常、Office 或脚本解释器作为祖先进程、Run 键持久化,以及紧随其后的周期性外连。处置与清除步骤完成证据保全后再进入处置阶段。推荐顺序如下:从交换机、EDR 或主机防火墙层面隔离终端,避免继续接受远控指令。封禁经复核的域名、IP、证书指纹或代理访问特征,并回溯同类连接。终止恶意进程及其子进程,确认没有同名进程重新拉起。删除 Run 键、计划任务、服务、WMI 永久事件订阅等持久化项。隔离样本文件,不要直接覆盖;保留副本和 SHA-256 用于复盘。检查被远控账户的登录记录、令牌使用、横向访问和敏感文件读取情况。若存在凭据窃取或管理员会话暴露,应在干净设备上执行密码及密钥轮换。针对本案例确认过的 Run 键,可先导出再删除:reg.exe export HKCU\Software\Microsoft\Windows\CurrentVersion\Run C:\IR\case-20250308\run-backup.reg /y reg.exe delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v RuntimeBroker /f Stop-Process -Id 4120 -Force Move-Item 'C:\Users\Public\Libraries\RuntimeBroker.exe' 'C:\IR\quarantine\RuntimeBroker.exe.quarantine' Get-FileHash 'C:\IR\quarantine\RuntimeBroker.exe.quarantine' -Algorithm SHA256删除命令必须以现场确认的键名、路径和 PID 为准,不要照抄到生产环境。若进程存在注入、内核驱动、系统文件替换或多重持久化,仅删除落地文件通常不够,应评估重装可信镜像。风险与修复建议启用进程创建审计并记录命令行;PowerShell 开启脚本块日志、模块日志和受保护事件转发。部署经过基线测试的 Sysmon 配置,至少覆盖进程创建、网络连接、DNS、文件创建和注册表持久化。通过 WDAC 或 AppLocker 限制用户可写目录执行程序,重点关注 Public、ProgramData、Temp 和用户配置目录。限制 Office 创建脚本解释器和系统工具子进程,可结合 ASR 规则实施,先以审计模式观察兼容性。普通用户不授予本地管理员权限,运维账户和日常办公账户分离,减少远控进入后的权限上限。出口代理保留域名、SNI、证书和进程关联信息;对周期性低流量外连建立基线检测。对 Run 键、计划任务、服务和 WMI 订阅建立变更监控,告警中保留修改进程、用户和完整命令行。处置后连续观察至少一个完整业务周期,确认恶意域名无新增解析、持久化项未恢复、同类哈希和路径未在其他终端出现。总结逆向木马远控的核心不是给样本贴一个家族标签,而是把静态代码、运行行为、持久化位置、网络通信和日志证据串成可验证的链路。实际处置中应坚持先隔离和保全,再逆向提取稳定特征,最后按进程、账户和主机三个层面完成清除与复核。对于出现进程注入、凭据暴露或高权限长期驻留的终端,重建系统往往比局部删除更可靠。 逆向分析、样本行为与调试流程示意 网络请求、日志与边界流量分析示意
1小时前1小时 这类 RAT 处置建议先做“隔离但不断电”,不要急着删样本或重启。重启会丢失内存中的注入代码、解密后的 C2 配置和现存连接;直接删除又容易破坏时间线。先在交换机或 EDR 侧限制该主机仅能访问取证节点,同时保留当前登录状态。 1. 固化现场 mkdir C:\IR date /t > C:\IR\basic.txt time /t >> C:\IR\basic.txt hostname >> C:\IR\basic.txt whoami /all >> C:\IR\basic.txt tasklist /v > C:\IR\tasklist.txt tasklist /m > C:\IR\modules.txt netstat -abno > C:\IR\netstat.txt arp -a > C:\IR\arp.txt ipconfig /all > C:\IR\ipconfig.txt wevtutil epl System C:\IR\System.evtx wevtutil epl Security C:\IR\Security.evtx wevtutil epl Microsoft-Windows-PowerShell/Operational C:\IR\PowerShell.evtx certutil -hashfile C:\path\sample.exe SHA256 有条件的话再用 WinPmem 获取内存,并对样本、内存镜像、EVTX、Prefetch、Amcache、SRUM 建立 SHA-256 清单。所有时间统一换算为 UTC,避免主机时区和日志源不同导致链路误判。 2. 不要只盯样本进程,重点找注入与持久化 用 Process Explorer/PE-sieve 核查无文件映像、RWX 内存、线程起始地址落在私有内存,以及父子进程异常关系。常见可疑链包括 Office/浏览器拉起 PowerShell、脚本宿主再拉起 rundll32、regsvr32 或系统进程中出现无磁盘映射模块。 Get-CimInstance Win32_StartupCommand | Select-Object Name,Command,Location,User Get-ScheduledTask | Where-Object {$_.State -ne 'Disabled'} | Select-Object TaskPath,TaskName,State Get-CimInstance Win32_Service | Select-Object Name,State,StartMode,PathName reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" /s reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDlls" /s bitsadmin /list /allusers /verbose wmic /namespace:\\root\subscription PATH __EventFilter get /format:list wmic /namespace:\\root\subscription PATH CommandLineEventConsumer get /format:list wmic /namespace:\\root\subscription PATH __FilterToConsumerBinding get /format:list 另外检查服务路径是否未加引号、计划任务 XML 中是否引用用户目录、WMI 永久订阅、BITS 作业、登录脚本,以及 Defender 排除项: Get-MpPreference | Select-Object ExclusionPath,ExclusionProcess,ExclusionExtension 3. 还原通信链路 把 PID 与五元组、DNS、代理日志、TLS SNI/证书指纹关联起来。RAT 可能使用 CDN、DoH 或合法云服务,因此不要只封 IP;应同时提取域名、URI、Host/SNI、JA3/JA4、证书序列号、固定心跳周期及请求体长度。若是直连 IP,也要检查该 IP 在其他终端上的首次出现时间。 Get-NetTCPConnection | Sort-Object OwningProcess | Format-Table LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess Get-DnsClientCache | Sort-Object Entry | Format-Table Entry,RecordName,RecordType,Data Get-WinEvent -FilterHashtable @{ LogName='Microsoft-Windows-Sysmon/Operational' Id=1,3,7,11,13,22 } | Export-Csv C:\IR\sysmon-events.csv -NoTypeInformation 如果现场此前没有 Sysmon,不建议为了取证临时安装后就把新日志误当完整历史。历史链路应更多依赖防火墙、DNS、代理、EDR、域控登录事件和 NetFlow。 4. 横向范围确认 围绕样本 SHA-256、落地路径、互斥体、服务名、任务名、注册表值、C2 特征做全网检索;同时检查受害账号在其他主机上的 4624/4625/4648/4672、服务安装 7045、计划任务 4698,以及远程执行常见痕迹。尤其注意 LogonType 3、9、10 与源地址是否符合管理员日常行为。 5. 清除顺序 先封禁 C2 和被盗账号会话,轮换受影响账号及该主机上出现过的高权限凭据。 停止恶意进程及其注入宿主,再删除服务、任务、WMI/BITS 和启动项。 隔离样本而不是直接永久删除,保留原始副本及哈希。 执行离线扫描,并复核 Defender 排除项、安全策略、代理和证书存储。 若发现 LSASS 访问、域管登录、内核驱动或多重持久化,优先重装而非“手工清干净”。 恢复联网后至少观察一个完整心跳周期,确认没有 DNS、HTTPS 或备用 C2 回连。 最终报告最好明确区分“已观测事实”和“分析推断”,并保留每个 IOC 的来源、首次/末次出现时间和置信度。这样后续扩大排查范围时,不会因单一字符串或共享基础设施造成大量误报。
创建帐户或登录后发表意见