通过受感染的主机利用 SOCKS 代理来自 Windows 攻击者机器的工具是一个包含一些细微差别和混淆空间的主题。这种细微差别源于将普通网络流量代理到目标网络的协议要求,以及可用于 Windows 以促进通过 SOCKS 代理网络流量的工具(或缺乏工具)。但是,从攻击的角度来看,将现有 Windows 工具和本机实用程序代理到网络中的能力具有重要价值。为此,这篇文章旨在逐步完成:
- 所涵盖材料的清晰度与已经有据可查的内容
- 远程执行 Windows 工具与在主机上执行的价值主张
- 网络拓扑水平集和图表示例
- 识别工具的流量以关注通过 SOCKS 路由的内容
- 代理依赖于 DNS、RPC(DCOM/WMI、MS-DRSR/DRSUAPI)、Kerberos、LDAP 和 SMB 等协议的 Windows 工具和实用程序的过程
- 使用攻击者想要代理的常见协议以及 Proxifier 客户端细节来解决细微差别,以最大限度地提高攻击性用例的价值
- 使用此技术进行代理时的操作提示
TLDR ; 启用远程名称解析,以及Proxifier中的 Windows 服务/SYSTEM 进程的代理,以解决 DNS 问题,并通过 SOCKS 代理强制来自 SYSTEM 进程/内核启动的 TCP 的流量。跳到Proxying Offensive Windows Tooling部分 以获取实际示例。
介绍
在基于 *nix 或 Windows 的操作系统中,将攻击性工具代理到网络中并不是一个新概念。通过 Proxychains 等实用程序推送与Impacket等工具相关的流量是一个有据可查的主题 [ 1 ][ 2 ][ 3 ][ 4] . 这篇文章将改为介绍通过 SOCKS 通过受感染的主机代理 Windows 工具,例如我们已经了解和喜爱的几个 C# 和 Powershell 项目,以及利用这种技术带来的一些细微差别。这个想法不是要替换已经存在的资源和工具,而是要扩展工具(主要是基于 Windows)的可用性,否则这些工具需要在主机上执行。出于攻击目的代理来自 Windows 的流量也已在之前得到解决 [ 5 ][ 6 ][ 7 ][ 8 ],本文将基于这些资源,重点关注被代理的协议,并解决可能出现的与 SOCKS 配置有关的问题。
价值主张
我想在这篇文章中强调的价值是将来自 Windows 工具的 RPC 流量(以及更多)代理到目标网络的能力。这有什么好处?不必通过重新实现特定协议或使用可能不适合您的特定需求的重新实现来重新发明轮子。使用 .NET、Win32 API 甚至原生 Windows API 来处理与 WMI、MS-DRSR (DRSUAPI)、MS-SCMR 等协议的交互,可以省去这方面的麻烦。
将这一点与从远程、未加入域的 Windows 机器在目标域内的用户上下文中创建进程和关联令牌的能力相结合,可以利用本机 Windows 功能将更多现有工具代理到受损的网络。实现这一点的两种方法是简单地使用runas.exe 二进制文件,或者在目标用户只有 NT 哈希的情况下使用mimikatz PTH功能。这些工具所依赖的底层 win32 API 调用,例如CreateProcessWithLogonW或CreateProcess也可用于相同目的。
将 Windows 工具代理到网络的好处也与将任何其他工具代理到网络相关的许多相同好处相一致。使用此代理技术时,将不会创建在执行动态代码执行或拖放到磁盘时通常会考虑维护 OPSEC 的几个潜在的基于主机的指标,例如:
- AMSI — .NET 4.8 、Powershell、WSH(Windows 脚本宿主)的程序集混淆
- Fork&Run——关于父子进程关系的行为考虑
- API Hooking — 可能重新映射 NTDLL,具有动态序号解析的系统调用
- ETW — 以典型的 Assembly.Load 功能不太明显的方式进行修补
- 内核回调——加载 EV 签名的自定义驱动程序或利用易受攻击的驱动程序
情境决策
这种技术有时间和地点。一些工具需要在代理和 C2 之间进行大量数据传输。通过 C2 代理您的工具可能会增加流出到 Internet 的网络流量。如果您无法将代理上的睡眠/抖动降至交互式(睡眠为 0),那么与被代理协议相关的超时、该协议的工具使用以及代理客户端(在本例中为 Proxifier)都应该是考虑到。就来自特定进程的标准网络流量而言,偏离常规,为行为和网络级别的检测机会留下了空间。将这些项目与作为替代方案在主机上执行产生的潜在指标进行权衡将是有益的。
基础设施拓扑水平集
这是将 Windows 工具代理到网络时攻击者基础结构的外观示例:
对于即将到来的示例,这Windows Attacker Machine
将是一个 Windows VM,它使用 Proxifier 通过 SOCKS 代理路由我们的工具流量,并结合runas.exe
或 mimikatz 在适当的远程域用户上下文中执行工具。C2
将是一个使用 SOCKS4A 服务监听的 Cobalt Strike 团队服务器。这Target Network
是一个受损的 Active Directory 环境,其中Compromised Machine
运行 Cobalt Strike 的信标,并且可以路由到域控制器Target Workstation
以及Target Server
域控制器。
提示:当 Cobalt Strike 服务器监听其 SOCKS 服务时,默认绑定到 0.0.0.0。以某种方式保护此服务对于防止不受限制地访问您的目标网络至关重要。确保攻击者机器和 C2 之间的通信安全也是一个 OPSEC 考虑因素,以确保诸如明文 RPC 和 NetNTLM 哈希之类的流量不会穿越互联网。
可以使用其他几种技术和工具来实现相同的结果,例如Compromised Machine
Windows 10 1803 或更高版本中的本机 OpenSSH(在 SOCKS 的服务器端),或者甚至使用 Microsoft 签名的 SSH 二进制文件及其相关的 DLL 依赖项Windows 版本(这里有向后兼容性)。ProxyCap是 Proxifier 的可行替代方案(在 SOCKS 的客户端,Windows Attacker Machine
)。出于演示目的,我们将在接下来的示例中结合使用 Cobalt Strike 的信标和 Proxifier。
前置器配置
从 Windows 机器通过 SOCKS 路由工具时可能会出现几个问题。以下是一些有望帮助缓解一些潜在问题的项目:
- 确保服务和/或系统进程流量通过代理进行路由。这可以通过在 GUI 中启用一个选项或将Proxifier 作为 Windows 服务运行来完成。
Services and Other Users
- 启用远程主机名解析,以便通过选择
resolve hostnames through proxy
Proxifier 配置中的选项来正确解析 DNS 。
注意:是@_EthicalChaos_对 Bloodhound Gang slack 中的对话做出回应,这促使我进行故障排除,以确保正确路由 SYSTEM 进程流量。
结合上面列出的项目,您将需要配置代理服务器和代理规则(稍后我们将详细介绍)。
提示:在配置您的代理服务器以使用 Cobalt Strike 的信标时,请确保
SOCKS Version 4
选择了协议,并检查该Use SOCKS 4A extension (remote hostname resolution)
选项。
识别代理过滤的流量
在通过 SOCKS 代理路由工具时,了解哪些进程会产生哪些流量很重要,原因有几个。对于某些协议,您使用的工具在与远程资源通信期间可能依赖于 SYSTEM 进程。如前所述,这与 Proxifier 的配置方式有关。了解流量的生成方式和原因将帮助您仅过滤通过 SOCKS 代理并进入目标网络的基本流量。例如,我们将:
- 使用 `runas` 在域用户的上下文中创建一个新进程,该域用户在目标工作站上具有本地管理员权限,可从受感染的机器路由
- 执行SharpWMI枚举目标工作站上的环境变量
- 使用Sysinternal 的Procmon监控与 SharpWMI 相关的网络流量
从上面的屏幕截图中,我们可以看到在执行 SharpWMI 时,在端口 135/tcp上进行RPC 端点映射svchost.exe
的上下文中。这是有道理的,因为 WMI 位于DCOM之上,它依赖 RPC 来实现远程通信能力。一旦为 RPC 通信确定了一个高动态端口(在本例中为端口 49754/tcp),就会结束并接收来自 WMI 查询的输出。作为过滤以仅通过 Proxifier 路由 SharpWMI 流量的示例,可以配置以下代理规则以仅将 SharpWMI 相关流量路由到受感染的主机:nt authoritynetwork serviceSharpWMI.exe
注意:上面显示的规则的特定目标端口范围
sharpwmi
已设置,因为这是现代 Windows 操作系统中用于 RPC 通信的默认临时端口范围。
代理攻击性 Windows 工具
利用前面介绍的信息,我们可以识别与 Windows 实用程序相关的流量以通过 SOCKS 推送,相应地配置 Proxifier,并开始在适当的用户上下文中将该工具的流量路由到目标网络。
参考基础架构拓扑级别集部分,了解在接下来的示例中执行的位置和方式。示例中的主机名和 IP 将与该部分的网络图保持一致。这些工具将从Windows Attacker Machine
一个未加入域的远程 Windows VM 执行和代理。Cobalt Strike 的信标正在运行WORKSTATIONA
。从C2
网络图中的服务器来看,已经使用 Cobalt Strike 的信标启动了 SOCK4A 服务。为了使用常用工具进行演示,示例将包括:
- 带安全带和 WMIC 的 RPC/DCOM (WMI)
- MS-DRSR (DCSync) 与 SharpKatz
- 具有本机 Windows 功能的 SMB
- LDAP 与 ADExplorer 和 PowerView
- 带有 Rubeus 的 Kerberos
带安全带和 WMIC 的 RPC/DCOM (WMI)
从 开始Windows Attacker Machine
,在适当的远程用户上下文 (CITADELjason) 中生成一个新进程,以WORKSTATIONB
通过代理以本地管理员权限进行访问。远程目标主机的主机名用于seatbelt.exe
参数中,由于前面提到的 Proxifier 配置,它将成功解析。
创建的两个代理规则(可以在Rule : Proxy
列中看到)已成功触发,仅通过 SOCKS 服务器路由我们的工具特定流量。请注意,svchost.exe
执行 RPC 端点映射的进程之一是在 SYSTEM 上下文中执行的。如本节所述,除非选择了适当的 Proxifier 选项,否则这将失败Proxifier Configuration
。WMI 的端点映射成功,因为打开了一个套接字并通过临时端口(在本例中为 49746/tcp)seatbelt.exe
上进行了数据传输。WORKSTATIONB
本机wmic.exe
Windows 二进制文件可用于实现类似的结果。WMI 网络流量被代理,因此可以观察到相同的操作:
- 端口 135/tcp 上的 RPC 端点映射
svchost.exe
作为 SYSTEM 生成为 RPC 端点映射的一部分wmic.exe
建立临时端口后进行大量通信
MS-DRSR (DCSync) 与 SharpKatz
如果您拥有要为其创建访问令牌的用户的 NT 哈希,则在您拥有哈希的用户的上下文中创建进程的一种方法是 Mimikatz PTH 功能。与 类似runas.exe
,Mimikatz 在域用户的上下文中生成一个新进程,但不是提供明文密码,而是提供了 NT 哈希。
默认域管理员帐户及其 NT 哈希用于在必要的用户上下文中创建新进程以执行 DCSync。执行 SharpKatz 并利用 MS-DRSR 进行特定用户的 DCSync。与 WMI 类似,因为这是一个基于 RPC 的协议,我们观察到端点映射和路由的高端口流量。
注意:请注意来自 的流量
searchapp.exe
。代理规则成功地将这个与 DCSync 无关的流量直接路由到互联网,防止不必要的流量通过我们受感染的主机路由。
具有本机 Windows 功能的 SMB
使用适当的用户上下文,可以通过 SOCKS 代理路由常见的实用程序,例如dir
标准输出和重定向到远程资源,以及与这些操作相关的 SMB 流量。此流量是从内核发起的,这可以通过源自System
进程的流量来证明。
文件浏览器explorer.exe
可以类似地通过代理进行路由,从而能够以图形方式安装网络驱动器并与远程文件系统的内容进行交互。
本机应用程序还可用于与现在可通过 SOCKS 访问的远程文件系统的内容进行交互。例如,可以使用本地文本编辑器直接修改远程机器上的文本文件。
LDAP 与 ADExplorer 和 PowerView
提供远程域控制器 IP 地址和凭据以访问我们的 SOCKS 代理另一端的目标域,ADExplorer64.exe
执行 Sysinternals。可以交互式地查看和修改 Active Directory 对象。
Mimikatz 的 Pass-The-Hash (PTH) 功能用于在域用户上下文中创建进程。目标域中的任何域用户都可以使用,因为对于本示例,我们只需要执行标准 LDAP 查询的权限。PowerView的Get-DomainUser
功能已执行,LDAP 通信已正确路由到 SOCKS 隧道另一端的目标域控制器。
注意:当使用Web.Client下载 PowerView 时,我们的代理规则正确地将 HTTPS 流量直接路由到互联网,而不是通过我们的 SOCKS 隧道。
带有 Rubeus 的 Kerberos
在此示例中,我们将使用不同的域用户在 SOCKS 隧道另一侧的目标域的经过身份验证的用户的上下文中生成进程。
Rubeus 被执行并尝试对目标域中的所有用户进行 ASREPRoast。使用 Rubues 的 ASREPRoast 只需要对目标域进行身份验证的访问权限,因此任何域用户都可以满足要求(此处使用 CITADELjohn)。用于路由特定于 Rubeus 进程的流量的代理规则被触发。LDAP (389/tcp) 被代理,并且对域中任何用户的查询都do not require Kerberos preauthentication
启用了该属性。当识别出具有此属性的用户时,将代理 Kerberos (88/tcp) 流量以获取可能可破解的加密 TGT blob。
提示:请记住,在与 Kerberos 交互时正确配置 DNS 非常重要。
**关于使用 TGT 的注意事项**
在上述所有示例中,明文凭据或 NT 哈希都被利用来代理流量到具有适当域用户上下文的网络。您还可以通过票证 (PTT) 来利用伪造或提取的 TGT。要通过 Kerberos 成功向远程域控制器进行身份验证:
- 确保 DNS 通过 SOCKS 代理远程解析
ksetup
使用本机 Windows可执行文件 [ 8 ]手动将您的 Kerberos 领域设置为目标域
结论
通过 SOCKS 路由 Windows 工具可以缓解典型攻击性工作流程中的潜在痛点,例如与主机执行相关的 OPSEC 风险,以及与使用重新实现的协议相关的故障排除错误。了解您正在路由什么以及它是如何被路由的,将帮助您确定何时该技术可能是您当前代码执行策略的理想替代方案。