发布于10月9日10月9日 背景在授权内网渗透测试里,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.txt2. 无凭据识别主机信息先不带账号执行一次,主要看主机名、域信息、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 和域账号权限边界核查。实际使用时,关键不是跑多少模块,而是控制范围、保留证据、解释清楚风险,并能指导修复。建议把每次测试拆成“资产识别、授权认证、共享权限、管理员边界、日志验证、复测闭环”几个步骤,既能减少误伤,也方便后续整改落地。 服务器、云资产与权限边界梳理示意
10月9日10月9日 这类核查建议不要只停在“能否登录”,而是把结果分成认证、权限、暴露面和整改复测四部分。尤其是域环境,尽量使用批准的审计账号,避免直接做密码喷洒;先确认锁定阈值和测试窗口。 可以按下面的顺序执行: # 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 或进程列表,实际执行时建议使用临时审计环境、专用低权限账号和凭据保险库,不要把真实密码直接粘贴到帖子或脚本中。
10月9日10月9日 补充一点实战里容易漏掉的: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 联动告警; 测试账号范围是否排除了高价值账号和服务账号; 是否能接受失败登录事件量。 这样做出来的结果会更像一次内网风险核查,而不是单纯跑工具截图。
创建帐户或登录后发表意见