【翻译】自底向上学习SMB和Samba
27 Mar 2019在这篇教程我们将介绍服务器报文块协议(Server Message Block或SMB)。尽管大多数人听说过这个缩略词(指SMB),但极少数人真正地理解这个重要的协议。SMB可能是通信协议中最难理解的协议了,但它对于网络的流畅运作非常重要,这是安全的特点。
什么是SMB
服务器报文块协议(Server Message Block,后文均称SMB)是七层协议中应用层的一个协议,广泛地应用于文件、端口、命名管道和共享打印机。它是C-S(客户端-服务器)型的通信协议,可以使用户(users)和应用程序通过局域网分享资源。如果某个电脑有个其他电脑需要读写等进行文件操作的文件,此时SMB能让用户与其他用户分享文件。此外,SMB还能让你在局域网分享打印机。
在TCP/IP上的SMB占用445端口。
SMB为C-S型的有请求和响应的协议。下图展示了这个协议请求-响应的方式。客户端通过TCP/IP或NetBIOS连接服务器。一旦两者建立连接,客户端就能发送指令来获取分享、读写文件和获取打印机。通常SMB能使客户端做任何人们在自己电脑系统做的事,但必须有网。
SMB最开始在20世纪80年代被IBM公司开发出来,后来微软采用了这个协议并让它适配于Windows操作系统。
CIFS
CIFS(Common Internet File System,通用Internet文件系统)和SMB经常被新手甚至网络安全专业人士搞混。CIFS代表“Common Internet File System”,是SMB协议的一种形式、一种特殊的实现,被微软开发并应用于其早期的操作系统。
现在CIFS协议逐渐被废弃因为它被更多现代化的SMB(包括2006年Windows Vista引进的SMB2.0、2012年Win8和Windows Server 2012引进的SMB3.0)的实现方法取代。
弱点
以前Windows上的SMB和Linux/Unix系统上的Samba是操作系统严重弱点的主要来源,很可能以后也是。过去十年最严重的Windows弱点中有两个是SMB弱点,包括MS08-067和NSA开发的最近的“永恒之蓝”漏洞利用。这两种漏洞利用都使攻击者可以向目标系统的SMB发送特制的数据包并执行远程代码提权。也就是说,有了这些漏洞,攻击者可以拿到任何系统的权限想做什么做什么。
想了解更多“永恒之蓝”通过Metasploit在Win7系统的的利用,可以看原作者的教程。此外,通过使用Metasploit攻击者还可以伪造一个假SMB服务器来捕获相关证书。
还有,SMB在Linux/Unix的使用——Samba,同样存在自身的问题。
尽管不是这些弱点和漏洞的完整清单,但当我们在Metasploit5找smb漏洞时我们还是找到了比较详细的以下列表。
注意这个被标注的臭名昭著的MS08-067漏洞给百万多的Windows Server 2003、Windows XP和更早的系统带来安全威胁。在列表最下面你可以看到NSA过去威胁无数系统的“永恒之蓝”漏洞(MS17-010),在这个漏洞被Shadowbrokers泄露之后它被Petya和WannaCry等勒索软件利用。
在原网站网络取证部分,原作者详细分享了对抗Win7系统SMB的“永恒之蓝”漏洞的协议包层次。
Samba
SMB最初被IBM开发然后被微软采用,而Samba被开发用于Linux/Unix系统来效仿Windows服务器。Samba使能够像Windows系统一样把资源分享给Windows系统。
有时候理解协议或系统的最好方式很简单,就是自己亲自把它们安装部署一遍。
现在,我们要在Linux系统上安装、调整设置并部署Samba。通常我总是使用Kali——一个基于Debian的系统,但这种方法应该适用于任何Debian系统(包括Ubuntu和任何版本*NIX系统在内)。(译者注:亲测现在的Kali滚动版自带Samba)
第一步:下载和安装Samba
第一步,如果系统未曾安装Samba(大多数系统更新源镜像站都有Samba),就敲入以下命令:
kali > apt-get install samba
第二步:启动Samba
Samba下载安装完成后我们就需要启动它。Samba在Linux系统上类似于一种服务,我们可以用“service”命令启动它。
kali > service smbd start
记住这个服务不叫“Samba”而是“smbd”或”smb“进程。
第三步:设置Samba
几乎所有在Linux上的应用服务都需要对某个conf(设置)文件进行设置。对于Samba,这个文件位于“/etc/samba/smb.conf”。让我们用文本编辑器打开吧。
kali > leafpad /etc/samba/smb.conf
让我们在文件末尾加入以下几行:
[Me_share]
comment=Samba share
path = 自定义路径
read only = no
browsable = yes
在我们的示例中,是这样的:
- 先命名我们的分享:[Me_share];
- 再写上注释:comment = Samba share;
- 提供我们要分享的路径(相当于Win系统的文件夹):path = 自定义路径;
- 赋予或限制读写权限:read only = no;
- 窗口浏览权限:browsable = yes;
注意上述步骤只是示例仅供参考,我们可以自己决定路径或权限的是否。
第四步:创建一个分享
现在我们设置好了Samba的选项,我们该创建分享了。分享的对象就是我们让网络上其他用户和应用可以访问的文件目录和文件内容。
第一步就是在用户的home文件夹用mkdir命令创建一个文件夹。现在我们为叫OTW的用户创建一个叫HackersArise_share的文件夹。
mkdir /home/OTW/HackersArise_share
文件夹被创建完成后,我们需要给与每个要接触这个文件夹的用户读写等权限,用chmod命令。
kali > chmod 777 /home/OTW/HackersArise_share
现在得重启Samba来让它更新我们已对准备分享的文件进行的设置。
kali > service smbd restart
分享被创建后,本网络上的Windows系统机可以通过在文件资源管理器敲入如以下命令来很简单地访问这个分享:
\\192.168.1.101\HackersArise_share
总结
SMB对于大多数计算机系统是一个很重要的协议,可以进行文件、端口、打印机和命名管道分享。对于大多数网络空间安全大佬来说不太好懂也不太好接受,但是像上述展示的MS08-067和NSA的“永恒之蓝”严重漏洞弱点都与它相关。我们越是理解这些协议,就越能防止恶意攻击和威胁而保护自己的系统。