跳转到帖子

Kali 渗透工具实战:用 NetExec 做授权内网 SMB/域账号核查与风险闭环

精选回复

发布于

背景

在授权内网渗透测试里,SMB 与域账号状态核查是很常见的一步。以前不少人习惯用 CrackMapExec,现在 Kali 上更推荐使用 NetExec(nxc),它延续了 CME 的使用方式,适合做资产可达性、域信息、账号有效性、本地管理员权限边界、共享目录暴露等验证。

这篇只讨论授权场景下的工具使用和验证链路,不涉及隐蔽驻留、免杀、横向破坏等内容。目标是把问题定位清楚,并给出可复现的命令、日志留痕点和修复建议。

测试场景

  • 测试机:Kali Linux
  • 目标环境:Windows AD 内网
  • 域名:corp.local
  • 域控:10.10.10.10
  • 测试网段:10.10.10.0/24
  • 授权账号:corp\audit.user
  • 测试目标:确认 SMB 暴露、账号权限边界、共享目录配置风险
建议在测试前和甲方确认:允许扫描的网段、允许验证的账号、是否允许登录验证、是否允许枚举共享目录、是否允许导出结果。不要在生产网段做高频爆破或无授权密码喷洒。

工具安装与环境确认

Kali 新版本通常可以直接通过 apt 安装 NetExec。如果仓库版本较旧,也可以用 pipx 隔离安装。个人更建议 apt 优先,便于系统统一维护。

sudo apt update
sudo apt install -y netexec

# 确认版本
nxc --version

# 查看 smb 模块帮助
nxc smb -h

如果系统里同时存在旧的 cme 和 nxc,建议在报告里明确使用的工具版本,避免不同版本输出字段不一致导致复现困难。

问题定位思路

SMB/域账号核查通常按下面顺序走,避免一上来就做大范围认证测试:

  • 先确认 445 端口可达性与主机存活。
  • 再确认目标是否加入域、主机名、操作系统版本。
  • 使用授权账号验证登录,不做未授权密码猜测。
  • 枚举共享目录,判断是否存在 Everyone、Domain Users 可写目录。
  • 检查当前账号是否拥有本地管理员权限。
  • 记录 Windows 侧日志,给出可落地修复建议。

技术分析:NetExec 在 SMB 核查里的几个关键点

NetExec 的 smb 子命令会对目标的 SMB 服务进行连接、认证和枚举。常用字段包括:

  • signing:SMB 签名是否开启,关系到中间人攻击风险评估。
  • SMBv1:是否启用 SMBv1,老旧协议存在较多历史风险。
  • Pwn3d!:表示当前凭据在该主机上具备本地管理员级权限。
  • shares:列出共享目录及读写权限。
  • sessions:查看当前会话,需要权限支持。

在报告中不要只贴工具截图,建议把“验证命令、目标范围、关键输出、风险解释、修复建议”对应起来,这样后续整改和复测都更顺。

操作步骤

1. 确认 SMB 资产范围

如果已经有授权网段,可以先用 nmap 做端口确认,再将结果作为 NetExec 输入。这样比直接对整个网段做认证尝试更克制。

# 扫描 445 端口开放情况
sudo nmap -p445 --open -n -oG smb_445.gnmap 10.10.10.0/24

# 提取开放 445 的主机
awk '/445\/open/ {print $2}' smb_445.gnmap > smb_hosts.txt

# 查看数量
wc -l smb_hosts.txt

2. 无凭据识别主机信息

先不带账号执行一次,主要看主机名、域信息、SMB 签名和 SMBv1 状态。

nxc smb smb_hosts.txt

输出中重点关注类似内容:

SMB  10.10.10.10  445  DC01  [*] Windows Server 2019 Standard 17763 x64 (name:DC01) (domain:corp.local) (signing:True) (SMBv1:False)
SMB  10.10.10.23  445  FILE01 [*] Windows Server 2016 Standard 14393 x64 (name:FILE01) (domain:corp.local) (signing:False) (SMBv1:False)

这里 FILE01 的 signing:False 需要记录,虽然不等于一定可被利用,但在内网中属于应整改项。

3. 使用授权账号验证登录

建议将密码放入临时文件并限制权限,避免命令历史直接留下明文。测试结束后删除。

read -s PASS
export NXC_PASS="$PASS"

# 使用授权域账号验证
nxc smb smb_hosts.txt -d corp.local -u audit.user -p "$NXC_PASS"

如果输出中出现 [+] 表示认证成功。若出现大量 STATUS_LOGON_FAILURE,应立即停止,确认账号、域名、密码是否正确,避免触发锁定策略。

4. 检查本地管理员权限边界

授权账号不应在大量普通服务器上拥有本地管理员权限。如果 NetExec 标记 Pwn3d!,需要单独列出主机并和管理员确认是否为预期配置。

nxc smb smb_hosts.txt -d corp.local -u audit.user -p "$NXC_PASS" --local-auth

注意:--local-auth 用于本地账号认证,不适合域账号。域账号验证时不要加该参数:

nxc smb smb_hosts.txt -d corp.local -u audit.user -p "$NXC_PASS"

判断重点:

  • 域普通账号不应在服务器批量拥有本地管理员权限。
  • 运维账号如果需要管理员权限,应通过分组、JIT、PAM 或堡垒机流程控制。
  • 禁止将 Domain Users 加入本地 Administrators。

5. 枚举共享目录权限

共享目录是内网常见风险点,尤其是可写共享、匿名共享、包含脚本或部署包的共享。

nxc smb smb_hosts.txt -d corp.local -u audit.user -p "$NXC_PASS" --shares

重点关注输出中的权限:

SMB  10.10.10.23  445  FILE01  Share        Permissions     Remark
SMB  10.10.10.23  445  FILE01  -----        -----------     ------
SMB  10.10.10.23  445  FILE01  ADMIN$       NO ACCESS       Remote Admin
SMB  10.10.10.23  445  FILE01  C$           NO ACCESS       Default share
SMB  10.10.10.23  445  FILE01  Public       READ,WRITE      Public Share
SMB  10.10.10.23  445  FILE01  IT-Tools     READ            Deployment tools

如果普通域账号对 Public 有写权限,需要进一步确认目录用途。测试时不建议随意上传可执行文件,可以用无害文本文件验证写权限,并在测试后删除。

# 创建无害验证文件
echo "authorized write test $(date)" > nxc_write_test.txt

# 使用 smbclient 手工验证写入与删除
smbclient //10.10.10.23/Public -U 'corp.local/audit.user%密码'
smb: \> put nxc_write_test.txt
smb: \> ls
smb: \> del nxc_write_test.txt
smb: \> exit

如果不希望密码出现在命令行,可在交互输入密码,或者使用临时凭据文件并做好权限控制。

6. 导出结果便于复盘

NetExec 默认会在用户目录下保存数据库。实际项目里,我更习惯同时保留命令输出文本,便于报告引用和复测对比。

mkdir -p evidence

nxc smb smb_hosts.txt \
  -d corp.local \
  -u audit.user \
  -p "$NXC_PASS" \
  --shares | tee evidence/nxc_smb_shares_$(date +%F).txt

测试结束后清理环境变量和临时文件:

unset NXC_PASS
rm -f nxc_write_test.txt

日志留痕与排查方法

蓝队或系统管理员可以在 Windows 侧重点查看以下日志,确认测试行为范围:

日志位置事件 ID说明
Security4624登录成功,重点看 Logon Type 3 网络登录
Security4625登录失败,如数量异常需确认是否误触发认证失败
Security4672分配了特殊权限,常见于管理员登录
Security5140访问了网络共享对象
Security5145详细共享访问检查,可用于定位访问的共享路径

在域控上可以用 PowerShell 快速查看指定账号的失败登录情况:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddHours(-2)} |
  Where-Object {$_.Properties[5].Value -like '*audit.user*'} |
  Select-Object TimeCreated, Id, ProviderName, Message

如果测试期间出现大量 4625,应暂停测试,先确认是否存在密码错误、域名写错、账号锁定策略过严或工具参数误用。

风险与修复建议

  • SMB 签名未开启:建议通过组策略开启“Microsoft network server: Digitally sign communications”。域控应强制开启,服务器视兼容性逐步推进。
  • SMBv1 启用:如无遗留业务依赖,应禁用 SMBv1,并排查老旧 NAS、打印机、旧系统依赖。
  • 普通账号拥有本地管理员:清理本地 Administrators 组,使用受控运维组,结合 LAPS/Windows LAPS 管理本地管理员密码。
  • 共享目录可写:按最小权限重新配置 ACL,避免 Domain Users、Everyone 拥有写权限。公共目录需明确负责人和清理周期。
  • 共享目录存放脚本和凭据:检查 bat、ps1、config、xml、ini、rdp 文件,避免明文密码、连接串、部署密钥泄露。
  • 日志不足:开启对象访问审计,重点记录共享访问、失败登录、特权登录事件,便于事后追溯。

一个简单的复测清单

  • 再次执行 nxc smb smb_hosts.txt,确认 SMBv1 和 signing 状态是否符合预期。
  • 使用原授权账号执行 --shares,确认可写共享是否已收敛。
  • 确认普通账号不再出现 Pwn3d! 标记。
  • 在 Windows 日志中确认整改后没有异常失败登录和非预期共享访问。
  • 抽查 GPO 是否真正下发到目标 OU,而不是只修改了策略未生效。

总结

NetExec 在 Kali 上适合做授权内网 SMB 和域账号权限边界核查。实际使用时,关键不是跑多少模块,而是控制范围、保留证据、解释清楚风险,并能指导修复。建议把每次测试拆成“资产识别、授权认证、共享权限、管理员边界、日志验证、复测闭环”几个步骤,既能减少误伤,也方便后续整改落地。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
这类核查建议不要只停在“能否登录”,而是把结果分成认证、权限、暴露面和整改复测四部分。尤其是域环境,尽量使用批准的审计账号,避免直接做密码喷洒;先确认锁定阈值和测试窗口。 可以按下面的顺序执行:
# 1. 先确认域控、协议和 SMB 签名状态
nxc smb dc01.corp.local -u audit_user -p '<密码>' -d CORP

# 2. 读取域账号、组及密码策略(按授权范围执行)
nxc smb dc01.corp.local -u audit_user -p '<密码>' -d CORP --users
nxc smb dc01.corp.local -u audit_user -p '<密码>' -d CORP --groups "Domain Admins"
nxc smb dc01.corp.local -u audit_user -p '<密码>' -d CORP --pass-pol

# 3. 核查目标主机上的共享、会话和登录用户
nxc smb targets.txt -u audit_user -p '<密码>' -d CORP --shares
nxc smb targets.txt -u audit_user -p '<密码>' -d CORP --sessions
nxc smb targets.txt -u audit_user -p '<密码>' -d CORP --loggedon-users
重点记录以下几类结果: - 普通域账号是否能访问不应暴露的共享,尤其是 `SYSVOL`、`NETLOGON` 以外的业务共享。 - 是否存在“同一密码可登录大量主机”的本地管理员复用问题。这个结论应基于已批准的账号或凭据样本验证,不建议用大量密码进行尝试。 - SMB 签名是否强制、是否仍启用 SMBv1。NetExec 输出里通常会显示相关协商信息,建议同时用资产配置或组策略结果交叉验证,避免只相信单次探测。 - 共享权限和 NTFS 权限是否叠加导致越权。`READ` 不一定代表没有风险,重点看是否能读取配置文件、备份、脚本和凭据材料。 - 域管理员、服务账号、无人值守账号是否在普通终端或文件服务器上留下交互式登录会话。 如果需要验证“普通账号是否拥有本地管理员权限”,建议只针对明确批准的少量主机做验证,并把登录成功与实际权限分开记录。例如:
# 仅对批准的测试主机核查,不要直接扫整个网段
nxc smb approved-hosts.txt -u audit_user -p '<密码>' -d CORP

# 若使用本地账号,显式标记本地认证,避免误把账号当成域账号
nxc smb approved-hosts.txt -u local_audit -p '<密码>' --local-auth
报告中最好保留主机名/IP、时间、账号类型、认证方式、共享名、权限、原始输出摘要和截图哈希,密码和 NTLM 哈希不要写入报告。整改闭环可以对应到具体控制项: 1. 关闭不需要的 SMBv1,按组策略强制 SMB 签名。 2. 使用 Windows LAPS 管理本地管理员密码,禁止本地管理员密码跨主机复用。 3. 清理普通账号对业务共享的继承权限,分别核对共享权限和 NTFS ACL。 4. 服务账号改用 gMSA,限制交互式登录,并检查长期未轮换密码。 5. 对发现的异常会话、脚本明文凭据和备份文件做清理,同时检查是否需要凭据轮换。 6. 整改后用同一批目标和同一审计账号复测,确认“原始发现—整改动作—复测结果”能一一对应。 命令行里的密码也容易进入 shell history 或进程列表,实际执行时建议使用临时审计环境、专用低权限账号和凭据保险库,不要把真实密码直接粘贴到帖子或脚本中。
补充一点实战里容易漏掉的:NetExec 的结果最好从一开始就按“可复测、可闭环”的格式落盘,不然后面整改时很难证明风险是否消失。 比如 SMB 核查可以直接把认证、共享、权限结果分别导出,避免只看终端输出:
mkdir -p nxc_out

# 基础认证与 SMB 信息
nxc smb targets.txt \
  -u audit_user -p '<密码>' -d CORP \
  --log nxc_out/smb_basic.log

# 共享枚举,重点看 READ / WRITE / ADMIN$
nxc smb targets.txt \
  -u audit_user -p '<密码>' -d CORP \
  --shares \
  --log nxc_out/smb_shares.log

# 本地管理员权限核查
nxc smb targets.txt \
  -u audit_user -p '<密码>' -d CORP \
  --local-auth \
  --log nxc_out/local_auth_check.log
如果环境里 Kerberos 可用,建议优先走 Kerberos,能减少明文口令在命令行和日志里的暴露,也更贴近日常域认证路径:
# 先拿 TGT
kinit [email protected]

# 使用 Kerberos 认证核查
nxc smb targets.txt -k --shares
另外,闭环时建议单独标记几类高优先级项:
  • SMB signing: False:中继风险,需要结合是否启用 LDAP signing、EPA 一起看。
  • 普通域账号对共享有 WRITE:优先复核是否能落脚本、配置文件、备份文件。
  • 普通账号命中 Pwn3d!:说明该账号在目标上具备本地管理员权限,通常要追溯 GPO、本地组策略或历史运维账号残留。
  • ADMIN$、C$ 可访问:不要只记录可访问,最好记录对应账号、主机、时间点,方便后续移除权限后复测。
复测可以用同一份 targets 和同一个审计账号跑一遍,前后日志做 diff:
diff -u before_smb_shares.log after_smb_shares.log
diff -u before_local_admin.log after_local_admin.log
还有个细节,域账号核查不要用密码喷洒替代资产核查。真要验证弱口令或默认口令,建议单独走审批,先确认:
  • 域密码锁定阈值和观察窗口;
  • 是否有智能锁定、MFA、EDR 联动告警;
  • 测试账号范围是否排除了高价值账号和服务账号;
  • 是否能接受失败登录事件量。
这样做出来的结果会更像一次内网风险核查,而不是单纯跑工具截图。

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

最近浏览 0

  • 没有会员查看此页面。