发布于10月9日10月9日 最近几周多家威胁情报源都提到一个比较稳定的趋势:攻击者不再急着打高危 RCE,而是优先利用泄露的 VPN、SSO 或远程运维账号进入内网,再通过 AD 枚举、远程服务和日志清理完成横向移动。这个现象在授权渗透测试和蓝队复盘里也很常见,尤其是 SSL VPN 未开启 MFA、历史账号未清理、域内普通用户权限边界混乱的环境。这篇不做泛泛新闻转述,主要按实战排查视角整理一条链路:VPN 登录异常 → 内网探测 → 凭据访问 → 横向移动 → 日志留痕 → 修复建议。适合近期做威胁狩猎、应急排查或授权内网测试时对照使用。背景近期多个勒索组织和初始访问代理的行为有几个共同点:使用历史泄露账号或弱口令登录 VPN、VDI、RDP 网关。登录后先进行低噪声内网探测,例如 net view、nltest、LDAP 查询、SMB 访问测试。优先寻找域控、文件服务器、备份服务器、运维跳板机。使用合法工具横向,例如 PsExec、wmic、WinRM、远程计划任务。在执行勒索前清理日志、停用安全软件或删除影子副本。这类攻击的关键不在单个漏洞,而在账号权限边界和日志链路是否完整。很多环境被打穿,并不是因为没有安全设备,而是 VPN、AD、终端、文件服务器日志没有串起来。问题定位:从 VPN 登录日志开始如果近期发现异常文件加密、批量登录失败、域控认证压力异常,建议先从远程接入设备排查。重点关注:同一账号短时间内从多个国家或 ASN 登录。非工作时间 VPN 成功登录。VPN 登录成功后,内网出现大量 SMB、LDAP、Kerberos 请求。登录源账号平时很少使用,或属于离职、外包、测试账号。VPN 成功登录后很快访问域控、文件服务器、备份服务器。常见设备包括 Fortinet、Palo Alto、Pulse Secure、Cisco ASA、深信服、Array、OpenVPN、Windows RRAS 等。不同设备字段不同,但核心字段基本一致:用户名、源 IP、登录时间、分配的内网 IP、认证结果、User-Agent、会话持续时间。技术分析:典型内网攻防链路一个比较常见的链路如下:攻击者使用泄露账号通过 VPN 登录。获取内网地址,例如 10.10.20.57。通过 DNS、LDAP 或 NetBIOS 枚举域信息。尝试访问 SYSVOL、共享目录、运维脚本目录。寻找明文密码、配置文件、备份脚本、连接串。使用获得的域账号执行远程命令。在多台主机投递批处理、PowerShell 或勒索程序。清除 Windows 事件日志,删除卷影副本。蓝队排查时,不要只看恶意文件哈希。很多情况下攻击者前半段全部使用系统自带工具,留痕主要在认证日志、进程创建日志、SMB 访问日志和 PowerShell 日志里。操作步骤:Windows 域环境排查下面是我在应急里常用的一组排查顺序,适合先确认是否存在账号入侵和横向移动。1. 查询异常登录事件域控重点看以下事件:4624:登录成功。4625:登录失败。4768:Kerberos TGT 请求。4769:Kerberos 服务票据请求。4776:NTLM 认证。4672:分配了特殊权限的登录。横向移动常见登录类型:LogonType 3:网络登录,常见于 SMB、PsExec。LogonType 10:远程交互登录,常见于 RDP。LogonType 9:显式凭据登录,常见于 runas、远程工具。Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-7) } | Where-Object { $_.Properties[8].Value -in 3,9,10 } | Select-Object TimeCreated, @{n='TargetUser';e={$_.Properties[5].Value}}, @{n='LogonType';e={$_.Properties[8].Value}}, @{n='SourceIP';e={$_.Properties[18].Value}} | Sort-Object TimeCreated | Export-Csv C:\\Temp\\logon_4624_last7d.csv -NoTypeInformation -Encoding UTF8注意:不同系统版本下 Properties 下标可能会有差异,严谨做法是结合事件 XML 字段解析,避免误判。2. 检查远程执行痕迹常见横向移动会留下这些痕迹:服务创建:事件 7045,常见于 PsExec、远程服务执行。计划任务:事件 4698、4702,或 Microsoft-Windows-TaskScheduler 日志。进程创建:事件 4688,需要提前开启命令行审计。PowerShell:事件 4103、4104。WMI:Microsoft-Windows-WMI-Activity/Operational,事件 5857、5858、5861。# 查询近 7 天新建服务事件,排查 PsExec、随机服务名、异常路径 Get-WinEvent -FilterHashtable @{ LogName='System'; Id=7045; StartTime=(Get-Date).AddDays(-7) } | Select-Object TimeCreated, @{n='ServiceName';e={$_.Properties[0].Value}}, @{n='ImagePath';e={$_.Properties[1].Value}}, @{n='ServiceType';e={$_.Properties[2].Value}}, @{n='Account';e={$_.Properties[4].Value}} | Sort-Object TimeCreated如果看到服务路径位于 ADMIN$、C:\\Windows\\Temp、C:\\ProgramData、用户目录下,且服务名随机,需要重点确认。3. 关联 VPN 分配地址与内网访问很多排查会漏掉这一步。VPN 日志里的公网源 IP 不能直接和 Windows 日志对应,Windows 看到的通常是 VPN 分配的内网地址。因此要建立映射关系:字段含义排查价值usernameVPN 登录账号关联 AD 账号src_ip公网来源 IP判断地理位置、代理、云主机assigned_ipVPN 分配内网 IP关联域控 4624/4769 日志login_time登录时间和横向移动时间线对齐logout_time退出时间判断会话持续范围建议把 VPN 日志导出后与域控认证日志做时间线合并。重点看 VPN 登录后 5 到 30 分钟内是否出现大量服务票据请求、SMB 连接或远程登录。4. 检查凭据访问风险点初始账号进来后,攻击者常找这些位置:\\\\domain.local\\SYSVOL 下的历史脚本。文件服务器上的 backup、运维、脚本、密码 目录。数据库连接配置,如 web.config、application.yml、.env。无人值守安装文件,如 unattend.xml。RDP 保存凭据、浏览器保存密码、运维工具配置文件。# 在文件服务器上粗略搜索高风险文件名,注意控制范围,避免影响业务 Get-ChildItem D:\\Share -Recurse -ErrorAction SilentlyContinue -Include ` *.config,*.xml,*.yml,*.yaml,*.ini,*.txt,*.bat,*.ps1 | Where-Object { $_.Name -match 'pass|pwd|credential|account|backup|db|密码|账号' } | Select-Object FullName, Length, LastWriteTime | Export-Csv C:\\Temp\\sensitive_file_candidates.csv -NoTypeInformation -Encoding UTF8这里不是建议在生产环境盲目全盘扫,而是对已知共享目录、运维目录做定向检查。搜索结果也要注意权限控制,不要二次扩散敏感信息。日志留痕:几个高价值信号下面这些信号在近期事件中出现频率较高:普通域用户在非工作时间请求大量 cifs/主机名 的 4769 事件。同一 VPN 分配地址访问多台服务器的 ADMIN$。多台主机出现相同的 7045 服务创建记录。短时间内出现 vssadmin delete shadows、wmic shadowcopy delete。PowerShell 4104 中出现下载、解码、反射加载、关闭 Defender 的行为。安全日志被清除,事件 1102。# 排查常见破坏性命令,需要开启 4688 进程命令行审计 Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4688; StartTime=(Get-Date).AddDays(-14) } | Where-Object { $_.Properties[8].Value -match 'vssadmin|wbadmin|bcdedit|wevtutil|wmic shadowcopy|Delete Shadows' } | Select-Object TimeCreated, @{n='User';e={$_.Properties[1].Value}}, @{n='Process';e={$_.Properties[5].Value}}, @{n='CommandLine';e={$_.Properties[8].Value}}风险与修复建议建议按优先级处理,不要只做单点封堵。VPN 强制 MFA:所有远程接入账号启用 MFA,尤其是外包、运维、管理员账号。清理历史账号:禁用离职、测试、长期未登录账号。建议每月导出 lastLogonTimestamp 做复核。限制 VPN 访问范围:不要让 VPN 用户默认访问全内网。按角色划分 ACL,只开放必要系统和端口。收敛域内权限:普通用户不应对服务器本地管理员组有写入或远程登录权限。开启关键日志:启用 4688 命令行审计、PowerShell Script Block Logging、WMI 日志,并集中到 SIEM 或日志平台。保护备份:备份服务器不要加入普通域管理范围,备份账号避免域管权限,保留离线或不可变备份。监控远程执行:对 PsExec、远程服务创建、计划任务、WinRM、WMI 远程调用建立告警。审计共享目录:清理包含密码、连接串、脚本凭据的文件,必要时使用专门的密钥管理方案。可落地的加固配置Windows 域环境里,建议至少开启下面几项审计策略:auditpol /set /subcategory:\"Logon\" /success:enable /failure:enable auditpol /set /subcategory:\"Account Logon\" /success:enable /failure:enable auditpol /set /subcategory:\"Process Creation\" /success:enable /failure:enable auditpol /set /subcategory:\"Security Group Management\" /success:enable /failure:enable auditpol /set /subcategory:\"Other Object Access Events\" /success:enable /failure:enable reg add \"HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\Audit\" ^ /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f reg add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\PowerShell\\ScriptBlockLogging\" ^ /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f如果担心日志量,可以先在服务器 OU、运维跳板机、域控、文件服务器上分批开启,再根据日志平台容量调整保留周期。总结近期新闻里的攻击趋势并不复杂,但很有效:拿账号进 VPN,借合法工具在内网移动,最后集中破坏。防守重点不是追每一个恶意样本,而是把远程接入、账号权限、横向移动日志串起来。建议近期至少做三件事:一是导出近 30 天 VPN 登录记录,排查异常来源和历史账号;二是检查域控 4624、4769、7045、4688、4104 等关键日志;三是收敛 VPN 到内网的访问范围和普通账号的服务器权限。只要这几项落实,很多入侵会在勒索执行前就露出明显痕迹。 服务器、云资产与权限边界梳理示意
10月9日10月9日 这类事件里,建议把“VPN 登录成功”到“勒索落地”之间的时间线先串起来,不要只盯着异常公网 IP。重点看 VPN 会话、身份认证、域控和文件服务器上的同一账号活动是否能对上。 1. 先固化 VPN 侧证据 导出最近 7~14 天的登录成功、失败、登出、地址分配、权限变更和 MFA 结果,保留原始时间戳和时区。 重点筛选:新国家/ASN、短时间多地域登录、同一账号并发会话、登录后立即访问多个内网网段、账号登录时终端指纹或客户端版本发生变化。 不要只看用户名。把 VPN 分配的虚拟 IP、设备标识、认证方式、MFA 结果与后续 Windows 事件中的源地址关联起来。 # Windows 事件转发或本机日志中,先筛选常见远程登录事件 Get-WinEvent -FilterHashtable @{ LogName='Security' Id=4624,4625,4648,4672,4778,4779 } | ForEach-Object { [xml]$x = $_.ToXml() [PSCustomObject]@{ Time = $_.TimeCreated Id = $_.Id User = ($x.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'}).'#text' Ip = ($x.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'}).'#text' Logon = ($x.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'}).'#text' } } | Sort-Object Time 2. 区分“账号被盗”还是“VPN 设备/配置被利用” 核对 VPN 供应商、版本和暴露管理面,尤其是 SSL VPN 门户、SAML/OIDC 回调、备份配置和本地管理员账号。 检查是否存在绕过 MFA 的条件访问例外、长期有效的 refresh token、未纳管设备仍可建立隧道,以及旧账号/服务账号被允许直接 VPN 登录。 对可疑账号同时撤销 VPN 会话、密码、注册的 MFA 设备和云端 refresh token;仅改密码可能会留下已建立的会话或有效令牌。 3. 横向移动要重点看哪些事件 4624 的 Logon Type 3(网络登录)和 Type 10(RDP),以及 4648 的显式凭据使用。 4672 特权登录后,是否紧接着出现 4698 计划任务、7045 服务安装、5140/5145 SMB 访问、4728/4732 加组或 4740 锁定。 域控上的 4768/4769 Kerberos 请求:同一账号在短时间内从多个工作站申请票据,或访问与其职责无关的 CIFS、HOST、LDAP 服务。 如果攻击者使用 WMI、PsExec、WinRM,单看登录事件不够,还要结合远程服务创建、WMI-Activity、PowerShell 4103/4104 和 Sysmon 1/3。 # 在域控上快速看某个账号近期的 Kerberos 与网络登录 $u = 'suspect_user' Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4768,4769,4624} | Where-Object { $_.Message -match [regex]::Escape($u) } | Select-Object TimeCreated, Id, MachineName, Message | Sort-Object TimeCreated 4. 检查 VPN 到内网的实际访问范围 很多环境只审计“能不能连 VPN”,却没有记录 VPN 地址池到服务器的连接。建议在防火墙、核心交换机、EDR 或服务器侧按 VPN 地址池反查: # Linux 防火墙/网关上,按 VPN 地址池观察新建连接(示例) sudo conntrack -L 2>/dev/null | \ grep -E 'src=(10\.250\.|172\.2[0-9]\.|192\.168\.)' | \ grep -E 'dport=(445|3389|5985|5986|22|389|636|88)' 如果 VPN 地址池能直接访问域控、备份服务器和所有文件服务器,建议立即按角色拆分访问控制:普通远程办公账号不应访问 SMB 管理共享、域控管理端口和备份管理面;管理员账号也应通过跳板机或受控管理网段访问。 5. 发现疑似横向移动后的处置顺序 先隔离 VPN 网关或收紧 VPN 到内网的 ACL,保留日志,不要直接重装导致证据丢失。 禁用被确认滥用的账号,并清理活动会话、MFA 设备、API 密钥和持久化令牌。 隔离出现异常服务、计划任务、RDP 登录或批量文件改名的主机;优先保护域控、备份和虚拟化管理平台。 确认是否存在域管理员凭据暴露后,再安排分阶段重置,避免只重置一个入口账号而让攻击者继续使用已取得的高权限凭据。 从最早异常 VPN 登录时间开始回溯,至少覆盖账号、源 IP、目标主机、认证协议、进程创建和文件改名事件,形成一条可复核的时间线。 另外,勒索前常见的“试探阶段”未必会立即触发杀软告警,例如短时间内枚举域用户、共享和备份任务,随后通过合法工具进行远程服务执行。把这些低噪声行为与 VPN 会话和异常账号绑定起来,通常比单独搜索某个勒索样本名称更容易提前发现。
10月10日10月10日 补一个容易漏的点:VPN 虚拟 IP 到主机侧源地址的映射要按“租约时间段”做,不然很容易把后续 Windows 日志串错。尤其是地址池复用比较快的环境,同一个 10.x VPN IP 一天内可能分给过多个账号。 可以单独整理一张关联表,字段至少包括: - VPN 账号 - 分配的虚拟 IP - 登录时间、登出时间 - 客户端公网 IP - 设备 ID / 证书序列号 / 客户端版本 - MFA 结果 - 关联到的 AD 账号或本地账号 然后再去 Windows 侧按源地址和时间窗口查横向移动痕迹。除了 4624/4625,我会重点补看这几类: 1. 远程服务创建和启动 勒索前常见通过 PsExec、sc、远程管理工具落 payload,可以查 7045、4697: Get-WinEvent -FilterHashtable @{ LogName='System' Id=7045 StartTime=(Get-Date).AddDays(-14) } | Select-Object TimeCreated, MachineName, ProviderName, Id, @{n='ServiceName';e={$_.Properties[0].Value}}, @{n='ImagePath';e={$_.Properties[1].Value}}, @{n='Account';e={$_.Properties[4].Value}} 关注 ImagePath 里出现: - ADMIN$、C$、Temp、ProgramData、Users\Public - 随机命名 exe - powershell / cmd / rundll32 / regsvr32 / mshta - psexesvc、remcom、paexec 等服务名 2. 计划任务落地 很多团伙不用服务,改用 schtasks 横向执行。查 4698/4702,如果开启了 TaskScheduler 日志,也看 106、140、200、201: Get-WinEvent -FilterHashtable @{ LogName='Security' Id=4698,4702 StartTime=(Get-Date).AddDays(-14) } | Select-Object TimeCreated, MachineName, Id, Message 以及: Get-WinEvent -FilterHashtable @{ LogName='Microsoft-Windows-TaskScheduler/Operational' Id=106,140,200,201 StartTime=(Get-Date).AddDays(-14) } | Select-Object TimeCreated, MachineName, Id, Message 3. SMB 访问和管理共享 文件服务器、域控、运维机上建议看 5140、5145,判断 VPN 会话后是否访问了 ADMIN$、C$、IPC$ 或大量业务共享: Get-WinEvent -FilterHashtable @{ LogName='Security' Id=5140,5145 StartTime=(Get-Date).AddDays(-14) } | Where-Object { $_.Message -match 'ADMIN\$|C\$|IPC\$' } | Select-Object TimeCreated, MachineName, Id, Message 如果没开对象访问审计,至少从文件服务器 SMB 会话、EDR 网络连接、Netlogon 日志里补证据。 4. 域内凭据使用链路 VPN 账号如果不是域账号,也要查它登录后有没有马上触发域账号 4648、4768、4769、4776。特别是 4648 能看到“显式凭据”使用: Get-WinEvent -FilterHashtable @{ LogName='Security' Id=4648 StartTime=(Get-Date).AddDays(-14) } | Select-Object TimeCreated, MachineName, Message 关注: - 目标服务器名是否集中指向 DC、文件服务器、备份服务器 - Account Name 是否从普通用户切到管理员、备份账号、服务账号 - Process Name 是否为 cmd、powershell、wmic、mstsc、runas、psexec 类路径 5. 不要忽略备份系统和虚拟化平台 勒索落地前通常会先处理备份。建议把 Veeam、Commvault、NetBackup、vCenter、ESXi、NAS 管理后台日志也拉进时间线。重点看: - 备份任务被禁用、删除 - 备份仓库文件被删除 - 新增管理员账号 - 登录来源来自 VPN 地址池 - 大量快照删除 - SSH 被开启或异常登录 ESXi 最后建议排查时先不要急着全网扫 IOC,先用“VPN 登录时间点 + 虚拟 IP + 首台被访问内网主机”做种子,往后扩 2~6 小时,通常能比较快还原出第一跳、提权点和横向移动路径。时间线一旦对齐,比单纯看异常 IP 准很多。