跳转到帖子

授权内网测试中 SMB 可访问但远程服务操作失败,如何定位权限边界与日志留痕?

精选回复

发布于

问题背景

在已授权的内网测试中,测试账号能够访问目标主机的 445 端口,甚至可以完成 SMB 身份认证,但远程查询或创建服务时返回“拒绝访问”或“RPC 服务器不可用”。这类情况应如何区分网络、身份、令牌过滤和服务控制管理器权限问题?目标端应检查哪些日志?

这类问题不能只用“445 端口已开放”判断权限是否成立。SMB 文件共享和远程服务控制是两条相关但不等价的链路:前者主要涉及 TCP 445、共享权限和 NTFS 权限;后者通常还依赖 RPC Endpoint Mapper、动态 RPC 端口、服务控制管理器权限以及目标主机实际生成的访问令牌。

先明确验证边界

建议使用专门的测试账号,并记录测试源 IP、目标主机、开始时间和结束时间。不要直接以生产域管理员账号反复尝试,也不要为了“让测试通过”临时关闭防火墙、UAC 或终端防护。

  • SMB 认证成功,不代表能够访问 ADMIN$。
  • 能够访问 ADMIN$,不代表具备远程服务控制权限。
  • 出现 4624,不代表已经获得管理员令牌。
  • 出现 4672,只说明该登录会话被分配了敏感特权,仍需结合具体操作日志判断。
  • 未出现 7045,也不能证明没有发生其他远程管理行为,例如 WinRM、WMI 或计划任务操作。

第一步:拆分网络与协议问题

从测试端分别验证 SMB、RPC Endpoint Mapper 和 WinRM。不要只使用端口扫描结果,因为中间防火墙可能允许建立连接,但拦截后续动态 RPC 流量。

$target = '10.10.10.20'
Test-NetConnection $target -Port 445
Test-NetConnection $target -Port 135
Test-NetConnection $target -Port 5985
Test-NetConnection $target -Port 5986

# 仅验证共享访问,不写入文件
cmd /c "dir \\$target\ADMIN$"

# 仅查询远程服务列表,不创建或修改服务
sc.exe \\$target query

结果可以按下面的方式理解:

  • 445 不通:优先检查主机防火墙、网络 ACL、Server 服务和 SMB 监听状态。
  • 445 可通但 ADMIN$ 拒绝访问:重点检查账号是否属于目标本地管理员组、远程 UAC 过滤、共享权限和账号来源。
  • ADMIN$ 可访问,但远程服务查询提示 RPC 不可用:检查 TCP 135、动态 RPC 端口以及“远程服务管理”相关防火墙规则。
  • 远程服务查询成功,但修改操作被拒绝:通常已经进入服务控制管理器权限或令牌权限问题,不应继续归因于 SMB。

第二步:确认目标端实际身份与权限

在目标主机本地或经批准的管理通道上检查管理员组成员。需要注意,嵌套域组可能不会被简单的本地组列表完全展开,最终应以实际登录令牌和域组关系为准。

whoami /all
Get-LocalGroupMember -Group 'Administrators'

Get-Service RpcSs,LanmanServer,WinRM
Get-NetTCPConnection -State Listen |
  Where-Object LocalPort -in 135,445,5985,5986 |
  Select-Object LocalAddress,LocalPort,OwningProcess

reg.exe query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy

如果测试使用的是目标主机本地管理员账号,应重点关注远程 UAC 令牌过滤。LocalAccountTokenFilterPolicy 不存在或为 0 时,本地管理员通过网络登录通常会得到受过滤令牌;设置为 1 会削弱这一保护,不建议把修改该值作为常规修复方案。更稳妥的做法是使用受控域账号、JEA、受限 WinRM 或集中运维平台完成远程管理。

如果使用域账号,还应确认其域组成员关系已同步,并排除 Kerberos 票据尚未更新的情况。账号刚被加入管理组时,旧登录会话中的访问令牌不会自动刷新,通常需要注销并重新登录后再验证。

第三步:按时间窗口收集日志

建议以测试开始时间前后 15 至 30 分钟为窗口,在目标端导出 Security 和 System 日志。关键事件包括:

  • 4624:成功登录。网络访问通常对应登录类型 3。
  • 4625:登录失败,可查看 Status 和 SubStatus 区分错误密码、账号限制和登录类型限制。
  • 4672:为新登录分配敏感特权,应通过 Logon ID 与 4624 关联。
  • 4688:进程创建,需要提前启用“审核进程创建”;命令行记录还需启用相应策略。
  • 4697:安装服务,依赖“审核安全系统扩展”。
  • 5140:访问网络共享,通常每个共享会话记录一次。
  • 5145:详细共享访问,可看到共享名、相对目标名称和访问权限。
  • 7045:System 日志中的服务安装事件,包含服务名、映像路径和启动类型。
New-Item -ItemType Directory -Path 'C:\IR' -Force | Out-Null
$start = (Get-Date).AddMinutes(-30)
$securityIds = 4624,4625,4672,4688,4697,5140,5145

Get-WinEvent -FilterHashtable @{
  LogName='Security'
  Id=$securityIds
  StartTime=$start
} | Sort-Object TimeCreated |
  Select-Object TimeCreated,Id,MachineName,Message |
  Out-File 'C:\IR\security-window.txt' -Encoding utf8

Get-WinEvent -FilterHashtable @{
  LogName='System'
  Id=7045
  StartTime=$start
} | Sort-Object TimeCreated |
  Select-Object TimeCreated,Id,MachineName,Message |
  Out-File 'C:\IR\service-install-window.txt' -Encoding utf8

# 查看当前审核策略,子类别名称可能随系统语言变化
auditpol.exe /get /category:*

分析时不要只按事件 ID 搜索。应至少关联以下字段:

  • 4624 中的源网络地址、目标账号、登录类型和 Logon ID。
  • 4672、5140、5145 中与登录会话对应的 Logon ID。
  • 5145 中的 Share Name、Relative Target Name 和 Access Mask。
  • 7045 中的 Service Name、Image Path、Service Type 和 Start Type。
  • 4697 中的 SubjectLogonId,用于确定发起服务安装的安全主体。

7045 本身通常不能直接给出远端源 IP,因此应以时间为主线,将其与 4624、5145、4697、4688 以及防火墙日志关联。若部署了 Sysmon,还可以参考事件 1 的进程创建和事件 3 的网络连接,但事件 3 默认可能未启用,并且高流量服务器需要谨慎配置过滤规则。

常见误判

  • 把 4624 当作提权成功:4624 只说明一次登录成功,必须检查登录类型、账号、源地址和后续授权结果。
  • 把 4672 当作域管理员证据:本地 SYSTEM、服务账号及部分内置主体也会产生 4672。
  • 看到 ADMIN$ 就认为发生文件投递:5140 仅代表共享被访问,是否读取或写入应查看 5145 的目标路径和访问权限。
  • 没有 7045 就认定不存在横向行为:WMI、WinRM、远程计划任务和远程注册表具有不同的日志链路。
  • 直接启用 LocalAccountTokenFilterPolicy:这会扩大本地管理员凭据被用于横向移动的风险。

修复与加固建议

  • 限制 TCP 445、135 和动态 RPC 端口的来源,仅允许管理网段或跳板机访问。
  • 避免多台主机复用本地管理员密码,使用 Windows LAPS 管理唯一且定期轮换的本地管理员凭据。
  • 优先通过 WinRM HTTPS、JEA 或受控运维平台提供最小权限管理,不把 ADMIN$ 和远程服务管理作为通用运维入口。
  • 通过组策略启用登录、详细文件共享、进程创建和安全系统扩展审核,并根据日志量调整 Security 日志容量。
  • 启用进程命令行审核前评估敏感参数泄露风险,日志平台应限制读取权限和保存周期。
  • 对 7045、4697 以及异常 5145 写入行为建立告警,重点关注用户可写目录、临时目录和非标准服务路径。
  • 保留主机防火墙,不要用全局关闭防火墙的方法排障;应创建限定源地址、目标端口和程序的临时规则,并在验证后回收。
  • 完成测试后检查是否遗留测试文件、服务、账号、计划任务或防火墙规则,并保存清理记录。

结论

SMB 可访问但远程服务操作失败,通常不是单一端口问题。可靠的定位顺序是:先拆分 445、135 和动态 RPC 链路,再确认账号在目标端生成的实际令牌,最后通过 4624、4672、5145、4697 和 7045 建立时间线。排障目标应是确认权限边界和审计覆盖是否符合设计,而不是通过关闭安全机制强行让验证成功。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
网络流量与边界分析示意图
网络请求、日志与边界流量分析示意

SMB 可访问只说明 445、身份认证和某个共享对象的 ACL 通过了,不代表该账号具备 SCM、WMI、计划任务或 WinRM 的远程管理权限。建议先用只读操作把失败点分层,不要直接通过关闭 UAC、防火墙来验证。

1. 先确认实际使用的身份和认证方式

net use \\TARGET\IPC$ /delete
klist purge
net use \\TARGET\IPC$ /user:DOMAIN\User *
net use \\TARGET\IPC$
klist

重点排除已有 SMB 会话复用了其他凭据。Windows 对同一目标同时使用多组凭据时也可能出现 1219 错误。域环境下再看是否拿到了目标的 CIFS Kerberos 票据;只有 NTLM 时,需要继续检查 DNS、SPN、时间同步和域连通性。

建议分别测试:

dir \\TARGET\Share
dir \\TARGET\ADMIN$
sc.exe \\TARGET query type= service state= all

powershell -NoProfile -Command "Test-NetConnection TARGET -Port 445"
powershell -NoProfile -Command "Test-NetConnection TARGET -Port 135"
powershell -NoProfile -Command "Test-WSMan TARGET"
  • 普通共享可读、ADMIN$ 拒绝:通常只是共享或文件 ACL 权限,不具备远程管理权限。
  • sc.exe 返回错误 5:已到达 SCM,但令牌或 SCM/服务对象 DACL 不允许。
  • 返回 1722:优先检查 RPC、防火墙及动态 RPC 端口,而不是 SMB 权限。
  • 返回 1326:认证或凭据问题。
  • WinRM、WMI、SCM 使用的是不同授权模型,某一种成功不能推导其他方式也成功。

2. 检查目标端权限边界

在目标机由管理员执行只读检查:

whoami /all
net localgroup Administrators
sc.exe sdshow scmanager
sc.exe sdshow ServiceName

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy

secedit /export /cfg C:\Windows\Temp\secpol.cfg
findstr /i "SeNetworkLogonRight SeDenyNetworkLogonRight" C:\Windows\Temp\secpol.cfg

常见边界包括:

  • 账号能通过网络登录,但不在本地管理员组,也没有被单独授予服务查询、启动或停止权限。
  • 使用目标机本地管理员账号时,被 Remote UAC 过滤成受限令牌。LocalAccountTokenFilterPolicy 默认值或值为 0 时需要重点关注,但不建议为了测试直接改成 1;更合理的是使用域账号、JEA/WinRM 委派,或给具体服务设置最小权限。
  • SCM 管理器允许枚举,但具体服务 DACL 不允许启动、停止或修改,因此可能出现“能查询、不能操作”。
  • “拒绝从网络访问这台计算机”策略、受保护用户组、认证策略筒仓等覆盖了本地组成员关系。
  • 若是启动服务失败,还要区分“调用者无权控制服务”和“服务自身账号缺少作为服务登录权限、密码错误、依赖项失败”。后者通常会在 System 日志中留下明确错误。

3. 按远程管理协议检查网络路径

  • SMB/命名管道:TCP 445。
  • WMI/DCOM:TCP 135 加动态 RPC 端口。
  • WinRM:TCP 5985/5986,并受监听器、认证方式和会话配置约束。
  • 远程计划任务和 SCM 通常还受 RPC、防火墙规则组及服务状态影响。

如果 445 正常但 WMI 报 RPC 不可用,应让网络侧核对 135 及动态 RPC,不要把它归因于共享权限。可在目标机查看对应规则是否启用:

Get-NetFirewallRule |
  Where-Object DisplayGroup -match 'Windows Management|Remote Service|Remote Event Log|Windows Remote Management' |
  Select-Object DisplayName, DisplayGroup, Enabled, Direction, Action

4. 用日志判断请求到底到达了哪一层

按测试时间、源 IP、账号进行关联,重点查看:

  • Security 4624/4625:网络登录是否成功,通常为 Logon Type 3;同时看认证包、源地址和失败状态码。
  • Security 4672:是否分配了管理员级特殊权限。没有该事件并不一定表示认证失败,但能帮助判断远程令牌。
  • Security 5140/5145:共享和具体文件/命名管道访问,5145 中的访问掩码及状态可区分共享 ACL、NTFS ACL和管道访问。
  • System / Service Control Manager:服务启动、停止、登录失败及配置变化;创建服务常见为 7045。
  • Microsoft-Windows-WMI-Activity/Operational:WMI 请求和提供程序错误。
  • Microsoft-Windows-TaskScheduler/Operational:计划任务注册、启动和执行结果。
  • Microsoft-Windows-WinRM/Operational:WinRM 认证、监听器及会话错误。
  • Windows Defender Firewall 日志或 Security 5156/5157:判断是否被主机防火墙允许或阻止。

可以先导出测试时间窗,避免只截取单条事件:

$start = (Get-Date).AddMinutes(-30)

Get-WinEvent -FilterHashtable @{
    LogName   = 'Security'
    Id        = 4624,4625,4672,5140,5145,5156,5157
    StartTime = $start
} | Select-Object TimeCreated, Id, Message |
    Out-File C:\Windows\Temp\remote-test-security.txt -Width 300

Get-WinEvent -FilterHashtable @{
    LogName      = 'System'
    ProviderName = 'Service Control Manager'
    StartTime    = $start
} | Select-Object TimeCreated, Id, LevelDisplayName, Message |
    Out-File C:\Windows\Temp\remote-test-scm.txt -Width 300

如果 4624 已成功、5145 显示命名管道访问成功,但 sc.exe 返回错误 5,基本可以把范围收敛到远程令牌过滤或 SCM/具体服务 DACL;如果目标端完全没有对应认证事件,则应回到名称解析、凭据复用、网络设备或实际连接目标是否正确。

最后建议在测试记录里保存精确时间、源/目标 IP、使用账号、执行命令、原始错误码和对应事件 ID。尤其不要只写“SMB 成功、服务失败”,这两个结论分别属于连通性、认证和对象授权的不同层级。

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

最近浏览 0

  • 没有会员查看此页面。