域渗透 | SMB的原理与外部C2的应用

admin 2022年6月27日12:53:58评论119 views字数 7110阅读23分42秒阅读模式
域渗透 | SMB的原理与外部C2的应用

本文作者:星尘

    "旧游无处不堪寻,无寻处,唯有少年心"

SMB Beacon 与命名管道

在 Windows 中,无管理员权限的情况下,即无法添加白名单。

当尝试使用 Bind() 绑定一个 TCP Socket 时,Defender 会弹窗提示是否允许此程序进行网络连接,只有用户点击允许访问才可放行。

域渗透 | SMB的原理与外部C2的应用

这个情况下,回连 C2 服务器要使用SMB协议。

SMB协议

根据 微软官方文档说明

官方文档

https://docs.microsoft.com/zh-cn/windows/win32/fileio/microsoft-smb-protocol-and-cifs-protocol-overview

服务器消息块 (SMB) 协议是网络文件共享协议,如 Microsoft Windows中实现的称为 Microsoft SMB 协议。定义特定版本的协议的消息数据包集称为方言。常见的 Internet 文件系统 (CIFS) 协议是 SMB 的方言。SMB 和 CIFS 也可用于 VMS、多个版本的 Unix 和其他操作系统。

在 OSI 网络模型中,Microsoft SMB 协议最常用作应用程序层或演示文稿层协议,并且依赖于较低级别的协议进行传输。Microsoft SMB 协议最常使用的传输层协议是通过 TCP/IP (NBT) NetBIOS。但是,Microsoft SMB 协议还可以在没有单独的传输协议的情况下使用,Microsoft SMB 协议/NBT 组合通常用于向后兼容性。

Microsoft SMB 协议中使用的安全模型与 SMB 的其他变体使用的安全模型相同,由两个级别的安全性(用户和共享)组成。共享是可由 Microsoft SMB 协议客户端访问的文件、目录或打印机。

  • 用户级身份验证指示尝试访问服务器上的共享的客户端必须提供用户名和密码。进行身份验证后,用户可以访问服务器上不受共享级别安全性保护的所有共享。此安全级别允许系统管理员专门确定哪些用户和组可以访问共享。

  • 共享级身份验证指示对共享的访问由分配给该共享的密码控制。与用户级别安全性不同,此安全级别不需要用户名进行身份验证,也不会建立用户标识。

在这两个安全级别下,密码会在发送到服务器之前进行加密。Microsoft SMB 协议支持 NTLM 和较旧的 LAN 管理器 (LM) 加密。这两种加密方法都使用质询-响应身份验证,其中服务器将发送一个随机字符串,客户端返回一个计算的响应字符串,该字符串证明客户端有足够的凭据进行访问。

在本人防火墙上默认配置如下:

域渗透 | SMB的原理与外部C2的应用

这里可以看到,在 Windows 中,防火墙通常默认允许 SMB 协议出入站,因此,如果有什么功能或机制可以用于与外部机器进行通信的,SMB 协议无疑是一种很好的选择。而命名管道就是基于 SMB 协议进行通信的,所以我们可以基于命名管道与外部机器进行通信,从而建立控制通道。

命名管道

“命名管道” (IPC)又名 “命名管线”,但是通常都叫命名管道,是一种简单基于 SMB 协议的进程间通信(Internet Process Connection - IPC)机制。在计算机编程里,命名管道可在同一台计算机的不同进程之间或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信传输。

和一般的管道不同,命名管道可以被不同进程以不同的方式方法调用(可以跨语言、跨平台)。只要程序知道命名管道的名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。

默认情况下,我们无法使用命名管道来控制计算机通信,但是微软提供了很多种 Windows API 函数,例如 :

  • 用于实例化命名管道的服务器端函数是 CreateNamedPipe

  • 接受连接的服务器端功能是 ConnectNamedPipe

  • 客户端进程通过使用 CreateFileCallNamedPipe 函数连接到命名管道

在微软的官方文档中对命名管道安全性有详细描述

官方文档

https://docs.microsoft.com/zh-cn/windows/win32/ipc/named-pipe-security-and-access-rights

调用 CreateNamedPipe 函数时,可以为命名管道指定安全描述符。安全描述符控制对命名管道客户端和服务器端的访问。如果指定 NULL,则命名管道将获取默认的安全描述符。命名管道的默认安全描述符中的 ACL 向 LocalSystem 帐户、管理员和创建者所有者授予完全控制权。他们还向“每个人”组的成员和匿名帐户授予读取访问权限。

外部 C2 的通信模型

外部 C2 系统是用于实现 C2 通信的一种规范。

在 Cobalt Strike 4.0+ 中,对监听器类型做了扩充,加入了外部 C2 的 Payload 选项。CS 允许用户在遵循外部 C2 规范的前提下,使用此接口定义自己的外部 C2 协议。

域渗透 | SMB的原理与外部C2的应用

(图片来源:https://leanote.com/api/file/getImage?fileId=5e257c57ab64411ab6006f44

在 Cobalt Strike 中使用的是 SMB Beacon

Windows 将命名管道通信封装在 SMB 协议中。因此得名 SMB Beacon。SMB Beacon 使用命名管道通过父 Beacon 进行通信。这种点对点的通信对于在同一台主机上的 Beacon 生效。它也可以在整个网络上运行。

参考链接

http://blog.leanote.com/post/snowming/8b7ce0f84c03

SMB Beacon 使用场景:

当前已拿到了目标内网中的一台机器的 beacon shell,然后又通过其它方式搞到了同内网下的另一台 windows 机器的本地 administrator 密码且这台机器的 SMB[445 端口]能正常通信。

但是由于各种各样的原因限制,那台 windows 机器并不能正常访问外网,也就是说没法再正常的反弹 beacon shell 了,那么其他那些反向监听器也就全都用不上了,而我现在就想通过当前仅有的这个 beacon shell 能不能把内网那台不能正常访问外网的机器也一块给带出来呢?答案是肯定的,bind_pipe(CS SMB 协议 payload 的名字) 就是专为适应这种实战场景而设计的。

SMB Beacon 使用步骤:

1. 探测内网 445 端口开放情况,建立 SMB 监听器2. 使用欲横向主机的凭据填充令牌:beacon> shell net use \172.31.51.190admin$ /user:"administrator" "test1234@" 3. 横向建立SMB Beacon:beacon> jump psexec64 172.31.51.190 smb 4. 取消链接unlink [ip address] [session PID]5. 再次链接到 SMB Beaconlink [host] [Pipename]

要销毁一个 Beacon 链接,在父会话或子会话中使用 unlink [ip address] [session PID] 。这个 [session PID] 参数是要取消链接的 Beacon 的进程 ID。该值用于当有多个子 Beacon 时,指定一个特定的 Beacon 来断开链接。

此 SMB Beacon 不会离开并消失。相反,它进入一种等待其他 Beacon 连接的状态。我们可以使用 link 命令来从将来的另一个 Beacon 恢复对 SMB Beacon 的控制。

为了与正常流量融合,链接的 Beacon 使用 Windows 命名管道进行通信。这个流量被封装于 SMB 协议中。对于此方法有一些警告:

  1. 具有 SMB Beacon 的主机必须接受 445 端口上的连接。

  2. 只能链接由同一个 Cobalt Strike 实例管理的 Beacon。

注意:使用 SMB Beacon 的前提是凭据必须是 administrator 的。否则 jump psexec 横向可能失败

通过 SMB 协议绕过防火墙建立 C2 信道可以作为本地权限提升漏洞的利用链中的一步。

进一步可以利用命名管道的模拟客户端功能来获取 system 权限,MSF 的 getsystem 功能就是通过此方法实现的。

外部 C2 的通信流量融合

外部 C2 规范允许将 Beacon 的通信(回连团队服务器或连接到其他 Beacon)方式拓展到几乎任何需要的方式。可以拓展通信协议、提供工具集本身不支持的通信方法。在 Cobalt Strike 的特定场景中 —— Beacon 可以通过 HTTP/S 和 DNS 协议出口 C2 流量;并通过 SMB 的命名管道和 TCP socket 链接到其他的 Beacon 。

通过合法服务(例如 Office 365Google云端硬盘DropboxSlack或其他任何服务)出口C2 流量,可以使得 C2 流量充分融合到正常流量,尤其是如果你的目标使用这些服务作为其日常业务的一部分时。在某些情况下,你甚至可以通过目标自己的应用传输 C2 流量,例如通过他们自己的 OneDrive 传输 C2 数据。

通过文件共享、活动目录或任何可以被写入/读取的应用进行的内网 C2 通信也很难被检测到,这也有助于绕过不同类型的防火墙限制。

比起来,可拓展 C2 的好处就是配置简单,外部 C2 的好处是隐蔽性更好、绕防火墙等限制的效果更好,可以拓展协议,但是实现起来比较难。

而GitHub上也有外部C2相关的内容与工具:

Github C3地址:

https://github.com/Rvn0xsy/Cooolis-ms


预防

微软在保护SMB流量中提到几种方法:

阻止入站 SMB 访问

阻止来自企业硬件防火墙的 internet 上的 TCP 端口445入站。阻止入站 SMB 流量阻止从 internet 进行访问,从而保护网络内的设备。

如果希望用户在网络边缘以入站的状态访问其文件,可以在 QUIC 上使用 SMB。默认情况下,这会使用 UDP 端口443,并为 SMB 流量提供 TLS 1.3 加密安全隧道(如 VPN)。

阻止出站 SMB 访问

阻止在公司防火墙上向 internet 出站 TCP 端口445。阻止出站 SMB 流量会阻止网络内的设备使用 SMB 向 internet 发送数据。

如果使用 Azure 文件存储 SMB,请将 vpn 用于出站 vpn 流量。通过使用 VPN,可以将出站流量限制为所需的服务 IP 范围。

清点 SMB 使用情况和共享

你可以使用以下工具和功能来帮助你清点 SMB 访问权限:

  • 使用 文件共享 脚本来检查服务器和客户端上的共享。

  • 使用注册表项 Security SettingsAdvanced Audit Policy ConfigurationAudit PoliciesObject AccessFile Share 启用SMB 入站访问的审核线索。由于事件数可能很大,请考虑在指定的时间内启用或使用 Azure Monitor

检查 SMB 日志可了解哪些节点正在通过 SMB 与终结点通信。你可以决定是否正在使用终结点的共享并了解哪些共享存在。

配置 Windows Defender 防火墙

使用防火墙规则来添加额外的连接安全性。配置规则以阻止包含异常的入站和出站通信。一种出站防火墙策略,阻止在托管网络内部和外部使用 SMB 连接,同时允许访问最小服务器集,而无其他设备为横向防御深层度量值。

另外也在防止 SMB 流量从横向连接进入或离开网络中更详细提到Windows防火墙相关

位于网络边缘的外围硬件和设备的防火墙应阻止来自 Internet) 的未经请求的通信 (以及从 internet (发) 到以下端口的传出流量。

域渗透 | SMB的原理与外部C2的应用

源自 Internet 或目的地为 Internet 的任何 SMB 通信不太可能是合法的。

主要案例可能适用于基于云的服务器或服务,例如 Azure 文件。应在外围防火墙中创建基于 IP 地址的限制,以仅允许这些特定终结点。组织可以允许端口 445 访问特定的 Azure 数据中心和 O365 IP 范围,以启用混合方案,其中本地客户端 (位于企业防火墙后面) 使用 SMB 端口与 Azure 文件存储通信。还应仅允许 SMB 3。x 流量,需要 SMB AES-128 加密。

对于Windows SMB 共享的客户和服务器,可以使用 Windows Defender 防火墙 阻止所有入站 SMB 流量,以防止来自恶意或受攻击设备的远程连接。在Windows Defender 防火墙中,这包括以下入站规则。

域渗透 | SMB的原理与外部C2的应用

可以看到默认未开启防火墙

禁用 SMB 服务器(如果未使用)
使用策略进行测试和部署

检测

参考

https://www.4hou.com/posts/B8nx

检测一般的点对点恶意流量和恶意命名管道可能非常困难,但并非不可能。通常,检测植入工具自身的恶意行为,比检测点对点协议要更为容易。

但是,有一些指标可以被发现。其中,许多检测都需要对某些指标进行基线测试,并将新行为与此基线进行比较,以便进一步了解事件发生的异常情况。

主机检测

安全事件标准OSSEM

https://github.com/OTRF/OSSEM/
  1. 已知的恶意命名管道名称:这种检测方式最为明显,也最容易得出结果。C2框架可能会使用容易被检测到的默认命名管道名称。例如,Covenant使用gruntsvc作为默认管道名称,而Cobalt Strike使用msagent作为默认管道名称。这两个管道名称都可以在两个框架内轻松更改,但使用这一指标来检测未更改默认值的攻击者可能会非常有效。

Sysmon可以用于收集有关命名管道的信息。创建命名管道时,会生成Sysmon事件ID 17。我们可以根据已知恶意管道名称列表来检查PipeName字段。

域渗透 | SMB的原理与外部C2的应用

  1. 与命名管道相关的异常进程:为了正确利用这种检测方式,组织中应该使用一种方法来收集与命名管道相关的进程,并对其进行基线化。同样,Sysmon事件ID 17具有此检测所需的所有信息。我们应该在一段时间内收集这些事件,并将新事件与其基线进行比较。

例如,Chrome有一组通用的命名管道,它们通常采用“mojo.#####.#####.##################”的格式,其中#代表一个数字。

例如:

域渗透 | SMB的原理与外部C2的应用

如果针对与命名管道相关的进程进行基线化的结果显示,C:Program Files (x86)GoogleChromeApplicationchrome.exe从不或者几乎没有创建不匹配“mojo.####.#####.####################”格式的命名管道,那么如果存在一个新事件,显示C:Program Files (x86)GoogleChromeApplicationchrome.exe创建了一个不符合上述格式的新命名管道(例如:pipe123),这就是异常的:

域渗透 | SMB的原理与外部C2的应用

像这样的异常命名管道可能值得我们的研究。在理想情况下,该检测应该与其他主机指标共同使用,以便为潜在的攻陷判断添加额外的上下文。

  1. 异常命名管道安全描述符:如本文前面所述,Covenant将单个安全描述符应用于其命名管道,允许Everyone组进行FullControl。这不是绝对必要的,但可以提高运营者的可用性。例如,对父Grunt上的令牌操作这样的操作,可以改变用户与命名管道交互的方式,并且如果安全描述符仅限于特定用户,可以实现限制使用命名管道。例如,我们可以看到Grunt命名管道使用James Forshaw的NtObjectManager项目来应用这个安全描述符:

组织可以利用这一方法,与可用性进行权衡,通过搜索安全描述符来识别潜在的恶意命名管道。如果单独使用这一检测方法,可能会导致误报。理想情况下,这应该被用作增强其他相关指标严重性的补充指标。

网络检测

用于识别点对点流量的基于网络的检测,必须依赖于受影响组织的内部网络上捕获地数据。在许多组织中,都不会收集这些数据。但我们认为,组织至少应该在内部网络的某些关键节点收集内部网络流量。具体而言,这一收集的位置和收集的数量,应该始终针对于特定的组织。

网络流量模式通常可以从基于主机的指标推断出来。例如,从一个系统到另一个系统的的Windows事件4624(登录事件)意味着从第一个系统到第二个系统的网络连接。但是,从主机收集的数据存在一个缺点,就是它更容易受到攻击者对受损终端的操纵。

下面提到的一些检测方式,一些可能依赖于从网络明确收集的数据(即:“网络流”数据),同时还包含一些可以基于主机日志推断的网络活动,并且还有一些可以通过任一方式来收集。

  1. 远程连接到命名管道:点对点命令与控制依赖于远程访问的命名管道。我们可以收集从远程系统访问的命名管道基线。要收集这些数据,可以通过两种方法。一种方法是纯粹的网络方式,使用某种网络镜像或流量收集工具,可以检查SMB网络流量,以查找被访问的命名管道。举例来说,我们可以使用Wireshark看到访问命名管道的流量。

第二种方法是基于主机的方法,我们可以使用Sysmon 事件ID 18,它负责记录到命名管道的新连接,并识别并非来自当前主机的连接。事实证明,当远程访问管道时,Image字段设置为System。但遗憾的是,我们没有得到原始主机名,但至少我们可以确定远程访问管道:

域渗透 | SMB的原理与外部C2的应用

域渗透 | SMB的原理与外部C2的应用

  1. 异常的主机到主机流量:这种最终的检测方式比检测命名管道更为有效。我们可以通过将正常的内部主机到主机的流量进行基线化,来尝试识别主机到主机的流量。在对这类活动进行基线化处理之后,会发现某些高价值服务器可能永远不会或几乎不会与主要包含用户工作站的某些子网建立网络连接。如果突然发现从这些高价值服务器到工作站子网的大量网络连接,那么就可以说这一行为是异常的,并值得后续调查。这种检测方式同样依赖于合适的基线,并且可能会发生误报。理想情况下,这种检测方式应该作为补充指标,以增加其他相关指标的严重性。



域渗透 | SMB的原理与外部C2的应用
域渗透 | SMB的原理与外部C2的应用
域渗透 | SMB的原理与外部C2的应用
域渗透 | SMB的原理与外部C2的应用

我们在这个行业相遇,也会在这个行业各自奔赴前程。希望下次我们会在顶峰相遇。

域渗透 | SMB的原理与外部C2的应用


原文始发于微信公众号(0x00实验室):域渗透 | SMB的原理与外部C2的应用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月27日12:53:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   域渗透 | SMB的原理与外部C2的应用http://cn-sec.com/archives/1146576.html

发表评论

匿名网友 填写信息