enum4linux 报 Server doesn't allow session 与 SMB 主机信息枚举
enum4linux 是一个封装 Samba 套件(rpcclient、net、nmblookup、smbclient)的枚举脚本,用于从一个 IP 上提取 Windows 或 Samba 主机的用户、共享、工作组与密码策略等信息。它本身不实现协议,只是把几条 SMB/NBT 命令串起来并解析输出。
仅供已获得书面授权的安全测试使用。
安装与版本
Kali 自带。先看脚本本体:
bash
head -12 /usr/bin/enum4linux
输出说明它只是一层包装:
#!/usr/bin/env sh
set -e
cd /usr/share/enum4linux/
exec ./enum4linux.pl "$@"
版本信息在帮助里:
bash
enum4linux -h
首行即版本:
enum4linux v0.9.1 (http://labs.portcullis.co.uk/application/enum4linux/)
Kali 2025.4 同时装了重写版:
bash
enum4linux-ng --help
ENUM4LINUX - next generation (v1.3.7)
基本用法
-a 是最常用的参数,等价于同时开启 -U -S -G -P -r -o -n -i:
bash
enum4linux -a 192.168.1.20
对一个没有开放 SMB 的主机执行时,它会逐段报错但继续跑:
Starting enum4linux v0.9.1 on Wed Oct 14 16:32:39 2026
=========================================( Target Information )=========================================
Target ........... 127.0.0.1
RID Range ........ 500-550,1000-1050
=============================( Enumerating Workgroup/Domain on 127.0.0.1 )=============================
[E] Can't find workgroup/domain
=================================( Nbtstat Information for 127.0.0.1 )=================================
Looking up status of 127.0.0.1
No reply from 127.0.0.1
=====================================( Session Check on 127.0.0.1 )=====================================
[E] Server doesn't allow session using username '', password ''. Aborting remainder of tests.
各段独立,前面的失败不会中断整体,只有 Session Check 失败才会 Aborting remainder of tests。
报错 Server doesn't allow session
[E] Server doesn't allow session using username '', password ''. Aborting remainder of tests.
含义是用空用户名空密码建立 SMB 会话被拒绝,后续依赖会话的枚举(用户、共享、组)整段跳过。三种常见情形:
- 目标是 Windows 10/11 或较新的 Server,默认禁止匿名会话,这属于正常加固,不是漏洞;
- 目标根本不是 SMB 服务,445/139 没开。先把端口确认掉:
bash
nmap -p 139,445 192.168.1.20
- 已经拿到低权限账号,直接带凭据枚举:
bash
enum4linux -u user -p 'Passw0rd' -a 192.168.1.20
若目标只开放 139 而 445 不通,脚本会走 NetBIOS 会话,成功率明显下降。用 -v 可以看到它实际执行的每条 net 与 rpcclient 命令。
报错 Can't find workgroup/domain
[E] Can't find workgroup/domain
这是 nmblookup 拿不到 NetBIOS 名称。主机名解析依赖 NBT,只开 TCP 445 的现代 SMB 可能不回 NetBIOS 查询。用 -w 手动指定工作组可以跳过这一步:
bash
enum4linux -w WORKGROUP -a 192.168.1.20
它不影响后续基于 445 的 RPC 枚举,属于可忽略的噪声。
enum4linux 与 enum4linux-ng 的差别
两者同机共存。enum4linux 是 2011 年的 Perl 老脚本,enum4linux-ng 是重写版,差异主要在结果处理:
[-oJ OUT_JSON_FILE | -oY OUT_YAML_FILE | -oA OUT_FILE]
新版支持把枚举结果直接导出成 JSON 或 YAML,便于批量收集后统一处理:
bash
enum4linux-ng -A -oJ host.json 192.168.1.20
新目标建议直接用 enum4linux-ng,老字典与老教程里的命令仍可用 enum4linux 等价执行。
分场景用法
只取用户列表:
bash
enum4linux -U 192.168.1.20
只取共享列表:
bash
enum4linux -S 192.168.1.20
取密码策略,包含最短长度、锁定阈值与历史次数:
bash
enum4linux -P 192.168.1.20
匿名被限时用 RID 循环枚举用户:
bash
enum4linux -r -R 500-550 192.168.1.20
对域控补充 LDAP 389 段的信息:
bash
enum4linux -l 192.168.1.20
拿到凭据后的枚举顺序
匿名会话被拒、又拿到一组低权限账号时,按下面的顺序推进。
先确认会话可用:
bash
smbclient -L //192.168.1.20 -U user%'Passw0rd'
再带凭据让 enum4linux 跑全量:
bash
enum4linux -u user -p 'Passw0rd' -a 192.168.1.20
对列出的共享逐个尝试读取,重点看是否有可写目录:
bash
smbclient //192.168.1.20/share -U user%'Passw0rd'
域环境里再用 LDAP 段补齐组织信息:
bash
enum4linux-ng -A -u user -p 'Passw0rd' 192.168.1.20
顺序的原则是先证明会话可用,再枚举,最后验证可读写性,避免在无效凭据上反复试。
适用边界
enum4linux 面向 SMB/NetBIOS 与少量 LDAP,不覆盖 WinRM、RDP、WMI 等其它管理面。它的输出偏清单性质,用户、组、共享、密码策略这些信息本身不代表漏洞,价值在于为后续的凭据猜解与横向移动提供素材。只开 SMB3 且关闭匿名访问的主机,能拿到的信息会明显减少,这是加固生效的表现。
注意事项
Server doesn't allow session在新版 Windows 上是常态,说明对方做了基线加固,不要当成漏洞上报。- enum4linux 的结果都来自 SMB/NBT 的公开可读信息,本身不写入目标;但
-A(Aggressive)会尝试写检查,测试前确认授权范围。 - 老脚本依赖 Samba 客户端,缺
smbclient、rpcclient、polenum时会静默少输出几段,先用-v确认命令是否真的执行。 - 同一网段批量枚举时把结果导出成 JSON,比逐个看终端滚动更可靠。
- 结果里的用户名与共享名只是线索,是否可利用要回到具体漏洞与凭据继续验证。