微软SMB和空会话介绍​

admin 2022年6月7日00:12:58评论257 views字数 4153阅读13分50秒阅读模式

微软SMB和空会话介绍

2020年2月21日

 

空会话(Null sessions)

       SMB是我在微软工作期间接触最多的技术之一。您也可能通过其他常用名称知道SMB: CIFS和Samba。虽然这在技术上是三种不同的东西,但许多人可以互换使用这个术语来描述同一个的网络文件系统协议。为什么?这是一个涉及IBM、微软、Linux大约35年历史的漫长故事。你所需要知道的是,在微软我们使用术语SMB(服务器消息块)。

       但是如果您一定要知道,简化的版本是这样的:SMB是协议,CIFS是SMB的一种古老方言,而Samba是SMB协议的Linux/ unix的实现。人们和公司熟悉其中一个术语并坚持使用它,这使得这三个名称在技术文档之外可以互换。

       你可能会问什么是空会话?空会话意味着对网络资源的访问是在没有身份验证的情况下授予的。也称为匿名或访客访问,最常见的是IPC$ "Windows Named Pipe"共享。Windows已经很长一段时间不允许null或匿名访问了。

 

凭证和SMB

       大多数入侵检测软件似乎不了解在Active Directory (AD)环境中,Windows如何认证SMB,这通常是导致误报的原因。Windows和SMB确实希望人们成功地连接到文件共享,因此他们想尽办法尝试所有可用凭证来完成连接。

       人们倾向于认为用户名是唯一的身份验证机制,在工作组中,这基本上是正确的。添加AD后,身份验证情况就会发生变化。将计算机加入域的动作创建了一个计算机对象。计算机对象(<hostname>$)是AD中有效的身份认证对象,可用于对Windows和SMB共享进行身份验证。虽然SMB很少退回到计算机或机器、帐户,但这是可能的。

       例如,Hyper-V可以被设置为在不使用S2D或SAN的情况下通过SMB 3访问虚拟硬盘。这种设置使用Hyper-V主机的机器帐户来访问SMB共享,而不是使用用户或服务帐户。

       如果没有显式提供帐户,SMB将尝试隐式凭证。首先是登录用户的帐户,然后有时是计算机对象。一些具有特定权限的共享和第三方文件服务器将允许计算机帐户连接。您可能权限受限或没有访问权限,但它将进行身份验证。

       使用隐式凭证不是空会话连接,因为提供了凭据;即使它们并没有被显式提供。这意味着SMB会话正在被授权,因此不是空会话。

       究竟什么是隐式和显式凭证?显式凭证是作为身份验证的一部分提供的凭证。这就像点击“使用不同凭证连接”复选框时,映射一个驱动器与文件资源管理器,或“net use /user”。隐式凭证与此相反。如果没有提供显式凭证,则意味着操作系统应该使用当前登录用户的凭证。


测试

       你不相信我,对吧?渗透测试说这是一个空会话。你甚至用命令来证明。现在你会认为微软又在玩老把戏了。20年了空会话错误仍然没有修复!

好吧,我证明给你看。这些都是任何人都可以做的测试。我将使用行业标准的包捕获和分析工具Wireshark,并通过三个主要测试来打动您。

 

  1. 工作组到工作组-两个没加入域的Windows 10 1903(2019年春季更新)系统。所有更新已安装,截止2019年10月。除了设置文件共享外,没有做任何更改。

  2. 工作站到工作站-两个加入域的Windows 10 1903(春季2019更新)系统。所有更新已安装,截止2019年10月。除了加入域和设置文件共享外,没有进行任何更改。

  3. 工作站到域控制器(DC) -个加入域的工作站到DC。工作站运行完全补丁的Win10 1903, DC运行完全补丁的Windows Server 2019。默认域策略,无需加固,无需额外的策略或配置。

       通常有两个命令用于测试空会话,我将使用这两个命令进行测试,外加一个额外的基于场景的测试。第一个命令显式地设置了一个不存在用户(/user:)和密码("")

net use \<IP ADDRESS>IPC$ "" /user:

       第二个命令不设置显式凭证。这是更有趣的行为,因为它为Windows留出了尝试隐式凭证的空间。

net use \<IP ADDRESS>IPC$

non-IPC$ 共享测试

net use \<IP Address>share                                                    

对于域测试,我将使用域的SYSVOL共享

net use \<DC>SYSVOL

 

理解 IPC$

       进程间通信共享(inter-process communication share,IPC$)是一种特殊情况。正是这个共享允许远程命名管道(Named Pine)访问。管道是一种老式的方法,用于允许两个服务相互通信,甚至在一个网络连接上。IPC$功能已经存在很长时间了,IPC$的默认访问规则随着Windows的每个版本而改变。旧版本的Windows的行为可能与这些测试不同。

网络配置:

Subnet: 10.19.0.0/24

服务器:    10.19.0.1

RedWrk:    10.19.0.2

BlueWrk:   10.19.0.3

域用户账户:

RedUser

BlueUser

域:

CONSTOSO

本地账户:

LclRed

LclBlue

计算机名:

RedWrk

BlueWrk

 

SMB如何连接

       在我们继续之前可能需要一些基本知识。有三个关键的SMB命令用于认证和授权:Negotiate, Session Setup和Tree Connect。

  • Negotiate(协商)-这个命令决定SMB使用哪种方式(主要.次要版本),发现基本设置,取决于使用方式,执行一些预认证。

  • Session Setup(会话设置)—执行身份验证的地方。在这里交换凭证、Kerberos票据或安全令牌,在这一步批准或拒绝常规授权。

  • Tree Connect(树连接)—从授权到共享。Tree Connect从上一步Session Setup获得安全帐户,并使用该帐户来确定是否应该批准对单独共享的访问权。

       由于SMB的工作方式,可以成功地进行身份验证,但不能访问任何资源。这就是为什么在做出最后的判断之前,要深入了解到底发生了什么。

       开始测试…

工作组到工作组(Workgroup to Workgroup)

       这是基本的家用场景。两台电脑都是常规使用,他们一辈子都不想打开设置控制台,只想让东西正常工作。

net use \10.19.0.3IPC$ "" /user:

       结果:没有批准访问

微软SMB和空会话介绍​

net use \10.19.0.3IPC$

       结果:没有批准访问

微软SMB和空会话介绍​

       注意:Windows在没有提供凭证的情况下拒绝完成连接。

 

net use \10.19.0.3share

       结果:没有批准访问

微软SMB和空会话介绍​

       注意:Windows在没有提供凭证的情况下拒绝完成连接。

       这都是意料之中的行为,因为RedWrk和BlueWrk两台电脑之间没有内在的信任。没有集中式的身份验证方法意味着每个工作组成员必须依赖于其本地安全数据库,该数据库不包含关于其他工作组成员的详细信息,除非显式地添加这些详细信息。这意味着所有匿名和隐式身份验证方法都将失败。

 

工作站到工作站(加入域)Workstation to Workstation (Domain-joined)

       RedWrk和BlueWrk在下一步加入了域。RedWrk运行同样的“net use”命令到BlueWrk。这就是我们开始感兴趣的地方。

net use \10.19.0.3IPC$ "" /user:

       结果:没有批准访问

微软SMB和空会话介绍​

       在这个例子中,使用“/user:”参数,这是一个显示空凭证,被windows拒绝

 

net use \10.19.0.3IPC$

微软SMB和空会话介绍​

       “啊哈!好用了!”我听见你在大喊。“这是一个空会话!”

       嗯,不!

       还记得我说过Windows真的想让这种连接生效吗?嗯,我们确实这样做了,当没有输入凭证时,Windows将自动尝试用户的域凭证。这就是我一直在说的隐含凭证。

       让我们看看抓取的数据包捕。具体来说,是会话设置部分,身份验证发生在这里

微软SMB和空会话介绍​

 

       你会注意到,RedWrk发送了CONTOSORedUser帐户,即使我们没有显式设置这个凭证。这与允许您通过Windows资源管理器连接到您的工作共享驱动器的机制是相同的,无需显式地输入您的Windows凭据,只是以命令行形式。 

       由于传递并接受了有效的域凭据,因此这不是一个空会话。尽管表面上看起来很像。

       您可能注意到,SMB在某些测试中使用的是NTLM身份验证,而不是Kerberos。当使用IP地址而不是主机名或完整域名(Fully Qualified Domain Name,FQDN)时,就会发生这种情况。

       这是因为IP地址需要一些额外的设置才能成为有效的Kerberos对象。此外,NTLM是纯文本的,这使得在文章的上下文中更容易理解身份验证。

net use \10.19.0.3share

微软SMB和空会话介绍​

       与前面的命令相同。使用登录用户的域帐号,连接成功。

       以下是抓取数据包:

微软SMB和空会话介绍​

 

工作站到域控制器

net use \10.19.0.1IPC$ "" /user:

微软SMB和空会话介绍​

       结果:空会话不允许

net use \10.19.0.1IPC$

       这个命令生效,因为已经传递了Windows用户凭证。这里没有空会话

微软SMB和空会话介绍​

 

net use \10.19.0.1SYSVOL

微软SMB和空会话介绍​

       包捕获中的所有内容看起来都应该连接,但是SYSVOL是一个特例。

       SYSVOL和NETLOGON共享需要在现代Windows上进行Keberos身份验证。这可以通过策略来改变,但我们只推荐这种方式,当您有一个老旧系统,而您又无法说服管理层摆脱它的时候,Kerberos确实是可行的方法。


       切换到域名,也就是切换到Kerberos,并正确登录:

微软SMB和空会话介绍​

       下边是Wireshark 抓取的数据

微软SMB和空会话介绍​

       了解是成功的一半

       渗透测试的分析只能达到这样的深度。收集和分析数据包超出了大多数产品的能力。当你有疑问的时候,自己验证一下这是误报还是错报。

(完)

原文始发于微信公众号(安全行者老霍):微软SMB和空会话介绍​

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月7日00:12:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   微软SMB和空会话介绍​https://cn-sec.com/archives/1090821.html

发表评论

匿名网友 填写信息