跳转到帖子

逆向木马远控实战:从可疑 PE、内存注入到 C2 回连的完整排查链路

精选回复

发布于

背景

在一次已授权的内网攻防复盘中,终端告警显示某办公主机通过 HTTPS 周期性访问一个无业务关联的外部地址。代理日志只能确认连接由 rundll32.exe 发起,无法判断这是正常组件调用、渗透测试植入物,还是已经失控的第三方木马。

这类场景不能只依赖文件哈希或杀毒软件结论。远控木马常见的规避方式包括:使用系统进程承载、配置加密、动态解析 API、进程注入、短周期心跳和注册表持久化。排查时应把磁盘样本、进程内存、网络流量和主机日志放在同一时间线上分析。

以下步骤仅用于已授权环境中的样本分析与事件响应。动态分析应在隔离虚拟机中进行,禁止让未知样本直接访问互联网。

问题定位与证据保全

首先记录告警时间、主机名、登录用户、源进程、目标地址和端口,不要立即删除文件或结束进程。直接处置可能破坏内存配置、注入载荷和父子进程关系。

Windows 主机可以先收集进程、网络、签名及哈希信息:

$case = "C:\IR\case-2025-01"
New-Item -ItemType Directory -Force $case | Out-Null

Get-Date | Out-File "$case\collection-time.txt"
Get-CimInstance Win32_Process |
  Select-Object ProcessId, ParentProcessId, Name, ExecutablePath, CommandLine |
  Export-Csv "$case\process.csv" -NoTypeInformation -Encoding UTF8

Get-NetTCPConnection |
  Select-Object CreationTime, State, LocalAddress, LocalPort,
                RemoteAddress, RemotePort, OwningProcess |
  Export-Csv "$case\tcp.csv" -NoTypeInformation -Encoding UTF8

Get-FileHash "C:\Path\suspect.exe" -Algorithm SHA256 |
  Format-List | Out-File "$case\hash.txt"
Get-AuthenticodeSignature "C:\Path\suspect.exe" |
  Format-List * | Out-File "$case\signature.txt"

wevtutil epl Microsoft-Windows-Sysmon/Operational "$case\sysmon.evtx"
wevtutil epl Security "$case\security.evtx"

若主机仍在通信,应优先通过交换机、EDR 或主机防火墙实施定向隔离,而不是直接关机。涉及内存注入时,可使用组织批准的取证工具采集内存;采集文件应计算 SHA-256,并记录采集人、时间、工具版本和原始存储位置。

静态逆向:判断样本能力与配置位置

静态分析的目标不是完整还原所有代码,而是快速回答四个问题:样本如何启动、如何持久化、连接哪里、执行了什么能力。

  • 检查 PE 编译时间、节区名称、节区熵和导入表。高熵且原始大小明显异常的节区通常需要进一步确认是否压缩或加密。
  • 检查数字签名及证书链。文件存在签名不等于可信,应同时确认签名状态、证书主体和时间戳。
  • 搜索 URL、域名、User-Agent、互斥体、注册表路径、计划任务名称和服务名称。
  • 关注 VirtualAlloc、VirtualProtect、WriteProcessMemory、CreateRemoteThread、NtMapViewOfSection、WinHttpSendRequest 等 API,但不能仅凭单个 API 定性。

下面的脚本只读取 PE 元数据并计算节区熵,不执行样本,可用于批量初筛:

import math
import sys
from collections import Counter
import pefile

path = sys.argv[1]
pe = pefile.PE(path, fast_load=False)

def entropy(data):
    if not data:
        return 0.0
    count = Counter(data)
    size = len(data)
    return -sum((n / size) * math.log2(n / size) for n in count.values())

print("Machine:", hex(pe.FILE_HEADER.Machine))
print("Timestamp:", pe.FILE_HEADER.TimeDateStamp)
print("EntryPoint:", hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint))

for section in pe.sections:
    name = section.Name.rstrip(b"\x00").decode(errors="replace")
    data = section.get_data()
    print(name,
          "VA=", hex(section.VirtualAddress),
          "Raw=", section.SizeOfRawData,
          "Virtual=", section.Misc_VirtualSize,
          "Entropy=", round(entropy(data), 3))

if hasattr(pe, "DIRECTORY_ENTRY_IMPORT"):
    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        dll = entry.dll.decode(errors="replace")
        names = []
        for item in entry.imports:
            names.append(item.name.decode(errors="replace") if item.name else str(item.ordinal))
        print(dll, ",".join(names))

经验上,熵接近 8、导入表极少且入口点落在可写可执行节区,只能说明样本可能经过封装,不能单独作为木马结论。下一步应在反汇编器中跟踪入口点、解密循环和间接调用,确认解包后代码的实际行为。

动态分析:观察持久化、注入与远控行为

动态分析环境建议使用无敏感数据的 Windows 虚拟机、仅主机网络、模拟 DNS/HTTP 服务和可回滚快照。启动前开启 Process Monitor、Process Explorer、Wireshark,以及具备进程创建和网络连接记录能力的 Sysmon。

重点观察以下行为:

方向关键证据常见误判
持久化Run 键、服务、计划任务、WMI 永久订阅、启动目录软件更新器和企业运维代理
进程注入跨进程句柄、远程线程、异常可执行私有内存、映像路径缺失安全软件、输入法和辅助功能组件
凭据访问访问 LSASS、读取浏览器凭据数据库、调用 Vault APIEDR 和经过批准的密码管理工具
C2 通信固定间隔、低数据量、异常 SNI、域名前置特征、证书复用监控心跳、消息客户端和资产管理程序

如果 rundll32.exe、regsvr32.exe 或 powershell.exe 发起连接,应回溯其父进程和完整命令行。仅看到系统二进制名称没有意义,真正需要确认的是加载的 DLL、脚本来源、签名状态和进程树上下文。

内存与注入链路分析

无落地远控或反射式 DLL 加载可能不会留下完整磁盘文件。此时应检查进程虚拟地址空间中类型为 MEM_PRIVATE、权限包含可执行、且不对应已加载模块的区域。可疑区域还可能出现 MZ 头、PE 结构、配置字符串或解密后的网络地址。

使用 Volatility 3 分析 Windows 内存镜像时,可以先建立进程和网络关联,再检查可疑内存区:

python vol.py -f memory.raw windows.info
python vol.py -f memory.raw windows.pslist
python vol.py -f memory.raw windows.pstree
python vol.py -f memory.raw windows.cmdline
python vol.py -f memory.raw windows.netscan
python vol.py -f memory.raw windows.malfind --pid 4321
python vol.py -f memory.raw windows.dlllist --pid 4321

malfind 的结果需要人工复核。JIT、浏览器和安全产品同样会生成可执行私有内存。较强的组合证据是:可执行私有内存中存在 PE 特征,同时该进程出现异常外联,父进程关系不合理,并且 Sysmon 记录到跨进程访问或远程线程创建。

网络侧确认 C2 回连

对抓包文件先按可疑主机和时间窗口过滤,再统计连接间隔、请求大小、SNI、DNS 响应及 TLS 证书。周期并不一定完全固定,远控通常会加入随机抖动,因此应观察一段时间内的间隔分布。

tshark -r incident.pcapng -Y "dns" \
  -T fields -e frame.time_epoch -e ip.src -e dns.qry.name

tshark -r incident.pcapng -Y "tls.handshake.extensions_server_name" \
  -T fields -e frame.time_epoch -e ip.src -e ip.dst \
  -e tls.handshake.extensions_server_name

tshark -r incident.pcapng -Y "ip.addr==10.10.20.15 && tcp" \
  -T fields -e frame.time_epoch -e ip.dst -e tcp.dstport -e frame.len

确认 C2 时不要只封禁单个 IP。应同时提取域名、证书指纹、URI 路径、User-Agent、请求体长度模式、DNS TTL 和进程身份。攻击者更换 IP 的成本通常低于更换整套通信配置。

检测规则与日志留痕

对于已确认样本,可以用 YARA 固化相对稳定的代码或配置特征。规则应组合多个字符串,并限定 PE 文件,避免把单个 API 名称作为检测依据:

rule Win_RemoteControl_Config_Family_A
{
    meta:
        description = "Detects reviewed remote-control sample family A"
        scope = "authorized incident response"
    strings:
        $cfg1 = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide ascii
        $cfg2 = "Content-Type: application/octet-stream" ascii
        $mutex = "Global\\ClientUpdateSingleton" wide ascii
        $ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" ascii
    condition:
        uint16(0) == 0x5a4d and filesize < 10MB and
        3 of ($cfg*) and $mutex and $ua
}

生产部署前应在正常软件样本库中回扫。字符串可能被合法程序复用,也可能被攻击者轻易修改。更可靠的策略是把文件特征与进程树、网络连接和持久化事件做关联。

建议至少保留以下日志:

  • 进程创建及完整命令行,包括 Sysmon Event ID 1 或安全日志 4688。
  • 网络连接,包括 Sysmon Event ID 3、代理日志、DNS 查询日志和边界流量元数据。
  • 映像加载、进程访问、远程线程和注册表变更,对应 Sysmon Event ID 7、10、8、12 至 14。
  • PowerShell Script Block Logging、Module Logging 和转录日志。
  • 服务安装、计划任务创建、WMI 活动及防火墙策略变更。

风险处置与修复建议

确认远控木马后,不应只删除样本。需要按照攻击链检查入口、权限提升、凭据访问、横向移动和持久化,否则主机重新上线后可能再次失陷。

  • 隔离受影响主机,封禁经过验证的域名、地址、证书及代理特征,同时保留取证所需访问通道。
  • 清理服务、计划任务、Run 键、WMI 订阅和异常启动项;记录清理前后的配置差异。
  • 若样本接触过浏览器、LSASS、SSH 密钥或配置文件,应轮换相关凭据和令牌,并检查同账号在其他主机上的登录记录。
  • 修补初始入口,包括公网漏洞、弱口令、宏策略、脚本执行策略和过度开放的远程管理端口。
  • 限制普通用户写入并执行高风险目录,结合应用控制策略约束用户目录、临时目录和下载目录中的未知程序。
  • 复核本地管理员、服务账号和域账号权限,减少远程管理范围,阻断不必要的工作站间横向访问。
  • 对高置信度入侵主机优先重装或恢复可信镜像,而不是把手工删除文件视为完整恢复。

总结

逆向木马远控的关键不是单独找出一个恶意文件,而是把 PE 静态特征、解包后的能力、内存注入证据、进程树、持久化项和 C2 流量串成可验证的链路。实际处置中应坚持先保全证据、再隔离分析、最后清理与轮换凭据。检测规则也应从单一哈希升级为文件、行为、网络和身份上下文的组合,才能应对样本重打包与基础设施快速切换。

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

这类排查建议先固定现场,再做静态逆向。直接双击样本或先重启,容易丢掉注入进程、临时落地文件和短生命周期的 C2 连接。

1.先采集易失证据并建立时间线

mkdir C:\IR
tasklist /v > C:\IR\tasklist.txt
wmic process get ProcessId,ParentProcessId,CreationDate,ExecutablePath,CommandLine /format:csv > C:\IR\process.csv
netstat -abno > C:\IR\netstat.txt
sc query type= service state= all > C:\IR\services.txt
schtasks /query /fo CSV /v > C:\IR\schtasks.csv
wevtutil epl Security C:\IR\Security.evtx
wevtutil epl System C:\IR\System.evtx
wevtutil epl Microsoft-Windows-Sysmon/Operational C:\IR\Sysmon.evtx

重点关联进程创建时间、父子关系、外联首次出现时间以及持久化项写入时间。常见异常包括 Office、浏览器、压缩软件拉起 PowerShell,或系统进程的父进程、会话号、路径与正常基线不一致。

2.判断是普通远程线程注入,还是进程镂空、模块覆盖

不要只凭“进程里出现私有可执行内存”就下结论。可使用 Process Explorer/Process Hacker 检查线程起始地址、映像路径和签名,再用 PE-sieve 做交叉验证:

pe-sieve64.exe /pid <PID> /shellc /iat 3 /hooks /data 3 /dmode 1 /dir C:\IR\pesieve

如果发现 MEM_PRIVATE + PAGE_EXECUTE* 区域,继续确认线程入口是否落在该区域;如果主模块的磁盘映像与内存节区差异较大,则更像 hollowing 或模块篡改。建议同时保留完整内存,避免只导出单个可疑区段导致导入表、配置数据和上下文丢失:

procdump64.exe -accepteula -ma <PID> C:\IR\proc_<PID>.dmp

3.C2 分析不要只盯 IP

IP 可能是 CDN、被入侵主机或短期 VPS。更稳定的关联点通常是域名解析链、TLS 证书指纹、SNI、HTTP Host、URI 结构、User-Agent、固定心跳长度和回连间隔。若样本使用 HTTPS,可先从内存中检索域名、配置块和加密前的请求内容;隔离复现时用 FakeNet-NG 或 INetSim 接管 DNS/HTTP,避免样本真实出网。

tshark -r traffic.pcapng -Y "dns or tls.handshake.extensions_server_name or http.request" ^
  -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name ^
  -e tls.handshake.extensions_server_name -e http.host -e http.request.uri

若存在固定周期回连,可计算相邻连接的时间差。稳定周期叠加少量抖动,通常比单次访问某个恶意 IP 更有检测价值。

4.最后再提取 IOC,并区分阻断项与狩猎项

  • 阻断项:确认恶意的文件哈希、域名、证书指纹、URI、服务名和计划任务。
  • 狩猎项:父子进程组合、异常线程入口、无映像支撑的 RX/RWX 内存、注册表路径和命令行特征。
  • 弱关联项:单独的公网 IP、编译时间、可被轻易修改的文件名,不宜作为唯一判据。

如果现场启用了 Sysmon,优先检查事件 1(进程创建)、3(网络连接)、7(映像加载)、8(CreateRemoteThread)、10(进程访问)、11(文件创建)、13(注册表写入)和 22(DNS)。最终结论最好能闭环成“初始执行 → 注入目标 → 持久化 → C2”的时间线,而不是只列一组 IOC。

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

最近浏览 0

  • 没有会员查看此页面。