论坛首页 安全编程开发区 阅读主题

[原创]AppDomainManager 注入:从GAC 利用到无文件加载的多种实现

473 浏览 0 回复
#1 楼主 2026-06-01 21:08:58
过去的注入技术(如跨进程注入)依赖底层的 Windows API(如 VirtualAllocEx、WriteProcessMemory、CreateRemoteThread),这些 API 目前已被 EDR和杀毒软件严密监控。传统的 dll 劫持则需要依靠文件路径、容易被 DLL 签名校验发现 ,也容易存在重名文件导致劫持失败。AppDomainManager 注入(本文讨论基于.NET Framework 4.x环境)则避免使用敏感 API, 转向利用 .NET 原生框架(如运行时)的合法功能,而且通过设置全局环境变量,可实现对符合条件的.NET 程序启动即感染。其核心思路是: 攻击者编写一个恶意的 C# 类,继承自官方的 System.AppDomainManager,然后通过修改配置文件或环境变量,欺骗一个合法的、有签名的 .NET 程序在启动时将这个恶意类作为其“AppDomainManager”加载。当编写并编译一个 .NET 程序(如 C# 或 VB.NET)时,它并不会直接变成计算机 CPU 能看懂的机器码(0101),而是变成一种中间语言(MSIL/CIL)。.NET 运行时的任务就是负责把这些中间代码翻译成机器码,并全程管理程序运行时的各种需求,特别是内存管理需求。在 .NET 中,为了防止内存泄漏,运行时会自动追踪不再使用的对象并回收内存;而不是像 C++ ,开发者必须手动申请和释放内存。在 Windows 平台上,它最核心的部分被称为 CLR (Common Language Runtime,公共语言运行时)。AppDomainManager 注入技术是安全专家 Casey Smith 在 2017 年首次提出。与传统的 DLL 劫持(DLL Side-Loading)不同,这利用的是 .NET 自身正常的程序集解析和加载机制,行为更加隐蔽,安全软件很难在不影响正常业务的前提下进行拦截。换句话说,AppDomainManager 注入的核心价值在于利用“受信任的微软签名程序”来加载“不受信任的代码”,属于 LOLBins (Living Off The Land Binaries) 。AppDomain(应用程序域): 在 .NET 框架中,AppDomain 是进程内的一个轻量级隔离边界。一个操作系统进程(PID)可以包含多个 AppDomain。这种机制使得 .NET 程序可以安全地加载和卸载程序集(Assembly),防止不同的代码段互相干扰。AppDomainManager: 这是一个官方提供的基类,用于让宿主(Host)自定义如何创建和管理新的 AppDomain。当一个 .NET 应用程序启动并初始化它的第一个 AppDomain 时,它会检查是否配置了自定义的 AppDomainManager。如果有,.NET 运行时会优先加载并执行这个管理器代码AppDomainManager 不依赖于文件缺失,也不需要复杂的远程线程注入。它利用的是 CLR 加载机制中的“配置优先”原则,代码运行环境极其“纯净”且受信任。AppDomainManager 允许代码在目标程序的 Main 函数执行之前就获得控制权。这意味着攻击者可以在安全软件还没来得及挂钩(Hook)或初始化监控之前,就已经完成了反调试、反沙箱或内存补丁等恶意操作。CLR启动 → 创建默认AppDomain → 加载AppDomainManager → 调用InitializeNewDomain → 用户Main以下测试均基于.NET Framework 4.x,虽然 .NET Core 及更高版本(.NET 5/6/7/8)也支持 AppDomainManager,但其加载机制(如 app.config 的处理方式)和 GAC 的概念已经发生了巨大变化。使用 C# 创建一个类库(DLL),包含一个继承自 AppDomainManager 的类,并重写 InitializeNewDomain 方法。在该方法中放入恶意代码。具体编译过程:新建一个文件 MyPayload.cs,使用记事本输入以下 C# 代码。这段代码继承了 AppDomainManager,重写了InitializeNewDomain(),实现在.NET 程序初始化时启动计算器。 打开命令提示符(cmd),进入 MyPayload.cs 文件所在目录,利用系统自带的 .NET 编译器 (csc.exe) 将源码编译为 AppVStreamingUX_Multi_User.dll。运行以下命令: 选择 .NET 框架自带的合法且有微软签名的程序 dfsvc.exe 作为启动测试 dll 的目标程序,将其复制到AppVStreamingUX_Multi_User.dll 所在目录,并重命名为AppVStreamingUX.exe,稍微伪装一下 dfsvc.exe (Deployment File Service) 是 Microsoft .NET Framework 的一部分,主要负责 ClickOnce 应用程序的安装、更新和管理。它是合法的 Windows 系统进程,通常随 .NET Framework 运行。虽然它是正常的部署服务,但也可能被滥用为执行恶意代码的白名单程序。 不过,安全软件可能会校验文件名与签名中的原始文件名是否匹配,如果不匹配,反而会增加风险。这里仅仅做个测试,就先不管这么多了。在目标 .NET 程序AppVStreamingUX.exe(原名为dfsvc.exe )同目录下创建一个名为 (目标程序名).exe.config 的文件。在配置文件中指定恶意 DLL (AppVStreamingUX_Multi_User.dll)和类名(MyAppDomainManager)。当受害者或攻击者运行该合法 exe( AppVStreamingUX.exe)时,.NET 运行时会自动读取 .config 文件(AppVStreamingUX.exe.config),并静默加载 AppVStreamingUX_Multi_User.dll 执行其中的恶意代码(弹出计算器)。将以下 XML 内容写入该文件: 点击运行程序AppVStreamingUX.exe,计算器顺利弹出 通过火绒剑可以观察到AppVStreamingUX.exe 进程创建后,很快就打开并读取了配置文件AppVStreamingUX.exe.config 接着又打开了文件 AppVStreamingUX_Multi_User.dll 可以清楚地看到,这个AppVStreamingUX.exe 加载了 AppVStreamingUX_Multi_User.dll。 这次测试成功实现了利用配置文件的 AppDomainManager 注入。需要注意的是若以下任一条件不满足,CLR 将抛出异常并终止启动:编译新的 dll 运行命令,将以上代码编译为 GlobalManager.dll 管理员权限打开 Powershell,依次执行以下命令 接着把 dll 文件放到文件夹C:\test,然后设置环境变量 点击运行AppVStreamingUX.exe,创建了

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290997.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号