跳转到帖子

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

精选回复

发布于

背景

这篇记录的是一次授权内网渗透测试中的典型链路:从一台已获得普通域用户权限的办公终端出发,验证内网 SMB 暴露面、域账号权限边界、横向移动可能性,并结合日志回溯给出修复建议。重点不在“打穿”,而是在可控范围内证明风险、留下证据、避免误伤业务。

测试环境大致如下:

  • 域环境:Windows Server AD,域名示例为 corp.local
  • 测试起点:一台已授权的 Windows 10 终端,普通域用户权限
  • 目标范围:10.10.20.0/24 办公网段、部分文件服务器和运维跳板机
  • 测试限制:禁止破坏性操作,禁止批量爆破,禁止修改生产数据
说明:以下命令和思路只适用于授权渗透测试、应急排查和企业内部安全验证。实际测试中建议先和甲方确认扫描频率、账号范围、日志窗口和回滚方案。

问题定位

内网横向里,SMB 往往是最容易被低估的入口。很多企业已经关掉了外网暴露面,但内网仍存在以下问题:

  • 大量主机开放 445/TCP,且没有基于网段的访问控制
  • 域用户可以枚举共享目录,部分共享可写
  • 历史运维账号仍然具备本地管理员权限
  • 老系统仍启用 SMBv1 或允许匿名枚举
  • 日志有记录,但没人把 4624、4627、5140、7045 等事件串起来看

本次测试中,初始现象是:普通域用户登录终端后,能够访问多个文件服务器共享,并在某台测试文件服务器上发现可写目录。进一步验证发现,该目录被多个运维脚本引用,存在被利用进行横向扩散的可能。

技术分析

这类链路通常分成三段:

  • 资产发现:确认内网 SMB 服务、主机名、域信息、操作系统版本
  • 权限验证:验证当前域用户能否访问共享、是否具备写权限、是否存在本地管理员复用
  • 留痕回溯:确认登录事件、共享访问事件、服务创建事件是否可被审计发现

渗透测试里需要注意边界。比如验证共享写权限时,不建议上传可执行文件或脚本触发执行,推荐使用带时间戳的无害文本文件,并在测试完成后清理。验证本地管理员权限时,也不建议直接远程执行高风险命令,可以通过只读查询或受控命令确认。

操作步骤

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

whoami /user
whoami /groups
nltest /dsgetdc:corp.local
net config workstation
set USERDNSDOMAIN

重点看当前用户所属组、是否为域用户、是否存在异常高权限组,例如 Domain Admins、Account Operators、Server Operators,以及是否加入了某些内部运维组。

2. 低频扫描 SMB 暴露面

在授权范围内进行低频扫描,避免对终端安全软件和业务造成噪声。示例:

nmap -Pn -n -p445 --open --max-rate 50 10.10.20.0/24 -oA smb_10.10.20

如果客户对扫描较敏感,也可以优先从域控、DNS、CMDB 或 DHCP 记录获取资产,再进行定向验证。

3. 枚举共享目录并验证权限

net view \\10.10.20.15 /all
net use \\10.10.20.15\share /user:corp\test.user *

若已在域内登录,通常不需要显式输入密码,可直接访问:

dir \\10.10.20.15\share
copy test_write_marker.txt \\10.10.20.15\share\pt_write_marker_202501.txt
del \\10.10.20.15\share\pt_write_marker_202501.txt

这里的关键是只验证“是否可写”,不要上传敏感工具,不要覆盖已有文件。建议文件内容写清楚测试人员、时间、工单号,便于管理员确认。

4. 检查是否存在本地管理员权限复用

在一些企业环境中,普通域账号因为历史遗留被加入了服务器本地管理员组。可以用只读方式验证:

wmic /node:10.10.20.21 computersystem get username
wmic /node:10.10.20.21 os get caption,version,csname

如果返回 Access is denied,通常说明没有对应权限;如果能获取系统信息,说明当前凭据可能具备远程管理能力。进一步验证前应取得明确授权。

也可以让管理员在目标主机上执行:

net localgroup administrators

重点排查是否存在宽泛的域组,例如 corp\domain users、历史运维组、离职人员账号。

代码/命令示例:批量检查共享可访问性

下面是一个偏防守验证的 PowerShell 示例,只检查共享是否可列目录,不写入文件,适合在授权测试中快速形成资产清单。

$targets = Get-Content .\smb_hosts.txt
$result = @()

foreach ($ip in $targets) {
    try {
        $shares = net view \\$ip 2>$null
        if ($LASTEXITCODE -eq 0) {
            $result += [PSCustomObject]@{
                Host = $ip
                Status = "Reachable"
                Detail = ($shares -join " | ")
            }
        } else {
            $result += [PSCustomObject]@{
                Host = $ip
                Status = "Denied_or_NoShare"
                Detail = "net view failed"
            }
        }
    } catch {
        $result += [PSCustomObject]@{
            Host = $ip
            Status = "Error"
            Detail = $_.Exception.Message
        }
    }
}

$result | Export-Csv .\smb_share_check.csv -NoTypeInformation -Encoding UTF8

如果要进一步验证写权限,建议单独对确认过的测试目录执行,不要对全网共享做批量写入。批量写文件很容易触发误报,也可能污染业务目录。

日志留痕与排查方法

渗透测试不能只给一个“存在风险”的结论,还要告诉防守方如何发现它。SMB 横向相关日志主要看以下几类:

事件 ID位置含义
4624Security登录成功,重点关注 Logon Type 3 网络登录
4625Security登录失败,可用于发现密码喷洒或错误凭据尝试
4672Security特权登录,出现管理员权限时需要重点关注
5140Security访问了网络共享对象
5145Security详细文件共享访问,需开启对象访问审计
7045System创建系统服务,常见于远程执行行为

在文件服务器上可以用 PowerShell 快速筛选共享访问日志:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5140; StartTime=(Get-Date).AddDays(-1)} |
Select-Object TimeCreated, Id, ProviderName, Message |
Out-File .\share_access_5140.txt -Encoding UTF8

筛选网络登录事件:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-1)} |
Where-Object { $_.Message -match 'Logon Type:\s+3' } |
Select-Object TimeCreated, Id, Message |
Out-File .\network_logon_4624_type3.txt -Encoding UTF8

如果测试过程中进行了远程管理能力验证,还需要检查目标主机是否出现 4672 或 7045。尤其是 7045,一旦出现陌生服务名、随机文件路径或临时目录下的可执行文件,应该作为高优先级告警。

风险与修复建议

1. 收敛 SMB 访问面

  • 办公终端之间默认不应互通 445/TCP
  • 普通办公网段访问服务器 SMB 应通过白名单控制
  • 跨部门共享建议迁移到统一文件服务,并做权限分级

Windows 防火墙可参考:

New-NetFirewallRule -DisplayName "Block SMB from Office Segment" `
-Direction Inbound -Protocol TCP -LocalPort 445 `
-RemoteAddress 10.10.20.0/24 -Action Block

2. 清理共享权限

  • 避免 Everyone、Authenticated Users 拥有写权限
  • 共享权限和 NTFS 权限都要检查,最终权限取交集
  • 业务临时目录设置定期审计和过期清理

常用检查命令:

net share
icacls D:\Share
Get-SmbShare | Select-Object Name,Path,Description
Get-SmbShareAccess -Name "share"

3. 限制本地管理员组

  • 不要把大范围域组加入服务器本地管理员
  • 使用 LAPS 或 Windows LAPS 管理本地管理员密码
  • 运维账号和普通办公账号分离,禁止同一账号登录办公终端和服务器

4. 开启必要审计

建议通过组策略开启:

  • Audit Logon:Success、Failure
  • Audit Account Logon:Success、Failure
  • Audit Object Access:按关键共享目录开启
  • Audit System Events:Success、Failure

对于关键文件服务器,可以对敏感共享目录配置 SACL,记录写入、删除、权限变更事件。不建议全盘开启详细审计,否则日志量会很大。

5. 建立检测规则

可以先做几个基础关联:

  • 同一账号短时间访问大量主机的 445
  • 普通办公账号在服务器产生 4672 特权登录
  • 工作时间外访问大量共享目录
  • 出现 7045 服务创建,且服务路径位于临时目录或用户目录

总结

SMB 横向验证是内网渗透里很常见的一环,但真正有价值的不是简单扫出多少 445,而是把“可访问、可写、可管理、可审计”这几件事串起来。授权测试中建议遵循三个原则:低频扫描、最小化验证、完整留痕。

从防守角度看,修复优先级可以按这条线推进:先收敛 445 暴露面,再清理共享写权限,然后治理本地管理员复用,最后补齐日志审计和告警。这样既能降低横向移动风险,也能在真实事件中更快定位账号、主机和访问路径。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
这类授权内网测试里,SMB 横向验证建议重点把“可利用性”和“可追溯性”分开记录,不然后面复盘很容易只剩下一堆成功/失败截图。 几个比较实用的点: 1. **先确认 SMB 暴露面和签名状态** 横向前建议先把 445 存活、SMB 版本、签名要求梳理出来,尤其是“Signing disabled / not required”的机器,风险优先级会高很多。
nmap -p445 --script smb-protocols,smb2-security-mode -oA smb_check 10.0.0.0/24
重点看:
Message signing enabled but not required
SMBv1 enabled
Dialect: 2.0.2 / 2.1 / 3.x
如果是域环境,也可以配合域控日志确认是否存在大量 4624 Type 3 登录,避免测试动作被误判成异常横向。 2. **横向验证尽量控制动作粒度** SMB 验证不一定非要执行命令,很多时候确认凭据有效性、共享访问权限、管理共享可写就够了。例如:
net use \\10.0.0.12\IPC$ /user:DOMAIN\user 'Password'
net view \\10.0.0.12
dir \\10.0.0.12\C$
如果必须验证远程执行,建议提前约定测试窗口和命令白名单,比如只执行:
hostname
whoami
ipconfig /all
不要上传大文件、不要落可执行 payload,避免给清理和取证带来额外成本。 3. **日志留痕可以按事件链整理** Windows 侧比较关键的日志点: - 4624:登录成功,重点看 LogonType=3、认证包、源 IP - 4625:登录失败,判断是否有喷洒或密码错误 - 4672:高权限登录 - 5140:访问网络共享 - 5145:详细共享访问,能看到目标路径和访问权限 - 7045:服务创建,常见于 PsExec 类方式 - 4688:进程创建,需要开启命令行审计 - Sysmon 1/3/11:进程、网络连接、文件创建 比如远程服务执行通常会看到:
4624 Type 3 登录
4672 分配特殊权限
7045 创建服务
4688 启动 cmd.exe / powershell.exe
5145 访问 ADMIN$ / IPC$
如果报告里能把这些事件按时间线串起来,比单纯写“存在横向移动风险”更有说服力。 4. **修复闭环不要只停留在改密码** SMB 横向风险通常不是单点问题,建议至少覆盖这些项: - 禁用 SMBv1 - 强制 SMB Signing,尤其是服务器侧 - 清理本地管理员复用密码,接入 LAPS / Windows LAPS - 限制普通终端之间的 445 互访 - 管理共享访问仅允许堡垒机、管理网段 - 开启 4688 命令行审计和 PowerShell 日志 - 对 4624 Type 3 + 4672 + 7045 建规则告警 - 域管理员禁止登录普通终端 参考配置可以这样落:
# 禁用 SMBv1
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

# 查看 SMB 签名配置
Get-SmbServerConfiguration | Select EnableSecuritySignature,RequireSecuritySignature

# 要求服务器端 SMB 签名
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
防火墙层面建议按资产角色做访问控制,而不是全网互通:
# 示例:阻断非管理网段访问本机 445
New-NetFirewallRule `
  -DisplayName "Block SMB from non-admin subnet" `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 445 `
  -RemoteAddress 10.0.0.0/24 `
  -Action Block
5. **复测建议保留同一条验证路径** 修复后不要只扫端口,最好按原测试路径复测: - 原凭据是否仍可 SMB 登录 - 原主机是否还能访问 ADMIN$ / C$ - 原远程执行方式是否失败 - 日志是否能看到失败事件和告警 - 是否有例外主机未纳入策略 这样闭环会比较完整:攻击面收敛、凭据风险降低、日志可追溯、告警可触发。对于内网测试报告来说,这几个点比单纯展示横向成功更有价值。

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

最近浏览 0

  • 没有会员查看此页面。