勒索软件分析_Conti

0. Conti介绍

勒索软件即服务(Ransomware as a Service,RaaS)变体 Conti 推出还不到两年,已经进行了第七次迭代。Conti被证明是一种敏捷而熟练的恶意软件威胁,能够自主和引导操作,并具有无与伦比的加密速度。截至 2021 年 6 月,Conti独特的功能集已帮助其附属公司从 400 多个组织勒索数百万美元。

1. Conti攻击概述

Conti的行为与大多数勒索软件类似,但它经过精心设计,更加高效且更具规避性。具体来说,Conti在混淆能力、运行速度以及文件加密方面进行持续优化,其主要特征包括:

混淆能力提升:自早期的Conti(2019 年末)通过简单的 XOR 机制来隐藏在运行时解析的 API 名称。从2020年6月开始,Conti还采用了字符串混淆的自定义编码函数。

运行速度提升:Conti使用多达32个并发CPU线程进行文件加密操作,并且从2020年9月开始Conti将加密算法从AES切换为CHACHA。

文件加密优化:2020年9月后,Conti添加了新的文件加密逻辑(部分加密)。2021年1月后,Conti在加密过程中引入C++ 队列和锁,取代了原先使用的IoCompletionPorts。

2. 勒索软件影响

Conti由所谓的TrickBot团伙开发和维护,主要通过RaaS隶属模式运营。Conti勒索软件源自Ryuk的代码库,并依赖于相同的TrickBot基础设施。Conti 样本于 2019 年 10 月左右首次出现,截至2021年6月已经发生399 起Conti攻击,攻击事件统计如下图所示。

3. 勒索软件分析

测试版本

导入函数:Conti使用LoadLibraryA和GetProcAddress手动链接导入函数,所有 API 的名称均使用字节0x99进行简单的XOR编码。此版本中未对DLL的名称进行编码,除了一些来自Rstrtmgr.dll的可选导入之外。除此之外,GetProcAddress函数最终会确保它拥有它正在寻找的所有强制API。否则,它使用 ExitProcess退出程序。

加载资源:Conti会加载 PE 文件中的两个资源。第一个将用作赎金票据的文本(在最早的版本中设置为“测试票据”),而第二个是用逗号分隔的字符串列表,通过这些字符串可以过滤目标文件。这允许对上述资源进行简单修改可以实现定制化的勒索攻击,而无需重新编译勒索软件。

加密前操作:Conti首先通过命令行(所有命令字符串均通过字节 0x99 进行异或编码)删除系统驱动器上的卷影副本,之后通过命令行停止系统上约170项服务,然后迭代系统上正在运行的所有进程并终止“sql”相关的进程。完成上述操作之后,Conti查询系统中处理器的数量,并创建两倍于处理器数量的IoCompletionPort与处理器数量的线程。

目标文件获取:Conti在创建线程后,Conti查找系统上所有驱动器,并运行其逻辑(目标文件过滤)来选择每个驱动器上的目标文件。遍历所有驱动器后,Conti使用所有线程从GetIpNetTable返回所有IP地址,对每个IP地址调用NetShareEnum获取网络共享列表,并获取目标文件。

文件加密:Conti的文件加密主要通过其迭代函数与加密函数实现,(1)迭代函数会获取一个文件夹作为参数,并通过FindFirstFile API搜索文件夹中的所有文件。(2)加密函数首先从PE文件数据部分加载RSA公钥,之后从IoCompletionPorts中获取目标文件路径,然后通过AES+RSA对目标文件进行混合加密,最后将文件的扩展名改为“.CONTI”并对下一个目标文件进行加密。

正式版本

目标文件获取:Conti在以迭代的方式在各驱动器上并行搜索目标的文件。具体来说,Conti会为每个驱动器创建一个新线程,并以驱动器根路径作为参数通过迭代函数获取目标文件。这是一个很好的补充,可以提高速度。

文件加密:Conti在以前的版本中,加密的 AES 密钥和原始文件大小都在加密之前写入文件的末尾。然而,在此版本中,只有在文件完全加密后才会写入原始文件大小。

改进版本v1

命令行参数:Conti引入加密模式、网络位置等命令行参数,方便攻击者实施自定义勒索攻击。

函数导入:Conti使用自定义编码函数代替简单的单字节 XOR,且更多字符串被混淆。

加密前操作:Conti减少了 36 个服务的停止,创建互斥体以避免不同实例之间的相互干扰。

目标文件获取:Conti通过GetIpNetTable中的本地IP(如,192.168.*)查找共享文件。

改进版本v2

命令行参数:FAdded支持对其他命令行参数的支持。在此版本中,可以将目录列表指定为搜索要加密的感兴趣文件的目标。此外,可以给出一个日志记录标志,尽管它直到更高版本才实现。

函数导入:在大多数情况下,Conti 不会嵌入 DLL 的普通名称及其所需的导出,而是仅保留所需字符串的哈希值。通过哈希仅找到 kernel32.dll。其余的 DLL 名称嵌入在可执行文件中,现已进行模糊处理,并使用 LoadLibraryA API 加载。选择的 API hash函数是 Murmur2A8,其常量种子设置为 0x5B2D,用于小写 ASCII 字符串。

新实现的钩子删除逻辑在加载所有必要的 DLL 后发生。对于每个加载的 DLL,Conti 会读取磁盘上的文件并遍历其中的所有导出,查找前几个字节的差异。如果在磁盘版本和内存版本之间发现任何此类差异,则内存中的字节将被从磁盘读取的字节替换。钩子删除函数中使用的 API 是通过加载时链接的 LoadLibraryA 和 GetProcAddress 获取的,这又是一个新添加,没有经过将 API 切换为运行时加载的 API 的重构。

加载资源:这两个资源已被删除。勒索字条内容已移至可执行文件的数据部分,同时删除了加密特定文件模式而不是默认文件模式的功能。我们推测作者发现后一个功能不值得支持,因为我们从未见过它在实践中使用。

加密前操作:删除服务的能力已被删除。允许删除卷影副本的功能以不同的方式实现,在本示例的逻辑中更进一步。如果选择本地加密模式,该示例将通过使用 WMIC9 运行命令来删除在 ROOT\CIMV2 上查询 Win32_ShadowCopy 时找到的卷影副本。与之前使用 vssadmin10 删除固定数量的驱动器相比,这些驱动器可能启用也可能未启用卷影副本,甚至可能未安装在磁盘上,甚至可能会丢失带有卷影副本的驱动器。

重新实现已删除的功能,为从 IoCompletionPorts 读取而创建的线程数量又恢复到基于系统上可用处理器的数量。这次,它取决于勒索软件的执行模式,在指定“仅本地”或“仅网络”加密的情况下为每个处理器创建一个线程,如果同时使用两种模式,则创建两倍的线程。有趣的是,此版本中的重新实现使用了从 GetNativeSystemInfo 查询返回的错误值,使用 dwActiveProcessorMask 而不是 dwNumberOfProcessors。这个小bug在后续版本中得到修复。

目标文件获取:“169.*”形式的地址被添加到 IP 地址列表中以搜索共享。现在使用 inet_ntoa API,而不是使用 InetNtopW 将地址转换为宽字符串,使字符串只有字节大小。不是执行 32 个线程来搜索这些 IP 地址上的共享,而是只有一个线程在做脏活。

在寻找网络共享的过程中还有一项额外的检查。首先使用恶意软件手动创建的套接字检查地址是否有 445 上的开放端口。然后,仅对应答检查的 IP 调用 NetShareEnum API。此更改应该会减少在没有任何地址的地址上查询共享的噪音。

文件加密:不同的文件采用不同的逻辑进行加密。我们有一个包含 171 个扩展名的新列表,其中文件的全部内容都被加密,然后还有另一个包含 20 个扩展名的列表,其中仅对文件的某些部分进行了加密。最后,其余文件按大小进行分类。

加密算法由AES改为ChaCha。密钥仍然是按文件随机生成的,并在使用二进制文件数据部分中嵌入的 RSA 公钥加密后写入文件末尾。

加密文件的扩展名已从 .CONTI 更改为 .YZXXX,这可能有助于避免根据已知的扩展名更改检测到勒索软件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP HCM WPBP的几个变量含义

WPBP起源 WPBP是SAP HCM的主数据的集合内表,集合、内表这两个名词如何理解,集合就是多个主数据的汇总,内表是ABAP的几个数据结构,就和我们EXCEL的多行一行。 wpbp数据来源 WPBP的主数据来源于SAP HCM 0000、0001、0007、0027、0008信息类型的汇总,SAP HCM是以时间轴为核心…

揭秘《庆余年算法番外篇》:范闲如何使用维吉尼亚密码解密二皇子密信

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

有趣的css - 加减动态多选框

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是用 css 实现一个适用树形菜单场景的加减动态多选框。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面…

SQL SERVER 我没有消失,SQL SERVER下一个版本是2025 (功能领先大多数数据库)

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2320人左右 1 …

github加速访问及资源一秒代理下载

如果你想加速打开github网页,可以采用以下方法,仅需一个插件。 1.代理加速访问 打开gitee网站,搜索dev-sidecar关键字,然后找到星星最多的项目 可以阅读项目说明,找到感兴趣的内容或是直接下载DevSidecar桌面应用程序…

C语言笔记21 •模拟atoi函数•

1.atoi的使用 atoi是将字符串转化为int类型数字的一个库函数 int main() { char str[] "123568"; int a; a atoi(str); /*将字符串转化为int型的数字*/ printf("%d\n", a); } 2.模拟atoi函数 #define _CRT_SECURE_NO_WARNINGS…

MyBatis-Plus 从入门到精通

MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…

通过Kafka-Logger插件收集流量进行漏洞扫描

通过Kafka-Logger插件收集流量进行漏洞扫描 方案 可以通过APISIX kafka-logger 插件将日志作为 JSON 对象推送到 Apache Kafka 集群中,消费Kafka里的数据格式化后添加到MySQL。 方案详情 1、登录APISIX,启用内置的kafka-logger 插件: 2…

PyQt6--Python桌面开发(34.QStatusBar状态栏控件)

QStatusBar状态栏控件 self.statusBar.showMessage(q.text()菜单选项被点击了,5000)

当HR问你是否单身时,该怎么回答?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:我是晶圆厂厂务工程师,最近在面试新工作,但是几乎每家HR都会问我同一个问题:你结婚没有&#xff1…

安全设计 | CISA:构建不可侵犯的代码,软件安全设计的未来之路

软件制造商在产品设计和开发过程中应采取安全设计原则和方法,以减少网络安全风险,并转变责任重心,使产品在设计时就内置安全特性,而不是依赖于后期的补丁和修复。为此CISA发布了《软件安全设计的原则和方法》,帮助软件…

Windows11平台在VS2022上通过CMake安装C++绘图库ROOT库

Root库是一个功能强大的开源软件框架,用于数据分析、可视化和存储。它最初是为高能物理实验设计的,但现在已经广泛应用于各种科学领域和工程应用中。Root库使用C编写,提供了许多用于数据处理和分析的工具和算法。它的核心功能包括数据存储、数…

6.Redis之String命令

1.String类型基本介绍 redis 所有的 key 都是字符串, value 的类型是存在差异的~~ 一般来说,redis 遇到乱码问题的概率更小~~ Redis 中的字符串,直接就是按照二进制数据的方式存储的. (不会做任何的编码转换【讲 mysql 的时候,知道 mysql 默认的字符集, 是拉丁文,插入中文…

等保2.0看这一篇就够了

一、等级保护介绍 1.1什么是等级保护 网络安全等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安…

微火问答:全域外卖和本地生活服务是同个项目吗?

当前,本地生活赛道火爆程度不断升级,作为其主要板块之一的团购外卖也持续迸发出新的活力。而全域运营的出现无疑是给团购外卖这把正在熊熊燃烧的烈火,又添了一把新柴! 所谓全域运营,简单来说,就是指所有领…

SAP-技巧篇实现GUI免密码登录

做为上千万的软件怎么会没有免密码登录呢 01 — 背景需求 如何实现SAP GUI免密码登录,不输入密码实现系统自动登录。 免责声明:谨慎设置,因免密登录导致数据泄密,作者概不负责。 02 — 实现 客户端要求:SAP G…

VMware创建虚拟机

1.自定义 2.选择硬件兼容性 3.创建一个空白硬盘 4.选择操作系统和版本 5.设置虚拟机名称以及安装位置 6.处理器配置 7.设置虚拟机内存 8.设置网络类型 8.选择IO控制器 9.选择磁盘类型 10.创建一个新硬盘 11.设置磁盘容量以及磁盘个数 12.设置磁盘文件名称(默认) 13.点击完成创建…

从0开始学统计-P值

1.P值是什么? P值(P-value)是假设检验中的一个重要指标,用于衡量样本数据对于零假设的支持程度。具体来说,P值表示在假设零假设为真的情况下,观察到的样本数据或更极端情况出现的概率。 通常情况下&#…

蓝桥杯-班级活动

题目描述 小明的老师准备组织一次班级活动。班上一共有 ( n ) 名(( n ) 为偶数)同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 ( n ) 以内的正整数作为 id,第 …

KVM热迁移虚拟机+KSM内存页合并

KVM高级功能部署 文章目录 KVM高级功能部署资源列表基础环境一、静态迁移1.1.在源宿主机上准备虚拟机1.1.1、调试VNC1.1.2、创建虚拟机test011.1.3、console登录test01虚拟机1.1.4、标记虚拟机test01当前IP地址 2.1、提取磁盘和配置文件2.2.1、查看虚拟机test01当前状态2.2.2、…