在分析师新手所遇到的所有常见协议中,或许没有一个像服务器消息块(SMB,Server Message Block)那样难以理解。它庞大的规模,稀缺的文档和广泛的应用让其成为最令初级分析人员恐惧的协议之一。但SMB非常重要:在Windows活动目录环境中的横向移动可能只会造成轻微损失,但也可以是灾难性的破坏;而几乎所有公开提供的此类移动技术都以某种方式涉SMB。虽然SMB各方面上的指南有不少,但是我发现缺乏可访问的、全面的、针对网络分析的资料。本指南的目标是解释这个令人困惑的协议,以帮助新分析人员立即在网络中开始威胁搜捕,忽略了似乎构成大多数SMB入门核心的无关紧要的细节,并把注意力集中在一位分析师最有可能看到的各种威胁上。本指南适度牺牲完整性以便于阅读:想要更深入的阅读可访问注释。为让协议的基础操作更加清晰,全文都会有大量的简化处理;事实上这些简化在文中不会被强调。最后,由于本指南是从网络角度尝试解释SMB协议,所以基于主机的信息(例如,Windows日志)的讨论已被省略。
从最基本上讲,SMB是让设备可通过网络(通常是局域网)在彼此间执行许多函数调用的协议。SMB已经存在很久了,并保持了很多向后兼容性,它包含了在数量上近乎荒谬的残留函数功能,但其现有的核心使用比看上去更简单。大多数情况下,今日的SMB用于映射网络驱动器;向打印机发送数据;读写远程文件;执行远程管理以及访问远程机器上的服务。
SMB可直接运行在TCP(端口445)或NetBIOS(通常是端口139,很少用到端口137或138)上。要开始一个SMB会话,两个参与者得就一个方言达成一致;进行认证;并且发起者连接到一个“树”。从大多数的意图和目的上讲,此树可以被认为是一个网络共享(网络共享是网络上的某种共享资源,可通过网络访问的驱动器或文件夹)。下图是显示在Wireshark中的PCAP,演示了一个简单的会话设置和树连接。在这种情况下,机器192.168.10.31正在连接到192.168.10.30机器上的“c$”共享(相当于c:\驱动器),这台电脑主机名是“admin-pc”(你可能觉得这个网络设置看起来很熟悉。本文档中引用的这个和所有PCAP都是基于这个梦幻般的微软Advanced Threat Analytics(ATA)攻击模拟手册 中的实验设置,无论您是否在您的环境中使用它,这都是一个很好的资源)。
如果你用wireshark打开这个PCAP并查看包的详细信息,你会发现很多信息,有时很难说出哪些是相关的。幸运的是,作为分析师,我们大多不关心这些设置数据包的细节(除了那些与身份验证有关的细节外,下面将对此进行讨论)。大多数情况下,记下正在访问的机器和共享就足够了。
你会经常看到两个特殊的共享:IPC$和ADMIN$共享。ADMIN$共享基本上可以认为是路径C:\Windows的符号链接(更多参见这里 )。IPC$的销有不同。它不直接映射到文件系统,而是提供一个接口,通过它可以执行远程过程调用(RPC),如下所述。
为了更好地了解SMB如何执行基本操作,我们首先看一下文件复制操作的简化版。看起来像这个PCAP (完整PCAP中增加的复杂性来自两个方面:创建和设置C:\temp文件夹的适当元数据,并将元数据添加到收到的mimikatz文件和\tmp目录):
我们看到的第一个动作是由wireshark解析出的“Create Request File”。在这个例子中,这告诉192.168.10.30:192.168.10.31想要创建文件mimikatz.exe(它是来自Benjamin Delpy的惊人的mimikatz工具,是每个安全研究人员工具箱的重要组成部分;在这里 ,它预编译的版本在这里 )(图中标记1)(需要注意的是,这与用于访问文件的命令是相同的,所以看到“Create Request”并不总是意味着正在创建文件);192.168.10.31使用GetInfo(图中标记2)检索它正在写入的文件系统的一些信息;然后用SetInfo(标记3)发送一些长度信息;接下来,192.168.10.31请求通过几个写入(标记4)来发送实际的文件字节;追加了一些元数据(包括时间戳)到完整的远程文件(标记5)并关闭它;文件传输已经完成。
读操作也差不多;以下PCAP显示反过来的进行读的操作。主机192.168.10.31正在从主机192.168.10.30下载mimikatz。
我们从“creating”文件请求开始(标记1),虽然在这种情况下它是一个现存的文件,我们正在请求一个句柄。我们使用GetInfo(标记2)从文件中获取许多元数据,然后对实际文件字节(标记3)进行读取请求。
还有其他大量的SMB命令,但是其中很多是罕见的或相对自我解释的,我们不会在这里详细介绍它们(更多在这里 )。你可能会遇到AndX命令 ,这一开始可能会让人迷惑。它只是允许两个命令被打包成一个,只带着一个SMB头。在于大多数情况下,你可以把它们当作两个单独的命令。
作为安全分析师,我们最感兴趣的SMB流量的细节之一是用户/机器对。设备上不寻常的登录可能表示整个尝试横向移动的威胁。在Windows活动目录环境中,主机通过两种主要方式向服务器及相互之间进行身份验证:NTLM和Kerberos。 两者中较老的NTLM 自1993年Windows NT发布以来一直在使用,但在最新版本的Windows中仍然受到支持。它使用用户的密码哈希来加密它正在进行身份验证的设备发送的质询。因此,它非常容易受到哈希类型的攻击(详见这里 ),Kerberos是活动目录环境下推荐的身份验证协议。NTLM继续用于Workgroup环境(没有域控制器的Windows环境)和一些较旧的系统(详见这里 )。
在Windows 2000中引入的Active Directory中的Kerberos是一种更现代、更健壮的身份验证协议,但需要一个票证授予服务器(TGS)来运行,通常在Active Directory域控制器上运行。 Kerberos的完整解释超出了本文的范围(详见 ),所以我们将侧重于协议的两个方面,这对我们在这里的讨论很重要。一,Kerberos身份验证与SMB分开进行,涉及到与TGS以及您正在尝试验证的服务的交互。二,Kerberos票据,用于访问远程机器上的服务,不包含对我们有用的明文形式用户信息。
在NTLM上传递哈希攻击和在Kerberos上传递票证攻击(更多见这里 )都很难在网络层次上检测到,因为流量通常看起来与合法使用相同。对于网络维护者来说,了解哪些用户应该登录到哪些机器上,以及保持对哪些帐户用于访问哪些资源的良好纪律是关键。在这方面,SMB流量分析有时可以帮助我们。下面显示的NTLM身份验证包括用户尝试以明文方式进行身份验证(这个PCAP来自wireshark网站,是“smb-on-windows-10.pcapng”)。
根据捕获网络流量的方式,也许可以但也许不可以追踪Kerberos会话。虽然用户名不包含在明文SMB认证中,但您可以追踪与TGS进行的初始认证,并查看所返回的会在SMB会话中使用的票证。在这里 可看到更多的细节。
SMB的一个常见用例是对本地网络中的另一台机器进行远程过程调用(RPC)。这个功能可以用于很多事情,但是我们特别感兴趣的是如何将它用于像用户和组枚举这样的事情,这可能是尝试横向移动的迹象。重要的是要注意,RPC可以通过原始TCP以及SMB来实现,所以不存在SMB通信流量并不意味着没有RPC。我们首先看一下SMB之上的RPC的一个简单例子,我们可以看到是否有人试图使用net命令枚举我们域中的所有用户(在这个PCAP中运行的确切命令是“net user /domain”)。
这个PCAP的启动方式与我们所见过的其他PCAP类似,有协议协商和会话建立(标记1)。请注意,我们正在连接到IPC$共享(标记2):这将是我们连接树以进行所有的RPC。接下来,我们“Create Request File”(标记3),其中文件名是我们正在连接的服务的名称(在这里是安全帐户管理器(SAMR))。需要注意的是Wireshark为我们解析出了SAMR协议,而在它不能识别服务的情况下,这个文件名对于我们确定我们查询的内容是非常有用的。接下来,我们调用RPC绑定,然后正式连接到服务(标记4)。现在我们已连接到服务,Wireshark解析发送给SAMR的各个命令。我们可以看到192.168.10.31试图通过这个服务枚举域中的用户(标记5)。
我们再来看看SMB上RPC的另一个简单示例:使用at命令 在远程计算机上安排任务。我们将只看到PCAP的一部分,从会话建立之后,而我们已经连接到IPC$共享。
从高层次来看,这个PCAP 看起来与上面的SAMR调用类似。我们使用服务名(标记1)(atsvc,我们可以从SMB Create Request File命令中看到)创建一个请求文件,调用一个RPC绑定(2),然后发送一个JobAdd请求到at服务(标记3)。有几点需要注意:其一,由于在这种情况下,RPC在SMB上运行,所以每个RPC命令都必须有一个与其关联的SMB命令。在这种情况下,RPC bind位于SMB write之上,而与服务的通信发生在ioctl/fsctl命令上(详见 )。这可能有点混乱,所以有时候最好把它看作三个独立的层:SMB、RPC和服务(在这个例子中是ATSVC)。许多RPC命令都会在SMB ioctl命令之上,如下所示。假设你不是逐字节地撕开数据包,那么SMB命令并不是特别重要:相反,把重点放在RPC调用上,或者(如果Wireshark能解析它)在RPC上运行的服务(这是一个重大的简化。SMB命令最终确实很重要,并且对数据如何传递给RPC调用和低层服务有影响。充分讨论这个超出了本指南的范围,但我建议每个读者仔细检查每个PCAP中的RPC调用,看看SMB,RPC和服务命令是如何关联的)。
Wireshark为我们解析了at编排器服务命令,我们可以看到用户正在尝试安排mimikatz运行。
PsExec是一个Windows远程管理工具,长期以来一直是Active Directory环境中攻击者横向移动的最爱。 PsExec自己网站将自己描述为:“一个轻量级的telnet替代品,可让您在其他系统上执行进程,并且具有控制台应用程序完全交互性,而无需手动安装客户端软件。PsExec最强大的用途包括在远程系统上启动交互式命令提示符,以及像IpConfig这样的远程启用工具,否则无法使用这些工具显示有关远程系统的信息。“(详见PsExec )虽然它仍然常用于合法管理任务,其广泛的功能对攻击者来说很有用。如果完全部署的话,请务必密切关注它在网络中的所有使用。
PsExec在网络分析上可能会相当复杂,所以我们首先看一下两个简单的例子。第一个显示PsExec被用来从目标机器提取文件(正在执行的命令是:psexec.exe \admin-pc -accepteula cmd /c (cd c:\temp ^&mimikatz.exe “privilege::debug” “sekurlsa::tickets /export” “exit”)(见上面的ATA手册))。
我们首先连接到ADMIN$共享(标记1)(指向C:\Windows),然后复制PSEXESVC.exe文件(标记2)。这是一个最终将作为临时服务在目标机器上运行的可执行文件。然后,我们连接到IPC$共享(提示3)(注意,我们不需要为此产生另一个会话设置)。由于Wireshark在本文编写时还无法解析PSEXESVC(跟ATSVC和SAMR一样不过是另一个服务),我们看到原始的ioctl请求FSCTL_PIPE_TRANSCEIVE(标记4),而不是被解码成特定于服务的命令。然后,我们打开(或更准确地说,FSCTL_PIPE_WAIT请求 )服务的stdin(标记5),stdout(标记6)和stderr(标记7),然后从stdout(标记8)开始读取实际的文件。从版本2.1开始,PsExec会加密本地和远程机器之间的所有通信,所以我们无法从这个PCAP中获得更多的信息。
下一个示例 我们将看到使用PsExec将用户添加到远程计算机,看起来相当不同。最初的设置是类似的,我们连接到ADMIN$共享(提示1)并复制PSEXESVC.exe文件(提示2),然后在这里我们完全断开连接。
但是,当我们重新连接到IPC$共享(提示1)时,我们通过对SVCCTL服务的RPC调用来启动PsExec(而不是像上面那样发送ioctl到PSEXESVC管道)(提示2),然后像之前一样连接到stdin,stdout和stderr(提示3)。
metasploit框架(https://www.metasploit.com/ )也包含了它自己的PsExec版本,它的工作原理稍有不同(详见 )。在这个PCAP 中,我们使用它来传递我们在SMB中偷取的一些NTLM证书,然后将meterpreter(https://www.offensive-security.com/metasploit-unleashed/about-meterpreter/ )下载到目标机器上。
这是未删节的PCAP,它显示了这个模块在传输有效载荷方面的效率。您会注意到它广泛使用了AndX命令。然而,在进一步的检查中,你会看到所有的AndX命令都是“没有更多的命令”,这意味着我们只发送一个命令。 这些AndXs可能被用于逃避检测。
我们执行正常的NTLM身份验证(提示1),然后连接到IPC$(提示2)和ADMIN$(提示3)共享(请注意,在这种情况下,我们是同时连接到它们的,不像前面的两个示例)。然后,我们尝试在远程机器上打开PowerShell可执行文件(提示4)。这是metasploit检查PowerShell的存在,为的是不必将PSEXESVC可执行文件发送过去,因为某些解决方案可能会将其检测为恶意文件。它成功找到它(提示5),连接到SVCCTL服务(提示6),然后在提示7传输文件。它创建(提示8)并启动服务(9),然后清理(10)和断开(11)。如果我们检查服务创建,我们实际上可以看到生成meterpreter加载器的PowerShell命令。
尽管命令在wireshark中被截断,但在原始数据包字节中,我们可以看到它是用来解码和执行shellcode的。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课