跳转到帖子

逆向木马远控实战:从进程注入、持久化到 C2 留痕的闭环排查

精选回复

发布于

背景与授权场景本文面向已获授权的终端应急与靶场复盘。场景是一台 Windows 11 测试终端出现周期性外联:EDR 只记录到 powershell.exe 短暂启动,随后由正常签名进程 rundll32.exe 建立 TLS 连接。目标不是运行样本验证危害,而是在隔离环境中完成静态逆向、宿主行为关联、持久化定位和修复验证。未知样本不要在办公终端直接双击。分析虚拟机应使用快照、Host-only 网络或可控仿真网络,并关闭共享剪贴板、共享目录和宿主盘映射。样本以哈希标识,避免在工单和聊天工具中直接传递可执行文件。一、先固化现场,避免只盯单个进程远控木马常把加载器、注入宿主、持久化项和网络会话拆开。只隔离 rundll32.exe 往往会漏掉负责重建任务的脚本或服务。建议先记录系统时间、登录会话、进程树、网络连接、计划任务、服务和自启动项,再做终止进程或删除文件操作。mkdir C:\IR\case-042
Get-Date -Format o | Out-File C:\IR\case-042\time.txt
Get-CimInstance Win32_Process |
Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine |
Export-Csv C:\IR\case-042\process.csv -NoTypeInformation -Encoding UTF8
Get-NetTCPConnection |
Select-Object State,LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess |
Export-Csv C:\IR\case-042\net.csv -NoTypeInformation -Encoding UTF8
schtasks /query /fo CSV /v > C:\IR\case-042\tasks.csv
sc.exe query type= service state= all > C:\IR\case-042\services.txt
reg.exe query HKCU\Software\Microsoft\Windows\CurrentVersion\Run /s > C:\IR\case-042\run-hkcu.txt
reg.exe query HKLM\Software\Microsoft\Windows\CurrentVersion\Run /s > C:\IR\case-042\run-hklm.txt
Get-FileHash C:\IR\suspect\sample.bin -Algorithm SHA256 |
Format-List | Out-File C:\IR\case-042\hash.txt对关键证据使用只读副本分析,并记录 SHA-256。若需要内存取证,应先采集内存再重启;重启会破坏注入区域、未落盘配置和临时网络状态。二、问题定位:建立父子进程、模块与外联三条关联先把 OwningProcess 映射回 PID,再追溯父进程。重点检查三类不一致:系统二进制路径异常,例如 rundll32.exe 不在 System32 或 SysWOW64;命令行语义异常,例如 DLL 路径位于用户临时目录;签名正常但加载了无签名模块。正常签名只能说明宿主文件来源,不能排除其被注入或侧载。$pids = (Get-NetTCPConnection -State Established).OwningProcess | Sort-Object -Unique
Get-CimInstance Win32_Process | Where-Object ProcessId -in $pids |
Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine

Get-Process -Id 4120 -Module -ErrorAction SilentlyContinue |
Select-Object ModuleName,FileName |
Sort-Object FileName

Get-AuthenticodeSignature C:\Windows\System32\rundll32.exe |
Select-Object Status,StatusMessage,SignerCertificate如果进程模块枚举失败,不要立即认定为隐藏。跨位数枚举、权限不足和受保护进程都会造成同样现象。应结合 EDR 遥测、Sysmon ImageLoad 事件、内存映像中的 VAD 权限及 PE 头共同判断。三、静态逆向:从入口点还原加载链对样本副本先做文件类型、节区和导入表检查。加载器常见特征包括节区熵偏高、导入函数很少、入口点附近存在动态解析 API、资源区或尾部附加大块数据。需要区分普通压缩壳与恶意配置封装,单凭高熵不能定性。查看 PE 时间戳,但把它当弱证据;编译时间可被修改。检查导入表中 VirtualAlloc、VirtualProtect、WriteProcessMemory、CreateRemoteThread、NtMapViewOfSection 等内存与进程操作。搜索 UTF-16 和 ASCII 字符串,关注互斥体、任务名、注册表路径、User-Agent、URI 模板和证书字段。定位字符串解密函数:通常会出现紧凑循环、逐字节异或或加减、固定初始种子,以及解密结果被网络或注册表 API 引用。在 Ghidra 或 IDA 中应从 API 调用的交叉引用反推参数来源,而不是从入口点线性阅读全部反编译结果。例如由 WinHttpConnect 的第二个参数向前追踪,可定位 C2 主机解密逻辑;由 RegSetValueExW 的键名参数向前追踪,可定位持久化配置。重命名函数时使用行为名称,如 decrypt_config、install_task、inject_remote,而不是猜测具体家族名。四、动态分析:验证注入而不连接真实 C2动态阶段应在快照虚拟机内使用仿真 DNS/HTTP 服务,禁止样本访问公网。Procmon 过滤 Process Name、Operation 和 Path,可快速观察文件释放、注册表写入和任务创建;Process Explorer 或内存取证工具用于核对私有可执行内存。典型注入线索是某宿主进程出现 PAGE_EXECUTE_READWRITE 的私有区域、线程起始地址不落在已加载模块、或内存中存在 MZ/PE 结构但模块链表没有对应项。观察项可疑表现需要排除线程起始地址落在 Private、RX 或 RWX 区域JIT、浏览器沙箱、部分安全软件模块路径用户可写目录、无签名、名称仿冒合法插件与自动更新组件网络节奏固定周期、小包、失败后指数退避代理探测、遥测和时间同步内存 PE未出现在正常模块列表反射式加载的合法测试组件不要仅凭 RWX 内存下结论。更可靠的证据链是:加载器创建或打开目标进程,目标出现异常私有可执行区,新线程从该区域启动,随后该 PID 建立外联,并且时间顺序一致。五、持久化排查:任务、服务与 WMI 订阅远控常利用看似正常的更新任务名隐藏。计划任务应同时检查 Action、Trigger、Principal 和创建时间;特别关注指向 AppData、ProgramData 临时子目录、脚本解释器或带编码参数的动作。服务项重点核对 ImagePath 是否带未加引号路径、是否加载用户可写目录中的 DLL。Get-ScheduledTask | ForEach-Object {
$t = $_
foreach ($a in $t.Actions) {
[pscustomobject]@{
TaskPath=$t.TaskPath; TaskName=$t.TaskName
Execute=$a.Execute; Arguments=$a.Arguments; UserId=$t.Principal.UserId
}
}
} | Where-Object {
$_.Execute -match 'powershell|wscript|cscript|mshta|rundll32' -or
$_.Arguments -match 'AppData|ProgramData|EncodedCommand'
} | Format-Table -AutoSize

Get-CimInstance -Namespace root\subscription -ClassName __EventFilter
Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer
Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding发现 WMI 永久订阅时,要保存 Filter、Consumer 和 Binding 三者内容后再删除,避免只删一端留下残项。删除前确认其不是资产管理或运维代理创建的合法订阅。六、网络与日志留痕TLS 加密并不妨碍行为分析。可关联目标 IP、SNI、证书指纹、连接周期、上下行字节比和发起 PID。若环境部署 Sysmon,至少关注事件 1 进程创建、3 网络连接、7 镜像加载、11 文件创建、13 注册表值修改、19 至 21 WMI 事件。日志采集端应保留 UTC 时间和主机时区,避免跨设备时间线错位。# 查询最近 24 小时内 Sysmon 的进程、网络与持久化相关事件
$start = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName='Microsoft-Windows-Sysmon/Operational'
Id=1,3,7,11,13,19,20,21
StartTime=$start
} | Select-Object TimeCreated,Id,RecordId,Message |
Export-Csv C:\IR\case-042\sysmon.csv -NoTypeInformation -Encoding UTF8如果未部署 Sysmon,可补查 Windows Defender、PowerShell Operational、TaskScheduler Operational、Security 4688 和 Windows Firewall 日志。4688 只有在启用命令行审计后才包含完整命令行,因此应提前配置,而不是事后才期待日志存在。七、检测规则:以稳定行为特征替代易变 IOC哈希和域名容易变化。YARA 更适合扫描静态文件或已提取的内存区域,规则应组合家族中相对稳定的配置标记和代码片段,并设置文件大小及命中数量约束,降低误报。下面是用于内部样本库筛查的示例骨架,字符串需替换为逆向后确认的特征。rule RAT_Loader_Config_Marker_Internal
{
meta:
purpose =

逆向分析与样本观察示意图
逆向分析、样本行为与调试流程示意
日志取证与事件时间线示意图
日志证据、时间线与事件还原示意

这类远控排查建议不要把“注入、持久化、C2”拆成三个孤立 IOC,而是用同一条时间线互相校验。尤其要先保全内存、网络连接和计划任务状态,再做隔离或查杀,否则注入载荷和短连接证据很容易丢。

Windows 主机上可以先快速收敛可疑进程:重点看无正常父子关系、映像路径与签名不一致、从用户可写目录启动,以及“进程有网络连接但磁盘映像无异常”的对象。

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

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

Get-CimInstance Win32_Process | ForEach-Object {
  $p = $_
  if ($p.ExecutablePath) {
    $sig = Get-AuthenticodeSignature -FilePath $p.ExecutablePath
    [pscustomobject]@{
      PID=$p.ProcessId; PPID=$p.ParentProcessId; Path=$p.ExecutablePath
      Signature=$sig.Status; CommandLine=$p.CommandLine
    }
  }
}

发现疑似被注入进程后,不要只看进程名。用 Process Explorer/Process Hacker 检查私有可执行内存、无文件映射的线程起始地址和异常模块;离线内存可用 Volatility 3 交叉检查:

python vol.py -f mem.raw windows.pslist
python vol.py -f mem.raw windows.pstree
python vol.py -f mem.raw windows.netscan
python vol.py -f mem.raw windows.malfind --pid <PID>
python vol.py -f mem.raw windows.ldrmodules --pid <PID>

malfind 命中并不等于恶意,JIT、浏览器和安全软件都会产生 RX/RWX 私有页。更有价值的是组合特征:内存页为 PAGE_EXECUTE_READWRITE、存在 MZ/PE 头或解码 stub、线程起始地址落在该私有区,同时该 PID 正在连接外网。可疑内存段导出后再做哈希、字符串和反汇编,不建议直接在生产机执行样本。

持久化部分除了 Run 键和计划任务,建议补查服务、WMI 永久订阅、启动目录以及 IFEO。下面几项通常能覆盖大部分常见落点:

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" /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

判断持久化是否与注入链同源时,优先比较创建时间、执行账户、命令行、落地目录和文件哈希。计划任务 XML 中的作者字段参考价值有限,触发器、动作参数以及任务文件的创建时间更可靠。还要注意 LOLBin 链,例如 rundll32、regsvr32、mshta、powershell 的父进程和完整参数。

C2 留痕不应只盯固定 IP。远控常换地址,但域名、证书、URI、JA3/JA4、DNS 请求节奏和固定长度心跳往往更稳定。主机侧可关联 Sysmon 事件 1(进程创建)、3(网络连接)、7(镜像加载)、10(进程访问)、13(注册表)和 22(DNS);若已启用 PowerShell 日志,再查 4103/4104。建议按 PID、ProcessGuid 和时间窗口做关联,避免 PID 重用导致串线。

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=1,3,7,10,13,22} |
  Where-Object {$_.TimeCreated -gt (Get-Date).AddHours(-24)} |
  Select-Object TimeCreated,Id,Message |
  Export-Csv .\sysmon_timeline.csv -NoTypeInformation -Encoding UTF8

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=4103,4104} |
  Select-Object TimeCreated,Id,Message |
  Export-Csv .\powershell.csv -NoTypeInformation -Encoding UTF8

最后可以用一个最小闭环验证结论:持久化项在 T1 启动加载器,T2 对目标进程产生访问或远程线程行为,T3 该目标进程解析域名并建立连接,T4 出现周期性心跳。四段证据至少命中三段,再进行隔离、封禁和清除会更稳。清除前保留内存镜像、相关文件、任务 XML、注册表导出、EVTX、DNS/代理日志及时间基准;清除后重启复查同一持久化点和外联,确认没有备用落点或二次下载链。

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

最近浏览 0

  • 没有会员查看此页面。