由BreakOut引发对SMB的进一步思考
前言:在打BreakOut的时候同样也有个Samba,但是又接触了一遍之后发现还有好多是之前未曾了解的
因此这里这里记录汇总一下
SMB协议
最开始的话还是再梳理一下这个协议,它最初是为了让 Windows 电脑之间能互相“共享文件和打印机”而设计的,但现在它已经演变成了企业内网通信的核心:
-
SMB 的核心功能
虽然大家最熟悉的是“共享文件夹”,但 SMB 能做的事情远不止于此:文件访问:读、写、创建、删除远程服务器上的文件。
打印服务:将文档发送到网络打印机。
进程间通信 (IPC):最出名的就是 IPC$ 管道,很多黑客工具和管理工具利用它来执行远程命令(比如 psexec)。
服务发现:在局域网内广播,告诉大家“我在这里,我有共享资源”
-
SMB 的通信过程(以访问文件为例)
当我们在电脑上输入\\10.144.45.107\share时,后台发生了以下步骤:建立连接 (TCP Handshake):SMB 现代版本通常运行在 TCP 445 端口上(老版本可能用 NetBIOS 的 139 端口)
协议协商 (Negotiate):客户端问:“我会 v1, v2, v3,你用哪个?”服务器回:“我也支持 v3,咱就用 v3"
身份验证 (Session Setup):客户端发送账号密码(通常是
NTLM或Kerberos哈希)。服务器确认没问题后,建立会话连接共享 (Tree Connect):客户端请求访问具体的文件夹路径
交互操作:开始读取文件内容
-
SMB 的版本演进
SMB 经历过几次重大的技术跨越,安全性也随之翻天覆地:SMB 1.0 (CIFS):
-
现状:已淘汰
-
特点:极其臃肿、速度慢、极不安全。它是永恒之蓝 (EternalBlue) 漏洞的温床
SMB 2.0 / 2.1:
-
时代:随 Windows Vista/7 引入
-
提升:极大减少了网络“废话”(封包减少),支持更大的读写缓冲区
SMB 3.0 / 3.1.1:
-
时代:随 Windows 8/10/11 引入
-
核心:强制加密。现在的 SMB 3.x 支持 AES 认证加密,即使黑客在中间截获了流量,也看不见传输的文件内容
-
-
如何利用
在内网渗透中,SMB 几乎是必经之路:横向移动:如果攻击者拿到了一个管理员账号,可以直接通过 SMB 在其他机器上远程启动服务(如 MSF 的 psexec 模块)
信息泄露:如果没有正确配置(开启了空连接/匿名访问),攻击者可以枚举出系统里的用户列表、共享路径甚至磁盘结构
中继攻击 (Relay):利用 NTLM 协议的缺陷,攻击者可以把我们的登录凭据“转发”给另一台服务器,从而进行冒充登录
SMB版本
协议版本
下一个是获取SMB的具体版本,刚开始的时候用的是MSF:

可以看到显示的是3.1.1
然后是nmap:
nmap -p 445 --script smb-os-discovery,smb-protocols 10.144.45.107

扫出来结果不同的原因简单来说Nmap 在列举“可能性”,而 MSF 在寻找“最优解”:
-
Nmap 的逻辑:询问“你支持哪些?”
使用的 Nmap 脚本smb-protocols的原理是向目标主机发送一个 SMB 协商请求
它的过程:Nmap 就像是在问服务器:“嘿,我能用 v1, v2, v3 协议跟你说话吗?”服务器的回应:目标服务器会查表,然后告诉 Nmap:“我支持列表里的这些协议版本”
结果:Nmap 会把服务器声明支持的所有协议全部列出来。所以会看到从 2.0.2 到 3.1.1 的一长串列表
-
MSF 的逻辑:询问“我们用哪个?”
当我们使用 MSF 的auxiliary/scanner/smb/smb_version时,它的目的是建立一个实际的连接来提取版本信息它的过程:MSF 也会发送协商请求,但它通常会直接尝试以该服务器支持的最高版本进行握手
协商结果:在 SMB 协议中,客户端和服务器会自动“向下兼容”,最终只选定一个双方都支持的最高版本来通信
结果:MSF 只会显示最终协商成功的那个版本(即当前最高、最安全的版本)。在该靶机中,目标支持 3.1.1,所以 MSF 只报 3.1.1
软件版本
再后面enum4linux扫出来的又不一样:
enum4linux -a 10.144.45.107

区别
| 工具 | 扫描结果 | 含义 | 对应关系 |
|---|---|---|---|
| Nmap | 2.02 到 3.1.1 | 能力范围 | 服务器支持从 Vista 到 Win10/11 水平的协议。 |
| MSF | 3.1.1 | 当前会话 | 本次通信实际使用的最高版本。 |
| enum4linux | Samba 4.13.5 | 软件型号 | 目标运行的是 2021 年左右发布的 Samba 软件。 |
这么看其实有些懵,可以再做一个类比:
| 层面 | 对应概念 | 例子 | 解释 |
|---|---|---|---|
| 协议 (Protocol) | HTTP / HTTPS | HTTPS 1.1 / 2.0 / 3.0 | 就像是“交通规则”。无论你用什么设备,大家必须遵守同一套规则(如:如何请求数据、如何加密) |
| 软件 (Software) | 浏览器 (Browser) | Chrome, Firefox, Safari | 就像是“具体的车”。不同公司造的车不同,内饰、引擎、安全性也不一样 |
| 软件版本 (Version) | 具体的补丁号 | Chrome 124.0.x | 就像是“车的年款”。2024款肯定比2010款修补了更多零件缺陷(漏洞) |
enum4linux简单枚举
具体讲一下enum4linux -a 10.144.45.107这个枚举出来的信息,要不然后面忘了再看又是两眼一黑:
Target Information模块

此模块由enum4linux基于用户输入参数和内置默认值自动填充,反映的是扫描发起前的预设配置,而非从目标获取的实际信息。
Target为扫描对象的IP地址;
RID Range定义了后续用户枚举时查询的SID相对标识符范围,500-550覆盖Windows内置账户(如500为默认Administrator,501为Guest),1000-1050覆盖Samba环境下Unix系统用户的典型映射起始范围;
Username和Password为空字符串表明本次扫描以匿名会话发起;Known Usernames列表是enum4linux内置的一个硬编码常见账户名集合,用于在无法通过RPC直接枚举时进行SID反查和账户存在性验证
其中的administrator、guest、krbtgt、domain admins是Windows域环境的标准主体,root、bin、none则是Unix系统中的典型系统账户。该列表中账户名的出现仅代表工具预设,不能作为目标上确实存在这些账户的证据
Enumerating Workgroup/Domain模块

此模块通过向目标SMB服务发送SMB会话建立请求,提取协议协商阶段返回的Primary Domain字段,结果为WORKGROUP,表明该Samba服务器配置在标准的工作组模式而非Active Directory域模式下运行。
在Windows域体系中,此字段将返回域NetBIOS名;在域控制器上,此字段与DNS域名存在关联。
WORKGROUP是Windows和Samba安装后的默认工作组名称,其值本身不具有区分度,但对于判断目标是否属于域成员具有排他性作用:若返回明确的域名称,说明目标可能作为域成员服务器运行,此时主域控制器将成为下一步的探查对象;
WORKGROUP的返回结果将侦察范围明确限定为单机环境
Nbtstat Information模块

此模块调用nmblookup工具向目标的NetBIOS名称服务(UDP端口137)发起名称查询,获取目标主机在本地局域网广播域内注册的NetBIOS名称表。
NetBIOS是Windows网络体系中的遗留命名与发现协议,Samba完整实现了这一协议栈以实现与旧版Windows客户端兼容.
名称表中的每个条目由三部分组成:注册名称、类型标识号以及服务类型标志 本次输出的解析如下:
-
BREAKOUT <00> 表示
Workstation Service,即该主机可作为NetBIOS客户端向其他服务器发起请求。 -
BREAKOUT <03> 表示
Messenger Service,用于接收或发送局域网弹出消息(此服务在现代Windows中已弃用,Samba保留此声明旨在兼容旧版API) -
BREAKOUT <20> 表示
File Server Service,即该主机声明自身作为SMB文件服务器对外提供共享资源访问 -
..MSBROWSE.<01> 是
Master Browser服务名,表示该主机注册为局域网浏览主控服务器候选,负责维护局域网内可用主机的浏览列表 -
WORKGROUP <00> 是该工作组在NetBIOS命名空间中的域名声明,标记此主机属于
WORKGROUP工作组 -
WORKGROUP <1d> 为
Master Browser标识,表示当前该工作组内由谁来充当浏览主控——此处由BREAKOUT主机自身注册,意味着它已当选或自我声明为工作组的主浏览器。 -
WORKGROUP <1e> 为
Browser Service Elections标识,用于浏览器选举协议中的通信组播。
MAC Address字段为全零值(00-00-00-00-00-00),此值并非真实物理网卡MAC,而是虚拟化平台或容器环境中NAT网络卡驱动未向NetBIOS层暴露物理地址时的默认填充值。此项确认了目标运行于虚拟化环境,与物理硬件的安全取证无关。
Session Check模块

此模块调用smbclient以空用户名和空密码尝试建立到目标IPC$共享的会话连接
返回结果 Server 10.144.45.107 allows sessions using username '', password ''”确认空会话连接成功建立。这一结果具有以下技术含义:
目标Samba的security模式至少配置为user级别而非share级别中完全禁止匿名,且map to guest或restrict anonymous参数未被设置为极端严格的最高安全级,允许匿名用户在通过SMB协议认证后访问部分RPC端点. 此条件是后续所有基于空会话的信息枚举(rpcclient调用、用户列表提取、密码策略查询)能够执行的前提
Getting domain SID模块
先了解一下SID【数字身份证】是啥:
一个典型的 SID 看起来像这样:
S-1-5-21-3165297888-301567370-576410423-1001
可以把它拆开看:
S:表示这是一个 SID。
1:版本号(目前始终为 1)。
5:颁发机构(Identifier Authority),5 代表的是 Windows 系统。
21-xxxx-xxxx-xxxx:域或本地计算机的标识符。这串数字就像是你的“户口所在地”。
1001:RID (Relative Identifier)。这是最关键的部分,代表在这个系统里的具体编号
通过 SMB 协议,攻击者可以不断尝试不同的 RID(比如从 500 试到 1100)。如果服务器有配置缺陷,它会老老实实告诉我们每个 RID 对应的用户名。

此模块尝试通过LSARPC接口获取目标域的机器SID,如果目标是一个域控制器或域成员,此SID将与域内所有主体的SID前缀保持一致。
本次返回“(NULL SID)”,即目标未返回可解析的域SID。这一现象与WORKGROUP模式完全吻合:
在工作组模式下,每台Samba服务器的本地SAM数据库维护独立的SID空间,不存在一个统一分发的域SID,因此enum4linux的下行输出“Can't determine if host is part of domain or part of a workgroup”是逻辑一致的正确判断。
(NULL SID)的结果也意味着,后续通过lookupnames取得的用户SID将呈现本地SAM的独立SID结构而非域SID结构
OS Information模块

此模块包含两个子探测路径。第一路径调用smbclient尝试通过协商阶段的服务器banner获取操作系统信息,但本次返回 Can't get OS info with smbclient,说明smbclient在SMB协议版本协商中未收到目标主动暴露的详细OS描述字符串。
第二路径通过rpcclient的srvsvc接口调用NetServerGetInfo获取服务器信息,此为enum4linux成功提取OS数据的主通道
srvsvc返回的服务器类型字符串含义:
| 缩写 | 含义 |
|---|---|
| Wk | Workstation |
| Sv | Server |
| PrQ | Print Queue |
| Unx | Unix |
| NT | Windows NT 兼容声明 |
| SNT | Server NT |
Unx标志以协议层面的字段直接确认底层OS为Unix-Like系统,将此前基于自签名证书主机名和间接信息的OS推断推进为实证结论。
Samba 4.13.5-Debian提供的是Samba软件包自身的语义化版本和编译/打包来源(Debian发行版的官方软件包),此版本号是漏洞检索的核心索引键
platform_id字段值为500,此数值在Microsoft定义中对应NT非域控制器(PLATFORM_ID_NT_SERVER),Samba通过硬编码返回此值以兼容Windows API预期。
os version字段值为6.1,在Windows产品线中等价于Windows 7/Windows Server 2008 R2,同样由Samba进行兼容性赋值,不代表实际运行的Debian版本
server type字段值为0x809a03,此32位掩码的二进制解析与前述“Wk Sv PrQ Unx NT SNT”各标志位逐位对应,为同一信息的机器可读表现形式
Users on模块

枚举用户的功能由rpcclient的SAMR接口调用实现。
enum4linux预期通过enumdomusers获取用户列表,但在本次执行中,脚本抛出Perl层面的uninitialized value users错误。此错误意味着SAMR调用返回的数据在Perl封装程序的解析阶段处理失败——可能是由于目标Samba返回了空用户列表(在严格限制的匿名策略下合法),也可能是返回格式与enum4linuxv0.9.1内置解析逻辑存在不匹配。
因users变量始终保持未初始化状态,后续对此变量执行的print和pattern match等操作均失败,导致整个模块无有效数据输出。该错误指向的是客户端解析器的脆弱性,而非目标服务的必然配置问题
Share Enumeration模块

此模块首先使用支持SMB2及更高版本协议的Samba库进行共享列表枚举,成功识别出两个默认共享:print
(类型Disk,用于共享打印机驱动程序文件)和IPC(类型IPC,命名管道进程间通信接口,是RPC绑定的底层通道)
随后enum4linux按设计尝试以SMB1协议重新连接以获取工作组级浏览列表,但服务器拒绝执行版本降级至LANMAN1至NT1区间,返回“NT_STATUS_INVALID_NETWORK_RESPONSE”,说明该Samba服务器已完全禁用SMB1协议支持
Samba 4.11及之后版本的默认配置已引入server min protocol = SMB2_02参数,SMB1默认关闭,此项输出与Samba 4.13.5的预期行为一致
随后的共享映射尝试中,对print返回Mapping:DENIED,表明匿名会话成功枚举到共享名称但无权映射该共享对应的文件树
对IPC返回Mapping: N/A这是IPC$作为特殊共享类型的正常行为——它仅用于命名管道通信而非文件映射。通过映射返回的NT_STATUS_OBJECT_NAME_NOT_FOUND错误则进一步确认匿名用户在文件级操作层面受到有效限制
总结:
enum4linux -a扫描输出了六个模块中七个有效数据区块。核心情报可归纳为以下层次:
身份层确认主机名为BREAKOUT、工作组模式为WORKGROUP;
网络层揭示目标运行于虚拟化平台并注册了多个NetBIOS服务角色;访问控制层确认匿名空会话已建立,IPC$共享可用于RPC绑定;
平台层以实证方式确认底层OS为Debian系Linux,运行Samba 4.13.5;
信息缺口层明确标注用户枚举因脚本错误失败、密码策略因权限限制未返回。
完整输出的深层价值在于同时提供了可用通道(空会话RPC)和明确障碍(SMB1禁用、脚本解析错误)
rpcclient中常用命令
RPCclient 是一种用于实现远程过程调用(RPC)的客户端工具。它允许用户在不同计算机之间像调用本地函数一样执行代码,简化了分布式系统的开发。RPCclient 通常用于枚举域内信息,例如用户、组和权限等,广泛应用于安全测试和渗透测试中
rpcclient 专门通过 IPC$ 调用远程过程(RPC),能让我们查清服务器的底细:
rpcclient -U "" -N 10.144.45.107
基础信息查询
srvinfo
查询服务器的基本信息,确认操作系统版本,它是工作组还是域控,这是第一步踩点。

netshareenumall
列出所有共享,它能看到被隐藏的共享(名字后面带 $ 的)

用户与权限枚举(最核心)
enumdomusers
枚举域名(或本地机器)的所有用户,直接列出系统里的所有用户名和对应的 RID。
queryuser
查询特定用户的详细信息,如queryuser 500
查看该用户最后登录时间、密码到期时间、账号是否被禁用等。
enumdomgroups
枚举所有组,确定哪些组最有价值。
querygroup
查看组内成员,比如我们查到了管理员组的RID是 544,用这个命令能看到谁在管理员组里
但是在这里没啥东西:

SID 与 翻译(关联分析)
lookupnames
把用户名翻译成 SID,如果我们知道一个名字(比如 admin),用这个拿到它的完整 SID
lookupsids
把 SID 翻译成用户名,反向查询,遍历 SID 时非常有用
但是同样这里啥都没用,那么这里大概率SMB就用不了了,最后估计还得回到web端
写在最后
其实这里本来还想写用nex来进行爆破RID啥的来查找有无用户,但是单个靶机上好像没找到【翻了一下别的有SMB的】,估计还得到后面的域环境,碰到了再说吧,这些也够喝一壶的。

浙公网安备 33010602011771号