跳转到帖子

逆向木马远控样本分析:从持久化、通信心跳到内网横向的授权排查方法

精选回复

发布于

本文以授权渗透测试和企业内网应急分析为前提,讨论一类常见 Windows 远控木马的逆向与排查流程。重点不在于编写或改造木马,而是通过静态特征、进程行为、网络心跳和 Windows 日志,确认样本是否具备远程控制能力、建立了哪些权限边界,以及如何完成清理和复盘。

一、场景与分析目标

典型场景是:一台办公终端出现异常外连,用户反馈系统间歇性卡顿;EDR 只显示一个位于用户目录下的可疑可执行文件,进程名称伪装成常见软件。授权测试人员已经获得样本和隔离环境,需要回答以下问题:

  • 样本是否具备持久化能力,使用了启动项、计划任务、服务还是 WMI 事件订阅。
  • 进程是否具有远控特征,例如周期性心跳、命令执行、文件上传下载、屏幕或键盘采集。
  • 样本以哪个账户运行,是否发生过提权或访问其他主机。
  • 删除样本后是否仍有残留机制,能否通过日志和网络侧还原攻击链路。

样本分析应在断网快照虚拟机中完成。动态分析前记录样本 SHA-256、操作系统版本、快照时间和测试账户,避免把真实企业凭据或生产数据带入环境。

二、静态分析:先确认文件和加载链路

第一步不是直接运行样本,而是确认文件类型、签名、编译时间、导入表和资源。时间戳只能作为弱特征,不能单独用于判断恶意性。重点关注以下指标:

  • 导入了 WinInet、WinHttp、WS2_32、Crypt32、Advapi32 等网络、加密和注册表相关 API。
  • 出现 CreateProcess、ShellExecute、WriteProcessMemory、VirtualAlloc、SetWindowsHookEx 等高风险调用组合。
  • 存在 URL、域名、路径、互斥体名称、命令字、配置分隔符或疑似加密配置。
  • PE 节区熵异常、入口点位于非标准节区、导入表很小但运行时大量解析 API,说明可能存在壳或运行时解密。

在分析机上可以先进行不执行的基础采集:

Get-FileHash .\sample.exe -Algorithm SHA256
Get-AuthenticodeSignature .\sample.exe | Format-List
sigcheck64.exe -accepteula -nobanner -h -i -m .\sample.exe
strings64.exe -n 6 .\sample.exe > .\sample_strings.txt
rabin2 -I .\sample.exe
rabin2 -i .\sample.exe
rabin2 -zz .\sample.exe

如果样本是 .NET 程序,可使用 dnSpyEx 或 ILSpy 检查入口函数、配置类和网络请求封装;原生 PE 则使用 Ghidra、IDA 或 Binary Ninja 定位 WinHttpOpenRequest、InternetConnect、connect、WSARecv 等调用点,再向上追踪参数来源。分析时特别注意 URL、端口、User-Agent、请求头、加密密钥和命令分发函数之间的关系。

三、持久化定位:区分启动项、计划任务和服务

远控木马常把持久化与主体程序分离。例如启动项只负责加载一个位于用户目录的 DLL,计划任务则通过 rundll32.exe 或 PowerShell 启动实际载荷。排查时应同时检查注册表、任务计划、服务和 WMI,而不是只删除可疑 EXE。

reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run
schtasks /query /fo LIST /v
sc.exe query type= service state= all
Get-CimInstance Win32_StartupCommand | Select-Object Name,Command,Location,User
Get-CimInstance Win32_Service | Select-Object Name,State,StartMode,StartName,PathName
Get-CimInstance -Namespace root\subscription -ClassName __EventFilter
Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer
Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding

重点核对路径是否位于 %AppData%、%Temp%、Public、用户下载目录或回收站;服务的 ImagePath 是否包含引号缺失、参数拼接、PowerShell 编码命令;计划任务创建者、最近运行时间和触发器是否与业务不符。对于 WMI 事件订阅,要同时导出过滤器、消费者和绑定关系,三者缺一不可。

四、动态分析:观察远控行为而不是只看进程名

在隔离网络中运行样本前,先启动 Procmon、Wireshark、TCPView 或 Sysmon 采集。建议设置基线快照,记录系统原有进程、服务、计划任务和网络连接。动态分析应覆盖启动、空闲、用户交互和进程退出四个阶段。

  • 进程行为:观察是否创建子进程,尤其是 cmd.exe、powershell.exe、rundll32.exe、regsvr32.exe 和系统管理工具。
  • 文件行为:关注临时 DLL、脚本、压缩包、键盘记录文件和带随机名称的配置文件。
  • 注册表行为:重点看 Run 键、服务注册表、代理配置、Windows Defender 排除项和防火墙规则。
  • 网络行为:记录 DNS、首次连接时间、目标 IP、端口、TLS 证书、SNI、HTTP 方法、请求间隔和断线重连规律。
  • 权限行为:确认进程令牌、完整性级别、会话 ID、是否访问其他用户目录或尝试打开高权限进程。

远控样本通常存在周期性心跳。比如每 60 秒向固定域名发送一段长度相近的请求,收到响应后才创建命令执行子进程。单凭固定端口不能定性,但“固定间隔 + 异常 User-Agent + 非浏览器父进程 + 注册表持久化”组合起来就具有较高排查价值。

Get-Process | Sort-Object StartTime | Select-Object Id,ProcessName,Path,StartTime
Get-NetTCPConnection -State Established,TimeWait | Sort-Object OwningProcess | Format-Table
Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=1,3,11,13,22} -MaxEvents 200 | Format-List
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688,4698,7045} -MaxEvents 200 | Format-List

如果使用 Sysmon,至少应启用进程创建、网络连接、文件创建、注册表修改、DNS 查询和进程访问事件。事件 1 可还原父子进程关系,事件 3 可关联外连目标,事件 13 能发现 Run 键修改,事件 22 可辅助定位异常 DNS。没有 Sysmon 时,也应启用 Security 4688、4698 和 PowerShell 4104,并确保命令行审计已经打开。

五、从逆向结果判断命令分发与通信协议

在反汇编中,建议以网络 API 为入口向上回溯,而不是从入口点逐行阅读。常见逻辑可以抽象为:读取配置 → 创建互斥体 → 解析域名 → 建立连接 → 发送主机信息 → 接收任务 → 分发到命令执行、文件操作或信息收集模块。

分析响应数据时,关注长度字段、魔数、序列号、压缩标记和命令类型字段。若通信使用 HTTPS,不能仅依赖明文内容判断,应结合进程、SNI、证书、连接周期和代理日志。对加密配置,可以在调试器中对 CryptDecrypt、BCryptDecrypt 或自定义异或循环设置断点,在解密结果写入内存后导出配置;这比试图猜测密钥更可靠。

对疑似命令执行功能,应在无敏感数据的测试机上记录输入、父进程、工作目录和输出位置,不要把生产凭据复制到样本可访问的目录。重点确认是否支持命令执行、文件上传下载、进程枚举、屏幕截图、键盘记录或代理转发,并将每项能力映射到实际权限边界。

六、日志关联:还原从落地到内网访问的链路

单台终端的进程日志往往不足以判断影响范围,需要把端点、DNS、代理、防火墙、认证和文件共享日志按时间线关联。建议使用样本首次出现时间作为起点,向前后各扩展一小时,形成以下时间线:

  • 邮件、浏览器下载或办公文档是否产生了初始落地文件。
  • 首次执行对应的用户、父进程和命令行参数是什么。
  • 持久化创建时间与首次外连时间是否一致。
  • 外连目标是否解析到多个 IP,其他终端是否访问过相同域名或 JA3/证书。
  • 该账户是否在短时间内访问 ADMIN$、IPC$、RDP、WinRM 或 LDAP。
  • 是否出现 4624、4625、4648、4672、4688、4698、7045 等认证、提权、进程和服务事件。

如果发现样本以普通域用户运行,但随后出现高权限服务创建或远程登录,应将“木马能力”和“账户权限滥用”分开分析。前者说明端点被控,后者说明权限边界或凭据管理存在额外问题,不能仅靠删除样本解决。

七、检测规则示例

下面的 YARA 规则仅用于在授权环境中发现同源样本,字符串应根据实际逆向结果替换,避免把过于宽泛的系统 API 作为唯一条件:

rule Suspicious_Remote_Control_Sample_Generic
{
    meta:
        description = "Detects a suspicious remote-control sample by combined behavior strings"
        author = "internal"
        confidence = "medium"

    strings:
        $mutex = "Global\\" ascii wide
        $cmd1 = "cmd.exe" ascii wide nocase
        $cmd2 = "powershell.exe" ascii wide nocase
        $net1 = "User-Agent" ascii wide nocase
        $net2 = "Content-Type" ascii wide nocase
        $api1 = "WinHttpOpenRequest" ascii
        $api2 = "CreateProcessW" ascii

    condition:
        uint16(0) == 0x5A4D and
        3 of ($mutex, $cmd1, $cmd2, $net1, $net2, $api1, $api2)
}

生产环境中建议将 YARA、EDR 行为规则和代理侧 IOC 联合使用。若只用文件哈希,攻击者重新编译或修改一字节即可绕过;若只用字符串,也可能误报正常管理工具。更稳妥的条件是“异常路径 + 持久化行为 + 非浏览器进程外连 + 可疑子进程”组合。

八、清理与修复建议

  1. 先隔离主机并保留内存、磁盘和关键日志证据,再终止进程。不要一开始就删除样本,否则可能丢失命令行、网络连接和解密后的配置。
  2. 禁用并删除确认过的计划任务、服务、启动项和 WMI 订阅,清理对应文件和临时目录;删除前保存注册表项、任务 XML 和服务配置。
  3. 对运行账户、近期登录账户和可能暴露的本地凭据执行凭据轮换,优先处理域管理员、服务器管理员和服务账户。
  4. 检查同一 IOC 在其他主机上的进程、DNS、代理和认证记录,不能把单台主机的清理结果当作事件闭环。
  5. 启用 Sysmon 或等效 EDR telemetry,开启进程命令行审计、PowerShell Script Block Logging,并限制普通用户创建服务、修改防火墙和写入高风险启动位置。
  6. 对出站流量实施应用和身份感知控制,办公终端不应默认允许任意程序直接访问互联网;同时保留 DNS、代理和 TLS 元数据,便于后续时间线分析。

九、总结

逆向木马远控分析的核心不是识别一个“可疑文件名”,而是把静态代码、运行时行为、持久化位置、通信心跳和权限使用串成可验证链路。实践中应优先回答“谁启动了它、它以谁的权限运行、它向哪里通信、它是否留下持久化、它是否访问了其他主机”五个问题。只有完成端点清理、凭据处置、横向排查和检测补强,样本分析才真正转化为可执行的防护改进。

逆向分析与样本观察示意图
逆向分析、样本行为与调试流程示意
补充一个实战里比较容易漏的点:做这类远控样本排查时,不要只盯进程名和自启动项,建议把“持久化点 → 心跳通信 → 横向痕迹”串起来做时间线,否则很容易清掉一个 loader,后面又被计划任务或 WMI 拉起来。 可以按下面几个方向补充验证: 1. 持久化排查建议覆盖这些位置
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce"
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce"

schtasks /query /fo LIST /v

wmic startup get Caption,Command,Location,User
wmic service get Name,DisplayName,PathName,StartMode,State
wmic /namespace:\\root\subscription PATH __EventFilter get Name,Query
wmic /namespace:\\root\subscription PATH CommandLineEventConsumer get Name,CommandLineTemplate
wmic /namespace:\\root\subscription PATH __FilterToConsumerBinding get Filter,Consumer
远控样本常见做法是服务名伪装成系统组件,比如 `Windows Update Service`、`Microsoft Security Update`,但 `PathName` 指到用户目录、`ProgramData`、`Temp`、`Public` 下面,这类优先看。 2. 心跳通信不要只看当前连接 如果样本心跳间隔较长,`netstat` 可能抓不到。建议结合 DNS 缓存、PowerShell 日志、Sysmon 或防火墙日志看。
ipconfig /displaydns

netstat -ano | findstr ESTABLISHED

Get-NetTCPConnection | Sort-Object -Property State,RemoteAddress |
  Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess

Get-Process -Id <PID> | Format-List Path,StartTime,CommandLine
如果环境里有 Sysmon,重点看: - Event ID 1:进程创建 - Event ID 3:网络连接 - Event ID 7:可疑 DLL 加载 - Event ID 11:文件创建 - Event ID 13:注册表修改 - Event ID 22:DNS 查询 例如查某个可疑进程的网络行为:
Get-WinEvent -FilterHashtable @{LogName="Microsoft-Windows-Sysmon/Operational"; Id=3} |
  Where-Object {$_.Properties[4].Value -like "*suspicious_process.exe*"} |
  Select-Object TimeCreated, Message
3. 横向移动建议重点看登录类型和远程执行痕迹 如果样本具备内网横向能力,Windows 事件日志里通常会留下比较明显的链路。 重点事件: - 4624:登录成功 - LogonType 3:网络登录,常见 SMB/WMI - LogonType 10:RDP - 4625:登录失败,爆破或密码喷洒 - 4672:特殊权限登录 - 4688:进程创建,需开启命令行审计 - 7045:新服务安装,常见 PsExec 类行为 - 4698:计划任务创建 可用下面命令先拉近 24 小时异常登录:
Get-WinEvent -FilterHashtable @{
  LogName='Security';
  Id=4624;
  StartTime=(Get-Date).AddDays(-1)
} | Where-Object {
  $_.Properties[8].Value -in 3,10
} | Select-Object TimeCreated, Message
查看新建服务:
Get-WinEvent -FilterHashtable @{
  LogName='System';
  Id=7045;
  StartTime=(Get-Date).AddDays(-7)
} | Select-Object TimeCreated, Message
如果发现服务名随机、路径在 `ADMIN$`、`C:\Windows\Temp`、`C:\ProgramData`,或者命令行里有 `cmd /c`、`powershell -enc`、`rundll32`,基本就要按横向处理了。 4. 内存和落地文件都要取证 有些远控只落一个很小的启动器,真正 payload 在内存里。授权排查时建议先保全再清理:
tasklist /v
wmic process get ProcessId,ParentProcessId,ExecutablePath,CommandLine

procdump -ma <PID> suspicious.dmp
certutil -hashfile suspicious.exe SHA256
如果样本疑似注入到正常进程,比如 `explorer.exe`、`svchost.exe`、`rundll32.exe`,可以重点看父进程、启动时间、加载模块和异常网络连接是否匹配。 5. 清理时注意账号和凭据 远控样本如果已经横向,单纯删文件意义不大。建议同步做: - 禁用可疑新增账号 - 重置被盗用账号密码 - 清理本机缓存凭据 - 检查本地管理员组、远程桌面用户组 - 检查域控上的异常登录和委派配置 命令示例:
net user
net localgroup administrators
net localgroup "Remote Desktop Users"

cmdkey /list
cmdkey /delete:<target>
整体建议是先把 IOC 提取出来:文件 hash、C2 域名/IP、互斥体、注册表路径、计划任务名、服务名、User-Agent、心跳 URI。然后在全网 EDR/SIEM/日志里反查,确认是否只有单点感染,还是已经有横向扩散。清理顺序也尽量按“断网隔离 → 取证 → 全网检索 → 凭据处置 → 清理持久化 → 复测心跳”来做,避免边清边被重新拉起。
可以再补一条:这类远控如果已经进入“心跳 + 横向”阶段,单机排查最好同时拉几类 Windows 日志,不然时间线容易断。 我一般会先按可疑持久化点的时间往前后各放宽 30~60 分钟,重点看这些事件: - 计划任务:`Microsoft-Windows-TaskScheduler/Operational` - `106` 创建任务 - `140` 更新任务 - `200/201` 任务启动/完成 - 服务安装: - System 日志 `7045` - 远程登录: - Security `4624`,重点看 `LogonType=3/10` - `4627/4672` 看是否高权限账户参与 - 凭据使用: - `4648` 显式凭据登录 - 远程创建进程: - 如果开了 Sysmon,看 `Event ID 1` - WMI 横向重点看 `WmiPrvSE.exe` 派生的进程 - PsExec 类重点看服务名、`PSEXESVC` 或随机服务名 可以用 PowerShell 先把关键事件拉出来,按时间排序对齐:
$start = (Get-Date).AddDays(-3)

Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4624,4648,4672
    StartTime=$start
} | Select-Object TimeCreated, Id, ProviderName, Message |
Sort-Object TimeCreated

Get-WinEvent -FilterHashtable @{
    LogName='System'
    Id=7045
    StartTime=$start
} | Select-Object TimeCreated, Id, Message |
Sort-Object TimeCreated

Get-WinEvent -LogName 'Microsoft-Windows-TaskScheduler/Operational' |
Where-Object {
    $_.TimeCreated -ge $start -and $_.Id -in 106,140,200,201
} | Select-Object TimeCreated, Id, Message |
Sort-Object TimeCreated
另外,横向排查时不要只在失陷主机上看,建议反向查“它访问过谁”。可以在域控或日志平台里按源 IP / 源主机名查: - 同一账号短时间内登录多台机器 - 登录类型为 `3`,目标集中在服务器段 - `4648` 中出现异常目标主机 - 非运维时间段出现远程服务安装 `7045` - 多台主机同时出现同名计划任务或同路径落地文件 如果环境有 Sysmon,建议重点检索这些父子进程关系:
ParentImage endswith '\wmiprvse.exe'
ParentImage endswith '\services.exe'
ParentImage endswith '\svchost.exe'
ParentImage endswith '\taskeng.exe'
ParentImage endswith '\taskhostw.exe'

Image contains '\cmd.exe'
Image contains '\powershell.exe'
Image contains '\rundll32.exe'
Image contains '\regsvr32.exe'
Image contains '\mshta.exe'
Image contains '\certutil.exe'
样本通信心跳这块,除了看 C2 域名/IP,也建议把“固定间隔外联”单独拎出来。很多远控心跳包内容不明显,但时间规律很稳定。可以用防火墙、代理、EDR 网络日志按五元组聚合,看是否存在 30 秒、60 秒、300 秒这类稳定周期外联。 最后处置顺序建议是: 1. 先隔离主机或阻断 C2,不要直接删文件; 2. 导出任务、服务、RunKey、WMI 订阅、网络连接、最近登录日志; 3. 找到同时间线上的横向目标; 4. 统一清理持久化点; 5. 重置相关账号密码,尤其是出现过 `4648` 或 `4672` 的账号; 6. 再恢复网络观察是否还有心跳重连。 不然只清本机 loader,确实很容易被另一台内网主机或者域账号再次拉起来。

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。