跳转到帖子

逆向木马远控实战:Windows 内网样本拆解、C2 定位与日志闭环

精选回复

发布于

背景

一次授权内网演练结束后,终端告警显示某办公主机上的 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 通信、实际权限和日志证据”串成闭环。静态逆向负责缩小范围,受控动态分析负责确认真实行为,主机与网络日志则用于判断影响面。最终产物至少应包含样本哈希、时间线、权限边界、稳定检测特征、处置记录和复查结果,才能支持后续封堵与修复。

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

这类样本拆解里,建议不要只盯着字符串中的域名/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 请求和进程事件经常会错位,闭环就很难复核。

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

最近浏览 0

  • 没有会员查看此页面。