恶意软件狩猎新途径:使用.NET元数据分析跟踪恶意软件

本文由Blaze于2024年3月25日发表于其个人博客网站上。

就在不久前,我们意外发现了一个PureCrypter样本,而PureCrypter则是一款适用于各种类型恶意软件(例如Agent Tesla和RedLine)的加载器和混淆处理工具。深入分析之后,我还专门为该样本编写了Yara检测规则,当时我便意识到,我是不是也可以写一些Yara规则来识别.NET开发的恶意软件或.NET程序集。

在这篇文章中,我将跟大家分享如何使用.NET元数据分析、跟踪和分类恶意软件的相关内容。

背景概述

.NET程序集或二进制文件通常包含各种元数据,例如内部程序集名称和GUID,尤其是MVID和TYPELIB:

GUID:也被称为TYPELIB ID,会在创建一个新项目时生成;

MVID:模块版本ID,.NET模块的唯一识别符;

TYPELIB:TYBELIB版本,或类型库编号;

这些特定的识别符可以使用strings命令下列正则表达式来解析:

[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}

我们以PureLogStealer的一个样本为例,基于MVID或Typelib来编写一个Yara规则。VirusTotal上的样本检测信息如下:

对应的Yara规则如下:

rule PureLogStealer_GUID{strings:$mvid = "9066ee39-87f9-4468-9d70-b57c25f29a67" ascii wide fullwordcondition:$mvid}

但现在存在的问题如下:

1、MVID会以二进制值的形式存储,而不是以字符串形式,同时Typelib GUID是以字符串形式存储的,由于我们这里只有MVID,因此该规则无法检测上面给出的这个样本;

2、VirusTotal似乎并没有报告Typelib;

3、使用字符串和正则表达式“手动操作”很麻烦,尤其是在较大的数据集上,而且容易出现假阳性和假阴性问题;

需要注意的是,在IlSpy或dnSpy(Ex)之类工具的帮助下,我们是可以查看到Typelib GUID和MVID的,但并不是所有的工具都会显示所有的数据,比如说:

如果我们使用ildasm来查看到话,会得到如下所示的信息:

针对上述所有的原因,我们要想办法解决,解决方案就是Yara规则结合我所开发的一个新Python工具。

解决方案和工具

在介绍解决方案和我的工具之前,我不得不提一下,多亏了Yara规则一直在进化,并且引入了下列新的模块,我们现在才能够更加有效地检测和捕捉恶意软件样本:

2017:引入.NET模块;【传送门】

2022:引入console模块;【传送门】

这也就意味着,在.NET模块的帮助下,我们现在可以按照下列方式来写Yara规则了:

import "dotnet"rule PureLogStealer_GUID{condition:dotnet.guids[0]== "9066ee39-87f9-4468-9d70-b57c25f29a67"}

检测样本:

Yara规则

现在我们可以利用Yara的强大能力,以及dotnet和console模块来编写一个新的Yara规则,并显示给定.NET样本的全部有用信息,例如程序集名称、Typelib和MVID:

首先,我们需要验证目标二进制代码是否是一个.NET编译文件,如果是,记录下特定的PE或代码信息,然后显示所有相关的.NET信息。上述样本的Yara规则数据(元数据)如下:

这也就意味着,我们现在可以编写下面这样的Yara规则:

import "dotnet"rule PureLogStealer_GUID{condition:dotnet.guids[0]=="9066ee39-87f9-4468-9d70-b57c25f29a67" ordotnet.typelib=="856e9a70-148f-4705-9549-d69a57e669b0"}

Python工具

那么,如果我想要对大规模样本集执行检测,并生成统计数据,然后进行恶意软件家族跟踪和分类的话,该怎么办呢?

为此,我专门开发了一个Python工具,这个工具就可以解决我们的需求问题。它支持输入一个文件、整个样本文件夹或恶意软件代码库,该工具会跳过任意非.NET代码,并报告Typelib、MVID和Typelib ID。

针对单个样本的工具执行结果如下:

该工具的帮助信息如下:

当然了,该工具并不仅限于搜索.NET恶意软件的MVID或Typelib,你也可以使用使用它并结合Yara和Python来提取各种你需要的信息。相关的Yara规则和Python工具(DotNet-MetaData )已经发布在【GitHub】上,有需要的研究人员可以自行访问下载。除此之外,广大研究人员也可以根据自己的需求对工具进行自定义开发和调整,以获取和显示更多的信息。

集群

跟踪威胁行为者的活动,一直以来都是研究人员的常规挑战之一,虽然有的时候会很有趣,但绝大多数都是枯燥乏味的。下面给出的是我遇到的一个恶意软件集群活动示例:

这里涉及到大量的样本集(1300个),主要针对的是SteamStealer。

针对我们的分析目标,我选择了目前四个比较热门的恶意软件(基于.NET或拥有.NET变种版本)进行分析:

RedLine

Agent Tesla

Quasar

Pure*(与PureCrypter, PureLogs等相关)

下载并使用DotNetMetadata分析后,我们会得到如下图所示的结果。

RedLine(56个样本)

RedLine Typelib GUID频率:

RedLine MVID频率:

Agent Tesla(140个样本)

Agent Tesla Typelib GUID频率:

Agent Tesla MVID频率:

Quasar(141个样本)

Quasar Typelib GUID频率:

Quasar MVID频率:

Pure*家族(194个样本)

Pure*  Typelib GUID频率:

Pure* MVID频率:

上述的饼状图能够显示相同Typelib或MVID出现的频率和情况,同时我们也可以利用这些饼状图数据来为每个恶意软件样本集群创建有效的Yara检测规则。

你可能会认为,这些饼状图不会特别有效,因为如果数据集再大一些的话,缩放会比较困难。但是,我们可以通过限制显示的结果数量,来获取更好的结果。上述四个恶意软件家族样本数据集中,总共有531个样本,再次运行可视化处理后,我们将进行下列操作:

1、针对整个样本集执行分析;

2、提取程序集名称;

3、仅列出排名前十的程序集名称;

4、使用柱状图代替饼状图;

结果如下图所示:

排名前三的为:

1、“Client”:Quasar家族;

2、“Product Design 1”:Pure家族;

3、“Sample Design 1”:Pure家族;

“Client”貌似是Quasar恶意软件编译时使用的默认程序集名称,而“Product Design”和“Sample Design”则可能是PureCrypter构建器的默认程序集名称。

接下来,我们就可以根据默认程序集名称为Quasar编写一个Yara规则:

import "dotnet"rule Quasar_AssemblyName{condition:dotnet.assembly.name == "Client"}

我们还可以构建Yara规则来对我们的恶意软件数据集或存储库进行分类:

import "dotnet"import "console"rule DotNet_Malware_Classifier{condition:(dotnet.assembly.name == "Client" and console.log(“Likely Quasar, assembly name: ", dotnet.assembly.name)) or(dotnet.assembly.name == "Product Design 1" and console.log("Likely Pure family, assembly name: ", dotnet.assembly.name)) or(dotnet.assembly.name == "Sample Design 1" and console.log("Likely Pure family, assembly name: ", dotnet.assembly.name))}

针对Pure家族和Quasar合并样本运行新的Yara规则后,分类结果输出如下:

我们可以将基于程序集名称、Typelib、MVID等的Yara规则集组合起来,创建具有更高置信度的规则,并将其用于进一步的恶意软件搜索和分类等操作。

意外收获

既然已经走到了这里,我们再努力一下!现在,我们可以尝试去寻找新的加密器或混淆处理器了。

当我使用工具脚本对500+个样本执行测试时,有一个程序集/代码吸引了我的注意:

针对它写一个简单的Yara规则:

import "dotnet"rule cronos_crypter{strings:$cronos = "Cronos-Crypter" ascii wide nocasecondition:dotnet.is_dotnet and $cronos}

Unpac.me Yara捕捉结果:

由此看来,这个加密器(Cronos-Crypter)似乎并不是很受欢迎。目前为止,只有两个Async RAT样本和两个PovertyStealer样本使用了它。

通过审查Async RAT并改进之前的“分类规则”,我们看到这个加密器至少在两个Async RAT样本上使用过,基于86个样本,我们得到了下列统计数据:

我们得到了下列程序集名称:

AsyncClient

Client(Quasar中也有)

XClient

Output

Loader

Stub

AsyncClient很可能是Async RAT项目的默认名称,针对该样本的Yara规则优化版本如下:

import "dotnet"import "console"rule DotNet_Malware_Classifier{condition:(dotnet.assembly.name == "Client" and console.log("Suspicious assembly name: ", dotnet.assembly.name)) or(dotnet.assembly.name == "Output" and console.log("Suspicious assembly name: ", dotnet.assembly.name)) or(dotnet.assembly.name == "Loader" and console.log("Suspicious assembly name: ", dotnet.assembly.name)) or(dotnet.assembly.name == "Stub" and console.log("Suspicious assembly name: ", dotnet.assembly.name))}

分类器Yara规则结果如下:

总结

在这篇文章中,我们主要介绍了两种用于从.NET恶意软件中提取元数据的技术方法和工具,简而言之,就是通过可靠的方法提取两个唯一GUID(Typelib和MVID)来识别恶意软件。

我们提供的Python脚本可以从大量.NET程序集中提取出所需的数据,广大研究人员可以根据实际情况调整大型集合的Yara规则,并扩展脚本以获取更多有价值的数据。

你可以在下列存储库中找到本文涉及到的工具和Yara规则示例:

GitHub - bartblaze/DotNet-MetaData: Identifies metadata of .NET binary files.

最后,祝大家恶意软件“狩猎”愉快!

参考资料

PureCrypter (Malware Family)

https://twitter.com/James_inthe_box/status/1767548157003743382

https://twitter.com/James_inthe_box

VirusTotal

CyberChef

Release YARA v3.6.0 · VirusTotal/yara · GitHub

Release YARA v4.2.0 · VirusTotal/yara · GitHub

GitHub - bartblaze/DotNet-MetaData: Identifies metadata of .NET binary files.

GitHub - TalosSec/Cronos-Crypter: Cronos Crypter is an simple example of crypter created for educational purposes.

参考链接

https://bartblaze.blogspot.com/2024/03/analyse-hunt-and-classify-malware-using.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多,浏览他们最喜欢的网站,点击电子邮件链接,或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用,但也会使组织面临一系列安全和业务风险&#…

网络连接与访问傻傻分不清?一文为你理清二者区别

网络连接指的是建立两个或多个计算机、设备或系统之间的物理或逻辑链接,使它们可以进行数据交换、通信和资源共享。连接可以是有线的或无线的,可以是临时的或长期的。 网络访问指的是在连接的基础上,通过合适的方式和权限进入特定资源、服务或…

计算机网络-IS-IS路由计算

前面已经学习了建立IS-IS邻接关系和同步LSDB,然后基于此路由器会进行路由计算。 一、路由计算 因为IS-IS路由器有不同的级别,只维护自身级别的LSDB,因此就是Level-1只有区域内的路由信息,Level-2有Level-2的路由信息,L…

数仓建模—数据语义层

数仓建模—数据语义层 什么是语义层 如今,企业产生大量数据,需要以正确的方式进行分析才能做出重要决策。数据可能来自多个来源并采用不同的格式,这使得清楚地了解其含义和重要性成为一项挑战。这就是语义层的用武之地。 语义层存在于数据仓库和最终用户使用的应用程序之间…

『 论文解读 』大语言模型(LLM)代理能够自主地利用1 day漏洞,利用成功率竟高达87%,单次利用成本仅8.8美元

1. 概览 该论文主要展示了大语言模型LLM代理能够自主利用现实世界的 1 day 漏洞。研究我发现, GPT-4 在提供了CVE描述的情况下,能够成功利用 87% 的漏洞。 这与其他测试模型(如 GPT-3.5 和其他开源 LLM )以及开源漏洞扫描器&…

原生js实现一个简化版的h函数

原生js实现一个简化版的h函数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

单片机使用循环来实现延时和定时器延时的区别是什么?

循环延时是一种简单的实现方式&#xff0c;但由于资源占用和精确度的限制。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在…

C++感受9-Hello Object 生死版•上

你好对象&#xff01; 认识C中基础中的基础类型&#xff1b;创建用户自定义的复合类型&#xff1b;创建新类型的对象&#xff1b;定制新类型对象的生死过程 零、面向对象启蒙 之前我们一直在问候世界&#xff0c;从这节课开始&#xff0c;我们的问候对象就是“对象&#xff08…

RocketMQ快速入门:group、topic、queue、tag等基本概念(四)

0. 引言 上一节&#xff0c;我们说明了rocketmq中的4个核心组成以及他们之间的工作关系。但其中穿插的topic, queue等概念&#xff0c;如果未接触过mq的同学可能会有些迷糊&#xff0c;所以本节&#xff0c;我们重点针对rocketmq中的基本概念进行讲解&#xff0c;之前学习过其…

人工智能中两个较为常见的评估模型性能指标(EVS、MAE)

1、解释方差(EVS) 官方社区链接&#xff1a;sklearn.metrics.explained_variance_score-scikit-learn中文社区 explained_variance_score是一个用于评估回归模型性能的指标&#xff0c;它衡量的是模型预测值与实际值之间关系的密切程度。具体来说&#xff0c;解释方差分数表示…

springboot整合rabbitMQ系列10 利用插件实现延时消息

插件的安装&#xff0c;本文就不做描述了&#xff0c;插件安装后如下&#xff0c;就说明安装成功了1 添加pom依赖&#xff0c;yml配置就不讲了2 核心类&#xff0c;定义交换机的代码改成如下&#xff0c;其它的定义队列&#xff0c;设置绑定关系&#xff0c;设置死信等&#xf…

【面试经典 150 | 数组】Z 字形变换

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;二维矩阵模拟方法二&#xff1a;一次遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

【CouchDB 与 PouchDB】

CouchDB是什么 CouchDB&#xff0c;全名为Apache CouchDB&#xff0c;是一个开源的NoSQL数据库&#xff0c;由Apache软件基金会管理。CouchDB的主要特点是使用JSON作为存储格式&#xff0c;使用JavaScript作为查询语言&#xff08;通过MapReduce函数&#xff09;&#xff0c;并…

QT中基于TCP的网络通信

QT中基于TCP的网络通信 QTcpServer公共成员函数信号 QTcpSocket公共成员函数信号 通信流程服务器端通信流程代码 客户端通信流程代码 使用Qt提供的类进行基于TCP的套接字通信需要用到两个类&#xff1a; QTcpServer&#xff1a;服务器类&#xff0c;用于监听客户端连接以及和客…

赛劲SEJINIGB零背隙滚轮齿条齿圈产品助力高精度运动平台

在高度精密化的工业时代&#xff0c;传统齿轮齿条系统所面临的背隙、摩擦粉尘、润滑等问题愈发凸显&#xff0c;这些问题不仅限制了设备的精度和稳定性&#xff0c;还对生产效率和产品质量造成严重影响。为此&#xff0c;赛劲SEJINIGB经过长期研发和技术积累&#xff0c;推出了…

消息队列 Kafka 入门篇(二) -- 安装启动与可视化工具

一、Windows 10 环境安装 1、下载与解压 首先&#xff0c;访问Apache Kafka的官方下载地址&#xff1a; https://kafka.apache.org/downloads 在本教程中&#xff0c;我们将使用kafka_2.13-2.8.1版本作为示例。下载完成后&#xff0c;解压到您的工作目录的合适位置&#xff…

如何在Windows 8/10/11上启用和禁用内置访客帐户?这里提供几种方法

你的Windows上有一个内置的guest帐户&#xff0c;可以帮助计算机上没有帐户的人登录。当然&#xff0c;你可以打开或关闭它。本文将介绍一些在Windows 8/10/11计算机中启用和禁用内置guest帐户的有用方法&#xff0c;供你更好地参考。 如何启用内置来宾帐户 在本地组策略中启…

Django中的事务

1 开启全局的事务 DATABASES {default: {ENGINE: django.db.backends.mysql, # 使用mysql数据库NAME: tracerbackend, # 要连接的数据库USER: root, # 链接数据库的用于名PASSWORD: 123456, # 链接数据库的用于名HOST: 192.168.1.200, # mysql服务监听的ipPORT: 3306, …

面向多源异质遥感影像地物分类的自监督预训练方法

源自&#xff1a;测绘学报 作者&#xff1a;薛志祥, 余旭初, 刘景正, 杨国鹏, 刘冰, 余岸竹, 周嘉男, 金上鸿 摘 要 近年来,深度学习改变了遥感图像处理的方法。由于标注高质量样本费时费力,标签样本数量不足的现实问题会严重影响深层神经网络模型的性能。为解决这一突出矛盾…

Linux防火墙相关命令以及ip白名单配置

Linux防火墙相关命令以及ip白名单配置 firewall防火墙基础命令查看防火墙的服务状态查看防火墙的状态服务的开启、关闭和重启查看防火墙规则端口的查询、开放和关闭重启防火墙 防火墙白名单配置部分参数介绍 firewall防火墙基础命令 查看防火墙的服务状态 systemctl status f…