发布于7小时前7小时 背景一次授权内网演练结束后,终端告警显示某办公主机上的 updater.exe 持续访问外部地址,并在 explorer.exe 中出现异常线程。样本没有明显窗口,重启后仍会运行,符合典型远控木马的加载、驻留和回连特征。本文按真实处置流程展开:先保全现场,再进行静态逆向和受控动态分析,最后利用主机日志还原执行链。示例中的域名和地址均使用保留值,例如 sync-gateway.invalid 和 192.0.2.23。分析对象只能来自明确授权的测试或应急场景。样本必须放在隔离虚拟机中运行,使用快照、Host-only 网络和模拟服务,禁止直接接入生产网络或公网。一、先保全现场,不要直接结束进程远控木马的配置、解密密钥和真实 C2 地址经常只存在于内存中。直接查杀可能丢失进程注入、网络连接和父子进程关系等关键证据。记录主机名、登录用户、系统时间、活动网络连接和进程树。导出 Sysmon、Security、TaskScheduler 和 Defender 日志。在隔离主机后采集可疑进程内存;如果怀疑存在进程注入,同时采集被注入进程。计算样本哈希,所有分析均针对副本进行。$case = 'C:\IR\case-2025-01' New-Item -ItemType Directory -Force $case | Out-Null Get-Date | Out-File $case\time.txt Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine | Export-Csv $case\process.csv -NoTypeInformation Get-NetTCPConnection | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess | Export-Csv $case\network.csv -NoTypeInformation Get-FileHash 'C:\Users\Public\updater.exe' -Algorithm SHA256 | Format-List | Out-File $case\hash.txt wevtutil epl Microsoft-Windows-Sysmon/Operational $case\sysmon.evtx wevtutil epl Security $case\security.evtx wevtutil epl Microsoft-Windows-TaskScheduler/Operational $case\tasks.evtx如果需要导出进程内存,可使用经过内部批准的取证工具。导出文件同样应计算 SHA-256,并记录采集时间、工具版本和操作人员,避免后续无法确认样本来源。二、静态逆向:先判断它是加载器还是完整远控样本初检显示为 64 位 PE,无有效数字签名,导入表只保留 LoadLibraryW、GetProcAddress、VirtualAlloc 等少量 API,异常节区熵约为 7.6。这类“导入稀疏、高熵节区、运行时解析 API”的组合通常意味着加壳或内存解密,不能仅依赖 strings 的结果下结论。建议先用 Detect It Easy、PE-bear 或 pefile 检查入口点、节区权限、TLS Callback、资源和签名,再用 FLOSS 恢复栈字符串,用 capa 判断能力。以下命令用于建立静态分析基线:sigcheck64.exe -accepteula -h -i -m C:\Samples\updater.exe floss.exe C:\Samples\updater.exe > C:\Analysis\floss.txt capa.exe -vv C:\Samples\updater.exe > C:\Analysis\capa.txt python -c 'import pefile; p=pefile.PE(r"C:\Samples\updater.exe"); print(hex(p.OPTIONAL_HEADER.AddressOfEntryPoint)); [(print(s.Name.rstrip(bytes([0])), hex(s.VirtualAddress), hex(s.Misc_VirtualSize), round(s.get_entropy(),2))) for s in p.sections]'本例中,FLOSS 恢复出 Software\Microsoft\Windows\CurrentVersion\Run、/api/v3/sync 和 Global\UpdateCheck_ 开头的互斥体字符串。capa 同时命中“解析 API 哈希”“分配 RWX 内存”“创建或修改注册表运行项”和“HTTP 通信”等能力。由此可将分析重点放在配置解密、持久化和内存载荷三个位置。三、动态分析:定位解密点和注入对象在隔离虚拟机内运行样本,Procmon 只保留该 PID 及其子进程,并关注 Process Create、RegSetValue、CreateFile 和 WriteFile。网络侧使用 FakeNet-NG 或内部模拟服务接收请求,避免样本接触真实 C2。调试时可以在以下 API 设置断点:VirtualAlloc、VirtualProtect:观察解密缓冲区从可写变为可执行。WriteProcessMemory、NtWriteVirtualMemory:确认是否向其他进程写入载荷。CreateRemoteThread、NtCreateThreadEx、QueueUserAPC:确认远程执行方式。RegSetValueExW、CreateProcessW:定位持久化值和后续进程。WinHttpOpenRequest、WinHttpSendRequest:在加密前读取主机名、URI、请求头和明文配置。本例在第二次 VirtualProtect 调用后出现 MZ 头,缓冲区权限由 RW 改为 RX。转储后得到第二阶段 DLL。加载器随后以 PROCESS_VM_WRITE、PROCESS_VM_OPERATION 和 PROCESS_CREATE_THREAD 权限打开 explorer.exe,并写入第二阶段代码。这个结论应同时由调试器调用栈、Sysmon Event ID 8 或 10,以及 explorer.exe 中无映像映射的可执行内存区域相互印证。若样本在启动后立即退出,应先检查互斥体、父进程、用户名、运行时长、CPU 数量和域环境判断逻辑,不要急于修改跳转。优先记录比较参数和返回值,确认是反调试、反沙箱还是配置错误,避免因粗暴补丁改变真实行为。四、C2 协议与权限边界分析网络流量显示样本每 60 秒向 sync-gateway.invalid 的 /api/v3/sync 发起 POST。请求体前 4 字节是小端长度,后续数据在内存中先压缩再加密。通过 WinHttpSendRequest 断点向上回溯,可以在加密函数调用前取得明文结构,其中包含主机 GUID、用户名、进程完整性级别和任务编号。判断危害时不能只写“具备远控能力”,需要明确权限边界:样本以普通用户启动时,只能写入 HKCU 运行项和当前用户可写目录。注入同完整性级别的 explorer.exe 不等于获得管理员权限。若后续出现 fodhelper.exe、eventvwr.exe 等异常父子关系,才需要继续验证是否发生 UAC 绕过。若进程请求访问 lsass.exe,检查 Sysmon Event ID 10 的 GrantedAccess、调用栈和签名信息,不能仅凭一次 OpenProcess 就判定凭据已泄露。如果样本以 SYSTEM 运行,应继续追溯服务、计划任务、驱动或软件部署平台,确认提权发生在木马内部还是此前的入侵链路中。五、用日志还原完整执行链推荐重点关联 Sysmon 事件 1、3、7、8、10、11、13、22。常见链路是邮件附件或下载器启动加载器,加载器落地第二阶段,修改 HKCU Run,随后注入 explorer.exe 并发起 DNS 和网络连接。$ids = 1,3,7,8,10,11,13,22 Get-WinEvent -FilterHashtable @{ LogName='Microsoft-Windows-Sysmon/Operational' Id=$ids StartTime=(Get-Date).AddDays(-3) } | Where-Object { $_.Message -match 'updater.exe|explorer.exe|sync-gateway.invalid|192.0.2.23' } | Select-Object TimeCreated,Id,RecordId,Message | Export-Csv C:\IR\case-2025-01\timeline.csv -NoTypeInformation Get-WinEvent -FilterHashtable @{ LogName='Security' Id=4698,4699,4702 StartTime=(Get-Date).AddDays(-3) } | Select-Object TimeCreated,Id,Message如果没有 Sysmon,仍可检查 Security 4688、4698,TaskScheduler Operational 106、140、141,以及 Defender Operational 日志。4688 需要提前启用“审核进程创建”和命令行记录,否则只能看到有限字段。六、将逆向结果转成检测规则文件哈希适合封堵已知样本,但变种后容易失效。更稳妥的做法是组合互斥体前缀、URI、持久化路径和解密后载荷中的稳定字符串。规则应先在软件基线库中验证,避免将正常更新程序误报为木马。rule RAT_UpdateLoader_Family_A { meta: description = "Authorized incident sample: loader and decrypted payload artifacts" scope = "memory_or_unpacked_file" strings: $mutex = "Global\\UpdateCheck_" wide ascii $uri = "/api/v3/sync" ascii $run = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide $cfg = "host_guid" ascii condition: uint16(0) == 0x5A4D and 3 of them }该规则更适合扫描解包文件或内存转储。若直接扫描原始加壳样本,字符串可能尚未解密。网络侧可针对异常 URI、固定心跳周期、罕见 User-Agent 和不符合资产角色的外联目标建立组合告警,但不要单独依赖某一个字段。七、处置与修复建议先隔离受影响主机,再阻断已确认的域名、IP、证书指纹和代理日志中的关联目标。删除文件前导出注册表运行项、计划任务 XML、服务配置和样本副本;保留完整证据链。清理 HKCU Run、计划任务、服务和启动目录中的持久化项,并检查同一用户配置文件下近期新增的 DLL、LNK 和脚本。如果存在 explorer.exe 注入,只删除落地文件并不可靠,应重启进入受控环境后复查内存、启动项和网络连接。若确认样本读取浏览器凭据、令牌或访问 lsass.exe,应在可信设备上轮换账号密码、会话令牌和相关密钥。若发现未知驱动、SYSTEM 级持久化或无法解释的内核回调,优先重装或从可信镜像恢复,不建议只做文件级清理。长期防护可启用 Sysmon、WDAC 或 AppLocker、Defender ASR、脚本日志和出口白名单,并确保日志集中保存,避免木马本地清理后失去追溯依据。总结远控木马分析的关键不是跑一次查杀工具,而是把“文件入口、解密载荷、持久化、进程注入、C2 通信、实际权限和日志证据”串成闭环。静态逆向负责缩小范围,受控动态分析负责确认真实行为,主机与网络日志则用于判断影响面。最终产物至少应包含样本哈希、时间线、权限边界、稳定检测特征、处置记录和复查结果,才能支持后续封堵与修复。 逆向分析、样本行为与调试流程示意 网络请求、日志与边界流量分析示意
6小时前6小时 这类样本拆解里,建议不要只盯着字符串中的域名/IP。很多远控会在运行时解密配置,或者通过 DNS、备用域名切换 C2。动态定位时可以按调用链下断点: 域名解析:DnsQuery_W、getaddrinfo 直连 Socket:connect、WSAConnect WinINet:InternetConnectW、HttpOpenRequestW WinHTTP:WinHttpConnect、WinHttpOpenRequest 配置解密:CryptDecrypt、BCryptDecrypt 在 x64dbg 里命中后,重点回溯返回地址和调用者模块,不要只记录 API 参数。域名、端口、URI、User-Agent、心跳间隔和样本 PID 放在同一条记录里,后续才能和主机日志、流量时间线对齐。遇到自写网络层时,可以从 ws2_32!connect 往上找负责组包和配置读取的函数。 动态环境最好使用 INetSim/FakeNet-NG 或内部 sinkhole,不建议让样本直接访问公网。Windows 自带抓包可以先这样留证: mkdir C:\IR 2>nul certutil -hashfile C:\sample\sample.exe SHA256 > C:\IR\hash.txt netsh trace start capture=yes report=no persistent=no ^ maxsize=512 tracefile=C:\IR\sample.etl rem 启动样本并复现行为 netsh trace stop netsh trace convert input=C:\IR\sample.etl output=C:\IR\sample.txt 日志闭环方面,Sysmon 至少应覆盖进程创建、网络连接、DNS、文件落地、注册表持久化和模块加载,即事件 ID 1/3/7/11/13/22。复现后可按时间窗口导出,避免只截几张 Process Monitor 图: $start = (Get-Date).AddMinutes(-20) Get-WinEvent -FilterHashtable @{ LogName = 'Microsoft-Windows-Sysmon/Operational' StartTime = $start Id = @(1,3,7,11,13,22) } | Select-Object TimeCreated, Id, RecordId, Message | Export-Csv C:\IR\sysmon_timeline.csv -NoTypeInformation -Encoding UTF8 最终报告建议以“样本哈希 → 进程树 → 配置解密位置 → DNS/连接目标 → 落地与持久化 → 对应日志 RecordId/PCAP 时间戳”串起来。尤其注意统一虚拟机、抓包机和日志服务器的时区与时间,否则 C2 请求和进程事件经常会错位,闭环就很难复核。
创建帐户或登录后发表意见