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

news2024/12/25 9:07:48

本文由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 fullword

condition:

$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" or

dotnet.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 nocase

condition:

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.coloradmin.cn/o/1621590.html

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

相关文章

文章杂记 | C++动态内存分配

1、C类和动态内存分配 https://blog.csdn.net/u011381222/article/details/137734622 Stringbad.h #pragma once #ifndef STRINGBAD_ #define STRINGBAD_#include<iostream>using namespace std;class Stringbad { private:char* str;//字符串地址int len; //长度st…

前端三剑客 HTML+CSS+JavaScript ④ HTML标签

祝你先于春天&#xff0c;翻过此间铮铮山峦 —— 24.4.23 一、HTML排版标签 1.标题标签 h1~h6 标签含义&#xff1a;标题 单/双标签&#xff1a;双 主要用前三个 2.段落标签 p 标签含义&#xff1a;段落 单/双标签&#xff1a;双 3.div 没有任何含…

Day17-Java进阶-网络编程(IP, 端口, 协议)TCP和UDP三次握手和四次挥手

1. 网络编程介绍 1.1 初始网络编程 1.2 网络编程三要素 1.2.1 IP InetAddress 的使用 package com.itheima.Inetaddress;import java.net.InetAddress; import java.net.UnknownHostException;public class InetAddressDemo1 {/*static InetAddress getByName(String host) 确…

Redis分布式锁 - 基于Jedis和LUA的分布式锁

先基于单机模式&#xff0c;基于Jedis手工造轮子实现自己的分布式锁。 首先看两个命令&#xff1a; Redis 分布式锁机制&#xff0c;主要借助 setnx 和 expire 两个命令完成。 setnx命令: setnx 是 set if not exists 的简写。将 key 的值设为 value &#xff0c;当且仅当…

基于PaddlePaddle平台训练物体分类——猫狗分类

学习目标&#xff1a; 在百度的PaddlePaddle平台训练自己需要的模型&#xff0c;以训练一个猫狗分类模型为例 PaddlePaddle平台&#xff1a; 飞桨&#xff08;PaddlePaddle&#xff09;是百度开发的深度学习平台&#xff0c;具有动静统一框架、端到端开发套件等特性&#xf…

Mac装虚拟机好不好 Mac装虚拟机和装Windows系统一样吗 PD虚拟机

随着跨系统操作的不断发展&#xff0c;虚拟机技术在生产力领域扮演着越来越重要的角色。Mac作为一款主流的操作系统&#xff0c;也有着运行虚拟机的能力。接下来给大家介绍Mac装虚拟机好不好&#xff0c;Mac装虚拟机和装Windows系统一样吗的具体内容。 一、Mac装虚拟机好不好 …

直接用表征还是润色改写?LLM用于文生图prompt语义增强的两种范式

直接用表征还是润色改写&#xff1f;LLM用于文生图prompt语义增强的两种范式 导语 目前的文生图模型大多数都是使用 CLIP text encoder 作为 prompt 文本编码器。众所周知&#xff0c;由于训练数据是从网络上爬取的简单图文对&#xff0c;CLIP 只能理解简单语义&#xff0c;而…

linux文件句柄数满,linux文件句柄数超出系统限制怎么办?

1、问题阐述&#xff1a; too many open files&#xff1a;顾名思义即打开过多文件数。 不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做句柄(handle)&#xff0c;这个错误通常…

自动化立体库安全使用管理制度

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球 【智能仓储物流技术研习社】自行下载 关于自动化立体库安…

Linux--系统烧写

前面几篇文章&#xff0c;已经搞定了Linux移植三巨头&#xff1a;uboot、kernel(包含dtb)和rootfs&#xff0c;除了uboot是烧写在SD中的&#xff0c;其它的都是在ubuntu虚拟机的nfs服务器中&#xff0c;运行时必须通过网络将这些文件加载到开发板的内存中运行。 本篇就来研究&a…

JAVAEE—HTTP

文章目录 HTTP导读HTTP解析HTTP的格式分析环境准备 HTTP请求格式首行headerHostContent-LengthContent-TypeUser-Agent (简称 UA)RefererCookie 空行body HTTP响应格式认识HTTP的方法POST方法POST和GET的区别第一&#xff1a;用处第二&#xff1a;传递数据第三&#xff1a;GET不…

QWidget | Qt::WindowType 枚举的取值及意义QFlags 模板类详解

01 与 QWidget 类有关的部分类的继承图 3、QObject 是所有 Qt 对象的基类,QPaintDevie 是所有可绘制对象的基类。 4、QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一…

装饰模式【结构型模式C++】

1.概述 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concrete…

区块链安全应用------压力测试

测试要求&#xff1a; 1. 对以下AccountManager智能合约进行压测(基础要求set函数测试&#xff0c;balanceOf涵为20分加分项)2. 在本地链进行测试&#xff0c;需要监控本地进程的资源使用情况。每个进程的multiOutput属性为Avg3. 需要将每一个更改的配置文件截图&#xff0c;和…

指针(5)

前言 本节是有关指针内容的最后一节&#xff0c;本节的内容以讲解指针习题为主&#xff0c;那么就让我们一起来开启本节的学习吧&#xff01; sizeof和strlen的对比 1.sizeof 我们在学习操作符的时候&#xff0c;学习了sizeof。sizeof存在的意义是用来计算变量所占用的内存空…

智慧火电厂合集 | 数字孪生助推能源革命

火电厂在发电领域中扮演着举足轻重的角色。主要通过燃烧如煤、石油或天然气等化石燃料来产生电力。尽管随着可再生能源技术的进步导致其比重有所减少&#xff0c;但直至 2023 年&#xff0c;火电依然是全球主要的电力来源之一。 通过图扑软件自主研发 HT for Web 产品&#xf…

百度智能云千帆 ModelBuilder 技术实践系列:通过 SDK 快速构建并发布垂域模型

​百度智能云千帆大模型平台&#xff08;百度智能云千帆大模型平台 ModelBuilder&#xff09;作为面向企业开发者的一站式大模型开发平台&#xff0c;自上线以来受到了广大开发者、企业的关注。至今已经上线收纳了超过 70 种预置模型服务&#xff0c;用户可以快速的调用&#x…

企业微信hook接口协议,开放平台id转企业用户id

开放平台id转企业用户id 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","openid":["woO9o4EAAAUg47yCUh1mDYVh71AJ8R3w"] } …

陪诊小程序的市场潜力与发展趋势研究

随着社会的快速发展和人口老龄化的加剧&#xff0c;医疗服务需求日益增长&#xff0c;而陪诊服务作为医疗服务的重要补充&#xff0c;正逐渐受到人们的关注和青睐。陪诊小程序作为一种便捷、高效的陪诊服务平台&#xff0c;其市场潜力和发展趋势值得关注。 一、市场潜力分析 人…

【现代交换原理与通信网技术】期末突击

文章目录 自己老师画的重点1. 程控交换机结构2. 测试模拟电路的七项功能3.中继电路的六项功能4.数字用户电路和模拟用户电路比较5.路由规划的基本原则6.七路信令的结构7.随路信令和公共信道信令8.软交换9.无极网和分级网10.路由选择.流量控制的原则/方法11.电路交换&&分…