恶意 NuGet 包攻击 ASP.NET 开发人员以窃取登录凭据

2026-02-25 09:35:25 1 102

针对 ASP.NET 开发人员的供应链攻击已经出现,该攻击涉及四个恶意 NuGet 包,旨在窃取登录凭据并在 Web 应用程序中植入持久后门。 这些软件包——NCryptYo、DOMOAuth2_、IRAOAuth2.0 和 SimpleWriter_——由用户名为“hamzazaheer”的威胁行为者于 2024 年 8 月 12 日至 21 日期间发布,它们累计下载量已超过 4,500 次。



针对 ASP.NET 开发人员的供应链攻击已经出现,该攻击涉及四个恶意 NuGet 包,旨在窃取登录凭据并在 Web 应用程序中植入持久后门。

这些软件包——NCryptYo、DOMOAuth2_、IRAOAuth2.0 和 SimpleWriter_——由用户名为“hamzazaheer”的威胁行为者于 2024 年 8 月 12 日至 21 日期间发布,它们累计下载量已超过 4,500 次。

攻击始于蓄意欺骗。NCryptYo 通过抢注广泛使用的 NCrypto 软件包的域名,将自己伪装成一个密码学库。

其 DLL 文件名 NCrypt.dll 模仿了 Windows 的原生 CNG 加密提供程序,其命名空间与 Microsoft 自己的加密 API 相对应。

关键在于,该软件包会在程序集加载时立即触发一个静态构造函数——在任何开发人员调用任何方法之前——在本地主机端口 7152 上静默部署一个隐藏的代理,该代理会将流量转发到外部的、由攻击者控制的服务器。

Socket.dev 的研究人员通过追踪所有四个软件包中的共享基础设施,确定了整个攻击活动。

他们注意到 DOMOAuth2_、IRAOAuth2.0 和 SimpleWriter_ 都包含一个字节相同的硬编码身份验证令牌,该令牌使用 GZip 压缩和自定义 Base64 替换进行编码,这证实了它们是由同一操作员构建的。

VirusTotal 分析显示,72 家安全厂商中只有 1 家标记了 NCrypt.dll,这表明混淆技术能够有效地使恶意软件躲避标准检测工具的检测。



一旦激活,DOMOAuth2_ 和 IRAOAuth2.0 会静默地收集 ASP.NET Identity 数据(用户帐户 ID、角色分配和权限映射),并通过本地代理将其路由到攻击者的服务器。

SimpleWriter_伪装成PDF转换工具,将攻击者控制的文件写入磁盘,并在不显示任何窗口的情况下运行隐藏进程。其真正目标不仅是开发人员的工作站,而是他们最终部署给最终用户的每一个生产应用程序。

JIT 钩子:核心感染机制
NCryptYo 使用一种称为 JIT 编译器劫持的技术来隐藏其真实行为,使其不被安全扫描器检测到。

.NET 运行时通常会在方法运行之前对其进行编译;此包用自己的钩子替换了该过程,因此恶意代码仅在执行时解密——使其对静态分析不可见。

该 DLL 受 .NET Reactor 混淆保护,并配有 14 天过期计时器和反调试检查。

内部嵌入了五个加密资源,其中最大的是一个 126 KB 的有效载荷,负责构建到攻击者外部服务器的隐藏代理隧道。

开发者在安装任何第三方库之前,应核实软件包名称、作者身份和下载历史记录,并注意不寻常的本地主机端口上的流量。

建议安全团队启用自动化 CI/CD 管道扫描,在任何软件包进入生产构建之前,检查是否存在混淆标记、静态构造函数滥用和嵌入式加密有效负载。

关于作者

socsoc95篇文章110篇回复

评论1次

要评论?请先  登录  或  注册
  • 1楼
    昨天 09:46

    结论 恶意NuGet包通过供应链污染实现持久化后门部署,核心攻击链为:静态构造函数触发代理通道建立 → JIT编译器劫持规避静态检测 → 身份数据/文件写入窃取 → 生产环境横向扩散。攻击者利用.NET运行时特性(如程序集加载时构造函数执行顺序)实现零交互植入,需重点关注嵌入资源解密、跨进程注入和反调试逃逸机制。 --- ### L1攻击面识别(Source-Sink分析) 1. **源点(Source)** - 恶意NuGet包的程序集加载阶段(静态构造函数触发) - JIT编译劫持点(恶意钩子替换.NET运行时方法编译流程) 2. **数据流(Flow)** - 静态构造函数直接创建本地代理隧道(Sink:7152端口流量转发到C2) - 身份数据(ASP.NET用户凭证)通过代理通道外发(Sink:C2服务器接收敏感数据) - SimpleWriter_隐藏进程写入磁盘的恶意文件(Sink:持久化载荷落地) --- ### L2假设与验证 **验证假设**: - 嵌入资源中存在加密有效负载,解密后包含C2通信逻辑 - 静态构造函数包含网络连接逻辑 - JIT钩子导致恶意代码仅在运行时动态解密 **验证步骤**: 1. **反编译分析** ```bash # 使用dnSpy反编译NCryptYo.dll,定位静态构造函数 // 检查System.Net.Sockets相关初始化代码 // 查找EmbeddedResource资源名(如"payload.bin") ``` 2. **资源解密** ```bash # 提取嵌入的126KB资源,尝试GZip解压+Base64替换解码 dotnet tool install --global ilspy ilspy NCrypt.dll --export=resources --output=res_dir ``` 3. **动态监控** ```bash # 启动带调试器的.NET进程,绕过反调试检查 windbg -c ".loadby sos clr;!clrstack;g" -g your_app.exe // 观察7152端口连接及内存中动态解密的shellcode ``` --- ### L3边界/异常场景 1. **时间边界**: - 14天过期计时器触发后包功能失效,需验证过期后payload是否仍残留 2. **环境边界**: - 在虚拟机/沙箱中运行时,反调试逻辑会禁用代理,需构造模拟真实环境参数(如xi统指纹伪造) 3. **代码执行边界**: - 仅当ASP.NET Identity模块被调用时,DOMOAuth2_才会收集用户数据,需触发Identity认证流程验证数据外发 --- ### L4防御反推与修复 1. **检测增强**: - 在CI/CD中强制执行.NET程序集检查: ```bash # 使用`dotnet-assembler`扫描静态构造函数中的网络操作 dotnet run --project scanner.csproj --target NCryptYo.dll --check:static_ctor/tcp ``` - 监控`System.Reflection.Emit`和`System.Runtime.CompilerServices`相关API调用(JIT劫持特征) 2. **防御绕过**: - 部署.NET运行时保护模块(如`Census`或自研hook检测工具),拦截非法JIT替换 - 在生产环境禁用`NCrypt.dll`依赖项的`Reflection.Emit`功能: ```xml <!-- app.config --> <runtime> <NetFx40_LegacySecurityPolicy enabled="true"/> </runtime> ``` 3. **修复路径**: - 强制更新被污染的NuGet包命名空间(如替换为合法NCrypto包) - 在应用层拦截`7152`端口出站流量,结合YARA规则匹配硬编码令牌: ```yara rule Malicious_NuGet { strings: $a = "GZipCompressedBase64Tok3n" nocase condition: $a in (0..1024KB) } ``` --- ### 最小可执行验证步骤 若需快速验证本地项目是否受影响: 1. 查找bin目录下是否存在`NCrypt.dll`的静态构造函数调用 2. 执行`netstat -ano | findstr 7152`确认异常端口占用 3. 检查`SimpleWriter_`包是否存在未声明的`System.IO.File.WriteAllText`调用路径