勒索软件分析_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,这可能有助于避免根据已知的扩展名更改检测到勒索软件。

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

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

相关文章

等保2.0看这一篇就够了

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

2024年云南特岗教师报名流程,超详细,明天就开始报名哦!

2024年云南特岗教师报名流程,超详细,明天就开始报名哦!

Android四大组件 Broadcast广播机制

一 概述 广播 (Broadcast) 机制用于进程或线程间通信,广播分为广播发送和广播接收两个过程,其中广播接收者 BroadcastReceiver 是 Android 四大组件之一。BroadcastReceiver 分为两类: 静态广播接收者:通过 AndroidManifest.xm…

SQL——SELECT相关的题目

目录 197、上升的温度 577、员工奖金 586、订单最多的客户 596、超过5名学生的课 610、判断三角形 620、有趣的电影 181、超过经理收入的员工 1179、重新格式化部门表(行转列) 1280、学生参加各科测试的次数 1068、产品销售分析I 1075、项目员工I …

Docker化Spring Boot3应用:从镜像构建到部署

随着容器化技术的发展,越来越多的应用采用了容器化部署的方式。容器化部署极大地减少了因部署环境不同带来的差异,实现了一次构建、随处运行的效果。此外,容器化还具有版本管理、快速启动、持续集成等优点。今天,我们将介绍如何在…

C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

看这两位东北圣女美吗?如何描写美女的大长腿?

看这两位东北圣女美吗?如何描写美女的大长腿? 最近署名为懂球娘娘的一篇描写东北圣女的文章火了,文中描述了海棠朵朵与辛芷蕾这两位娇媚动人的角色。其美艳动人的形象和魅力四溢的描写让人为之倾倒。 这种通过文字展现人物魅力的能力让人佩服…

【PostgreSQL支持中文的全文检索插件(zhparser)】

PostgreSQL本身是支持全文检索的,提供两个数据类型(tsvector,tsquery),并且通过动态检索自然语言文档的集合,定位到最匹配的查询结果。其内置的默认的分词解析器采用空格进行分词,但是因为中文的词语之间没…

Day06:Flex 布局

目标:熟练使用 Flex 完成结构化布局 一、标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 二、浮动 1、基本使用 作用:让块元素水平排列。 …

Linux——进程信号

目录 一、信号的理解 二、信号的种类 2.1 标准信号 (1-31) 2.2 实时信号 (通常是34及以上) 三、信号的产生 3.1 用户通过终端产生信号 3.1.1 signal 函数 3.1.2 demo 测试 3.1.3 demo 现象 3.2 通过系统函数产生信号 3.2.1 demo 测试 3.3 由软件条件产生信号 3.3.1…

uni-app App端实现文字语音播报(Ba-TTS)

前言 最近在遇到消息提示语音播放出来,查了一圈文档发现并没有自带api 后面想起支付宝收钱播报,不受限与系统环境和版本环境(后面查阅他是音频实现的) 如果是由安卓端需要语音播放功能-直接使用Ba-TTs救急(需要付费2…

MTK下载AP

只升级选Firemare Upgrade ,点下载后,关机下插入USB

CSP俄罗斯方块(简单易懂)

开始将题目理解成了&#xff0c;开始的列应该是从输入图案的最左端开始计算&#xff0c;将前面所有的空列都删掉&#xff0c;代码如下&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e410; const int M 1e510; int a[20][20]; int b[5][5];int…

Java的类和对象

Java的类和对象 前言一、面向过程和面向对象初步认识C语言Java 二、类和类的实例化基本语法示例注意事项 类的实例化 三、类的成员字段/属性/成员变量注意事项默认值规则字段就地初始化 方法static 关键字修饰属性代码内存解析 修饰方法注意事项静态方法和实例无关, 而是和类相…

牛客NC295 连续子链表最大和【simple 动态规划 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/650b68dfa69d492d92645aecd7da9b21 思路 动态规划动态规划算法通过迭代遍历输入数组&#xff0c;维护一个额外的数组 dp 来记录截止到每个位置的最大连续子数组和&#xff0c;并利用一个变量 max_num 实时更新全…

买房送户口!多城加入“抢人大战”

业内人士认为&#xff0c;近期&#xff0c;多地推出的购房落户政策已区别于此前的人才落户政策&#xff0c;更聚焦于住房消费&#xff0c;降低了落户门槛&#xff0c;体现了各地对导入人口的重视&#xff0c;有利于人才流动&#xff0c;推动新型城镇化建设。 千万人口城市“后…

GpuMall智算云:xinntao/Real-ESRGAN/Real-ESRGAN-v0.2.5.0

介绍 Real-ESRGAN旨在开发用于一般图像/视频恢复的实用算法。用纯合成数据训练现实世界盲人超级分辨率。我们将强大的ESRGAN扩展到一个实用的恢复应用程序&#xff08;即Real-ESRGAN&#xff09;&#xff0c;该应用程序使用纯合成数据进行训练。GpuMall智算云 | 省钱、好用、弹…

Qt下使用QImage和OpenCV实现图像的拼接与融合

文章目录 前言一、使用QImage进行水平拼接二、使用OpenCV进行水平拼接三、使用OpenCV进行图像融合四、示例完整代码总结 前言 本文主要讲述了在Qt下使用QImage和OpenCV实现图像的拼接与融合&#xff0c;并结合相应的示例进行讲解&#xff0c;以便大家学习&#xff0c;如有错误…

光速入门python的OpenCV

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python的OpenCV模块的关键知识点 争取用最短的时间入门OpenCV 并且做到笔记功能直接复制使用 OpenCV简介 不浪费时间的介绍: 就是类似于ps操作图片。 至于为什么不直接用ps&#xff0c;因为只有程序能…

JAVA -- > 初识JAVA

初始JAVA 第一个JAVA程序详解 public class Main {public static void main(String[] args) {System.out.println("Hello world");} }1.public class Main: 类型,作为被public修饰的类,必须与文件名一致 2.public static 是JAVA中main函数准写法,记住该格式即可 …