先说一个我最近的经历。团队在帮一家中大型企业做内部安全基线检查,需要在十几个网段、上千台主机上核实弱口令、共享资源暴露和本地管理员复用情况。之前一直用的 CrackMapExec 已经停更很久,部分模块在域控版本较新的环境里直接失效,后来换成了社区维护的 Netexec,实测下来确实顺手很多:安装依赖少、协议覆盖更全、模块体系清晰,单条命令就能完成跨网段批量扫描和结果落盘。
这篇 Netexec 使用教程我不会讲太多虚的,直接从安装开始,把命令骨架、几个高频实战场景、模块使用逻辑和我踩过的坑全部拆开讲。适合做授权红队评估、内网安全自查、企业安全基线巡检的人参考,也适合从 CrackMapExec 迁移过来的同学快速上手。所有命令都建议先在隔离实验环境里验证一遍,再在真实目标上执行。
1. 为什么我从CrackMapExec切到了Netexec
1.1 老CME停更后的社区分支选型
CrackMapExec 在 2021 年后基本进入了低维护状态,很多朋友还留在老版本上,但实际测试中会遇到两个问题:一是新版 Windows 10/11 和 Windows Server 2022 的部分认证流程变化,导致原有的哈希传递、会话枚举逻辑不再稳定;二是原项目的更新节奏跟不上漏洞利用和安全研究社区的需求,新模块沉淀速度明显变慢。
Netexec 起初是 CME 的社区分支,后来逐渐发展成独立维护的安全评估工具,人们通常叫它nxc。它保留了 CME 的命令风格和核心设计思想,同时重构了协议层和模块注册机制,整体代码更清爽。如果你之前熟练使用 CME,迁移到 Netexec 的学习成本其实很低,大部分命令习惯可以直接平移。
1.2 Netexec的核心优势
从我实际项目的体感来说,Netexec 最突出的几个点:
- 协议覆盖更完整。除了 SMB、LDAP、WinRM、SSH、MSSQL,还支持了更多远程服务协议,日常做 Windows 和 Linux 混合内网巡检基本不需要额外起其他工具。
- 执行命令的稳定性更好。SMB 和 WinRM 下的命令执行模块重构过,遇到目标机器有杀软或执行策略限制时,可以显式切换执行方式,不用反复手工调整。
- 模块生态更规范。每个模块都有明确的参数选项,用
--options就能查看,不需要翻源码去猜关键字。 - 日志和输出格式适合自动化。支持 JSON 输出,结果统一写入
~/.nxc/logs目录,对接脚本做后续处理非常方便。
1.3 兼容性与迁移成本
Netexec 沿用 CME 的参数设计思路,比如-u指定用户、-p指定密码、-H指定哈希、-M指定模块,这些在 CME 里怎么用,在 Netexec 里基本还是那个用法。
比较大的差异是安装方式升级了,推荐用pipx而不是直接pip install,这样环境隔离更干净。另外部分 CME 老模块在 Netexec 里需要新的事件绑定方式,如果你只使用官方内置模块,完全感觉不到这个差异。
2. 安装部署与第一条命令验证
2.1 用pipx隔离安装Netexec
Netexec 依赖不少底层库,直接往系统 Python 环境里装很容易把其他工具的环境搞乱。我用的是pipx方案,强依赖隔离在独立虚拟环境里,入口命令暴露到 PATH,后续升级也不影响其他工具。
安装流程如下,适合 Debian/Ubuntu 系的 Linux 发行版:
# 安装 pipx sudo apt update sudo apt install pipx -y pipx ensurepath # 安装 netexec pipx install netexec # 验证入口命令 nxc --help如果是 macOS 环境,也可以用 Homebrew 装 Python3 和 pipx,再走同样的pipx install netexec流程。Windows 上跑 WSL 是最省心的方式,不建议直接在 Windows 的 Python 环境里硬装,后面会遇到大量 dll 依赖问题。
2.2 常见依赖报错与处理
我在两台新机器上安装时都碰到过编译报错,主要集中在pylibldap和cryptography这两个依赖上。如果你遇到类似报错,先补系统依赖再重装:
sudo apt install -y libssl-dev libldap2-dev libsasl2-dev python3-dev build-essential pipx reinstall netexec另外提醒一句,如果你的系统 Python 版本低于 3.10,Netexec 部分新特性可能跑不起来。安装完成后用python3 --version检查一下,版本太老建议先升级系统 Python。
2.3 快速验证:跑一个SMB存活扫描
安装完成后的第一件事,我用一个简单的 SMB 扫描做验证。
nxc smb 192.168.80.0/24这个命令会扫描该网段所有开放 445 端口的主机,并尝试获取系统版本、主机名和当前登录用户等信息。如果能看到类似[+]或[+][SMB]开头的结果,说明基础功能正常。这个扫描不依赖任何认证凭据,能快速判断目标网段的 SMB 服务暴露面。
3. 命令骨架拆解:协议、目标和认证参数
3.1 协议子命令与目标表达式
Netexec 的第一个核心概念是协议子命令。你想对哪种协议做批量操作,就用对应的子命令:
| 子命令 | 默认端口 | 主要用途 |
|---|---|---|
smb | 445 | Windows 主机信息枚举、共享审计、口令验证、命令执行 |
ldap | 389/636 | 域环境信息收集、域用户属性查询 |
winrm | 5985/5986 | Windows 远程管理、命令执行 |
ssh | 22 | Linux/网络设备认证与命令执行 |
mssql | 1433 | 数据库口令验证、SQL 查询 |
ftp | 21 | FTP 服务匿名与口令验证 |
目标表达式可以使用单个 IP、CIDR、主机名,也可以写成文件,每行一个目标,方便批量管理:
nxc smb 192.168.80.10 nxc smb 192.168.80.0/24 nxc smb hosts.txt我习惯用文件方式维护目标列表,特别是在跨部门项目里,哪些网段已经授权、哪些不能碰,必须提前在目标文件里划清边界,避免误扫。
3.2 认证凭据的三种传递方式
Netexec 的认证参数很直观,平时最常用的三种:
- 明文密码:
-u admin -p 'P@ssw0rd' - 哈希传递:
-H 'NThash'或--hashes 'LMHash:NThash' - Kerberos 票据:
-K配合环境中导出的 ccache 文件
有几个容易踩的细节。第一,密码包含特殊字符时一定要用单引号包住,避免被 shell 解释;第二,哈希传递时如果只给 NT 哈希,直接写在-H后面即可,如果给完整 LM:NT 格式,用--hashes更稳妥;第三,在内网测试 Windows 主机时,如果目的是验证本地管理员密码复用,必须加--local-auth,否则默认会按域账号去认证,结果会出现大量假阴性。
3.3 输出格式与日志落盘
Netexec 默认的输出是表格形式,信息密度高,但有时候行宽溢出,在自动化脚本里不好解析。建议在需要对接后续处理时加上--json参数:
nxc smb 192.168.80.0/24 -u admin -p 'P@ssw0rd' --jsonJSON 输出会保留主机地址、协议、认证成功状态、模块返回数据等结构化字段,我可以直接用jq过滤,比如只提取认证成功的 IP:
nxc smb 192.168.80.0/24 -u admin -p 'P@ssw0rd' --json | jq -r '.[] | select(.success == true) | .host'所有扫描记录和攻击记录默认落在~/.nxc/logs目录。后面对比前后两次扫描结果时,直接查这个目录里的历史记录即可。
4. 场景一:内网资产盘点与共享目录审计
4.1 批量识别主机系统与开放端口
在做内网安全自查时,我经常先跑一轮无凭据的 SMB 扫描,快速摸清哪些主机开放了 SMB、系统版本是什么。这个动作很轻量,不会对目标产生明显流量特征,适合项目初期的资产摸底。
nxc smb targets.txt从输出里能直接看到主机名、系统版本、是否支持 SMBv1、当前 SMB 会话数等信息。系统版本字段对后续漏洞判定特别有用,比如发现 Windows Server 2003 这类老系统,就需要在报告里单独标记,提醒对方尽快隔离或升级。
4.2 共享枚举与匿名访问验证
拿到一组有效凭据后,我习惯先做共享枚举。SMB 服务通常会暴露出不少共享目录,包括普通用户的个人目录,甚至是错误配置的管理共享。
有凭据的情况下,共享枚举命令:
nxc smb targets.txt -u guest -p '' --shares这个命令会尝试使用guest空密码连接所有目标,列出可访问的共享名、类型和访问权限。实际测试中经常能遇到共享目录对所有用户开放或只凭 guest 就能写入的情况,这类问题在中大企业里并不少见。
对于没有凭据的场景,也可以先试空会话枚举,命令同样:
nxc smb targets.txt -u '' -p '' --shares如果目标允许空会话访问,输出的共享列表里会明确标出可读可写权限。这里要提醒一下,空会话在现代 Windows 上默认关闭,但部分硬编码共享还是会暴露,值得顺手验证。
4.3 spider_plus模块自动抓取敏感文件
共享枚举只是第一步,真正麻烦的是共享目录里存了什么敏感文件。默认的--shares只告诉你共享的存在和权限,但没法自动去翻文件。Netexec 内置的spider_plus模块能解决这个问题:它会遍历指定共享目录,根据关键字匹配文件名和文件内容,把结果落成 JSON 文件。
一个我在项目中经常用的示例:
nxc smb targets.txt -u admin -p 'P@ssw0rd' -M spider_plus --options 'DIR=ADMIN$'DIR=ADMIN$指定遍历 C 盘管理共享,模块会在授权范围内搜索文件名或内容包含密码、凭据、密钥等关键字的文件,输出结果保存在当前目录的spider_plus目录下。处理共享目录多的目标时,可以适当加大线程数,但要注意网络带宽和目标的 IO 负载,别把共享存储扫挂了。
5. 场景二:口令安全测试和哈希传递验证
5.1 密码喷洒的正确姿势
口令安全测试里最容易犯错的就是方式太粗暴。当你手头有一份用户名字典,对着一个目标反复测试大量密码,很容易触发账户锁定策略,造成业务账号被锁死。正确做法是使用密码喷洒思路:拿少量固定密码,对所有用户名统一测试一次,再切换下一个密码。
Netexec 支持这种场景,核心参数是--continue-on-success,意思是即使某个用户名尝试成功,也继续用相同密码对其他用户名测试,不会中途终止整轮喷洒。
一个典型的密码喷洒命令:
nxc smb 192.168.80.0/24 -u users.txt -p 'Spring2024!' --continue-on-success -t 1这里我把线程数降到 1,目的就是控制喷涂速度,尽量降低账户锁定风险。如果你面对的目标网段机器很多,可以适当提高到 10,但一定要跟客户确认锁定策略再动手。
5.2 哈希传递(Pass-the-Hash)复现
哈希传递是内网横向移动常用的技术。通常的思路是拿到一台主机的本地管理员权限后,从内存或系统里提取出密码哈希,再用这个哈希去尝试访问其他同密码的主机。Netexec 原生支持哈希传递,不需要额外工具。
流程上分两步。第一步,在已取得权限的主机上用--sam参数抓取本地账户哈希:
nxc smb 192.168.80.10 -u admin -p 'P@ssw0rd' --sam输出里会出现本地用户对应的 NT 哈希。第二步,用提取出的哈希在其他主机上验证:
nxc smb 192.168.80.0/24 -u administrator -H 'aad3b435b51404eeaad3b435b51404ee:xxxxxx' --local-auth这里再强调一下--local-auth的作用。不加这个参数,Netexec 默认会把administrator当作域账号去认证,对工作组机器和本地管理员账号基本都会失败。在横向移动测试里,本地管理员密码复用是非常常见的问题,用哈希传递能快速定位哪些主机存在同密码风险。
5.3 如何判定本地管理员复用问题
判定本地管理员复用不需要手动逐台登录,直接跑一条命令就能把结果汇总:
nxc smb 192.168.80.0/24 -u administrator -H 'NT哈希' --local-auth --json执行完成后,凡是输出中标注认证成功的主机,都说明存在同一组管理员凭据或密码哈希复用。这个结果可以直接导出到报告里,作为整改项。如果你发现同一网段里能通过同一条哈希登录三分之一以上的机器,那基本可以断定该企业域内主机存在泛化的本地管理员密码统一部署问题。
6. 场景三:远程命令执行与执行方式选择
6.1 在SMB上执行命令的常用写法
SMB 协议本身不直接提供远程命令执行能力,Netexec 是借助 Windows 的服务管理等远程机制实现的。日常用法很简单:
nxc smb targets.txt -u admin -p 'P@ssw0rd' -x 'whoami'-x参数用于执行单条命令,默认通过 cmd 执行。如果你想执行 PowerShell 命令,可以换成大写-X,例如:
nxc smb targets.txt -u admin -p 'P@ssw0rd' -X 'Get-Process'需要注意,命令执行的结果能否拿到,取决于目标的远程管理端口和权限配置。域环境里本地管理员权限通常够用,但遇到 UAC 远程限制或安全策略加固过的主机,即使账户是管理员,也可能返回拒绝访问。
6.2 WinRM和SSH协议的执行差异
如果你的目标是启用了 WinRM 服务的主机,用 WinRM 子命令执行命令会更稳。WinRM 执行方式不依赖管理员共享(比如 C$)权限,只要账号在远程管理用户组里就行,所以在一些禁止 admin 共享的环境中很实用:
nxc winrm 192.168.80.10 -u admin -p 'P@ssw0rd' -x 'whoami'SSH 子命令则可以审计 Linux 主机,尤其是混合内网里存在大量 Linux 服务器时:
nxc ssh 192.168.80.11 -u root -p 'P@ssw0rd' -x 'id && hostname'SMB 命令执行失败时,我通常会切换到 WinRM 再试一次。Windows 上的执行环境不同,同一组凭据可能就在 WinRM 上成功执行。对 Linux 目标做批量巡检时,SSH 子命令的速度和兼容性都比自己写脚本要省事得多。
6.3 exec-method切换与失败排查
Netexec 在 SMB 执行命令时,内部支持多种执行方法,常见的有atexec、smbexec、wmiexec等。默认情况下工具会自动选择,但自动选择不总是最优,如果你发现执行命令超时或返回空,可以手动指定:
nxc smb 192.168.80.10 -u admin -p 'P@ssw0rd' -x 'whoami' --exec-method atexec选执行方法的核心逻辑是:atexec依赖目标的任务计划程序服务,适合绕过部分杀软执行链;smbexec和wmiexec走不同的 Windows 管理接口,有些安全策略会拦截其中一个,但放行另一个。现场排查时,把三种方法各跑一遍,基本能定位是权限问题还是策略拦截问题。
7. 模块系统:内置模块、参数与扩展思路
7.1 常用内置模块清单与适用场景
Netexec 的模块系统是它最值钱的部分。你可以在任意协议子命令下使用-M指定模块:
nxc smb targets.txt -u admin -p 'P@ssw0rd' -M enum_av这个模块会远程枚举目标主机上运行的安全软件进程,帮我快速判断哪些终端有防护、哪些完全裸奔。类似的高频模块还有:
spider_plus:共享目录内容巡视和关键字过滤,适合找敏感文件。enum_loggedon_users:枚举远程主机上当前登录的用户,适合判断账号使用情况。enum_av:识别终端安全软件进程,辅助评估防护覆盖。ldap-domain-trust:在 LDAP 协议下检查域信任关系。
每个模块能做什么,在输出帮助信息里都有明确说明。第一次用某个模块之前,务必先看一遍模块输出格式。
7.2 模块选项的传递方式
模块不是一个个黑盒,它们大多支持自定义参数。查看方式很简单:
nxc smb targets.txt -u admin -p 'P@ssw0rd' -M spider_plus --options执行后能看到模块支持的参数列表和默认值。传参的语法是-M 模块名 --options 'KEY1=VAL1 KEY2=VAL2',多个键值对之间用空格分隔。
例如让spider_plus只巡特定目录并过滤特定后缀:
nxc smb targets.txt -u admin -p 'P@ssw0rd' -M spider_plus --options 'SHARE=C$ MAX_FILE_SIZE=200000 IGNORE_DIR=NONE'这种参数化设计让一个模块可以应对不同场景,不用频繁改代码。
7.3 自写模块的基本结构
如果你有特殊需求,比如定期抓取某类配置文件内容并统计,可以考虑写一个简单模块。Netexec 的模块本质上是 Python 类,需要实现两个关键方法:一个是定义模块参数,另一个是登录成功后的动作。
基本骨架类似这样:
from netexec.modules.base import BaseModule class MyModule(BaseModule): name = "my_module" description = "示例模块" options = { "KEYWORD": "password" } def on_login(self, context, connection): target = connection.host context.log.info(f"Target: {target}")在on_login里,connection对象提供了当前协议的连接句柄,可以继续调用 SMB、LDAP 接口完成自定义操作。当然,线上环境写模块时要注意异常捕获,避免一台主机报错就中断整个批量任务。
8. 我实际踩过的坑和使用建议
8.1 网络因素导致的假阴性
Netexec 的扫描结果依赖目标端口可达性和认证协议握手。如果目标主机的防火墙只允许指定来源 IP 访问 445,或者中间网络设备对高频访问做了限流,就会大量出现超时和认证失败。
处理办法有两个:一是扫描前先确认目标网段的 445 端口连通性,可以用nmap -p445做一轮预热;二是执行 Netexec 时增加超时时间,减少误报。nxc smb ... --timeout 10这种方式在跨网段测试时非常管用,能让延迟较高的主机正常返回结果。
8.2 凭据格式和认证失败的常见原因
凭据格式一直是新手容易卡住的地方。密码带空格、带特殊符号时,如果不加引号,会被 shell 拆成多个参数。哈希传递时,如果你只给 NT 哈希,要确保哈希长度是 32 位,否则会识别失败。
认证失败的另一个高频原因是混淆了域账号和本地账号。域内主机的本地管理员密码测试,记得加--local-auth;用域账号批量验证时,最好用-d指定域名,避免 Netexec 自动把用户名里带不带域名的情况搞混。
8.3 自动化脚本中的稳定输出技巧
我后期跑大规模巡检时,基本不用屏幕上的彩色表格,而是把所有结果统一用--json输出,再写入临时文件,后面用 Python 或jq统一处理。
一个建议的命令组合:
nxc smb targets.txt -u admin -p 'P@ssw0rd' --shares --json > smb_result.json然后通过jq提取access == True的共享路径,自动生成整改工单。这样做的优势是结果可回溯,后期复盘时不用重新扫描。
8.4 关于授权和合规的底线建议
写到这里,必须强调一句:Netexec 这类工具的功能决定了它只能用在有明确授权的环境中。我每次执行命令前,都会先确认目标网段是否通过了客户书面的授权审批,并且在命令里严格限定目标范围,避免扫到不该扫的主机。
对于企业安全团队来说,建议先把目标范围写成文件,用nxc smb authorized_targets.txt的方式加载,而不是手工输入一长串网段。这样既方便留痕,也能最大程度防止误操作。安全测试的价值是发现并修复问题,而不是制造问题,边界感永远要在工具能力之前。