发布于13小时前13小时 背景:近期攻击链已从“打漏洞”转向“复用身份”近期国际威胁情报中,一个值得关注的变化是:攻击者利用互联网边界设备漏洞取得初始访问后,不一定长期保留 WebShell,而是优先收集 VPN 会话、反向代理 Cookie、API Token 或运维账户凭据。即使漏洞已经修复,未失效的身份材料仍可能被继续复用,形成“设备已打补丁,但内网访问仍未终止”的窗口。这类事件的处置重点不能停留在版本核对。授权渗透测试或应急验证应同时检查四个环节:边界设备是否出现异常请求、会话是否发生跨地址复用、内网是否产生横向认证、攻击者是否建立新的权限落点。下面给出一套偏实战的排查流程,适用于 VPN、SSO 网关、堡垒机和反向代理暴露面。所有验证应在明确授权范围内进行。不要在生产环境直接执行破坏性利用,也不要为了“确认漏洞”上传持久化文件。优先使用版本、日志、会话和受控回连证据完成判断。问题定位:先回答四个时间点建立时间线时,建议先确定以下时间:漏洞设备首次收到异常请求的时间、补丁实际生效时间、相关账号最后一次合法登录时间、内网主机首次出现异常认证的时间。四者能够帮助区分“补丁前已失陷”“补丁后仍有会话复用”和普通误报。数据源重点字段异常特征VPN/SSO 日志账号、源 IP、设备指纹、会话 ID、MFA 结果同一会话短时间跨 ASN 或跨国家使用反向代理日志URI、状态码、上游地址、User-Agent、请求体长度管理接口探测、异常编码路径、连续 401 后突然 200Windows 安全日志4624、4625、4648、4672、4768、4769非常用源主机发起类型 3 登录或请求高价值服务票据Linux 审计与系统日志进程、父进程、UID、SSH 公钥、sudoWeb 服务账户启动 shell、curl、ssh 或新增定时任务DNS/防火墙源、目的、端口、域名、字节数边界设备主动连接内网管理端口或低频外联技术分析:补丁为何不能自动结束攻击链补丁通常只关闭初始漏洞入口,不会自动撤销已经签发的会话、轮换 API 密钥或删除新增账户。若设备在补丁前被访问,攻击者可能已经完成以下动作:导出或读取会话数据库、配置备份、私钥及 LDAP 绑定凭据;利用合法 VPN 会话进入内网,绕过再次触发边界漏洞;通过 SMB、WinRM、RDP 或 SSH 访问跳板机,并留下新的令牌或公钥;创建本地管理员、计划任务、systemd 服务或云平台访问密钥;清理边界设备上的临时文件,仅保留身份侧持久化。因此,验证结论至少应分成三档:仅存在易受影响版本;发现漏洞利用请求但未确认执行;确认身份材料或内网主机已被使用。不要仅凭扫描器返回的版本号直接宣布“已入侵”,也不要因补丁完成就直接关闭事件。操作步骤一:核对暴露面与补丁生效时间先从资产清单、负载均衡和 NAT 策略确认真实暴露节点,避免只检查管理平台而漏掉集群成员。对每个节点记录软件版本、镜像摘要、启动时间和配置更新时间。若厂商公告提供修复版本,应以设备本地版本和补丁状态为准,不要只依赖 HTTP Banner。# 在授权的 Linux 反向代理节点上记录版本、启动时间和监听端口 nginx -V 2>&1 systemctl show nginx -p ActiveEnterTimestamp -p ExecMainStartTimestamp ss -lntp sha256sum /etc/nginx/nginx.conf # 检查近 14 天服务变更与重启记录 journalctl --since '14 days ago' -u nginx --no-pager last -x | head -50若设备为封闭式 appliance,优先导出厂商支持包,并保留原始哈希。不要直接在设备上安装排查工具,以免改变时间戳或影响后续取证。操作步骤二:从代理日志筛选异常请求先提取管理路径、异常状态转换和罕见 User-Agent,再按源地址与时间聚合。下面的命令假设使用 Nginx combined 格式,应根据实际日志字段调整:# 找出对管理、认证、调试路径的访问 zgrep -hE '(/admin|/api/|/auth|/debug|/console)' /var/log/nginx/access.log* \ | awk '{print $1, $4, $6, $7, $9, $12}' \ | sort > /tmp/edge_suspect_requests.txt # 统计高频失败来源,作为后续关联线索,而非单独定性依据 zgrep -hE ' 401 | 403 | 404 | 500 ' /var/log/nginx/access.log* \ | awk '{count[$1]++} END {for (ip in count) if (count[ip] > 30) print count[ip], ip}' \ | sort -nr | head -50 # 检查 Web 服务账户是否启动过高风险子进程 ausearch -ts recent -m EXECVE 2>/dev/null \ | grep -E 'curl|wget|bash|sh|python|perl|nc|ssh'排查时应特别关注同一源地址先连续出现 401/403,随后请求管理接口返回 200 的情况。还要检查 URL 解码后的路径;双重编码、路径穿越片段和超长查询参数可能在原始日志里不直观。若代理前方还有 CDN,应确认记录的是真实客户端地址,并验证 X-Forwarded-For 是否只由受信代理写入,否则该字段可以被伪造。操作步骤三:验证会话是否被跨地址复用会话复用最有效的证据不是“某账号异地登录”,而是同一会话 ID 或同一刷新令牌在不合理时间内由不同网络使用。建议从认证平台导出脱敏后的会话标识、源 IP、设备 ID、签发时间、MFA 时间和注销时间,按会话聚合。# 示例 CSV 字段:time,user,session_id,src_ip,device_id,mfa_result # 找出同一会话对应多个源 IP 的记录 python3 - <<'PY' import csv from collections import defaultdict sessions = defaultdict(lambda: {'ips': set(), 'users': set(), 'rows': []}) with open('vpn_sessions.csv', newline='', encoding='utf-8') as f: for row in csv.DictReader(f): sid = row['session_id'] sessions[sid]['ips'].add(row['src_ip']) sessions[sid]['users'].add(row['user']) sessions[sid]['rows'].append(row) for sid, item in sessions.items(): if len(item['ips']) > 1: print(sid, sorted(item['users']), sorted(item['ips']), len(item['rows'])) PY多 IP 并不必然代表入侵,移动网络、企业出口切换和代理服务都会造成变化。进一步判断时,应结合 ASN、地理距离、设备指纹、MFA 是否重新触发,以及两个地址是否在时间上重叠。若平台支持 Token Family 或 Refresh Token Rotation,应优先检查同一令牌族的重放告警。操作步骤四:追踪内网横向认证Windows 域环境中,重点看边界访问发生后是否出现新的类型 3 网络登录、显式凭据使用或高权限登录。可在经过授权的日志汇聚节点上查询:# PowerShell:筛选最近 7 天关键安全事件 $start = (Get-Date).AddDays(-7) Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4624,4625,4648,4672,4768,4769; StartTime=$start } | Select-Object TimeCreated, Id, MachineName, Message | Export-Csv .\auth_timeline.csv -NoTypeInformation -Encoding UTF8 # Linux:检查新增 SSH 公钥、sudo 与计划任务变更 find /home /root -path '*/.ssh/authorized_keys' -type f -mtime -14 -ls 2>/dev/null journalctl --since '7 days ago' _COMM=sshd --no-pager journalctl --since '7 days ago' _COMM=sudo --no-pager find /etc/cron* /var/spool/cron -type f -mtime -14 -ls 2>/dev/null事件 4624 应结合 LogonType、IpAddress、WorkstationName 和 TargetUserName 判断;4672 只说明登录会话获得敏感特权,不应单独作为恶意证据。4769 中访问非常用服务器的 CIFS、HOST、HTTP 服务票据更值得关联。若 VPN 地址池固定,可先用该网段筛选,再追查这些账号后续访问过的主机。操作步骤五:检查权限边界与持久化确认异常认证后,不要只重置单个用户密码。应检查该身份能否读取密码库、虚拟化平台、备份系统、域控管理接口或云控制台。重点审计以下边界:VPN 用户组是否被直接映射到服务器管理组;堡垒机是否允许会话转发、文件传输或保存明文凭据;服务账号是否允许交互式登录,是否拥有不必要的本地管理员权限;反向代理节点是否能直接访问域控、备份网络或管理平面;API Token 是否缺少来源限制、过期时间或细粒度权限。在验证环境中可使用“最小证明”方法:仅确认受控低权限账号能否到达目标端口、能否读取无敏感内容的测试资源,不继续扩展权限。报告中应记录测试账号、源地址、时间、目标和停止条件,确保操作可与真实攻击活动区分。风险与修复建议优先级措施验证方式立即隔离疑似失陷节点,吊销全部相关会话和刷新令牌旧会话再次访问应返回 401,认证平台不再接受旧令牌族立即轮换设备私钥、LDAP 绑定密码、API Key 和运维凭据旧凭据失效,新凭据只授予最小权限高检查并删除未授权账户、公钥、计划任务和服务与基线配置、CMDB 和变更单逐项比对高限制边界节点到内网的东西向访问防火墙仅放行明确业务目的地址与端口中缩短高权限会话寿命,启用刷新令牌轮换与重放检测模拟旧令牌复用,确认平台产生告警并撤销令牌族中统一时间同步并集中保存认证、DNS、代理和终端日志随机抽取事件可在各数据源按秒级时间关联如果已经确认边界设备被执行任意代码,单纯“删除可疑文件”通常不够。对于无法证明完整性的封闭设备,应按厂商建议重置或从可信镜像重建,再导入经过审计的配置。密钥轮换应在重建后完成,避免新凭据再次写入仍受控的旧节点。日志留痕建议建议至少保留原始日志、查询结果、时间线和处置动作四类材料。导出后计算 SHA-256,并记录时区、采集人、采集命令和源系统。日志保存周期应覆盖边界设备公告披露前后的潜伏期;高价值环境可将认证与网络元数据保留 180 天以上,具体以组织合规要求为准。# 对导出证据生成清单,避免后续分析时无法确认文件是否变化 find ./evidence -type f -print0 | sort -z | xargs -0 sha256sum > evidence.sha256 sha256sum -c evidence.sha256总结这类威胁动态的核心不是某个漏洞编号,而是处置边界已经从“修补设备”扩大到“撤销身份、追踪横向、重建信任”。授权测试和事件排查应以时间线为主轴,把代理请求、会话记录、内网认证和权限变更串成完整证据链。只有同时完成会话吊销、凭据轮换、权限收敛、节点重建和日志验证,才能真正关闭补丁之后仍可能存在的访问路径。 服务器、云资产与权限边界梳理示意 安全动态、影响面和处置建议示意
12小时前12小时 补丁上线只能堵住入口,不能默认历史会话已经失效。建议把排查拆成“令牌是否仍可用”和“令牌对应账号是否已经在内网落点”两条线,并先保全边界设备升级前后的日志、会话库和配置快照。 1. 先做会话级止血 在 VPN、SSO、反向代理和 IdP 侧批量撤销补丁前签发的会话,轮换签名密钥、Cookie 加密密钥及设备侧 API 密钥;仅重置用户密码通常不会让现有 Cookie/JWT 失效。 如果 JWT 无法逐个吊销,可临时提高服务端校验:限制 iat 早于补丁时间的令牌,核验 iss/aud/exp/nbf,并要求高权限操作重新认证。不要只依赖前端删除 Cookie。 检查 HA 节点是否共用旧密钥或旧会话库,避免只处理主节点,备用节点仍接受旧令牌。 2. 查令牌复用,而不只是查失败登录 重点关联补丁前后至少 7~14 天的网关访问日志、VPN 审计、IdP 登录日志。优先找同一 session_id、JWT jti 或 Cookie 指纹在短时间内跨公网 IP、ASN、国家、User-Agent 使用的情况;还要关注“没有再次登录,却直接出现已认证请求”。日志落盘时只保存令牌的 HMAC 指纹,不要记录原始令牌。 # 假设日志为 JSON,按会话聚合来源 IP 和 UA jq -r 'select(.auth=="success") | [.session_id,.src_ip,.user_agent,.user,.time] | @tsv' access.json \ | sort -k1,1 > session-use.tsv # 快速找被多个来源 IP 使用的会话 awk -F '\t' '{k=$1 SUBSEP $2; s[k]=1; user[$1]=$4} END { for (k in s) {split(k,a,SUBSEP); n[a[1]]++} for (i in n) if (n[i]>1) print i,user[i],n[i] }' session-use.tsv 如果是 Splunk,可先做这一层筛选: index=edge (action=allowed OR auth=success) session_id=* | stats dc(src_ip) as ips values(src_ip) as src dc(user_agent) as uas values(user_agent) as ua min(_time) as first max(_time) as last by session_id user | where ips > 1 OR uas > 2 | convert ctime(first) ctime(last) 多 IP 本身不等于入侵,移动网络和企业代理会产生噪声。应再结合 ASN、地理距离、请求间隔、UA/TLS 指纹,以及敏感接口访问判断。反过来,攻击者经同一出口代理时,IP 不变,因此还要看新 UA、异常资源路径和会话首次使用时间。 3. 从账号向内网反查落点 把可疑会话对应的账号、首次异常时间和边界设备分配的内网地址作为种子,向前后各扩 2~4 小时关联: 域控:4624/4625/4648/4672、4768/4769/4776;重点看 Logon Type 3、异常工作站名、短时间访问多台主机。 终端:4688、Sysmon 1/3/10、EDR 进程树;关注浏览器或 VPN 客户端后继的 cmd、powershell、rundll32、远程管理工具。 横向:SMB 5140/5145、计划任务 4698、服务安装 7045、WinRM 5985/5986、RDP 3389,以及异常 LDAP/远程注册表访问。 网络侧:由 VPN 地址池或边界管理口发起的 DNS、SMB、RDP、WinRM、SSH 流量,尤其是此前从未访问过的服务器网段。 # Windows 端按可疑时间窗提取关键事件 $start = Get-Date '2025-01-15 02:00:00' $end = Get-Date '2025-01-15 06:00:00' Get-WinEvent -FilterHashtable @{ LogName='Security'; StartTime=$start; EndTime=$end Id=4624,4648,4672,4688,4698,5140,5145 } | Export-Csv .\suspect-window.csv -NoTypeInformation -Encoding UTF8 # 系统日志中的服务创建 Get-WinEvent -FilterHashtable @{ LogName='System'; StartTime=$start; EndTime=$end; Id=7045 } | Format-List TimeCreated,MachineName,Message 4. 判断是否已经形成持久化 不要只检查边界设备。对命中的终端和服务器检查新增本地/域账号、组成员变化、计划任务、服务、启动项、WebShell、SSH key、OAuth 应用授权和邮箱规则。若边界设备支持命令执行,还应核对其配置变更、管理员登录、未知文件、启动脚本及出站连接。 最终建议形成一张时间线:漏洞利用或异常请求 → 会话首次异常使用 → VPN/SSO 身份 → 内网源地址 → 首台主机 → 后续认证与横向行为。这样才能区分“令牌被复制但未进入内网”和“已经建立落点”。确认复用后,应隔离命中主机、吊销账号全部会话、重置相关凭据,并在验证 HA 节点和旧令牌均失效后再恢复访问。