勒索软件分析_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.mzph.cn/pingmian/15792.shtml

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

相关文章

记录一次cas单点登录的集成

主要思路:浏览器访问CAS服务器登录,拿到凭证给后端,后端用此凭证到CAS服务器验证登录并拿到用户信息,之后基于该凭证维持用户的登录状态。 主要流程: 1.浏览器访问后端需认证登录地址(不带ticket&#xf…

详细分析Element中的Drawer(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本用法2.2 不同方向2.3 自定义大小2.4 嵌入表单2.5 嵌套抽屉 3. 实战4. Element Plus(Drawer) 前言 对于该组件针对Vue2比较多,而Element Plus中的Drawer针对Vue3比较多 此处的Demo主要偏向Vue2 后续的El…

探索 Mistral 新发布的具有原生函数调用功能的 7B 模型【附notebook文件】

引言 Mistral 发布了新版的 7B 模型,这次更新引入了原生函数调用功能。对于开发者和 AI 爱好者来说,这一更新极具吸引力,因为它增强了模型的功能和实用性。在这篇博客中,我们将深入探讨这些新功能,展示如何使用该模型…

小程序-修改用户头像

1、调用拍照 / 选择图片 // 修改头像 const onAvatarChange () > { // 调用拍照 / 选择图片 uni.chooseMedia({ // 文件个数 count: 1, // 文件类型 mediaType: [image], success: (res) > { console.log(res) // 本地临时文件路径 (本地路径) const { tempFilePath } …

wordpress主题模板兔Modown 9.1开心版附送erphpdown v17.1插件

Modown 9.1开心版是一款模板兔开发的wordpress主题可,持续更新多年,优秀的资源下载类主题该模板基于Erphpdown,可以销售软件、视频教程、文章等等,通过主题和插件结合可以实现付费下载、付费阅读等功能,配合模板兔的一…

Spring Bean的生命之舞:反射机制下的华丽转身

1. 引言 在Spring框架中,Bean的生命周期是一段复杂而精彩的旅程,其中反射机制扮演着举足轻重的角色。它不仅是Spring框架实现IoC(控制反转)和AOP(面向切面编程)等核心功能的基础,也是Bean实例化…

数组-下一个排列

一、题目描述 二、解题思路 1.反向遍历当前排列,比如 排列A[a,b,c,d,e,f...] ,当遍历到e时,说明以 a,b,c,d,e为前缀的排列中不存在A排列的下一个排列。 2.把e(位置设为idx)和后面的元素作比较: 2.1 如果有…

在控制台看到 Docker 容器内部的输出

要在控制台看到 Docker 容器内部的输出,你可以使用以下几种方法: 使用 docker logs 命令: 这可以查看容器的标准输出和标准错误日志。 docker logs -f [CONTAINER ID]例如,对于你的容器,可以运行: docker l…

【数据结构(邓俊辉)学习笔记】二叉树02——遍历

文章目录 0.概述1. 先序遍历1.1 递归版1.1.1 实现1.1.2 时间复杂度1.1.3 问题 1.2 迭代版11.3 迭代版21.3.1 思路1.3.2 实现1.3.3 实例 2. 中序遍历2.1 递归形式2.2 迭代形式2.2.1 观察2.2.2 思路(抽象总结)2.2.3 构思 实现2.2.4 分摊分析 3. 后序遍历3…

网络原理 一

一、协议 网络通信中,协议是非常重要的概念. 协议进行了分层,此处就是按照这几层顺序来介绍每一层中的核心协议. 应用层,就对应着应用程序,是程序员打交道最多的一层,调用系统提供的 网络api 写出的代码都是基于应用层的. 应用层这里当然也有很多现成的协议,但更多的还是,程…

JVM(三)

在上一篇中,介绍了JVM组件中的类加载器,以及相关的双亲委派机制。这一篇主要介绍运行时的数据区域 JVM架构图: JDK1.8后的内存结构: (图片来源:https://github.com/Seazean/JavaNote) 而在运行时数据区域中&#…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…

SwiftUI中List的样式及使用详解(添加、移动、删除、自定义滑动)

SwiftUI中的List可是个好东西&#xff0c;它用于显示可滚动列表的视图容器&#xff0c;类似于UITableView。在List中可以显示静态或动态的数据&#xff0c;并支持垂直滚动。List是一个数据驱动的视图&#xff0c;当数据发生变化时&#xff0c;列表会自动更新。 针对List&#x…

树莓派4B 有电但无法启动

试过多个SD卡&#xff0c;反复烧系统镜像都无法启动。接HDMI显示器没有信号输出&#xff0c;上电后PWR红灯长亮&#xff0c;ACT绿灯闪一下就不亮了&#xff0c;GPIO几个电源脚有电&#xff0c;芯片会发热&#xff0c;测量多个TP点电压好像都正常。 ……

华为造车布局全曝光,对标奔驰、迈巴赫等

文 | Auto芯球 作者 | 雷慢 这一刻&#xff0c;我承认我格局小了&#xff0c; 就在刚刚&#xff0c;余承东曝光了华为智选车的布局计划&#xff0c; 华为问界、智界、享界等&#xff0c;将全面对标奔驰、迈巴赫、劳斯莱斯等车系&#xff0c; 这布局&#xff0c;确实是世界…

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

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

Trino On K8S(Dockerfile)[建议]

文章目录 Trino On K8S&#xff08;Dockerfile&#xff09;[建议]前期准备基础镜像下载java构建 Dockerfile编写 bootstrap.sh 脚本构建镜像 部署 Trino下载 Helm 源修改配置启动 增加 Hive Catalog挂载 core-site.xml hdfs-site.xml 配置修改 coordinator/worker configmap修改…

Python开发Android手机APP

Kivy是一个开源的Python库&#xff0c;用于快速开发跨平台的触摸应用程序。它特别适合创建具有图形用户界面&#xff08;GUI&#xff09;的应用&#xff0c;尤其是那些需要在多种操作系统&#xff08;如Windows、macOS、Linux、Android和iOS&#xff09;上运行的多点触控应用。…

【yolov10】使用自己的数据集训练目标检测模型

【yolov10】使用自己的数据集训练目标检测模型 一、anaconda安装二、环境配置三、数据集制作1、labelimg的安装2、使用labelimg 四、正片1、下载yolov10源码2、数据集目录3、训练4、推理 一、anaconda安装 直接参考前一篇博客&#xff1a; https://blog.csdn.net/m0_71523511/…

42、Flink 关于窗口状态大小的考量

关于状态大小的考量 窗口可以被定义在很长的时间段上&#xff08;比如几天、几周或几个月&#xff09;并且积累下很大的状态&#xff0c;当估算窗口计算的储存需求时&#xff0c;注意如下&#xff1a; Flink 会为一个元素在它所属的每一个窗口中都创建一个副本。 因此&#x…