跳转到帖子

渗透攻防实战:一次授权内网测试中的 SMB 横向验证、日志留痕与修复闭环

精选回复

发布于

背景

最近做了一次授权内网渗透测试,目标不是“打穿”为止,而是验证权限边界是否合理、横向路径是否可控、日志是否能还原关键动作。环境比较典型:办公网与服务器区逻辑隔离不彻底,域控、文件服务器、运维跳板机都在同一 AD 域内,终端大多开启了 SMB、WinRM,但防火墙策略比较粗。

本文记录其中一条比较常见的链路:低权限域用户登录终端后,通过共享目录与凭据暴露定位到高权限账号,再验证 SMB 横向访问边界。所有动作均限定在授权范围内,重点放在漏洞验证、排查方法、日志留痕和修复建议。

说明:以下命令和方法用于授权渗透测试、蓝队复盘和内网安全验证,不涉及破坏性操作。

问题定位

测试初期拿到的是一个普通域账号,权限较低,能正常登录一台办公终端。常规信息收集后发现几个问题:

  • 部分服务器允许普通域用户枚举 SMB 共享。
  • 文件服务器存在可读的运维脚本目录。
  • 脚本中出现明文服务账号密码。
  • 服务账号对多台服务器本地 Administrators 组有权限。
  • 域控安全日志可看到登录事件,但未对横向登录行为做有效告警。

这类问题在内网渗透里很常见,真正有价值的是把链路验证清楚:账号从哪里来、能访问哪些资产、产生哪些日志、应如何阻断。

技术分析

本次链路的关键点不是单一漏洞,而是多个配置问题叠加:

  • 共享目录权限过宽:普通域用户可读取运维目录。
  • 凭据管理不规范:批处理和 PowerShell 脚本中保存明文账号密码。
  • 本地管理员权限泛化:同一服务账号被加入多台服务器本地管理员组。
  • 横向访问缺少边界:SMB 445 在服务器间和办公网到服务器区均未做细粒度限制。
  • 日志监控不完整:只记录登录成功,没有关联账号、来源 IP、目标主机和登录类型。

验证思路是先做低噪声枚举,再确认共享访问权限,随后只验证最小必要的横向访问,不执行破坏性命令。

操作步骤

1. 当前身份与域信息确认

先确认当前用户、域、登录服务器,避免误判权限来源。

whoami /all
whoami /groups
echo %USERDOMAIN%
echo %LOGONSERVER%
nltest /dsgetdc:corp.local
net config workstation

重点看当前用户是否属于特殊组,例如 Account Operators、Server Operators、Backup Operators,或者被嵌套进某些业务组。很多时候“普通账号”实际通过组嵌套拿到了额外权限。

2. SMB 共享枚举

在授权范围内,对服务器网段做 SMB 连通性确认。这里不建议一上来就高并发扫全网,容易影响业务,也容易制造大量噪声。可以先从资产清单、DNS、AD 计算机对象中提取服务器列表。

net view /domain
net view \\filesrv01
net view \\ops-jump01

powershell -NoProfile -Command "Get-ADComputer -Filter 'OperatingSystem -like \"*Server*\"' -Properties OperatingSystem | Select-Object Name,OperatingSystem"

如果当前机器没有 RSAT 模块,也可以通过 DNS 或已有资产清单辅助定位,不强依赖域模块。

3. 共享目录权限验证

发现文件服务器存在共享目录后,重点验证普通域用户是否可读敏感路径。

dir \\filesrv01\share
dir \\filesrv01\share\ops
dir \\filesrv01\share\ops\scripts
findstr /S /I /N "password passwd pwd user domain credential" \\filesrv01\share\ops\scripts\*.bat \\filesrv01\share\ops\scripts\*.ps1

本次在一个部署脚本中发现类似内容:

net use \\app01\c$ /user:corp\svc_deploy P@ssw0rd_xxx
copy .\release.zip \\app01\c$\deploy\

这里不要急着扩大动作面。应先记录文件路径、访问权限、账号用途,并确认该账号是否仍有效。

4. 服务账号权限边界验证

验证账号权限时建议遵循最小验证原则,只确认是否能认证、是否具备管理访问,不做持久化、不投递文件、不执行高风险命令。

cmdkey /add:app01 /user:corp\svc_deploy /pass:P@ssw0rd_xxx
net use \\app01\admin$
dir \\app01\admin$\Temp
net use \\app01\admin$ /delete
cmdkey /delete:app01

如果能访问 admin$,基本可以证明该账号在目标主机具备本地管理员权限。测试时应记录目标主机、时间点、来源 IP、使用账号,方便蓝队侧对照日志。

也可以使用 PowerShell 远程管理验证 WinRM 权限,但不建议在未确认策略前批量执行。

Test-NetConnection app01 -Port 445
Test-NetConnection app01 -Port 5985

# 只做身份验证和主机名查询,不执行敏感操作
$sec = ConvertTo-SecureString 'P@ssw0rd_xxx' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('corp\svc_deploy', $sec)
Invoke-Command -ComputerName app01 -Credential $cred -ScriptBlock { hostname; whoami }

5. 日志留痕排查

蓝队复盘时,Windows 侧重点关注以下日志:

  • 4624:登录成功,关注 LogonType 3(网络登录)、10(远程交互)。
  • 4625:登录失败,关注爆破或密码试探。
  • 4672:分配特殊权限,常见于管理员登录。
  • 5140:访问网络共享对象。
  • 5145:详细共享访问检查,需要开启对象访问审核。
  • 4688:进程创建,需要开启命令行审计。

在目标服务器 app01 上可以用 PowerShell 快速筛选测试时间段内的登录事件:

$start = Get-Date "2024-05-20 10:00:00"
$end   = Get-Date "2024-05-20 11:00:00"

Get-WinEvent -FilterHashtable @{
  LogName='Security';
  Id=4624;
  StartTime=$start;
  EndTime=$end
} | ForEach-Object {
  $xml = [xml]$_.ToXml()
  [PSCustomObject]@{
    TimeCreated = $_.TimeCreated
    TargetUser  = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'}).'#text'
    Domain      = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetDomainName'}).'#text'
    LogonType   = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'}).'#text'
    IpAddress   = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'}).'#text'
    Workstation = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'WorkstationName'}).'#text'
  }
} | Sort-Object TimeCreated

如果开启了共享访问审核,可以继续查 5140/5145,定位访问了哪个共享:

Get-WinEvent -FilterHashtable @{
  LogName='Security';
  Id=5140;
  StartTime=$start;
  EndTime=$end
} | ForEach-Object {
  $xml = [xml]$_.ToXml()
  [PSCustomObject]@{
    TimeCreated = $_.TimeCreated
    Account     = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'SubjectUserName'}).'#text'
    ClientIP    = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'}).'#text'
    ShareName   = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'ShareName'}).'#text'
  }
}

日志关联时建议以“账号 + 来源 IP + 目标主机 + 登录类型 + 共享名”为主线。单看 4624 意义有限,尤其是服务账号本来就会登录多台机器,必须结合资产归属和时间窗口判断是否异常。

关键配置检查

下面几项配置建议在域环境中重点核查。

检查项风险表现建议处理
共享目录 ACLDomain Users 可读运维脚本、备份文件按业务组授权,移除 Everyone、Authenticated Users 的宽权限
服务账号使用范围同一账号管理多台服务器按系统拆分账号,限制登录主机
本地管理员组svc_deploy 等账号广泛存在于 Administrators使用 GPO 或 LAPS/Windows LAPS 管控本地管理员
SMB 访问边界办公网可直连服务器 445按网段和资产角色限制 SMB,仅允许必要来源
审计策略只有登录日志,无共享访问和进程命令行开启高级审核策略与命令行记录

风险与修复建议

  • 清理明文凭据:脚本、配置文件、共享目录、部署包中不要保存明文密码。历史文件和备份也要查,不能只改当前版本。
  • 轮换泄露账号密码:发现明文凭据后,应立即评估使用范围并轮换密码。若账号权限较高,建议同步排查近期登录记录。
  • 限制服务账号登录位置:通过 GPO 设置“拒绝本地登录”“拒绝通过远程桌面服务登录”,并限制可访问主机。
  • 收敛本地管理员权限:不要把域服务账号长期放入多台服务器本地 Administrators。确有需要时应使用分级账号和临时授权。
  • 加固 SMB 暴露面:服务器管理共享不应对办公网大范围开放。防火墙上按源 IP、管理网段、跳板机做白名单。
  • 开启关键审计:建议开启 4624、4625、4672、4688、5140、5145,并将日志集中到 SIEM 或日志平台。
  • 建立横向行为告警:对服务账号从非预期来源登录、短时间访问多台主机、访问 admin$、c$ 等行为建立规则。

高级审核策略可参考如下配置方向:

auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Logoff" /success:enable
auditpol /set /subcategory:"Special Logon" /success:enable
auditpol /set /subcategory:"File Share" /success:enable /failure:enable
auditpol /set /subcategory:"Detailed File Share" /success:enable /failure:enable
auditpol /set /subcategory:"Process Creation" /success:enable

同时建议开启进程命令行记录:

reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit" /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f

总结

这条渗透链路本身并不复杂:普通域用户读取共享目录,发现明文服务账号,再验证 SMB 横向权限。但它反映的是内网里最常见的权限边界问题:共享权限过宽、服务账号复用、本地管理员泛化、日志关联不足。

授权渗透测试里,建议不要只停留在“拿到权限”的结果,而要把证据链闭环:入口在哪里、权限如何扩大、横向能到哪里、日志是否可见、修复如何验证。这样报告对甲方安全建设才有实际价值,也方便蓝队按链路做检测和加固。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
这类“SMB 横向验证”在授权测试里建议把证据链做细一点,不然复盘时很容易只剩“能连上/不能连上”的结论。 我一般会补三块: 1. **把 SMB 访问和认证日志对齐** Windows 侧重点看这些事件: - `4624`:登录成功,重点关注 `Logon Type = 3` - `4625`:登录失败 - `4672`:分配了特殊权限,判断是否管理员权限落地 - `5140`:访问共享对象 - `5145`:详细共享访问,能看到访问的共享路径和权限判断 - `7045`:新服务安装,排查是否出现服务型横向 - `4688`:进程创建,如果已开启命令行审计,价值很高 可以在被访问主机上快速筛一段时间窗口:
wevtutil qe Security /q:"*[System[(EventID=4624 or EventID=4625 or EventID=4672 or EventID=5140 or EventID=5145)]]" /f:text /c:50
如果环境里有集中日志,建议按源 IP、账号、目标主机、Logon ID 关联,而不是只按账号查。很多横向行为在多个账号复用时,单看用户名会误判。 2. **验证“可横向”时尽量避免产生高风险动作** 测试 SMB 权限时,不一定要上来就创建服务或远程执行。可以先做低影响验证:
net view \\目标IP
net use \\目标IP\IPC$ /user:DOMAIN\user password
dir \\目标IP\C$
如果只是验证本地管理员权限,可以用只读动作判断,例如查询远程管理共享是否可访问:
dir \\目标IP\ADMIN$
dir \\目标IP\C$\Windows\Temp
如果确实需要验证远程执行能力,建议提前约定命令内容和落点,比如只执行:
hostname
whoami
ipconfig /all
并记录执行时间、源地址、目标地址、账号,方便蓝队或运维回查。 3. **修复闭环不要只停留在“改密码”** SMB 横向成功常见根因不只是弱口令,更多是权限边界没收住。建议闭环时逐项确认: - 普通域账号是否进入了本地 Administrators 组 - 是否存在共享本地管理员密码 - 是否启用了 Administrator 远程登录 - 是否暴露 `C$`、`ADMIN$` 管理共享给过多网段 - 工作站到工作站之间是否允许 SMB 通信 - NTLM 使用是否过宽 几个可落地的配置方向: 禁用或限制本地管理员远程使用,至少启用 LAPS / Windows LAPS 管理本地管理员密码;同时限制本地账号网络登录:
secpol.msc

本地策略 - 用户权限分配:
拒绝从网络访问这台计算机:
  Local account
  Local account and member of Administrators group
如果是域环境,可以通过 GPO 下发。还可以结合防火墙限制 445 访问范围,例如只允许管理网段访问服务器 SMB,禁止办公终端之间互访:
netsh advfirewall firewall add rule name="Block SMB From Workstation Segment" ^
dir=in action=block protocol=TCP localport=445 remoteip=办公网段
同时建议检查 NTLM 审计,先审计再逐步收紧:
组策略路径:
计算机配置 - Windows 设置 - 安全设置 - 本地策略 - 安全选项

Network security: Restrict NTLM: Audit Incoming NTLM Traffic
Network security: Restrict NTLM: Audit NTLM authentication in this domain
最后,报告里最好把每台目标主机的结果拆成三类: `认证成功但无管理员权限`、`可访问管理共享`、`可远程执行`。这三类风险等级和修复措施不一样,混在一起写容易导致整改不到位。

补充一个我在内网授权测试里常用的闭环思路:除了证明“这条 SMB 链路能打通”,最好把“为什么能打通、修完后是否真的断掉”也固化下来。这样交付时不会停留在现象层。

1. 先把目标主机的 SMB 暴露面取证下来

在目标机或域管跳板上拉一下 SMB 配置、共享、会话,比单纯截图连通性更有说服力:

Get-SmbServerConfiguration |
  Select EnableSMB1Protocol,EnableSMB2Protocol,RequireSecuritySignature,EnableSecuritySignature,AuditSmb1Access

Get-SmbShare |
  Select Name,Path,Description,FolderEnumerationMode,EncryptData

Get-SmbSession |
  Select ClientComputerName,ClientUserName,Dialect,NumOpens

Get-SmbOpenFile |
  Select ClientComputerName,ClientUserName,ShareRelativePath,Permissions

如果是老系统,也可以用:

net share
net session
net file

这里重点看几个点:

  • 是否还启用了 SMBv1;
  • 是否允许匿名或 Guest 访问;
  • 管理员共享是否被普通运维账号间接可用;
  • 同一组本地管理员密码是否复用导致横向;
  • SMB 签名是否未强制,存在中间人或降级风险。

2. 区分“文件共享访问”和“远程执行”

复盘时建议把这两类分开写。很多报告里会把 \\host\C$ 能访问、服务创建、计划任务、WMI 执行混在一起,整改优先级就容易乱。

可以按下面方式描述证据:

  • 仅能枚举共享:证明账号对共享有读权限;
  • 能访问 ADMIN$ / C$:证明具备本地管理员或等效权限;
  • 能创建服务或计划任务:证明已经具备远程命令执行条件;
  • 能落地文件并被执行:证明横向路径完整,需要更高优先级整改。

验证时建议尽量用低影响动作,例如只创建空目录或读取指定测试文件,不要随手丢二进制。比如:

dir \\TARGET\C$\Windows\Temp

echo test > \\TARGET\C$\Windows\Temp\smb_auth_test.txt

del \\TARGET\C$\Windows\Temp\smb_auth_test.txt

如果必须验证远程执行,最好提前约定测试命令,例如只执行 hostname、whoami,并记录命令、时间、源 IP、目标 IP。

3. 排查本地管理员复用,可以直接给整改方一个检查口径

SMB 横向里最常见的根因不是 SMB 本身,而是本地管理员口令复用、域账号过度加入本地 Administrators。

目标机上可以快速看本地管理员组成员:

net localgroup administrators

PowerShell 方式:

Get-LocalGroupMember Administrators |
  Select Name,ObjectClass,PrincipalSource

域环境里也建议抽样检查 GPO 是否把某些域组统一下发到了本地管理员组。整改方向一般是:

  • 启用 LAPS / Windows LAPS,保证本地管理员密码唯一化;
  • 清理不必要的域账号本地管理员权限;
  • 运维账号分级,禁止普通办公账号具备服务器本地管理员权限;
  • 高权限账号禁止登录普通终端,避免凭据落点扩大。

4. 修复项建议写成可验证配置

例如 SMBv1 关闭可以这样验证:

Get-SmbServerConfiguration | Select EnableSMB1Protocol

关闭 SMBv1:

Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force

强制 SMB 签名可以检查:

Get-SmbServerConfiguration |
  Select RequireSecuritySignature,EnableSecuritySignature

需要通过组策略统一时,可关注:

  • Microsoft network server: Digitally sign communications (always)
  • Microsoft network client: Digitally sign communications (always)
  • Network security: Restrict NTLM 相关策略
  • Windows Defender Firewall 入站规则中 File and Printer Sharing 范围限制

防火墙层面不要只写“关闭 445”,很多业务确实依赖 SMB。更实际的是限制来源网段,只允许文件服务器、备份服务器、管理跳板访问:

Get-NetFirewallRule -DisplayGroup "File and Printer Sharing" |
  Get-NetFirewallAddressFilter |
  Select InstanceID,RemoteAddress

示例限制远程地址:

Set-NetFirewallRule -DisplayGroup "File and Printer Sharing" -Enabled True
Set-NetFirewallRule -DisplayGroup "File and Printer Sharing" -RemoteAddress 10.10.10.0/24,10.10.20.5

5. 复测闭环建议保留“失败证据”

整改后不要只写“已修复”,最好保留三类复测结果:

  • 源主机再次访问 \\TARGET\C$ 被拒绝;
  • 日志中能看到失败认证或被防火墙拦截记录;
  • 目标主机配置项已符合预期,例如 SMBv1 关闭、本地管理员组已收敛、防火墙来源已限制。

这样一来,报告链路会比较完整:横向验证现象 → 认证/权限证据 → 根因配置 → 修复措施 → 复测失败证据。后续安全运营接手时,也更容易把规则和基线落下去。

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

最近浏览 0

  • 没有会员查看此页面。