发布于10月10日10月10日 背景最近在一次授权内网渗透测试里,遇到一个比较典型的问题:测试账号已经拿到一台业务服务器的本地管理员权限,确认目标网段存在多台 Windows Server,但使用 SMB 进行横向验证时失败,报错不一致,有的提示访问拒绝,有的提示网络路径不可达,还有的能连 IPC$ 但无法执行远程命令。这类问题在问答区经常被问到。单纯说“权限不够”或者“防火墙拦截”都太泛,实际排查要把身份、网络、服务、UAC、远程管理策略和日志证据分开看。下面按实战排查思路整理一套流程,适合授权测试、漏洞验证和蓝队复盘使用。前提:以下内容仅针对已授权的内网安全测试或企业自查。不要在未授权环境中验证。问题定位场景如下:源主机:10.10.20.15,Windows Server 2016,已取得本地管理员权限。目标主机:10.10.20.31 / 10.10.20.32,Windows Server 2019。域环境:corp.local。测试账号:corp\svc_deploy,疑似具有部分服务器本地管理员权限。目标:验证 SMB 管理面是否可达、账号权限边界是否清晰、是否存在可被横向利用的配置问题。常见现象可以先按下面几类归档:现象优先怀疑点验证方向445 端口不通防火墙、ACL、主机未开 SMB网络连通性和 Windows 防火墙规则IPC$ 可连接但 ADMIN$ 拒绝非管理员、UAC 远程限制、共享权限本地管理员组、LocalAccountTokenFilterPolicy认证失败口令错误、账号锁定、NTLM 限制安全日志 4625、域控策略能复制文件但无法创建服务SCM 权限、服务控制管理器限制、EDR 拦截7045、4697、Sysmon 事件技术分析SMB 横向验证通常不只是“连上 445”这么简单,至少涉及以下几个点:网络层:目标 TCP/445 是否可达,是否被边界防火墙或主机防火墙阻断。认证层:使用的是域账号、本地账号还是哈希认证;NTLM/Kerberos 是否被策略限制。授权层:账号是否在目标主机 Administrators 组内,是否有访问 ADMIN$、C$、SCM 的权限。系统策略:远程 UAC、LocalAccountTokenFilterPolicy、管理员共享、远程服务管理规则。监控留痕:Windows Security、System、PowerShell、Sysmon、EDR 是否记录相关行为。尤其要注意一个容易误判的点:域账号加入目标主机本地管理员组,和本地账号远程访问时的 UAC 过滤行为不完全一样。很多时候本地管理员账号远程访问 ADMIN$ 被拒,是因为远程 UAC 过滤导致令牌被降权,而不是密码或端口问题。操作步骤1. 先确认 445 端口连通性在源主机上用 PowerShell 做最基础的连通性测试,不要一上来就跑工具:Test-NetConnection 10.10.20.31 -Port 445 Test-NetConnection 10.10.20.32 -Port 445 # 批量测试一个小网段 1..50 | ForEach-Object { $ip = "10.10.20.$_" $r = Test-NetConnection $ip -Port 445 -WarningAction SilentlyContinue if ($r.TcpTestSucceeded) { "$ip 445 open" } }如果这里不通,优先看网络 ACL 和目标主机防火墙,不要继续纠结账号权限。2. 验证 SMB 会话和共享访问net use \\10.10.20.31\IPC$ /user:corp\svc_deploy "明文密码" net view \\10.10.20.31 net use \\10.10.20.31\ADMIN$ /user:corp\svc_deploy "明文密码"结果判断:IPC$ 失败:优先查认证、账号状态、NTLM 策略。IPC$ 成功但 ADMIN$ 失败:重点看管理员权限和远程 UAC。ADMIN$ 成功:说明具备较高文件级管理权限,但不代表一定能创建远程服务。3. 在目标机确认本地管理员组如果有正常运维通道,比如 RDP、堡垒机或 EDR 控制台,可以在目标机确认:net localgroup administrators # PowerShell 查看本地管理员组成员 Get-LocalGroupMember -Group "Administrators"如果 corp\svc_deploy 不在目标主机管理员组中,ADMIN$ 拒绝是正常结果,说明权限边界生效。4. 检查远程 UAC 过滤策略在目标机查看注册表:reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy常见情况:不存在或值为 0:本地管理员账号远程访问会被 UAC 过滤。值为 1:远程本地管理员获得完整令牌,横向风险明显升高。如果测试账号是域账号,这个配置不是首要因素;如果是目标机本地管理员账号,则要重点关注。5. 验证远程服务管理能力很多攻击链会通过远程服务执行命令。蓝队复盘时也常围绕这个点查证。授权测试中可以只做低风险验证,例如查询服务状态,不建议直接投递载荷。sc.exe \\10.10.20.31 query type= service state= active # 查询远程服务控制管理器权限是否可用 sc.exe \\10.10.20.31 qc Spooler如果查询失败但 ADMIN$ 可访问,说明账号对 SCM 的操作权限可能被限制,或者被安全产品拦截。日志留痕排查从蓝队角度,SMB 横向验证至少要看以下日志。1. 目标主机 Security 日志4624:登录成功,Logon Type 3 常见于网络登录。4625:登录失败,可看 Status/SubStatus 判断原因。4672:特权登录,说明账号拿到了管理员相关特权。5140:访问网络共享对象。5145:详细文件共享访问,需要开启对象访问审计。# 查询最近 50 条网络登录成功记录 Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 50 | Where-Object { $_.Properties[8].Value -eq 3 } | Select-Object TimeCreated, Id, ProviderName, Message # 查询共享访问记录 Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5140} -MaxEvents 50 | Select-Object TimeCreated, Id, Message2. System 日志7045:新服务被安装。若出现随机服务名、异常路径,需要重点排查。Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -MaxEvents 30 | Select-Object TimeCreated, Message3. Sysmon 日志如果部署了 Sysmon,可以关注:Event ID 1:进程创建。Event ID 3:网络连接。Event ID 11:文件创建。Event ID 13:注册表值修改。Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 100 | Where-Object { $_.Id -in 1,3,11,13 } | Select-Object TimeCreated, Id, Message如果看到来自源主机 10.10.20.15 的 SMB 连接、ADMIN$ 写入、随后出现服务创建,就基本能还原一条远程服务执行链路。风险与修复建议1. 管理员权限最小化不要把通用域账号加入大量服务器本地管理员组。部署 LAPS 或 Windows LAPS,避免本地管理员口令横向复用。对运维账号做分层:普通办公账号、服务器管理账号、域管账号分离。2. 收紧 SMB 管理面服务器之间不需要互访的,限制 TCP/445。只允许堡垒机、运维网段访问管理共享。禁用不必要的管理员共享要谨慎,很多企业运维依赖 ADMIN$,更推荐用防火墙和账号权限控制。# 示例:仅允许运维网段访问 445,需按实际环境调整 New-NetFirewallRule -DisplayName "Allow SMB From Admin Subnet" ` -Direction Inbound -Protocol TCP -LocalPort 445 ` -RemoteAddress 10.10.5.0/24 -Action Allow New-NetFirewallRule -DisplayName "Block SMB From Other Subnets" ` -Direction Inbound -Protocol TCP -LocalPort 445 ` -Action Block3. 保持远程 UAC 默认安全状态除非有明确业务原因,不建议将 LocalAccountTokenFilterPolicy 设置为 1。这个配置会显著提升本地管理员账号被复用后的横向风险。# 修复建议:删除或设置为 0 reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 0 /f4. 加强日志策略开启成功和失败登录审计。开启文件共享访问审计,重点关注 ADMIN$、C$、IPC$。对 7045 服务安装事件建立告警。将 Windows 日志集中到 SIEM,避免攻击者清理本地日志后无法追溯。5. 检查 NTLM 使用情况如果环境允许,逐步减少 NTLM 依赖,优先使用 Kerberos。对高价值服务器可以设置更严格的 NTLM 限制策略,但上线前一定要做业务兼容性验证。总结SMB 横向失败不要直接归因到“工具不行”或“权限不够”。比较稳的排查顺序是:先看 445 连通性,再看认证结果,然后确认本地管理员权限、远程 UAC、SCM 权限,最后结合 4624、4625、4672、5140、5145、7045 和 Sysmon 日志还原行为链。从防护角度看,最有效的措施不是单点禁用某个功能,而是账号分层、限制 SMB 管理面、本地管理员口令唯一化、保留完整日志。这样既能降低横向移动成功率,也能在授权测试或真实事件中快速定位问题。 服务器、云资产与权限边界梳理示意
10月10日10月10日 SMB 横向失败建议先把“认证失败”和“通道/权限失败”拆开看,不然容易误判。 可以按这个顺序排: 1. 先确认目标 SMB 基础连通和协议 Test-NetConnection 目标IP -Port 445 # 看 SMB 客户端/服务端配置 Get-SmbClientConfiguration | Select EnableSecuritySignature,RequireSecuritySignature,EnableInsecureGuestLogons Get-SmbServerConfiguration | Select EnableSMB1Protocol,EnableSMB2Protocol,EncryptData,RejectUnencryptedAccess 如果 445 通,但工具报错,重点看是否存在 SMB signing、SMB 加密、NTLM 限制、Guest 禁用等策略差异。 2. 用 Windows 原生命令区分凭据问题 不要一上来就用横向工具,先用 `net use` 验证认证链路: net use \\目标IP\C$ /user:域名\用户名 密码 # 或目标是本地账户 net use \\目标IP\C$ /user:目标主机名\用户名 密码 # 清理已有连接,避免同一 SMB 会话复用旧凭据 net use * /delete /y klist purge 常见返回可以这样判断: - `System error 5`:认证过了但权限不足,或者 UAC 远程限制拦截本地管理员 Token。 - `System error 53/67`:名称解析、共享不存在、防火墙/445 问题。 - `System error 86/1326`:密码或账户不对。 - `System error 1219`:当前机器已用其他凭据连过同一目标,需要清理 SMB 会话。 如果是本地管理员账户横向失败,重点看目标机: reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy 默认情况下,本地管理员远程连接 ADMIN$/C$ 可能会被过滤。授权测试里可以让管理员临时确认策略,不建议随意改生产配置。 3. 看目标端日志定位失败点 目标机优先看这几类事件: 安全日志: - `4624` 登录成功 - Logon Type 3:网络登录,SMB 常见。 - Authentication Package:NTLM / Kerberos。 - Account Name、Source Network Address 对应来源。 - `4625` 登录失败 - Status / SubStatus 很关键。 - `0xC000006D / 0xC000006A`:用户名正确但密码错。 - `0xC0000064`:用户不存在。 - `0xC0000234`:账户锁定。 - `0xC0000072`:账户禁用。 - `0xC000015B`:没有请求的登录类型权限。 - `4672` 特权登录,判断是否拿到管理员权限。 - `5140` 访问共享。 - `5145` 详细共享访问,能看到具体共享名和访问结果。 命令筛一下最近 SMB 相关登录: Get-WinEvent -FilterHashtable @{ LogName='Security' Id=4624,4625,4672,5140,5145 StartTime=(Get-Date).AddHours(-2) } | Select TimeCreated,Id,@{n='Msg';e={$_.Message}} | Format-List 如果域环境,还要看 DC 上的: - `4768` Kerberos TGT 请求 - `4769` TGS 请求,访问 CIFS 服务一般会有 `cifs/hostname` - `4771` Kerberos 预认证失败 - `4776` NTLM 认证 很多时候目标机只有 4625,但真正原因在 DC 上更清楚。 4. 注意 SMB 访问的几个典型坑 - 用 IP 访问时 Kerberos 通常走不起来,容易退回 NTLM;如果环境禁 NTLM,会失败。建议同时测试: dir \\目标主机名\C$ dir \\目标FQDN\C$ dir \\目标IP\C$ - 目标启用了“拒绝来自网络访问这台计算机”或“允许从网络访问此计算机”策略,账号即使密码正确也会失败。检查本地安全策略: secpol.msc # 本地策略 - 用户权限分配: # Access this computer from the network # Deny access to this computer from the network - 管理共享关闭或防火墙策略不一致: net share Get-NetFirewallRule -DisplayGroup "File and Printer Sharing" | Select DisplayName,Enabled,Profile,Direction,Action - 远程执行失败不等于 SMB 失败。比如能访问 `ADMIN$`,但创建服务失败,那就是 SCM 权限、EDR、服务控制日志的问题。此时看: - System 日志 `7045`:服务创建 - Security `4697`:服务安装 - Sysmon `1/3/11`:进程、网络、文件创建,视环境而定 5. 留痕角度可以重点确认这些点 如果只是定位失败原因,别只盯着工具输出,应该把源端和目标端时间对齐: 源端可能有: - SMB 客户端连接记录 - PowerShell 执行日志 `4103/4104` - 凭据使用相关 `4648` 目标端常见: - `4625` 失败登录 - `4624 Type 3` 成功网络登录 - `5140/5145` 共享访问 - `4672` 管理员特权登录 - `7045/4697` 服务创建,如果用了 psexec 类方式 - 计划任务横向则看 `4698/4702` 和 TaskScheduler Operational 日志 可以用下面命令导出目标近 2 小时相关日志,方便复盘: wevtutil epl Security C:\Windows\Temp\security_smb.evtx /q:"*[System[(EventID=4624 or EventID=4625 or EventID=4672 or EventID=4648 or EventID=5140 or EventID=5145 or EventID=4697 or EventID=4698 or EventID=4702) and TimeCreated[timediff(@SystemTime) <= 7200000]]]" wevtutil epl System C:\Windows\Temp\system_service.evtx /q:"*[System[(EventID=7045) and TimeCreated[timediff(@SystemTime) <= 7200000]]]" 我一般会先用 `net use` + 目标 4625/4624 + DC 4769/4776 三处对照。只要能判断到底是“凭据错、协议被拦、权限不足、UAC 过滤、还是远程执行阶段失败”,后面就不会在工具参数上反复试错。
创建帐户或登录后发表意见