跳转到帖子

逆向木马远控实战:从配置提取、持久化定位到 C2 留痕处置

精选回复

发布于

背景

在一次已授权的内网攻防复盘中,终端告警发现某办公主机持续向外部地址发起短连接。可疑进程伪装成系统更新组件,文件名为 WindowsUpdateService.exe,但不具备可信签名,父进程链也与正常更新流程不符。后续确认该样本属于 .NET 编写的远控木马,具备配置解密、注册表自启动、周期性心跳和远程命令执行能力。

本文以防守侧逆向和事件处置为目标,说明如何在隔离环境中还原木马配置、定位权限边界、核对日志留痕,并形成可执行的检测与修复方案。所有操作应限定在授权样本和隔离实验环境内。

问题定位

先不要直接双击样本。优先完成哈希、签名、文件类型和基础字符串检查,并保存原始时间戳。分析机建议使用无共享目录、无宿主机剪贴板、Host-only 网络的快照虚拟机;如需观察网络行为,可将流量导向 INetSim 或 FakeNet-NG,避免样本连接真实控制端。

mkdir C:\analysis\case01
copy D:\evidence\WindowsUpdateService.exe C:\analysis\case01\sample.bin

Get-FileHash C:\analysis\case01\sample.bin -Algorithm SHA256
Get-AuthenticodeSignature C:\analysis\case01\sample.bin | Format-List
Get-Item C:\analysis\case01\sample.bin | Select-Object Name,Length,CreationTimeUtc,LastWriteTimeUtc

# Sysinternals Sigcheck:查看签名、编译信息和哈希
sigcheck64.exe -accepteula -a -h -i C:\analysis\case01\sample.bin

# 提取 ASCII 与 Unicode 字符串
strings64.exe -accepteula -n 6 C:\analysis\case01\sample.bin > C:\analysis\case01\strings.txt
strings64.exe -accepteula -nobanner -u C:\analysis\case01\sample.bin >> C:\analysis\case01\strings.txt

本案样本的 PE 入口点位于 CLR 启动流程,导入表主要出现 mscoree.dll,说明应先按 .NET 程序处理。若是原生 PE,则可继续检查节区熵、TLS 回调、异常入口点和可疑导入函数。仅凭“高熵”不能直接判定恶意,它也可能来自压缩资源或合法保护壳。

技术分析

使用 dnSpyEx 或 ILSpy 打开样本后,入口函数只负责创建互斥体、解密资源并通过反射加载第二阶段程序集。配置数据存放在资源 cfg.dat 中,解密流程为 Base64 解码后执行 AES-CBC;密钥来自硬编码字符串的 SHA-256,IV 固定保存在静态字段。分析时应沿配置读取函数向上追踪调用者,而不是从大量混淆类名逐个阅读。

需要重点记录以下信息:

  • 控制端地址、端口、URI 路径和心跳周期。
  • 互斥体名称、安装目录、落地文件名和版本标识。
  • 自启动方式,包括 Run 键、计划任务、服务和 WMI 永久事件订阅。
  • 进程注入、凭据访问、屏幕采集等能力是否实际可达。
  • 配置是全局固定、按主机生成,还是从外部资源二次获取。

在本案中,解密后的配置包含两个备用域名、443 端口、30 秒心跳间隔,以及名为 UpdateHealthCheck 的计划任务。网络协议并非标准 HTTPS:样本虽然使用 443 端口,但首包是长度字段加自定义二进制数据。判断协议时应依据 TLS 握手和数据结构,不要仅依据端口。

动态验证步骤

动态分析前创建虚拟机快照,并启动 Procmon、Process Explorer、FakeNet-NG 和 Wireshark。Procmon 过滤条件可设置为 Process Name is WindowsUpdateService.exe,并额外关注 RegSetValue、CreateFile、CreateProcess 和 TCP Connect。若样本会复制后退出,还需按 Process Tree 追踪子进程,避免只盯住最初的文件名。

# 记录网络和进程事件,需要管理员权限
pktmon start --capture --comp nics --pkt-size 0 --file-name C:\analysis\case01\traffic.etl

# 执行样本仅限隔离虚拟机;启动前应建立快照并断开真实外网
Start-Process C:\analysis\case01\sample.bin
Start-Sleep -Seconds 90

pktmon stop
pktmon etl2pcap C:\analysis\case01\traffic.etl --out C:\analysis\case01\traffic.pcapng

# 检查常见持久化位置
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
schtasks /query /fo LIST /v
Get-CimInstance -Namespace root\subscription -ClassName __EventFilter
Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer
Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding

# 检查异常外连及对应进程
Get-NetTCPConnection | Where-Object State -eq Established |
  Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess
Get-Process -Id <PID> | Select-Object Id,Path,StartTime

调试时可在 CreateProcessW、RegSetValueExW、WinHttpConnect、InternetConnectW 和 connect 等 API 处设置断点。对于 .NET 样本,优先在配置解密方法、Assembly.Load、Process.Start 和注册表写入封装函数处设置托管断点。若存在环境探测,可记录判断条件后修改分支进行验证,但不要把补丁后的样本投入业务网络。

权限边界分析

该木马默认运行在当前用户权限下,写入 HKCU Run 键和用户目录不需要管理员权限。如果它尝试创建系统服务、写入 HKLM 或修改安全软件配置,则需要管理员令牌。分析报告中应明确区分“代码包含某能力”和“当前权限下已经成功执行”,否则容易高估影响范围。

可以结合进程令牌和对象访问结果确认权限:

whoami /user
whoami /groups
whoami /priv

# 查看样本目录 ACL,确认普通用户是否可写
icacls "C:\ProgramData\UpdateHealth"

# 查询计划任务主体与最高权限设置
schtasks /query /tn "UpdateHealthCheck" /xml

# 检查是否产生了新服务
Get-CimInstance Win32_Service |
  Where-Object PathName -match 'UpdateHealth|WindowsUpdateService' |
  Select-Object Name,StartName,State,PathName

如果样本从用户可写目录以高完整性启动,应继续调查提权来源,例如错误服务 ACL、可写服务路径、计划任务动作文件可替换,或者管理员主动输入凭据。不能仅因进程具有高权限就认定木马自带提权漏洞。

日志留痕与范围排查

Windows 默认日志未必足以还原完整链路。建议关联 EDR 遥测、Sysmon、DNS、代理、防火墙和域控日志。重点事件包括 Sysmon 1 进程创建、3 网络连接、7 镜像加载、11 文件创建、13 注册表值修改、22 DNS 查询,以及安全日志 4698 计划任务创建、7045 服务安装和 4688 进程创建。

# 导出最近 7 天计划任务创建和服务安装事件
$start = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4698; StartTime=$start} |
  Export-Csv C:\analysis\case01\event-4698.csv -NoTypeInformation
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045; StartTime=$start} |
  Export-Csv C:\analysis\case01\event-7045.csv -NoTypeInformation

# Sysmon 中按哈希、文件名和目标端口检索
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; StartTime=$start} |
  Where-Object Message -match 'WindowsUpdateService.exe|UpdateHealthCheck|DestinationPort: 443' |
  Select-Object TimeCreated,Id,Message |
  Export-Csv C:\analysis\case01\sysmon-hits.csv -NoTypeInformation

排查时不要只依赖文件哈希。攻击者重新编译或修改资源后,哈希会立即变化。更稳定的线索包括资源名称、配置字段结构、互斥体、计划任务名称、落地路径组合、非标准 TLS 行为和固定心跳间隔。

静态检测规则

下面的 YARA 规则用于内部样本库初筛,组合了 .NET 标识、资源名和配置相关字符串。字符串应根据实际逆向结果调整,并先在合法软件样本集上测试误报。

rule RAT_UpdateHealth_DotNet_Config
{
    meta:
        description = "Detects the analyzed .NET RAT family by stable implementation artifacts"
        scope = "internal defensive triage"
    strings:
        $dotnet = "BSJB" ascii
        $res1 = "cfg.dat" ascii wide
        $mutex = "UpdateHealth_Mutex_" ascii wide
        $task = "UpdateHealthCheck" ascii wide
        $crypto1 = "AesManaged" ascii wide
        $crypto2 = "CreateDecryptor" ascii wide
    condition:
        uint16(0) == 0x5a4d and
        $dotnet and $res1 and $task and
        1 of ($mutex, $crypto*)
}

规则命中只能作为待调查信号。生产环境部署前应验证性能和误报,并将命中结果与签名状态、父子进程关系、网络行为联合判断。

处置与修复建议

  • 先隔离受影响主机并保留内存、磁盘和日志证据,再终止进程和删除文件。直接清理会破坏控制端、注入目标和解密配置等关键线索。
  • 删除持久化项前导出注册表键、计划任务 XML 和服务配置;清理后重启并复查,不要只删除落地文件。
  • 封禁已确认的域名、IP、证书指纹和协议特征,同时回溯 DNS 与代理日志,识别其他周期性心跳主机。
  • 如果木马曾运行在用户会话中,应轮换该用户密码、浏览器会话令牌、VPN 凭据和本机保存的密钥。若出现高权限令牌或域管会话,应扩大到域级凭据处置。
  • 通过应用程序控制限制用户目录、临时目录和邮件下载目录中的未知程序执行;收紧可写服务目录和计划任务动作文件 ACL。
  • 启用 PowerShell 脚本块日志、4688 命令行记录及合理的 Sysmon 规则,并确保终端时间同步,便于跨数据源关联。
  • 对确认完全失陷、存在内核组件或无法证明清理完整性的终端,优先采用可信镜像重装,而不是长期依赖人工删除。

总结

远控木马分析的关键不是识别一个文件名,而是还原“入口文件、配置解密、持久化、权限变化、进程链、控制通信”这一完整链路。静态逆向负责提取稳定特征,动态分析用于验证真实行为,日志关联用于确定影响范围。最终报告应明确证据来源、成功与失败的行为、权限前提和处置验证结果,避免把未执行的代码能力直接等同于实际入侵影响。

逆向分析与样本观察示意图
逆向分析、样本行为与调试流程示意
网络流量与边界分析示意图
网络请求、日志与边界流量分析示意

这类样本建议把“配置提取、持久化、C2”串成同一条时间线,而不是分别看三个结果。尤其要保留配置字段在二进制中的偏移、解密算法和落地项创建时间,后续才能区分初始感染、远控上线和攻击者操作。

1. 配置提取先做静态定位,避免直接在办公网运行

优先搜索域名、URL、User-Agent、互斥体、注册表路径等宽字符串;如果静态内容被加密,再在隔离虚拟机中对常见解密 API、网络 API 下断点。提取结果最好同时记录文件偏移和虚拟地址,不能只留一份解密后的 JSON。

floss sample.exe > floss.txt
strings -a -n 6 sample.exe > ascii.txt
strings -a -e l -n 6 sample.exe > utf16.txt
capa sample.exe
diec sample.exe

若怀疑配置在资源段或 overlay,可先检查 PE 各节及文件尾部;运行时解密的样本,可以关注 CryptDecrypt、BCryptDecrypt、VirtualAlloc、WriteProcessMemory、WinHttpConnect 和 connect。在解密函数返回后 dump 缓冲区,通常比全内存扫字符串更容易复现。

2. 持久化不要只查 Run 键

远控常见落点还包括计划任务、服务、WMI 永久事件订阅、启动目录和用户级 COM 劫持。建议在隔离副本上一次性导出,避免边查边破坏时间戳:

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s
schtasks /query /fo LIST /v
sc query type= service state= all
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
dir "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup" /a

定位到可疑项后,重点核对命令行中的环境变量展开、引号错位、LOLBin 和伪装扩展名,例如 rundll32、regsvr32、mshta、powershell -enc。删除前先导出对应注册表项、任务 XML 或服务配置,并计算落地文件哈希。

schtasks /query /tn "\可疑任务名" /xml > task.xml
reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" run.reg /y
sc qc 可疑服务名 > service.txt
certutil -hashfile "C:\path\payload.exe" SHA256

3. C2 留痕要同时覆盖 DNS、代理和进程关联

只封 IP 容易漏掉动态域名或前置节点。建议从配置中拆出域名、端口、URI、证书特征和 User-Agent,再去查 Sysmon、DNS Client、代理、防火墙及 EDR 遥测。Windows 本机可先做以下快照:

netstat -abno > netstat.txt
tasklist /v > tasklist.txt
ipconfig /displaydns > dns-cache.txt
wevtutil epl Microsoft-Windows-Sysmon/Operational sysmon.evtx
wevtutil epl Microsoft-Windows-DNS-Client/Operational dns-client.evtx
wevtutil epl Microsoft-Windows-Windows Firewall With Advanced Security/Firewall firewall.evtx

关联时重点看 Sysmon 事件 1、3、11、13、22:进程创建、网络连接、文件落地、注册表修改和 DNS 查询。筛选逻辑应尽量使用“域名/URI + 发起进程 + 时间窗口”,不要把 CDN IP 直接当成高置信度 IOC。

4. 处置顺序

  1. 先从网络侧隔离主机,但保留电源和现场;
  2. 采集内存、活动连接、进程树和日志;
  3. 导出持久化配置及落地文件;
  4. 在 DNS、代理、EDR 中回溯同一 IOC,确认横向影响;
  5. 完成取证后再停服务、删任务和清文件;
  6. 若远控进程接触过浏览器、邮箱或凭据进程,应在可信设备上轮换相关凭据。

最后建议把配置解密脚本、持久化项、文件哈希、首次/末次通信时间和受影响主机整理成机器可读清单。这样后续复核时能判断是“样本仍在”还是“持久化已清但凭据和横向风险仍未闭环”。

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

最近浏览 0

  • 没有会员查看此页面。