记一次勒索软件样本分析
person 发表于 广东 历史精选 1168浏览 · 2024-08-26 02:14

前言

记一次勒索软件样本分析。

样本分析

混淆

.NET Reactor打包的,使用.NET Reactor Slayer 解混淆:

运行单一实例

dnSpy打开后,转到入口点分析。该勒索软件第一步先进行互斥锁的创建,名称为当前机器名称。该操作是为了确保计算机中只有一个实例在运行,降低被检测的风险。

flag的是个布尔值,只有在单一实例的情况下,恶意软件才会继续接下来的操作。

勒索信息解密

对Class.string_2下断点,动态调试:

可以看到smethod_15 函数的主要作用是对一个经过处理的字符串进行解码和替换操作 。单步走,可以得到一部分密文,继续单步下去,可以得到解码后的返回值,如下图:

这段文本是典型的勒索软件赎金说明文件的内容,标题 "CRYPTNET RANSOMWARE" 表明了这是一个Cryptnet 勒索软件。

通过搜索可以知道,CryptNet是一种NET勒索软件,它采用数据泄露与文件加密相结合的方式进行双重勒索攻击。从 OALabs 介绍中得知,它具有以下俩个特点:

  • 使用生成的 256 位密钥和 IV,通过 AES CBC 对文件进行加密。
  • 使用硬编码 RSA 密钥对生成的 AES 密钥进行加密,并将其附加到加密文件中。

说明文本中还表明了该勒索攻击的行为和联系信息,要求访问一个.onion网站和提供了一个受害者唯一ID。

对文件进行加密

接着往下 smethod_0

该函数内,首先获取了系统中所有驱动器信息(固定磁盘、移动磁盘、CD-ROM等),对这些驱动器进行遍历。先是获取了pathRoot,该路径一般是C盘路径(系统盘)。

对于非系统盘的文件,CryptNet通过一个Task.Factory.StartNew方法异步启动该加密任务,该任务执行的是 new Action(CS$<>8__locals1.method_0),通过异步任务,多个加密任务可以同时进行。

对于系统盘的文件,CryptNet先定义了一组数组array,如下:

再接着获取了系统盘C盘根目录下的所有子目录,将其放入array2中:

for循环遍历所有子目录项,如果子目录不在array数组里,则通过异步任务的方式启动加密任务。

如此操作是避免将一些系统文件、重要文件加密,以致系统无法正常运行。

一些经过加密的文件如下(随机的文件名后缀):

更改桌面背景

运行到smethod_12

这一步的操作是生成一个图像,并将其设置为系统的桌面背景。

先获取屏幕的分辨率和高度宽度,使用Bitmap生成一个图像。最后将图像保存为jpeg格式再设置成桌面背景。

SystemParametersInfo(20U, 0U, text, 3U) 是调用 Windows API 来更改桌面背景的操作,20U 是 SPI_SETDESKWALLPAPER 的标识符。

停用/删除备份功能

CryptNet先是通过smethod_12函数检查 当前用户是否是管理员用户,如果是的话,返回true,进入if。

smethod_14中,又定义了一组array,里面存储着一些名称,下断点查看返回值:

这些名称指向了一些备份和虚拟化相关的软件服务,例如:

  • **veeam** **VeeamDeploymentSvc**: 与 Veeam 软件相关,Veeam 是一家提供数据备份、恢复和虚拟机管理软件的公司。VeeamDeploymentSvc 是用于部署 Veeam 代理和其他组件的服务。
  • **BackupExecVSSProvider**: Veritas Backup Exec 的 VSS(卷影复制服务)提供程序,用于创建卷影复制(快照),以便进行一致性备份。
  • **vss**: 卷影复制服务 (Volume Shadow Copy Service),Windows 用于创建系统快照,支持备份和还原操作。

由此可知,CryptNet通过停止这些服务,阻止系统执行定期备份或恢复操作。

smethod_11调用了三次smethod_10分别传递三个参数。

smethod_10,尝试启动一个新进程,进程启动时隐藏窗口。执行一个程序,程序名是由smethod_16生成的,Arguments是程序执行的参数。

如上图,第一次执行的命令是

cmd.exe "/C vssadmin delete shadows /all /quiet & wmic shadowcopy delete"

该命令用于删除 Windows 系统中的所有卷影复制。

下面俩个参数:

cmd.exe "bcdedit /set {default} bootstatuspolicy ignoreallfailures & bcdedit /set {default} recoveryenabled no"
cmd.exe "wbadmin delete catalog -quiet"

前者用于禁用系统功能,使系统在出现问题时无法进入恢复模式;后者用于删除备份目录。

禁用正常服务

Main的最后一个函数 smethod_13

定义了一个array。包含了各种名称。

在foreach循环中,使用Process.GetProcessesByName查找具有给定名称的所有进程,并尝试使用process.CloseMainWindows关闭它们。

整体流程

CryptNet通过NET Reactor保护器混淆降低被检测的风险,该勒索软件启动首先创建单一实例,解密勒索信息说明;对文件的不同盘进行不同的加密,确保勒索的同时不损坏系统的正常运行;更改桌面背景为勒索信息;它检查当前用户是否为管理员,是的话就禁用备份功能,删除备份文件,最后将一些正常服务应用程序的进程杀掉。

加密手法

前文提到CryptNet的俩个特点:

  • 使用生成的 256 位密钥和 IV,通过 AES CBC 对文件进行加密。
  • 使用硬编码 RSA 密钥对生成的 AES 密钥进行加密,并将其附加到加密文件中。

硬编码的RSA密钥

<RSAKeyValue><Modulus>8TO8tQQRyFqQ0VShtSpLkDqtDVsrxS8SfdOsqRAj8mWF7sVoGzyZMcv501DF6iZUdKYsFDlaSMnuckG9+MJmD2ldZwU/0H6Xztkta1BkJWSO2qHg2JAGDp9ZsFGP1wDR9oRb1w7wtBe7Db3wf7q848+qKPWiTP/2R/jlR4evW73M65Jdo9uOzQnbmvw+blsloXeszuYlW2nCcwQ7WarzAK29UmM9ZHS0/lqzU0KHNU+DvyfGwmMJgtb2HN6GFGXq9Z0n3dNBCQVzdUl2G/7fLAMoFbJeExn5USZdFHr2ygheTilo/shmfq7tcPCZM8C4zqBtb0Nbct0f/M48+H920Q==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

string_3 是文件名后缀,只有特定的文件后缀才会被加密。

.myd .ndf .qry .sdb .sdf .tmd .tgz .lzo .txt .jar .dat .contact .settings .doc .docx .xls .xlsx .ppt .pptx .odt .jpg .mka .mhtml .oqy .png .csv .py .sql .indd .cs .mp3 .mp4 .dwg .zip .rar .mov .rtf .bmp .mkv .avi .apk .lnk .dib .dic .dif .mdb .php .asp .aspx .html .htm .xml .psd .pdf .xla .cub .dae .divx .iso .7zip .pdb .ico .pas .db .wmv .swf .cer .bak .backup .accdb .bay .p7c .exif .vss .raw .m4a .wma .ace .arj .bz2 .cab .gzip .lzh .tar .jpeg .xz .mpeg .torrent .mpg .core .flv .sie .sum .ibank .wallet .css .js .rb .crt .xlsm .xlsb .7z .cpp .java .jpe .ini .blob .wps .docm .wav .3gp .gif .log .gz .config .vb .m1v .sln .pst .obj .xlam .djvu .inc .cvs .dbf .tbi .wpd .dot .dotx .webm .m4v .amv .m4p .svg .ods .bk .vdi .vmdk .onepkg .accde .jsp .json .xltx .vsdx .uxdc .udl .3ds .3fr .3g2 .accda .accdc .accdw .adp .ai .ai3 .ai4 .ai5 .ai6 .ai7 .ai8 .arw .ascx .asm .asmx .avs .bin .cfm .dbx .dcm .dcr .pict .rgbe .dwt .f4v .exr .kwm .max .mda .mde .mdf .mdw .mht .mpv .msg .myi .nef .odc .geo .swift .odm .odp .oft .orf .pfx .p12 .pl .pls .safe .tab .vbs .xlk .xlm .xlt .xltm .svgz .slk .tar.gz .dmg .ps .psb .tif .rss .key .vob .epsp .dc3 .iff .opt .onetoc2 .nrw .pptm .potx .potm .pot .xlw .xps .xsd .xsf .xsl .kmz .accdr .stm .accdt .ppam .pps .ppsm .1cd .p7b .wdb .sqlite .sqlite3 .db-shm .db-wal .dacpac .zipx .lzma .z .tar.xz .pam .r3d .ova .1c .dt .c .vmx .xhtml .ckp .db3 .dbc .dbs .dbt .dbv .frm .mwb .mrg .txz .mrg .vbox .wmf .wim .xtp2 .xsn .xslt

主要加密操作

  • 通过Directory.GetFiles获得指定目录下的所有文件。
  • 遍历文件,通过Path.GetFileName获得文件名,然后同string_3比对,判断是否加密该文件。
  • 修改文件属性,若文件是只读的, 通过 fileInfo.Attributes = FileAttributes.Normal 移除只读属性 。
  • 根据文件大小决定加密方式:

  • 小于 524288L 字节的文件调用 Class0.smethod_6 进行加密。

  • 大于 524288L 字节的文件调用 Class0.smethod_4 进行分段加密。

接着获取当前目录下的子文件,递归调用smethod_1加密文件。

smethod_6

  1. File.ReadAllBytes读取所有字节存放到 array 里。
  2. text 和 text2 是随机化的加密密钥和初始向量iv。
  3. 使用 fileStream.SetLength(0L) 清空文件内容。
  4. 使用 AesCryptoServiceProvider 创建 AES 加密对象 ,模式为CBC。
  5. 将加密后的文件内容写入原文件,末尾附上标识符。

smethod_4

当文件大于 524288L 字节时,CryptNet会采用分组加密的方式。通过 fileStream.Position = (long)int_1; 设置文件指针位置,从 int_1 开始读取 int_0 字节的数据,然后对这些数据进行加密 (Class0.smethod_5)。

之后将加密后的数据写回到原来的位置 (fileStream.Position = (long)int_1;)。 依次进行,最终加密整个文件。

样本IOC

Hash Value
MD5 733a808bc1be9d56026fd39b6e587ce4
SHA1 323c2d8db7a1104a6631f420b3dfa98f693058a0
SHA256 2e37320ed43e99835caa1b851e963ebbf153f16cbe395f259bd2200d14c7b775

ANY.RUN沙箱链接:https://app.any.run/tasks/95d0f6d2-f8c1-4cff-ab4c-e804df757dc1/

后记

分析的时候要小心(虚拟环境and打好快照),能力有限不清楚删除卷影服务/禁用备份功能具体实现是怎么样的,在实际动态调试后,我尝试恢复快照,虚拟机直接卡死了,重启没反应什么都点不了。不得已重启了下物理机,物理机重启弹了修复界面。重新打开虚拟机也出现了修复磁盘的请求。欸

0 条评论
某人
表情
可输入 255