跳转到帖子

逆向木马远控实战:从 Windows PE 样本拆解到 C2 留痕与处置

精选回复

发布于

背景

本文记录一次授权内网攻防演练中的 Windows 远控样本分析过程。终端告警显示某办公主机上的文档阅读器拉起了异常进程,随后出现周期性外联。分析目标不是单纯给样本贴标签,而是回答四个问题:样本如何启动、如何持久化、如何与 C2 通信、现有日志能否还原完整链路。

所有样本操作应在隔离虚拟机中进行,关闭共享目录、剪贴板和宿主机凭据继承。动态分析网络建议使用 Host-Only 配合 FakeNet-NG 或 INetSim,不要直接放行互联网。

问题定位与证据保全

现场主机首先保全原始文件、父子进程、网络连接和持久化位置。不要直接双击样本,也不要在采集前执行清理工具,否则容易破坏时间线。

# 计算样本哈希并记录签名信息
Get-FileHash .\update_service.exe -Algorithm SHA256
Get-AuthenticodeSignature .\update_service.exe | Format-List *

# 收集进程、网络与常见持久化项
Get-CimInstance Win32_Process |
  Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine

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

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
schtasks /query /fo LIST /v

# 推荐在分析机中执行的静态检查
sigcheck64.exe -nobanner -a -h update_service.exe
capa.exe update_service.exe
floss.exe -n 6 update_service.exe > floss.txt

本次样本 SHA-256 应作为案件内部标识保存,但不应只依赖哈希封禁。远控样本常通过重新编译、修改资源或附加数据改变哈希,行为与协议特征更适合长期检测。

静态逆向分析

使用 Detect It Easy、PE-bear 和 Ghidra 检查后,样本表现为 64 位 PE,未带可信数字签名。入口点位于高熵代码节,导入表较少,但字符串中存在 WinHTTP、注册表路径和互斥体名称。该组合提示样本可能使用运行时 API 解析或经过简单壳处理。

  • 节区:新增的 .datax 节熵值接近 7.8,且同时具备可写、可执行属性,需要重点检查。
  • 导入函数:VirtualAlloc、VirtualProtect、LoadLibraryW、GetProcAddress、WinHttpOpen、WinHttpSendRequest。
  • 持久化字符串:Software\Microsoft\Windows\CurrentVersion\Run。
  • 主机标识:ComputerName、UserName、MachineGuid 等字符串被交叉引用到同一初始化函数。
  • 反分析迹象:检查 IsDebuggerPresent,并根据 GetTickCount64 的时间差决定是否继续执行。

在 Ghidra 中从 WinHttpSendRequest 的交叉引用反向追踪,可以找到通信封装函数。其上层逻辑先拼接主机信息,再加入 4 字节长度字段,最后进行异或循环和 Base64 编码。伪代码关系如下:

collect_host_info()
  -> build_tlv_record()
  -> xor_buffer(config_key)
  -> base64_encode()
  -> http_post("/api/v1/sync")

这里需要区分“可疑 API”与“恶意行为”。单独出现 WinHTTP 或 VirtualAlloc 并不能定性;当它们与隐藏启动、持久化、主机信息收集、固定周期外联共同出现时,证据链才成立。

配置定位与协议还原

样本的配置块位于高熵节尾部,前 4 字节为标记 43 46 47 31,即 ASCII 的 CFG1,后跟配置长度。通过交叉引用标记字符串,可定位解码函数。解码后的字段包括备用域名、URI、休眠时间、抖动比例和互斥体名称。

  • C2 示例:sync-gateway.example,文中域名仅用于说明。
  • 备用地址:198.51.100.27,属于文档保留地址。
  • URI:/api/v1/sync。
  • User-Agent:固定为较旧的浏览器版本,与系统实际浏览器不一致。
  • 心跳:基础间隔 60 秒,存在约 20% 抖动。

分析协议时应同时保存 FakeNet-NG 日志和 PCAP。判断周期性时不要只看相邻两个连接,建议至少观察十个心跳,并计算间隔分布。固定 URI、异常 User-Agent、近似周期连接和小体积 POST 请求组合起来,通常比单一域名更稳定。

动态分析操作步骤

恢复虚拟机快照后,先启动 Procmon、Process Explorer、Wireshark 和 FakeNet-NG,再通过受控调试器启动样本。Procmon 可过滤样本进程名,同时保留 Process Create、RegSetValue、CreateFile 和 TCP Connect 类事件。

在 x64dbg 中可对以下 API 设置断点,以观察明文配置和通信参数,而不需要完整脱壳:

bp kernel32!VirtualProtect
bp advapi32!RegSetValueExW
bp winhttp!WinHttpConnect
bp winhttp!WinHttpOpenRequest
bp winhttp!WinHttpSendRequest
bp winhttp!WinHttpReceiveResponse

命中 WinHttpOpenRequest 后,检查方法、URI 和请求句柄;命中 WinHttpSendRequest 后,记录附加头、缓冲区地址和长度。对 x64 调用约定,前四个整数或指针参数通常位于 RCX、RDX、R8、R9,其余参数位于栈中。记录完参数后继续执行,由 FakeNet-NG 返回受控响应。

本次动态行为链为:文档阅读器启动临时目录中的 update_service.exe;样本复制自身到用户 AppData;写入 HKCU Run 项;创建互斥体避免重复运行;收集主机信息;向固定 URI 发起周期性 POST。未观察到内核驱动安装,也未发现跨用户写入 HKLM 的行为,因此其持久化权限边界主要位于当前用户。

日志留痕与时间线还原

如果终端已部署 Sysmon,优先关联事件 1、3、11、13 和 22,分别对应进程创建、网络连接、文件创建、注册表值设置和 DNS 查询。时间窗口应从首次告警向前扩展至少 30 分钟,以寻找投递来源。

# 查询最近两小时与样本、持久化和外联相关的 Sysmon 事件
$start = (Get-Date).AddHours(-2)
Get-WinEvent -FilterHashtable @{
  LogName='Microsoft-Windows-Sysmon/Operational'
  StartTime=$start
  Id=1,3,11,13,22
} | Where-Object {
  $_.Message -match 'update_service.exe|CurrentVersion\\Run|sync-gateway'
} | Select-Object TimeCreated,Id,Message

# 检查 Prefetch 与用户启动目录
Get-ChildItem C:\Windows\Prefetch\*UPDATE_SERVICE* -ErrorAction SilentlyContinue
Get-ChildItem "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" -Force

若没有 Sysmon,可补充检查 Windows Defender Operational、PowerShell 日志、任务计划日志、DNS 客户端日志、代理服务器日志以及出口防火墙会话。仅依靠 netstat 很难还原已结束的短连接。

检测规则示例

下面的 YARA 规则用于样本族初筛,选择了配置标记、URI、互斥体和持久化字符串。上线前应在正常软件样本集中测试,避免把单个通用 API 当作强特征。

rule Win_RAT_CFG1_Family_Triage
{
    meta:
        description = "授权分析中发现的远控样本族初筛规则"
        purpose = "defensive triage"

    strings:
        $mz = { 4D 5A }
        $cfg = "CFG1" ascii
        $uri = "/api/v1/sync" ascii
        $run = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide ascii
        $mutex = "Global\\UpdateService_" wide ascii

    condition:
        $mz at 0 and filesize < 8MB and
        $cfg and $uri and ($run or $mutex)
}

网络侧可围绕固定 URI、User-Agent 与周期特征建立检测,但不建议只封禁示例域名。攻击者修改域名的成本很低,而请求路径、流量尺寸、周期分布和终端进程上下文组合后更难同时伪装。

风险判断

  • 当前用户权限并不代表低风险。样本仍可读取浏览器数据、用户文档、部分开发凭据和当前用户可访问的共享目录。
  • 如果被控用户拥有远程管理、代码仓库或云平台权限,远控可借助合法凭据继续横向移动。
  • 发现远控后不应立即只结束进程。先保存内存、网络连接和持久化证据,否则可能丢失解密后的配置和后续任务记录。
  • 若发现 LSASS 访问、浏览器凭据读取或远程登录痕迹,应按凭据已泄露处理,而不是仅重装单台终端。

修复与加固建议

  • 隔离主机后删除持久化项和落地文件,并使用已知可信介质重建系统;高价值终端不建议仅做文件级清理。
  • 轮换该用户在域、VPN、代码仓库、云平台和浏览器中使用过的凭据,同时撤销现有会话令牌。
  • 通过应用控制限制用户目录、临时目录和邮件缓存目录中的可执行文件启动。
  • 为 Sysmon 或 EDR 开启进程命令行、文件创建、注册表修改、DNS 与网络连接采集,并统一校时。
  • 代理和防火墙侧关联终端身份、进程信息与请求特征,保留足够长的 DNS、HTTP 和 TLS 元数据。
  • 复盘初始投递路径,检查文档阅读器、压缩软件或脚本解释器是否存在可利用漏洞,并完成补丁验证。

总结

远控样本逆向的关键不是找到几个可疑字符串,而是把静态结构、动态行为、通信协议和日志时间线串成闭环。本次样本通过当前用户 Run 项持久化,使用固定 URI 进行周期性通信,并在配置块中保存 C2 参数。最终处置应同时覆盖样本清除、凭据轮换、入口修复和行为检测,否则只封禁哈希或域名很容易遗漏同族变种。

逆向分析与样本观察示意图
逆向分析、样本行为与调试流程示意
服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意

这类样本分析里,建议重点补上“进程—网络—持久化”的时间线关联。只提取 PE 字符串或 C2 域名,处置时容易漏掉同进程释放的二阶段载荷和备用地址。

样本先在断网快照环境中做静态分诊,避免直接双击。可先检查签名、节区熵、导入表和 TLS Callback:

Get-FileHash .\sample.exe -Algorithm SHA256
Get-AuthenticodeSignature .\sample.exe | Format-List *

sigcheck64.exe -a -h -i .\sample.exe
diec.exe .\sample.exe
capa.exe .\sample.exe
strings64.exe -n 6 .\sample.exe > strings.txt

如果节区名异常、熵接近 7.5~8,且导入函数很少,不要直接断定行为简单,通常要继续看运行时解包。动态阶段可以用 Procmon 配合 Sysmon,重点记录进程创建、网络连接、DNS、文件落地和注册表持久化。Sysmon 至少开启 Event ID 1、3、11、12/13、22,并保留 ProcessGuid,后续比 PID 更可靠。

C2 留痕建议不要只记 IP。应同时提取域名、URI、Host、User-Agent、DNS 查询、TLS SNI、证书 SHA-256、JA3/JA4,以及固定长度或固定间隔的心跳特征。实验网络可用 FakeNet-NG 或 INetSim 接管解析,再通过 Wireshark 过滤样本进程相关通信:

dns
http.request
tls.handshake.extensions_server_name
tcp.flags.syn == 1 && tcp.flags.ack == 0

Windows 端回溯时,可先查 DNS 缓存、现存连接、计划任务、服务和常见自启动项:

Get-NetTCPConnection |
  Sort-Object State,RemoteAddress |
  Format-Table LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess

Get-CimInstance Win32_Process |
  Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine

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"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"

处置顺序也很关键:先从交换机、EDR 或防火墙侧隔离主机,再采集内存、网络连接、进程树和落地文件,最后终止进程、删除持久化并封禁 IOC。不要一开始就关机或删文件,否则内存中的解密配置、注入代码和 C2 会话会丢失。若发现凭据窃取或 LSASS 访问迹象,应从可信设备轮换账号和令牌;仅重装感染主机不足以闭环。

最终 IOC 最好区分为两类:文件哈希、固定路径等精确 IOC 用于确认感染;域名注册特征、证书复用、URI 结构、心跳周期等行为 IOC 用于发现变种。封禁前还要核实共享 CDN、云主机和正常签名程序被注入的情况,避免仅按 IP 扩大误杀。

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

最近浏览 0

  • 没有会员查看此页面。