跳转到帖子

Kali 渗透工具实战:Nmap、NetExec 与 Impacket 做内网 SMB 授权验证

精选回复

发布于

背景

这篇放在“渗透工具”板块,重点不是讲 SMB 协议科普,而是记录一次授权内网渗透测试中,如何在 Kali 下使用 Nmap、NetExec、Impacket 对 Windows 内网的 SMB 暴露面做验证,并同步给出日志留痕点和修复建议。

测试前提:已获得书面授权,目标网段、测试时间窗口、允许验证的账号范围都已确认。本文不涉及持久化、绕过审计、横向扩散和敏感数据导出。

示例环境:Kali 2024.x,测试网段 10.10.20.0/24,域名 corp.local,授权测试账号 corp\audit.check。

问题定位

内网 SMB 相关问题通常集中在几类:445 端口大面积开放、SMBv1 未关闭、匿名访问未禁用、共享目录权限过宽、SMB 签名未强制、弱口令或本地管理员复用。工具使用上建议先做面识别,再做权限验证,最后输出修复清单。

  • 资产识别:哪些主机开放 445/TCP。
  • 协议风险:是否启用 SMBv1,是否强制 SMB signing。
  • 权限边界:授权账号能看到哪些共享,是否存在 Everyone/Authenticated Users 可写。
  • 审计验证:Windows 安全日志是否能记录登录、共享访问、对象访问。

工具准备

Kali 默认包含 Nmap,Impacket 通常也可直接安装。NetExec 是 CrackMapExec 的社区延续版本,适合做批量 SMB 枚举和授权验证。

sudo apt update
sudo apt install -y nmap smbclient python3-impacket netexec

# 确认版本
nmap --version
netexec --version
impacket-smbclient -h | head

建议单独建立项目目录,保留原始输出,后续写报告时会省很多时间。

mkdir -p ~/pt/corp-smb/{scan,logs,evidence}
cd ~/pt/corp-smb

技术分析

SMB 验证不要一上来就尝试登录全网账号,更不要做未授权的口令喷洒。比较稳妥的链路是:

  • 先用 Nmap 探测 445 开放主机,减少后续工具噪声。
  • 再用 NSE 脚本识别 SMB 协议版本、安全模式和签名策略。
  • 使用授权账号做共享枚举,判断权限边界是否符合预期。
  • 对少量样本主机做日志核对,确认蓝队能看到关键事件。

几个关键判断点:

  • SMBv1:老旧协议,容易带来兼容性和安全问题,生产环境应关闭。
  • Message signing disabled:可能被中间人或中继类攻击利用,尤其是域环境中风险更高。
  • 匿名会话可用:可能泄露共享、域用户、组信息。
  • 共享可写:如果普通域用户能写入脚本目录、软件分发目录、公共启动目录,风险会明显放大。

操作步骤

第一步,先确认 445 端口开放主机。这里使用 SYN 扫描,保留 grepable 输出便于后续处理。

sudo nmap -p445 --open -sS -n -Pn 10.10.20.0/24 \
  -oA scan/smb_445_open

# 提取 IP 列表
awk '/445\/open/ {print $2}' scan/smb_445_open.gnmap > scan/smb_hosts.txt
wc -l scan/smb_hosts.txt

第二步,对开放主机做 SMB 安全配置识别。重点看 SMBv1 和 signing。

sudo nmap -p445 -n -Pn -iL scan/smb_hosts.txt \
  --script smb-protocols,smb2-security-mode,smb2-capabilities \
  -oA scan/smb_security_mode

输出中如果看到类似内容,需要重点标记:

| smb-protocols:
|   dialects:
|     NT LM 0.12 (SMBv1) [dangerous, but default]

| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled but not required

第三步,使用 NetExec 做匿名访问和授权账号共享枚举。匿名测试只验证是否允许空会话,不做进一步信息抓取。

# 匿名访问验证
netexec smb scan/smb_hosts.txt -u '' -p '' --shares \
  --continue-on-success | tee logs/nxc_smb_anonymous_shares.log

# 授权账号共享枚举,注意密码建议通过环境变量传入,避免进入 shell history
read -s SMB_PASS
export SMB_PASS
netexec smb scan/smb_hosts.txt -d corp.local -u audit.check -p "$SMB_PASS" --shares \
  --continue-on-success | tee logs/nxc_smb_auth_shares.log
unset SMB_PASS

第四步,对疑似权限过宽的共享,用 smbclient 做人工复核。只做目录列表和测试目录创建,避免读取业务文件内容。

# 列出共享
smbclient -L //10.10.20.35 -U 'corp.local/audit.check'

# 进入共享后只做最小化验证
smbclient //10.10.20.35/Public -U 'corp.local/audit.check'

# smbclient 交互中执行
# smb: \> ls
# smb: \> mkdir pentest_permission_check
# smb: \> rmdir pentest_permission_check
# smb: \> exit

第五步,如需验证 SMB signing,可以用 NetExec 快速汇总。没有强制签名的服务器要单独列出。

netexec smb scan/smb_hosts.txt --gen-relay-list logs/smb_signing_not_required.txt
cat logs/smb_signing_not_required.txt

这里的输出不是让你继续做中继攻击,而是用于证明“这些主机没有强制 SMB signing”,作为配置整改依据。

结果整理方法

报告里建议不要只贴工具原始输出,最好整理成表格,便于运维直接处理。

检查项判定方式风险说明建议动作
SMBv1Nmap smb-protocols老旧协议,历史漏洞多禁用 SMBv1
SMB signingNmap smb2-security-mode / NetExec relay list未强制签名时存在中继风险服务器端强制签名
匿名共享NetExec 空账号枚举可能泄露共享和目录结构关闭匿名访问
共享可写smbclient 最小化写入验证普通用户可写可能导致投递风险收敛 ACL

日志留痕与排查

蓝队侧可以重点看 Windows 安全日志和 SMB 服务日志。测试期间建议提前同步时间窗口,避免误报。

  • 4624:登录成功,Type 3 通常对应网络登录。
  • 4625:登录失败,确认是否存在异常爆破或误配置脚本。
  • 5140:网络共享对象被访问。
  • 5145:详细文件共享访问,需要启用相关审计策略。
  • 7040/7036:服务状态变化,本文流程正常不应出现此类异常操作。

Windows 上可以用 PowerShell 过滤授权测试账号的 SMB 访问记录:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624,4625,5140,5145; StartTime=(Get-Date).AddHours(-6)} |
  Where-Object { $_.Message -match 'audit.check' -or $_.Message -match '10.10.20.' } |
  Select-Object TimeCreated, Id, ProviderName, Message |
  Format-List

如果要提升 5145 的可见性,需要在组策略中打开:

Computer Configuration
  Windows Settings
    Security Settings
      Advanced Audit Policy Configuration
        Object Access
          Audit File Share: Success, Failure
          Audit Detailed File Share: Success, Failure

风险与修复建议

  • 关闭 SMBv1:Windows Server 可通过“Turn Windows features on or off”或 PowerShell 禁用;老业务系统要先做兼容性评估。
  • 强制 SMB signing:域环境建议通过 GPO 配置 Microsoft network server: Digitally sign communications (always)。
  • 收敛共享权限:共享权限和 NTFS 权限都要看,避免只改其中一层。
  • 禁用匿名访问:检查 Guest、Everyone、ANONYMOUS LOGON 相关权限。
  • 限制管理共享访问:不要让普通域用户具备本地管理员权限,重点排查本地管理员口令复用。
  • 启用审计:至少覆盖登录事件、共享访问、失败登录和关键目录对象访问。

服务器端强制 SMB signing 的组策略路径:

Computer Configuration
  Windows Settings
    Security Settings
      Local Policies
        Security Options
          Microsoft network server: Digitally sign communications (always) = Enabled
          Microsoft network server: Digitally sign communications (if client agrees) = Enabled

禁用 SMBv1 可参考以下命令,变更前建议先在测试组验证:

# 查看 SMBv1 状态
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

# 禁用 SMBv1
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart

总结

在 Kali 下做 SMB 授权验证,工具链不复杂:Nmap 负责发现和协议识别,NetExec 负责批量权限验证,smbclient/Impacket 负责人工复核。关键是控制边界:不做未授权口令尝试,不读取业务数据,不扩大影响面。

对防守方来说,这类测试最有价值的输出不是“扫到了多少台 445”,而是能明确指出哪些主机启用了 SMBv1、哪些没有强制 signing、哪些共享权限过宽,以及日志是否能完整记录这些访问。这样的结果才方便落地整改。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
可以补一个实战里容易踩的点:SMB 授权验证别只看“能不能连上 445”,要区分三层结果:端口可达、协议可协商、凭据可授权。Nmap、NetExec、Impacket 各自适合的位置不太一样。 先用 Nmap 做范围收敛,建议加上 SMB 协议探测和签名状态,后面判断中继风险也有用:
nmap -Pn -p445 --open \
  --script smb-protocols,smb2-security-mode,smb2-time \
  -oA smb_scan 192.168.1.0/24
如果环境里禁 ping,`-Pn` 很关键;否则会漏掉不少主机。输出里重点看: - `SMBv1` 是否启用 - `message signing enabled/required` - 时间偏差,Kerberos 认证失败时经常和时间不同步有关 NetExec 做批量授权验证比较顺手,但建议控制并发,尤其是生产网段,避免触发锁定策略或把老设备打挂:
nxc smb targets.txt \
  -u users.txt \
  -p passwords.txt \
  --continue-on-success \
  --shares \
  --timeout 5 \
  --jitter 1 \
  --threads 10
如果是域账号,建议明确域名,避免本地账户和域账户结果混淆:
nxc smb targets.txt -d CORP -u user1 -p 'Password123!' --shares
哈希验证的话也别忘了 LM 部分占位:
nxc smb targets.txt -d CORP -u user1 -H aad3b435b51404eeaad3b435b51404ee:NTLMHASH
有时看到 `STATUS_LOGON_FAILURE` 不一定就是密码错,常见还包括: - 域名写错或没写 - 账号被限制登录到指定主机 - SMB signing / NTLM 策略限制 - 本地管理员远程 UAC 过滤导致权限看起来不对 - 目标只允许 Kerberos,不接受 NTLM Impacket 更适合做单点确认和细节排查。比如先验证凭据能否列共享:
smbclient.py CORP/user1:'Password123!'@192.168.1.10 -list
或者用 Kerberos 票据验证,避免明文密码反复尝试:
export KRB5CCNAME=user1.ccache
smbclient.py -k -no-pass CORP/[email protected] -list
注意 Kerberos 场景尽量用主机名/FQDN,不要直接用 IP,否则容易因为 SPN 对不上失败。 如果目标存在本地管理员权限,再用 `psexec.py`、`wmiexec.py`、`atexec.py` 之前,建议先用 NetExec 看清楚是不是管理员权限:
nxc smb 192.168.1.10 -d CORP -u user1 -p 'Password123!' --shares
nxc smb 192.168.1.10 -d CORP -u user1 -p 'Password123!' --local-auth
`--local-auth` 只适合本地账户验证,不要和域账号混用,不然结果容易误判。 最后建议把结果按下面几类整理,比单纯记录“成功/失败”更利于后续复盘: - 445 open,但 SMB 协商失败 - SMB 可用,匿名访问可用 - 凭据有效,但无共享权限 - 凭据有效,有普通共享读权限 - 本地管理员 / 域管理员权限 - signing required / not required - SMBv1 是否开启 这样后续无论是做授权访问验证、口令风险统计,还是评估 NTLM relay 面,都比较清楚。

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

最近浏览 0

  • 没有会员查看此页面。