Server Message Block(SMB)协议是广泛应用于文件共享、打印机共享和进程间通信的网络协议,尤其在 Windows 环境中常见。渗透测试和网络安全审计中,SMB 是一个重要的攻击面,相关工具如 smbmap
、smbclient
和 netexec
提供了强大的功能来枚举、访问和利用 SMB 共享。本文将详细介绍这些工具的常见命令、用法和实际应用场景,帮助安全从业者和系统管理员更好地理解和使用它们。
1. SMB 协议简介
SMB 是一种客户端-服务器协议,用于在网络中共享资源(如文件、打印机)。它最初由 IBM 开发,后由 Microsoft 广泛采用,支持 NTLM 和 Kerberos 认证,运行在 TCP 端口 139 或 445 上。SMB 的常见版本包括 SMBv1、SMBv2 和 SMBv3,其中 SMBv1 因安全漏洞(如 EternalBlue)已被许多现代系统禁用。
在渗透测试中,SMB 枚举的目标包括:
- 发现共享目录及其权限。
- 提取用户、组或密码策略信息。
- 执行远程命令或上传/下载文件。
- 利用 SMB 漏洞(如 SMBGhost、SMBleed)。
以下将逐一介绍 smbmap
、smbclient
和 netexec
的详细用法,并补充其他相关工具的简单介绍。
2. smbmap:SMB 共享枚举利器
smbmap
是一个专注于 SMB 共享枚举的工具,基于 Python 的 Impacket 库开发,广泛用于渗透测试。它可以列出共享目录、检查权限、上传/下载文件,甚至执行远程命令。以下是 smbmap
的常见命令及其用法。
2.1 安装与依赖
smbmap
通常预装在 Kali Linux 中。若需手动安装,可通过 GitHub 仓库获取:
git clone https://github.com/ShawnDEvans/smbmap.git
cd smbmap
pip install -r requirements.txt
依赖包括 Impacket、PyASN.1 和 PyCrypto。
2.2 常用命令
2.2.1 列出共享目录
用于发现目标主机上的 SMB 共享及其权限。
smbmap -H <目标IP> -u <用户名> -p <密码>
-H
: 指定目标 IP 或主机名。-u
: 用户名(为空则尝试匿名登录)。-p
: 密码(支持明文或 NTLM 哈希,格式为LMHASH:NTHASH
)。- 示例:
输出示例:smbmap -H 192.168.1.100 -u guest -p ""
[+] IP: 192.168.1.100:445 Name: server.lan Disk Permissions Comment ---- ----------- ------- ADMIN$ NO ACCESS Remote Admin C$ NO ACCESS Default share IPC$ NO ACCESS Remote IPC Public READ ONLY Public Share
2.2.2 匿名登录
尝试使用空凭据访问共享:
smbmap -H <目标IP> -u "" -p ""
2.2.3 递归列出目录内容
列出指定共享中的文件和子目录:
smbmap -H <目标IP> -u <用户名> -p <密码> -R <共享名>
-R
: 递归列出指定共享的内容。- 示例:
输出示例:smbmap -H 192.168.1.100 -u admin -p password123 -R Public
[+] IP: 192.168.1.100:445 Name: server.lan Disk: Public dr--r--r-- 0 Mon Jan 10 12:00:00 2023 Documents -r--r--r-- 20480 Mon Jan 10 12:01:00 2023 readme.txt
2.2.4 上传文件
将本地文件上传到目标共享:
smbmap -H <目标IP> -u <用户名> -p <密码> --upload <本地文件> <共享名/目标路径>
- 示例:
smbmap -H 192.168.1.100 -u admin -p password123 --upload /tmp/payload.exe Public/payload.exe
2.2.5 下载文件
从共享下载文件到本地:
smbmap -H <目标IP> -u <用户名> -p <密码> --download <共享名/文件路径>
- 示例:
smbmap -H 192.168.1.100 -u admin -p password123 --download Public/secret.txt
2.2.6 执行远程命令
在目标主机上执行命令(需要管理员权限):
smbmap -H <目标IP> -u <用户名> -p <密码> -x <命令>
- 示例:
smbmap -H 192.168.1.100 -u admin -p password123 -x "whoami"
2.2.7 扫描多个主机
扫描 IP 范围或主机列表:
smbmap -i <IP范围> -u <用户名> -p <密码>
-i
: 支持 CIDR 格式(如192.168.1.0/24
)。- 示例:
smbmap -i 192.168.1.0/24 -u guest -p ""
2.2.8 检查可写共享
列出具有写权限的共享:
smbmap -H <目标IP> -u <用户名> -p <密码> --writable
2.2.9 指定域
在域环境中使用:
smbmap -H <目标IP> -u <用户名> -p <密码> -d <域名>
-d
: 指定域(如corp.local
)。- 示例:
smbmap -H 192.168.1.100 -u user -p password123 -d corp
2.3 注意事项
- 权限:某些操作(如命令执行)需要管理员权限。
- NTLM 限制:
smbmap
仅支持 NTLM 认证,不支持 Kerberos。 - 合法性:仅在授权范围内使用,未经许可的扫描可能违法。
3. smbclient:类 FTP 的 SMB 客户端
smbclient
是 Samba 套件的一部分,提供类似 FTP 的命令行界面,用于访问和操作 SMB 共享。它支持文件传输、目录浏览和共享枚举,适合 Linux/Unix 环境。
3.1 安装
smbclient
通常预装在 Linux 发行版中,可通过包管理器安装:
sudo apt install smbclient
3.2 常用命令
3.2.1 列出共享
显示目标主机上的共享列表:
smbclient -L <目标IP> -U <用户名>
-L
: 列出共享。-U
: 指定用户名(格式为用户名%密码
,若为空则匿名)。- 示例:
输出示例:smbclient -L 192.168.1.100 -U guest%""
Sharename Type Comment --------- ---- ------- Public Disk Public Share IPC$ IPC Remote IPC ADMIN$ Disk Remote Admin C$ Disk Default share
3.2.2 匿名访问
尝试匿名登录:
smbclient -L <目标IP> -N
-N
: 无密码(匿名)。
3.2.3 连接到共享
以交互模式连接到特定共享:
smbclient //<目标IP>/<共享名> -U <用户名>
- 示例:
进入交互模式后,提示符为smbclient //192.168.1.100/Public -U admin%password123
smb: \>
,支持以下命令:ls
: 列出目录内容。get <文件>
: 下载文件。put <文件>
: 上传文件。cd <目录>
: 切换目录。exit
: 退出。
3.2.4 非交互模式
直接执行命令:
smbclient //<目标IP>/<共享名> -U <用户名> -c "ls; get file.txt"
-c
: 指定要执行的命令(用分号分隔)。- 示例:
smbclient //192.168.1.100/Public -U admin%password123 -c "ls; get readme.txt"
3.2.5 递归下载
递归下载整个共享内容:
smbclient //<目标IP>/<共享名> -U <用户名> -c "recurse; prompt OFF; mget *"
recurse
: 启用递归。prompt OFF
: 禁用交互提示。mget *
: 下载所有文件。
3.2.6 指定域
在域环境中使用:
smbclient -L <目标IP> -U <域名>\<用户名>%<密码>
- 示例:
smbclient -L 192.168.1.100 -U corp\admin%password123
3.2.7 Kerberos 认证
在支持 Kerberos 的环境中:
smbclient //<目标IP>/<共享名> -k
-k
: 使用 Kerberos 认证(需配置 Kerberos 票据)。
3.3 注意事项
- 交互性:
smbclient
的交互模式适合手动操作,非交互模式适合脚本。 - Kerberos 支持:在 Active Directory 环境中,
-k
选项非常有用。 - 性能:递归下载可能较慢,建议结合其他工具(如
netexec
)。
4. netexec:多协议自动化渗透测试工具
netexec
(前身为 CrackMapExec)是一个强大的网络服务利用工具,支持 SMB、WinRM、RDP 等协议。它以自动化和批量操作为特色,适合快速枚举和测试大型网络。
4.1 安装
通过 GitHub 安装:
pipx install git+https://github.com/Pennyw0rth/NetExec
或使用 Docker:
docker run -it blacklanternsecurity/netexec
4.2 常用命令
4.2.1 基本扫描
扫描目标主机并获取基本信息(如主机名、域、OS 版本、SMB 版本):
netexec smb <目标IP>
- 示例:
输出示例:netexec smb 192.168.1.100
SMB 192.168.1.100 445 SERVER [*] Windows 10 Build 19041 (name:SERVER) (domain:corp.local) (signing:False) (SMBv1:True)
4.2.2 列出共享
枚举共享及其权限:
netexec smb <目标IP> -u <用户名> -p <密码> --shares
--shares
: 列出共享。- 示例:
netexec smb 192.168.1.100 -u admin -p password123 --shares
4.2.3 匿名访问
尝试匿名登录:
netexec smb <目标IP> -u "" -p "" --shares
4.2.4 执行命令
在目标主机上执行命令(需要管理员权限):
netexec smb <目标IP> -u <用户名> -p <密码> -x <命令>
-x
: 执行 cmd 命令。- 示例:
netexec smb 192.168.1.100 -u admin -p password123 -x "whoami"
4.2.5 执行 PowerShell 命令
执行 PowerShell 命令:
netexec smb <目标IP> -u <用户名> -p <密码> -X <PowerShell命令>
-X
: 执行 PowerShell 命令。- 示例:
netexec smb 192.168.1.100 -u admin -p password123 -X '$PSVersionTable'
4.2.6 递归下载共享内容
使用 spider_plus
模块递归下载共享内容:
netexec smb <目标IP> -u <用户名> -p <密码> -M spider_plus -o READ_ONLY=False
-M spider_plus
: 启用递归下载模块。-o READ_ONLY=False
: 包括可写共享。
4.2.7 用户枚举
枚举域用户:
netexec smb <目标IP> -u <用户名> -p <密码> --users
4.2.8 密码策略
获取域密码策略:
netexec smb <目标IP> -u <用户名> -p <密码> --pass-pol
4.2.9 Kerberos 认证
在 Kerberos 环境中使用:
netexec smb <目标IP> -k
-k
: 使用 Kerberos 认证。
4.2.10 批量扫描
扫描多个主机:
netexec smb <IP范围> -u <用户名> -p <密码>
- 示例:
netexec smb 192.168.1.0/24 -u guest -p ""
4.3 注意事项
- 自动化:
netexec
适合快速扫描和自动化任务,但可能产生较多网络流量。 - 权限:命令执行和高级操作需要管理员权限。
- 模块化:支持丰富的模块(如
zerologon
、petitpotam
),可通过-M
参数调用。
5. 其他相关工具简介
5.1 enum4linux
enum4linux
是一个 Perl 脚本,封装了 smbclient
、rpcclient
等工具,用于快速枚举 SMB 环境中的用户、组、共享和密码策略。
- 常用命令:
enum4linux -a <目标IP>
-a
: 执行所有枚举任务。
- 适用场景:快速提取域信息,尤其在允许空会话的系统中。
5.2 Impacket
Impacket 是一个 Python 库,包含多个 SMB 相关脚本(如 smbclient.py
、psexec.py
)。
- 示例:使用
smbclient.py
连接共享:python3 smbclient.py <域>/<用户名>:<密码>@<目标IP>
- 优势:支持 Kerberos 认证,适合复杂环境。
5.3 nmap SMB 脚本
Nmap 提供多个 SMB 相关脚本,用于漏洞扫描和共享枚举。
- 示例:枚举共享:
nmap --script smb-enum-shares -p 139,445 <目标IP>
- 示例:扫描 SMB 漏洞:
nmap --script smb-vuln* -p 139,445 <目标IP>
6. 实际应用场景
6.1 场景 1:发现可写共享
- 使用
smbmap
扫描共享:smbmap -H 192.168.1.100 -u guest -p "" --writable
- 发现可写共享
Public
,上传测试文件:smbmap -H 192.168.1.100 -u guest -p "" --upload /tmp/test.txt Public/test.txt
- 验证文件是否存在:
smbclient //192.168.1.100/Public -U guest%"" -c "ls"
6.2 场景 2:批量枚举域用户
- 使用
netexec
扫描域内主机:netexec smb 192.168.1.0/24 -u admin -p password123 --users
- 提取用户列表,结合其他工具(如
hydra
)进行密码喷洒。
6.3 场景 3:利用 SMB 漏洞
- 使用 Nmap 检测 SMB 漏洞:
nmap --script smb-vuln* -p 445 192.168.1.100
- 若发现 SMBGhost 漏洞,使用
netexec
测试:netexec smb 192.168.1.100 -u "" -p "" -M smbghost
7. 总结
smbmap
、smbclient
和 netexec
是 SMB 枚举和利用的三大核心工具,各自有独特优势:
smbmap
:专注于共享枚举和文件操作,适合快速权限检查。smbclient
:提供类 FTP 界面,适合手动操作和脚本化。netexec
:自动化程度高,适合批量扫描和复杂任务。
通过结合这些工具,安全从业者可以高效地发现 SMB 相关的安全问题,同时系统管理员可以利用它们审计和加固网络环境。在实际操作中,需根据目标环境选择合适的工具和认证方式(如 NTLM 或 Kerberos),并始终遵守法律和道德规范。