SeeSeeYouExec Windows Session Hijacking via CcmExec
在过去几年中,安全社区见证了系统中心配置管理器 (SCCM) 相关攻击[1]的增长。从提取网络访问账户 (NAA) 凭据到向目标设备部署恶意应用程序,SCCM 攻击已经帮助完成了复杂的目标并规避了现有的检测。Mandiant 红队已经利用 SCCM 技术对成熟的客户进行新型攻击,在这些情况下常规方法无法奏效。本博文将介绍其中一种 SCCM 攻击方法。
曾经,拥有 Windows 系统提升权限的红队成员可以轻松地将 shellcode 注入到毫无防备用户的进程中。这使红队成员能够在新进程中执行后渗透活动,如键盘记录或以受影响用户的身份访问 LDAP。然而,随着终端检测和响应 (EDR) 系统的改进,远程进程注入已成为一项高风险操作,促使红队寻找其他方法来劫持用户会话。
这就引出了 CcmExec,一个 SCCM Windows 客户端的原生服务,它具有对红队有用的独特设计。在这篇博文中,我们将深入探讨如何利用 CcmExec 服务进行会话劫持,并介绍CcmPwn[2],一个专门用于实现这种技术的工具。最后,我们将讨论安全团队的检测策略。
AppDomainManager 注入
在深入了解 CcmExec 之前,重要的是要理解AppDomainManager 注入[3]的复杂性,这是攻击者用来在.NET 应用程序中执行任意代码的加载器劫持技术。本质上,.NET 框架提供了一种管理应用程序域的方法,这些域是.NET 应用程序可以运行代码的隔离环境。AppDomainManager 类是这个基础设施的关键部分,负责创建和管理这些应用程序域。然而,如果攻击者覆盖了 AppDomainManager 类构造函数,他们就可以在创建应用程序域时强制托管应用程序运行攻击者定义的行为。
执行 AppDomainManager 注入最常见的方法是通过.config
文件。这种方法涉及修改应用程序的配置文件,以指定要由.NET 应用程序执行的自定义动态链接库文件 (DLL) 和 AppDomainManager。具体步骤如下:
-
创建自定义 AppDomainManager:开发一个从 AppDomainManager 派生的类,并包含恶意代码。将此类编译成 DLL。
-
创建配置文件:修改或创建应用程序的
.config
文件(例如:"application.exe.config
"),并添加以下 XML 元素来指定自定义 DLL 和AppDomainManager[4]:<configuration> <runtime> <appDomainManagerAssembly value="YourDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <appDomainManagerType value="YourAppDomainManager" /> </runtime> </configuration> -
执行应用程序:当.NET 应用程序执行时,.NET 运行时会读取位于同一文件夹中的
.config
文件,并加载指定的自定义 AppDomainManager。AppDomainManager 中的代码随后在应用程序的上下文中执行。
劫持 CcmExec
当使用Process Explorer[5]等进程分析工具分析 CcmExec 服务的进程CcmExec.exe
时,立即会发现一些显著特点。首先引人注目的是,该进程会为 Windows 系统上的每个交互式会话生成C:WindowsCCMSCNotification.exe
进程,如图 1 所示。SCNotification.exe
是 SCCM 客户端的一个组件,负责向用户显示通知,如软件安装提示或重启通知。
进一步检查发现,SCNotification.exe
文件是一个.NET 应用程序,其应用程序配置文件位于C:WindowsCCMSCNotification.exe.config
。你是否已经看出这意味着什么?
通过在配置为 SCCM 客户端的 Windows 系统上获取管理员权限,我们可以修改配置文件,指示.NET 应用程序加载恶意 DLL,并代表每个登录用户执行代码!攻击步骤很简单:
-
将恶意 DLL 上传到目标系统:这个 DLL 包含要在用户会话中执行的 AppDomainManager 代码。
-
修改 SCNotification.exe.config 配置文件:在此文件中指向恶意 DLL。
-
重启 CcmExec 服务:此操作会导致
CcmExec.exe
进程重启,并为每个登录用户运行SCNotification.exe
。
这种技术提供了一种隐蔽的方式来在多个用户会话中执行代码,而无需依赖远程 shellcode 注入。
使用 CcmPwn 武器化会话劫持
武器化这种技术相当简单。我们使用Impacket 库[6]开发了 CcmPwn 来执行上述攻击并劫持用户会话。CcmPwn 配备了多个模块。exec
模块将自定义配置和 DLL 文件上传到目标系统,远程重启 CcmExec 服务,然后重新上传原始配置文件。图 2 和图 3 展示了一个示例,其中使用 CcmPwn 为被劫持的会话提供了Cobalt Strike[7]信标。
此外,CcmPwn 还具有coerce
模块,可以强制每个登录用户发出 SMB 或 HTTP 身份验证请求。红队可以利用这些强制认证来尝试破解密码或进行中继攻击。该模块不需要 DLL,因为它只是将恶意配置文件上传到目标。该文件指示SCNotification.exe
从攻击者控制的文件共享加载文件,如图 4 和图 5 所示。
防御考虑
根据所使用的安全信息和事件管理 (SIEM) 或 EDR 解决方案,可以通过多种方式检测此攻击。建议采取以下防御措施:
-
监控 SCNotification.exe 的 1026 事件:事件 ID 1026 与.NET 运行时错误相关。当使用 CcmPwn 的 coerce
模块时,SCNotification.exe
会尝试从攻击者控制的文件共享加载不存在的 DLL。由于找不到 DLL,应用程序会产生System.IO.FileLoadException
错误。图 6 展示了这种行为的示例。
-
监控 7036 事件和远程登录类型 3:7036 事件对应于服务的启动和停止。通过监控此事件,安全团队可以检测到 CcmExec 服务的可疑重启,这可能表明有人试图劫持用户会话。使用 CcmPwn 时,类型 3 登录(网络登录)事件将在服务停止的同时发生,之后会有 20 秒的延迟才会重新启动服务。监控这种模式可以帮助分类这些服务事件,并提供潜在恶意活动的上下文。 -
监控文件修改和配置字符串:由于攻击者需要修改 SCNotification.exe.config
文件来执行此攻击,因此监控对此文件的更改可以提供早期警告。此外,应仔细检查配置文件中"AppDomainManagerType
"字符串的存在,因为它在 AppDomainManager 注入攻击中使用。安全团队应调查SCNotification.exe.config
中任何意外出现的此字符串。
通过实施这些防御措施并根据其 SIEM 或 EDR 解决方案的具体功能进行调整,组织可以增强其检测和响应通过 CcmExec 服务进行会话劫持攻击的能力。
参考资料
系统中心配置管理器 (SCCM) 相关攻击:https://github.com/subat0mik/Misconfiguration-Manager
[2]CcmPwn:https://github.com/mandiant/CcmPwn
[3]AppDomainManager 注入:https://github.com/TheWover/GhostLoader
[4]AppDomainManager:https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/appdomainmanagerassembly-element
[5]Process Explorer:https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer
[6]Impacket 库:https://github.com/fortra/impacket
[7]Cobalt Strike:https://www.cobaltstrike.com/
原文始发于微信公众号(securitainment):通过 CcmExec 实现 Windows 会话劫持
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论