发布于10月9日10月9日 背景最近做了一次授权内网渗透测试,目标不是“打穿”为止,而是验证权限边界是否合理、横向路径是否可控、日志是否能还原关键动作。环境比较典型:办公网与服务器区逻辑隔离不彻底,域控、文件服务器、运维跳板机都在同一 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 横向权限。但它反映的是内网里最常见的权限边界问题:共享权限过宽、服务账号复用、本地管理员泛化、日志关联不足。授权渗透测试里,建议不要只停留在“拿到权限”的结果,而要把证据链闭环:入口在哪里、权限如何扩大、横向能到哪里、日志是否可见、修复如何验证。这样报告对甲方安全建设才有实际价值,也方便蓝队按链路做检测和加固。 服务器、云资产与权限边界梳理示意
10月9日10月9日 这类“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 最后,报告里最好把每台目标主机的结果拆成三类: `认证成功但无管理员权限`、`可访问管理共享`、`可远程执行`。这三类风险等级和修复措施不一样,混在一起写容易导致整改不到位。
10月10日10月10日 补充一个我在内网授权测试里常用的闭环思路:除了证明“这条 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 关闭、本地管理员组已收敛、防火墙来源已限制。 这样一来,报告链路会比较完整:横向验证现象 → 认证/权限证据 → 根因配置 → 修复措施 → 复测失败证据。后续安全运营接手时,也更容易把规则和基线落下去。
创建帐户或登录后发表意见