ServerMessage Block
SMB协议大家应该都有所了解,毕竟2017年的MS17-010血洗整个互联网,加上之前的MS08-067 漏洞,这些都是SMB协议上出现过的著名漏洞
SMB 主要完成的工作主要就是文件共享,假如同一个工作组使用smb 互相传输文件
SMB 协议还可以被用在sql注入的带外通道上,我曾经遇到的一个CTF的题目就是考察这个考点·,遗憾的是当时没有公网IP,后来发现很多网站已经集成了接收SMB信息的功能
端口
139,445
直至Windows10,微软才默认SMB服务关闭状态(即使很多人根本就没有感知)
版本信息
SMB1 win2000/xp/win2003
SMB2 winvista sp1/win2008
SMB2.1 win7/win2008 r2
SMB3 win8/win2012
SMB最初版本的时候存在一个空会话访问的问题,这可以说是一个很古老的漏洞了,如果你看08年左右的书应该会看到IPC$ 空会话连接等攻击手段,我在两年前尝试过复现这个漏洞,由于当时技术差也没有复现成功,如果现在再进行复现也没有太大的意义了
空会话访问我们可以获取到的信息
密码策略
用户名
组名
机器名
用户和组的 sid
这些信息都是对于我们十分重要的,就拿一个不起眼的密码策略来说明吧!
密码策略规则规定了密码的最基本条件,比如至少多少位,包含几种字符,很多时候我们在提权建立账号时候就因为不满足密码策略而失败,失败之后还一头雾水
由于Windows用户众多,而且SMB协议也是经常使用的一个协议,所以Linux也自己实现了一个类似的Samba服务,这个服务也是这两个端口,并且可以与windows 上的SMB服务对接
关于RID
windows系统中用来区分用户的就是RID
administrator500
Guest 501
自己创建的 1000+
关于SID
SID是由计算机的一些不确定的因素产生的一个随机字符
一般SID+RID成为一个完整的SID
SMB 和SAMBA 都是工作在ISO七层模型中的第五层:会话层
关于Netbios
Network basic input output system
netbios是原来TCP/IP协议未推广时期工作在会话层的一个协议,TCP/IP协议推行后也兼容netbios
netbios实现文件共享主要识别主机靠的就是netbios名称,每一个主机都有,一般都是取主机名的前15个字符
在windows的cmd下可以使用
c:/>hostname 查看主机名
c:/>nbtstat -A 192.168.1.1 查看netbios信息,其中192.168.1.1是自己的IP
可以查看主机的netbios名称
如果netbios的字符不足15个,netbios会添加空格补齐15个
准确得说netbios的名称是16个,最后一个字符是一个16进制数,用来标明服务类型 20表示文件服务器
TCP/IP成为事实协议标准后,内网中也开始使用dns做域名解析,TCP/IP作为传输协议,NetBT负责将netbios的名称解析成IP地址,以供Netbios正常工作,这个也叫做 NetBios over TCP/IP (简称NetBT)
NetBIOS提供标准网络通信接口
就是说程序员在设计的时候基于netbios的程序不需要在考率TCP/IP怎么样,只需要实现这个接口就行了
UDPport 137 (name services) 名称服务(名称解析,名称注册)
UDPport 138 (datagram services) 数据段,数据报文服务,通过这个段阔传输数据
TCPport 139 (session services) 会话服务,保证传输的会话。(客户端向139提出TCP连接请求,之后基于这个连接进行文件共享的会话)
名称唯一
节点类型
B(广播)、P(点对点)、M(混合)、H(超级)
如何关闭这些端口呢?
在windows的网络连接里面 Internet协议版本4里面的属性中高级可以看到wins,直接禁用就会关闭了
检测
Nmap
扫描内网使用smb 或者samba 服务的主机
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5CatF2c1omdqFTbvwVM5cjN3YzNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
这个是一台没有打补丁的win7 主机
我们来看一下smb的脚本有哪些
首先来查询一下操作系统吧
可以看到清晰的识别出了是win7 旗舰版,比我们之前获取到的信息要详细得多
如果我们有账号和密码能够获取更加详细的信息
--script-args=smbuser=administrator,smbpass=123456
这些枚举信息的脚本我就不一个一个尝试了,一起来吧
漏洞检测
之前 nmap 有 smb-check-vulns 这个脚本,这个脚本会自动测试几个漏洞是否存在,不过后来被官方去掉了,换成了smb-vuln-conficker、smb-vuln-cve2009-3103、smb-vuln-ms06-025、smb-vuln-ms07-029、smb-vuln-regsvc-dos、smb-vuln-ms08-067等等几个脚本,我没有看官方的说明,也不知道为什么会这样,不过我猜测可能是因为漏洞之间会互相影响(比如如果先检测一个DoS类型的漏洞,可能直接主机就宕机了,导致其他的检测出现问题),当然只是我的猜测。
nmap -p139,445 192.168.1.108 –script=smb-vuln-*.nse--script-args=safe=1
safe=1 这个参数是保证扫描过程中不会导致主机宕机,从而影响正常使用
可以看到存在ms17-010 漏洞,危害等级高,RCE漏洞
还有很多脚本大家可以自行学习一下,当然可以同时使用所有的关于smb的脚本
nmap -p139,445 192.168.1.108 --script=smb-*.nse
当然这种方式是不推荐的,毕竟会产生大量的数据包
nbtscan
nbtscan -r 192.168.60.0/24
这个工具可以扫描不同的网段,就比如你在192.168.1.x,你可以扫描192.168.2.x
enum4linux
enum4linux –a –u administrator –p 123456192.168.60.108
不允许进行整个网段的扫描
【使用方法】
Linux SAMBA服务枚举
enum4linux1.1.1.1
Windows系统枚举
这个工具最开始设计时候比较早,主要是针对2000和xp进行设计的,所以对于win2003等做了一定默认安全配置的服务器其实并不能查询到信息,只有当我们已经有一个账号以后,根据账号密码进行查询
一下这些查询的参数需要放在前面,指定用户名密码和目标IP放在后面
-U 用户列表
-S 共享列表
-P 密码策略
-G 组账号
-d 详细信息
-u 指定用户
-p 指定用户密码
-a (-U -S -G -P -r -o -n -i)全都用上
-r 循环枚举RID
-R 自定义范围循环枚举RID -R 600-650
-l 通过TCP/389端口枚举域信息
-kuser 查询已知用户SID
-sfile 爆破共享名
-o 操作系统信息
5.02000
5.1xp
5.22003
-i 打印机信息
enum4linux -U -d -u administrator -p 123 192.168.2.1
关于SMB协议的扫描也就介绍这些,不过关于SMB的漏洞还有很多,由于SMB协议本身就有漏洞,没有打补丁的主机就可以直接获取shell,结合msf可以很简单的就完成。