跳转到帖子

授权内网演练中的样本定位、通信还原与持久化排查

精选回复

发布于

本文以一次授权内网攻防演练为背景:某 Windows 终端出现异常外联,EDR 仅记录到一个伪装成更新组件的进程,进程名为 updater.exe,运行账户为普通域用户。目标不是制作或改造远控木马,而是在获得授权的前提下,对样本进行取证、逆向分析、通信确认和清理验证。

分析环境建议使用与生产网络隔离的虚拟机,并准备原始磁盘镜像、内存镜像、EDR 导出日志和 DNS、代理、边界防火墙日志。不要直接在受感染主机上双击样本,也不要把样本上传到公共在线扫描站点,以免泄露企业代码和内部信息。

一、问题定位:先证明异常,再进入逆向

初步告警通常来自三个方向:异常进程、异常持久化项和异常外联。三者需要形成证据链,不能仅凭文件名或杀毒软件单条告警下结论。

  • 进程侧:确认进程路径、父子进程关系、签名、创建时间、命令行参数及运行账户。
  • 文件侧:计算 SHA-256,记录文件大小、PE 时间戳、节区权限和数字签名状态。
  • 网络侧:关联 DNS 查询、目的 IP、端口、TLS SNI、代理日志和连接持续时间。
  • 持久化侧:检查服务、计划任务、启动项、WMI 事件订阅、IFEO 和用户目录中的快捷方式。

如果进程仍在运行,优先在隔离网络中采集内存和句柄信息,再终止进程。直接删除文件会破坏后续的内存取证和时间线分析。

二、主机现场采集

以下命令适用于 Windows 授权取证。建议以管理员权限执行,并将输出写入只读证据目录。命令本身不会执行样本,仅读取进程、网络和持久化信息。

mkdir C:\IR\case-20250308
Get-FileHash C:\Users\Public\updater.exe -Algorithm SHA256
Get-AuthenticodeSignature C:\Users\Public\updater.exe | Format-List *
Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine | Out-File C:\IR\case-20250308\process.txt
Get-NetTCPConnection -State Established,Listen | Sort-Object OwningProcess | Format-Table -AutoSize | Out-File C:\IR\case-20250308\network.txt
Get-CimInstance Win32_Service | Where-Object {$_.PathName -match 'Users|ProgramData|Temp|Public'} | Select-Object Name,State,StartMode,PathName | Out-File C:\IR\case-20250308\services.txt
taskschd.msc
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run /s
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run /s
wevtutil epl Microsoft-Windows-Sysmon/Operational C:\IR\case-20250308\sysmon.evtx

在实际采集中,还应保存当前用户 SID、主机名、时区和系统时间,避免后续把不同主机的时间线混在一起:

hostname > C:\IR\case-20250308\host.txt
whoami /all > C:\IR\case-20250308\identity.txt
systeminfo > C:\IR\case-20250308\systeminfo.txt
w32tm /query /status > C:\IR\case-20250308\time.txt

三、静态逆向:从 PE 结构判断能力边界

静态分析重点不是寻找一个“木马特征”,而是确认样本具备哪些能力,以及这些能力是否与告警行为对应。建议按以下顺序处理:

  • PE 基础信息:确认架构、入口点、节区数量、节区熵、导入表和资源目录。
  • 加载行为:关注 LoadLibrary、GetProcAddress、VirtualAlloc、VirtualProtect、CreateThread 等 API 的组合,而不是单独看到某个 API 就判定恶意。
  • 持久化能力:检索服务创建、计划任务、注册表 Run 键、WMI 订阅和 DLL 搜索顺序相关字符串。
  • 通信能力:提取域名、IP、URL、HTTP 头、TLS SNI、命令分隔符、固定长度数据包和配置结构。
  • 权限边界:检查是否尝试令牌复制、服务配置修改、UAC 绕过或访问其他用户目录。

如果样本存在明显字符串加密,应先记录解密函数的输入输出和调用位置,不要急于修改样本。可以使用 x64dbg、Ghidra 或 IDA 在隔离虚拟机内对入口点、TLS 回调、网络初始化和配置解码函数设置断点。对疑似配置的内存区域做转储时,要同时记录模块基址和偏移,便于复核。

四、动态分析与通信还原

动态分析应使用无敏感数据的快照环境,网络通过可控的模拟服务或 sinkhole 接收,不允许样本连接真实 C2。重点观察四类事件:

  • 进程创建:确认是否由 Office、脚本解释器、服务进程或临时目录程序拉起。
  • 文件与注册表:记录创建、修改、删除操作,特别是启动项、服务和计划任务。
  • 网络:记录 DNS、首次连接时间、目的地址、端口、TLS SNI、HTTP 方法和周期性心跳。
  • 内存:关注可执行匿名内存、线程起始地址落在非映像区域、解密后出现的域名和命令字符串。

在 Sysmon 已部署的环境中,重点关联事件 ID 1、3、7、8、10、11、12、13、22。一个常见的证据链是:脚本解释器创建临时目录中的可执行文件,随后该文件创建 Run 键并周期性访问固定域名。这比单独依赖文件哈希更可靠,因为哈希可能因样本变种而变化。

五、用 YARA 固化样本族特征

规则应优先使用稳定的字符串组合、配置结构和导入特征,避免只写单一文件名。下面是一条示例规则,适合在授权环境中对已知样本族做初筛,不能替代沙箱和人工复核。

rule Suspected_Remote_Admin_Trojan_Sample
{
    meta:
        description = "Example rule for an authorized incident response lab"
        author = "IR"
        reference = "case-20250308"

    strings:
        $s1 = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide ascii
        $s2 = "/config" ascii nocase
        $s3 = "User-Agent:" ascii nocase
        $s4 = "beacon" ascii nocase
        $api1 = "InternetOpenA" ascii
        $api2 = "WinHttpOpenRequest" ascii

    condition:
        uint16(0) == 0x5A4D and
        2 of ($s*) and
        1 of ($api*)
}

规则部署前应使用企业软件基线、签名文件和历史样本进行误报测试。命中后应回到文件路径、签名、父进程和网络日志做上下文判断,不要直接依据 YARA 命中结果封禁整个目录。

六、权限边界与横向影响判断

远控样本本身未必具备域管权限。分析时应区分“样本执行权限”和“攻击者实际获得的权限”。需要重点核对:

  • 样本是否以普通用户、服务账户或本地管理员身份运行。
  • 是否访问了浏览器凭据、SSH 密钥、云凭据、共享目录或内存中的令牌。
  • 是否出现 SMB、WMI、WinRM、远程服务创建或计划任务下发行为。
  • 同一哈希、域名、注册表键和父进程是否在其他终端出现。

如果发现样本以域用户运行,不能只重置该用户密码。应同时检查其登录过的主机、Kerberos 票据使用情况、访问过的共享资源和异常认证事件。必要时撤销活动会话、重置相关凭据,并对高权限组成员做额外审计。

七、日志留痕与检测规则

建议启用进程创建审计并记录命令行参数,Sysmon 至少覆盖进程创建、网络连接、文件创建、注册表修改、DNS 查询和驱动加载。Windows 安全策略中可关注 4688、4697、4698、4657、4624、4648、4672 等事件。

检测逻辑可以从行为组合开始,例如“用户可写目录中的新进程 + 创建 Run 键 + 外连非基线域名”,而不是简单封禁 updater.exe。网络侧将 DNS、代理和终端网络事件按主机时间线关联,可以识别样本更换 IP 或文件名后的重复活动。

八、修复与验证

  1. 隔离受影响主机,保留磁盘和内存证据,记录隔离时间。
  2. 基于哈希、路径、域名、证书指纹和行为规则做全网检索。
  3. 删除或禁用恶意服务、计划任务、启动项和 WMI 订阅,并确认没有替代持久化。
  4. 清理样本及其释放文件,修复被修改的代理、DNS、主机防火墙和安全策略。
  5. 对泄露风险涉及的账号执行凭据轮换,优先处理管理员、服务账号和云访问密钥。
  6. 重新部署可信镜像或完成完整性验证后再恢复网络,避免只删除一个文件就宣告结束。

验证阶段应在 EDR、Sysmon、DNS、代理和防火墙日志中确认:恶意进程不再启动、持久化项不再出现、已知 C2 不再解析或连接、相同账户不存在异常登录。至少观察一个完整的心跳周期和业务高峰期,避免样本因定时任务或延迟触发而漏检。

总结

逆向木马远控的核心不是“找到一个可疑文件”,而是把样本能力、主机行为、网络通信、权限边界和日志时间线串成可复核的证据链。授权测试中应坚持隔离分析、最小化执行、保留原始证据和先修复后验证的原则。对变种样本,稳定的检测依据通常来自持久化方式、通信协议、配置结构和行为组合,而不是文件名或单一哈希。

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

这类演练建议把“进程/样本—网络五元组—持久化入口”放到同一条 UTC 时间线上分析。先限制主机外联并保全证据,不要一上来杀进程、删任务;否则已删除但仍在运行的文件、内存配置和现存连接都会丢失。还要记录主机与日志平台的时钟偏差。

1. 从连接反查进程和样本

Windows 先保存连接、进程及父子关系,再对可执行文件做哈希和签名检查:

Get-NetTCPConnection |
  Where-Object { $_.State -in @('Established','Listen') } |
  Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess

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

Get-FileHash 'C:\path\suspect.exe' -Algorithm SHA256
Get-AuthenticodeSignature 'C:\path\suspect.exe' | Format-List *
Get-Item 'C:\path\suspect.exe' -Stream *

历史记录重点看 Security 4688、Sysmon 1/3/11/12-14/19-22、PowerShell 4104。Sysmon 3 默认不一定启用,没有的话要结合 EDR、主机防火墙和网关日志。文件时间不能单独作为依据,最好再对照 Prefetch、Amcache、Shimcache、$MFT 和 $UsnJrnl。

Linux 上如果进程对应文件显示为 (deleted),要在停止进程前从 /proc 留样:

ss -tpna
lsof -nP -i
ps -eo pid,ppid,user,lstart,cmd --forest

readlink -f /proc/1234/exe
tr '\0' ' ' < /proc/1234/cmdline
cp --preserve=all /proc/1234/exe /mnt/evidence/sample.1234
sha256sum /mnt/evidence/sample.1234

样本建议通过既有取证或 EDR 通道收集,隔离保存且不要直接执行;涉及内部代码、配置时也不宜直接上传公共查杀平台。

2. 通信还原不要只盯域名

先通过 DHCP、VPN、NAT 日志确认事发时间点对应的真实终端,再按“时间、源/目的 IP、端口、协议、进程 PID”关联 DNS、代理、防火墙和终端日志。IP 复用、CDN 和域前置都会导致仅按域名或 IP 得出误判。

tcpdump -i any -nn -s 0 -G 300 -W 12 \
  -w '/mnt/evidence/host-%Y%m%d%H%M%S.pcap' 'host 10.0.0.23'

tshark -r host.pcap \
  -Y 'dns || http.request || tls.handshake.type == 1' \
  -T fields \
  -e frame.time_epoch -e ip.src -e ip.dst \
  -e dns.qry.name -e http.host -e http.request.uri \
  -e tls.handshake.extensions_server_name

加密通信无法直接看到载荷时,仍可还原 SNI、证书、DNS 应答、包长、上下行比例和固定心跳周期,再与进程启动时间对齐。JA3/JA4 只能作为线索,不建议单独作为定性依据。若需要提取协议配置,应在断网沙箱或内存镜像中进行,避免样本再次真实外联。

3. 持久化要覆盖非常规入口

Windows 除了 Run 键,还应检查服务、计划任务、WMI 永久订阅、启动目录、Winlogon 和 IFEO:

Get-CimInstance Win32_StartupCommand
Get-CimInstance Win32_Service |
  Select-Object Name,State,StartMode,StartName,PathName
schtasks /query /fo CSV /v

Get-CimInstance -Namespace root\subscription -ClassName __EventFilter
Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer
Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding

reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" /s

对应事件可重点看 4697、4698、4702、7045 和 1102。计划任务和服务不能只看名称,要检查实际执行路径、参数、运行账户、文件签名、ACL 以及首次出现时间。

Linux 侧至少覆盖 systemd、cron、SSH key、动态链接器和登录脚本:

systemctl list-unit-files --state=enabled
systemctl list-timers --all

for u in $(cut -d: -f1 /etc/passwd); do
  crontab -u "$u" -l 2>/dev/null
done

find /etc/systemd/system /etc/cron* /etc/profile.d \
  -xdev -type f -mtime -14 -ls
find /home /root -path '*/.ssh/authorized_keys' -type f -ls
cat /etc/ld.so.preload 2>/dev/null

清理时应先记录持久化项与落地文件的关联,再移除入口并持续观察是否被重新创建;如果会自动恢复,通常还存在第二个守护进程、任务或远程下发源。最终最好形成“初始执行、样本落地、首次外联、持久化建立、后续活动”五个时间点的闭环,而不是只给出一个哈希或恶意 IP。

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

最近浏览 0

  • 没有会员查看此页面。