## 基本資訊
### 樣本介紹
時間:2023 年 3 月
### VirusTotal
原始檔案

* `2b89a710d29598c840696c34d9443d825265e8a03fa55610ff253b450969fb88`
使用 7zip 壓縮過後的結果

* `737f5e1831fad68a72d204eddaa7e2f3d3aa723a263bc4f027389b38e8861be4`
使用 7zip + password 壓縮過後的結果

* `c7fd767a6aeeb95a6ea400094bbf9aecd3d5bd96a69d15295a1bcba1e005d299`
使用 WinRAR 壓縮過後的結果

* `e7b150a9f2d7aef111f1490726eaf4e15507623654fff95e238483a1229a6bfa`
### File Type
PE64 : 可執行檔使用的是 64 位元 PE 格式
會影響到
1.工具使用的對應版本
2.呼叫慣例(calling convention)不同
> x64 下前四個參數放在 RCX, RDX, R8, R9
**MZ Header 驗證**
`4D 5A / MZ` 是所有 PE 檔案的開頭標記,說明這個檔案是 Windows 可以執行的程式,而不是其他格式
**呼叫慣例**
函式呼叫時,呼叫端以及被呼叫端如何在組合語言層面協調使用堆疊(stack)與暫存器(registers)的一套規則
• 參數的傳遞方式(例如放在堆疊還是暫存器)
• 堆疊由誰來清理(caller 或 callee)
• 回傳值如何傳遞(通常在 EAX/RAX)
• 暫存器保存責任(哪些暫存器要由 caller 保護,哪些要由 callee 保護)
### Section

* /4、/19、/31 … 這些並不是標準 section 名稱
* section name 若超過 8 bytes 就以 / 加上數字命名
* 這個數字是 指向檔案中字串表(string table)的偏移值
### Imports
* KERNEL32.DLL
* Windows 核心 API,負責記憶體管理、程序與執行緒控制、輸入輸出作業。
* 幾乎所有 Windows 程式都會依賴它。
* ADVAPI32.dll
* 提供進階的 Windows API,例如登錄檔 (Registry)、服務 (Service)、安全性相關函式。
* msvcrt.dll
* Microsoft Visual C++ Runtime Library,提供 C 標準函式庫 (如 printf, malloc, free)。
* 舊版程式很常依賴它。
* PSAPI.DLL
* Process Status API,用來查詢進程與模組資訊,例如列出當前載入的 DLL。
* RstrtMgr.DLL
* Restart Manager,Windows 用來管理應用程式或系統元件的更新與重啟。
* SHELL32.dll
* 提供 Windows Shell 功能(檔案總管、桌面、開啟檔案對話框、捷徑)。
* USER32.dll
* 負責 Windows GUI 相關的 API,例如視窗建立、訊息處理、鍵盤與滑鼠輸入。
* WS2_32.dll
* Winsock 2,提供網路通訊的 API(TCP/IP, UDP)。
* WSOCK32.dll
* Winsock 1.1 版本,舊程式可能會用到。新版系統多用 WS2_32.dll。
### Characteristics
用來描述此執行檔的屬性
**2 → IMAGE_FILE_EXECUTABLE_IMAGE**
* 表示檔案是可執行檔,不是物件檔或 DLL
**4 → IMAGE_FILE_LINE_NUMS_STRIPPED**
* 移除了行號資訊
* 行號資訊主要用於 除錯 (debugging),記錄程式碼對應的原始碼行數
* 移除後分析人員就無法直接對照程式碼行號 → 增加逆向工程難度,是惡意程式常見的手法
**20 → IMAGE_FILE_LARGE_ADDRESS_AWARE**
* 應用程式能處理超過 2 GB 的虛擬位址
* 對於 64-bit 可執行檔很常見
#### 正常檔案
一般正常的可執行檔案是22
* 2 = 檔案可執行
* 20 = 可使用 > 2GB 位址空間
而這個檔案多了4 無行號資訊(編譯器去掉)
#### 什麼是行號資訊?
編譯器通常會將原始程式碼中的每一行與生成的可執行機器碼建立對應關係,可以用來除錯與堆疊追蹤
#### 移除後果
1.檔案變小
2.難以除錯
### Entropy
* 範圍:0 ~ 8
* 表示資料的隨機性(隨機越高,愈難被壓縮或破解)
* 常見判斷基準
* 3 ~ 6 → 正常程式碼或一般資料段落(.text, .data, .rdata 等)
* 大於 7 → 高度隨機,常見於 加殼 / 壓縮 / 加密 區段
* 小於 1 → 幾乎全是空白或填充(padding)
.text 段熵值 6.69,接近 7,這算「偏高」,顯示它可能被壓縮或加密過
**UPX 典型痕跡不見**:UPX 打包後通常會把原有 .text/.data/... 壓縮到 UPX0/UPX1 等自定義區段名,再由 stub 解壓回記憶體;區段名本身就是強烈指標。你的檔案仍是傳統 .text/.data/.rdata/...,不符這個模式。
### 殼
目前從DIE沒有明顯看出來是使用哪一種殼
整體熵值約為 6.41 → 屬於正常範圍
但是其他報告書寫說是用upx這個殼
嘗試用upx解殼說錯誤
如果發現一個 .text 區段特別的大,後面兩個區段特別的小,這也是個加殼的特徵
### Anti-VM
`0F A2` 是 x86 CPU 指令集中的一條機器碼 `CPUID`
**Anti-VM 常見檢查方法**
1. Hypervisor bit
* 呼叫 CPUID 讀 leaf 1 的 ECX[31](Hypervisor bit)
* 讀 CPUID 0x40000000 拿 hypervisor 廠商字串
2. 虛擬化廠商字串
3. 比對虛擬網卡的 MAC 位址前綴
* VMware:`00:05:69`, `00:0C:29`, `00:1C:14`, `00:50:56`
* VirtualBox:`08:00:27`
* Hyper-V:`00:15:5D`
* Parallels:`00:1C:42`
4. 驅動程式/服務/程序
* VMware:`vm3dmp.sys`, `vmhgfs`, `vmtoolsd.exe`
* VirtualBox:`VBoxGuest.sys`, `VBoxSF`, `VBoxService.exe`
* Hyper-V:`vmbus.sys`, `storvsc.sys`, `netvsc.sys`
這個程式只有透過 CPUID 去檢查 CPU 製造商字串(例如 "GenuineIntel" 或 "AuthenticAMD" ) ,因此不算是有偵測Anti-VM
### YARA Rule
YARA 是一個專門用來進行惡意程式辨識的規則語言與工具,全名為「Yet Another Ridiculous Acronym」
YARA rule 就是以這種語言撰寫的規則,用來定義惡意程式的特徵,透過比對檔案內容或記憶體中的數據,來判斷某個檔案是否與已知的惡意軟體家族相符
在windows安裝Yara Rule
```
winget install "VirusTotal YARA"
```
簡易規則檔 `cactus.yar`
```
rule Cactus_Readme_Simple
{
meta:
note = "先確認是否含有 Cactus 贖金檔名"
strings:
$r_ascii = "cAcTuS.readme.txt" ascii nocase
$r_wide = "cAcTuS.readme.txt" wide nocase
condition:
any of them
}
```
執行
```
C:\brian\Tools\yara-master-v4.5.4-win64\yara64.exe -s cactus.yar C:\brian\malware_sample\cactus\aaa.exe
```
## 1.初始化
惡意程式還沒開始真正的加密行為,它需要先做一系列「自我準備」
### 隱藏主控台視窗
* 這支程式原本是 主控台程式,如果直接執行,Windows 會彈出一個黑色的 CMD 視窗。
* 惡意程式不希望使用者或分析者太快發現它在跑,所以一啟動就呼叫 GetConsoleWindow() 取得自己的主控台視窗 Handle,再呼叫 ShowWindow(..., SW_HIDE) 把它關掉。
* 這樣使用者會以為「程式一閃就消失了」,但其實它已經在背景繼續執行。
* 報告也指出這樣做的目的是 規避偵測 (detection evasion)
### Protect Process
##### 說明
在靜態分析過程中,發現程式匯入並使用了 Windows API SetSecurityInfo。
透過交叉參照(xref)追蹤,確認一個名為 protectProcess 的自訂函式曾呼叫該 API。
由於該函式名稱及用途具有高度可疑性,因此進一步展開分析其內部實作。
發現這個惡意程式自己寫的一個內部函式
核心目標是:把目前這個行程(process)的 DACL 改成幾乎誰都不能開啟
> Discretionary Access Control List 任意存取控制清單
(1)
呼叫 `GetCurrentProcess`得到目前執行中程式的 進程 Handle
(2)
準備一塊很小很小的 ACL 緩衝區(8 bytes)
> ACL(Access Control List,存取控制清單)
(3)
InitializeAcl 把那 8 bytes 說明成「一個有效的 ACL」
注意:8 bytes 是「剛好只夠放 ACL 頭」的最小值,放不下任何 ACE。也就是這塊 一定是「空 DACL」
> ACE(Access Control Entry) = ACL 裡的其中一條規則
> DACL(Discretionary ACL) = ACL 的其中一種,專門管「允許/拒絕誰做什麼」
(4) 建立 Everyone 的 SID
準備 AllocateAndInitializeSid 的參數
這樣就拿到 Everyone 的 SID
官方名稱:SECURITY_WORLD_SID_AUTHORITY
數值結構:
Authority = {0,0,0,0,0,1}(十六進位 = 0x000001)
SubAuthorityCount = 1
SubAuthority[0] = 0
轉成字串就是:S-1-1-0
這就是 Everyone 群組的 SID,代表「所有使用者」。
(5) 在 ACL 中新增「拒絕存取」規則
準備 AddAccessDeniedAce 的參數並呼叫
這條 ACE 的意思是:拒絕 Everyone 幾乎所有(AccessMask=0x1FFFFF)對 Process 的權限(例如開啟、讀、寫、終止、建立執行緒等)
但這裡有關鍵陷阱:因為你的 ACL 只有 8 bytes,絕對不夠放任一條 ACE,所以這個呼叫幾乎一定 失敗(回傳 0)
在 ACL 中新增一條 ACE (Access Control Entry) Deny Access to Everyone
(6) 更新進程的安全描述
重點:設定了一個「空 DACL」在 Process 上,效果是「沒有人被允許」。
這比它原本想加一條 Deny ACE 還兇(而且更簡單直接),因為「空 DACL」=所有人都沒有 Allow
## 2.命令列與參數功能
### 核心參數
* -s:(setup) 完成金鑰解密、隱匿、持續化設定
* 自動建立並寫入 C:\ProgramData\ntuser.dat(裡面存有原始 EXE 路徑與參數)
* 不是 Windows 原生的登錄檔配置檔
* 存放原始惡意程式的路徑
* 塞入一些「垃圾資料」用來混淆/躲避分析
* 檔案裡存有一組 AES 金鑰,會被用來解密藏在惡意程式中的 RSA 公鑰
* 隱匿自身
* 將惡意程式自身複製到`C:\ProgramData\{Victim_ID}.exe`,作為開機自動啟動的持久化機制
* 將 ProgramData 設為隱藏屬性
* 持續化
* 建立「Updates Check Task」排程,確保持續執行
* -r:( Read )金鑰傳遞階段
* 會讀取之前由 -s 階段寫入的 ntuser.dat 檔案,取出 AES 金鑰
* 使用後刪除 ntuser.dat
* 然後再呼叫自身程式,並附帶 -i 參數,把 AES 金鑰帶進去
* -i:加密模式(Encryption)
* 利用前面提取的 AES 金鑰,解密內部的 RSA 金鑰
* 建立加密工作緒,開始掃描系統磁碟
* 列舉所有磁碟與檔案,排除特定系統資料夾
* 符合條件的檔案會被加密,副檔名會改為 .cts0 或 .cts1
* 加密時採用 AES256 CBC 模式,每個檔案生成新的隨機 AES Key,再用 RSA Public Key 把這個隨機 AES Key 加密,附在檔案尾端
**AES KEY** :
* 用來解密惡意程式內部被加密過的 RSA 公鑰,幫助程式拿到真正的 RSA 公鑰
**RSA Public Key** :
* 來源:隱藏在惡意程式中,但經過 AES 加密保護,必須先用 AES Key 解出來
* 作用:
* 檔案加密階段,每個檔案都會產生一把新的隨機 AES 檔案金鑰
* 這把「檔案 AES Key」才是真正用來加密檔案內容(AES-256-CBC)
* 為了讓受害者沒辦法自己解開,程式會用 RSA Public Key 把「檔案 AES Key」加密後附加在檔案尾端
* 只有攻擊者手上的 RSA Private Key 才能解開,這就是勒索的核心
### 控制與紀錄相關
* -l:啟用一般日誌,建立 update.log
* -e:額外詳細日誌(extra logging)
* -c:修改加密比例(部分加密 vs 全檔加密,預設 50%)
* -t:設定加密使用的執行緒數量
### 加密範圍限制
* -d:只加密指定資料夾
* -f:只加密單一檔案
### 其他參數
* -kd:刪除 Volume Shadow Copy、關閉特定進程與服務(需要系統管理員權限)
* -q:快速模式,結束特定執行緒
* -qo:Quick Only,快速加密指定檔案(僅少量加密測試)
## 3.建立互斥鎖
mutant_name: `inpf-8493-9fb7-58fbcAcTuS`
**用途**
* 避免重複執行 → 惡意程式或正常程式都可能用它來檢查自己是否已經有另一個實例在跑
* 跨程序同步 → 多個進程共用同一個鎖,避免同時修改某個資源
* 避免資源同時存取 → 確保同一時間只有一個執行緒能使用共享資源(例如檔案、記憶體區塊、網路 socket)
## 4.持久化機制

補充:
若透過 API 的方式來呼叫比較不容易被偵測到
## 5.檔案與系統偵察
### 檢查磁碟類型並過濾

* 主要透過這兩個 API ( GetLogicalDriveStringsW 和 GetDriveTypeW )
* **GetDriveTypeW 取得磁碟類型**
* 2 = 可移除 (USB)
* 3 = 固定硬碟
* 4 = 網路磁碟
* 5 = 光碟機
* **過濾條件**
* 排除光碟機 (5)
* 如果只要網路磁碟,就只保留網路磁碟
* 如果沒有網路磁碟,那所有非光碟的磁碟都會被列入
### 檔案與目錄偵察

1. 檢查資料夾名稱,看是否符合 checkFolderExt 的規則,例如要排除 Windows 系統資料夾,避免導致電腦立刻當機
1. 確認資料夾是否可寫入。如果能寫入,它會在資料夾裡建立一個 README 檔案
1. 遞迴進入該資料夾,繼續搜尋檔案與子目錄,準備加密更多檔案
## 6.刪除 shadow Copy 與關閉系統復原
目的 : 阻止受害者利用系統還原點或復原模式來搶救資料
解釋 :
陰影複製(Shadow Copy),正式名稱為「磁碟區陰影複製服務」(Volume Shadow Copy Service,VSS),是微軟Windows的一項核心技術,能夠在檔案系統上創建某個時間點的唯讀快照,用以備份或還原檔案
刪除還原點
```
vssadmin delete shadows /all /quiet
WMIC shadowcopy delete
```
關閉系統復原
```
bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {default} recoveryenabled no
```
* 修改了開機設定,讓系統即使發生錯誤也不會啟動修復模式
* 直接關閉 Windows 系統的 自動修復功能
## 7.處理黑白名單
### BlackProcessesList
如果偵測到以下任何進程,則立即終止相關進程
**流程**
1.利用 CreateToolhelp32Snapshot 建立系統 process 快照
2.使用 Process32FirstW / Process32NextW 依序枚舉每個行程
3.將可執行檔名 (pe.szExeFile) 與黑名單陣列 (blackProcessList) 逐一比對
4.若比對成功即呼叫 closeProcess() 以終止該行程
<details>
<summary>資料庫相關</summary>
`sqlservr.exe`, `sqlagent.exe`, `sqlbrowser.exe`, `sqlwriter.exe`,
`sql.exe`, `mysqld.exe`, `mysqld-nt.exe`, `mysqld-opt.exe`,
`dbeng5o.exe`, `dbeng50.exe`, `sqbcoreservice.exe`,
`isqlplussvc.exe`, `oracle.exe`, `ocssd.exe`, `dbsnmp.exe`, `agntsvc.exe`
</details>
<details>
<summary>Office 應用</summary>
`excel.exe`, `wordpad.exe`, `winword.exe`, `powerpnt.exe`, `onenote.exe`, `outlook.exe`,
`mspub.exe`, `visio.exe`, `msaccess.exe`, `infopath.exe`
</details>
<details>
<summary>瀏覽器/郵件</summary>
`firefox.exe`, `firefoxconfig.exe`, `thunderbird.exe`, `tbirdconfig.exe`
</details>
<details>
<summary>其他程式</summary>
`steam.exe`, `synctime.exe`, `notepad.exe`, `encsvc.exe`, `thebat.exe`, `msftesql.exe`,
`xfssvccon.exe`, `mydesktopservice.exe`,`mydesktopqos.exe`, `ocautoupds.exe`, `ocomm.exe`
</details>
### WhiteProcessList
<details>
<summary>白名單</summary>
`spoolsv.exe`, `explorer.exe`, `sihost.exe`, `fontdrvhost.exe`, `cmd.exe`, `dwm.exe`,
`logonui.exe`, `serachui.exe`, `lsass.exe`, `csrss.exe`, `smss.exe`
`winlogon.exe`, `services.exe`, `conhost.exe`
</details>
### BlackServiceList
針對黑名單中的 16 個服務逐一停止運作
**流程**
1.開啟服務控制管理員
2.嘗試開啟黑名單內的某個服務
3.發送「停止服務」的控制碼
4.關閉服務與 SCM 的 Handle
5.重複直到所有黑名單服務都被處理完
<details>
<summary>清單</summary>
`Phonesvc`, `Veeam`, `Memtas`, `Sql`, `Backup`, `Vss`,
`Sophos`, `Svc`, `Gxvss`, `Gxblr`, `Gxfwd`, `Gxcvd`, `Gxcimgr`
</details>
### ExtensionsBlackList
決定某檔案是否允許被加密,避免破壞系統關鍵程式或加密自身的勒索信
<details>
<summary>清單</summary>
`exe`, `dll`, `lnk`, `sys`, `msi`, `bat`,
`cts0-7`, `cAcTuS.readme.txt`, `desktop.ini`, `update.log`
</details>
### FolderBlackList
判斷一個資料夾名稱是否在勒索軟體的資料夾黑名單中
<details>
<summary>清單</summary>
`Tmp`, `Temp`, `Recycle.bin`, `perflog`, `perflogs`, `programdata`,
`systemvolume information`, `windows`, `thumb`, `winnt`, `windows bt`,
`windowsold`, `packages`, `Boot`, `Efi`, `Windowsapps`, `Microsoft`,
`WindowsDefender`, `MicrosoftShared`, `InternetExplorer`, `Tor Browser`,
`cAcTuS.readme.txt`, `Ctslck`, `desktop.ini`, `update.log`, `ntuser.dat`
</details>
## 8.加密階段
三者皆使用 OpenSSL 的 EVP_SealInit 與類似的加密API,且皆使用 EVP_aes_256_cbc() 做為加密演算法,表示加密機制相同,差別在檔案處理的切分策略
被 AES 加密過的 RSA 公鑰
```
9e7384c24653512f109071baa8468357552bb524328b1c8bb4c5152af58c51c5f8e1f18c97371b1faa0616d4642e4a556c5af7ae428bd7f8e9cee7917f35935379209608a5a79c98562b8ea50ef9d4724fe083e6f6cbb08453be30c849d6f0a6db5085169d28d8e26ea4db3db82773611da258c70a73ae6153bfd15108337c7f1dc453c70dac8c5b72e733ae427d091724386716cfac905ea1f7fc4d919d437eaf57c05280a29c1bc99df90eda4d9e59ba1f3bc65f784b953d7526a374ce71e8ddddfaf4e44399cef2ba99c289b0147977ab8d4bf494c28278deab82db24c57c7878fe5e9024eb917ffd6580f55f44f814bd195b804d892546648cac231dbc511a6b587c64f3f2ca5745cfb3ad75dc4c5ef83fc22918364213cd693a0ea992854639f2d41c16540dbc467edcd05848fd351d5dabf88333fb7c2bc93444497b0639e1429edcd5f45f163ccf518b8ea070a2a66cf87f5f79659fbf74b97e2606aa0a28ec691ba27c8cd8ad50ea082ac2acf4d5a5975692395312b6f717cc74db78b320b6c08c5eada461c197b324193b2086cb57f74ec953189eae4c63eea4c07fd8b97d64419343927bc9f0bdfae9d7a61b8206caabaee257381ccdd894a4898dd313e2693c011eb87487b957f1e2b748a62396b2d176e43d16ddcb7ea93d1fbe8a564ff88db1644282579658576f4e36a6a2dab853868a72b693378f1468838193a97b34bdf23c828d882ea3bc639293d2869c476246893ea0730e26b1f19fe2673d4a138202ee2d60be414420de59ba37f1df633969c0b1db805b94220bc2971bc044fca6dbc5579a53b9ff42be4f119f68c7a9d65997840b96021d1fe34d78f9757b142fb316e0b3d6dd2cc85b1a2a7ed834df08a61a9eef3901980e4d7f82d9dbdfbd3294b3a257f9023
```
SALT
```
LMLhRqYNdiaSac02
```
### 三種不同加密方式

* 小檔案 : 整個檔案加密 cryptFullFile
* 中檔案 : 用快速加密法 cryptQuickFile
* 大檔案 : 只加密部分內容 cryptPartFile
### 加密流程

## 9.資料外傳
透過 Rclone 來實現
## 10.生成勒索信
### 勒索文件
利用字串搜尋 `contact` 找到疑似勒索文件內容
透過 offset 進一步查看更多內容
紀錄該段落文字開始於 `4077F8` 結束於 `409078`
輸出文件內容
```
Your corporate network was compromised and encrypted by Cactus.
Do not interrupt the encryption process, don't stop or reboot your machines until the encryption is complete.
Otherwise the data may be corrupted.
In addition to the encrypted infrastructure, we have downloaded a lot of confidential information from your systems.
The publication of these documents may cause the termination of your commercial activities, contracts with your clients and partners, and multiple lawsuits.
If you ignore this warning and do not contact us, your sensitive data will be posted on our blog:
https://cactusbloguuodvqjm...onion/
In your best interest is to avoid contacting law enforcement and data recovery companies.
They can't help you with the recovery, will cause more problems and expenses, and delay the return to normal work significantly.
Besides, if you contact the police we will immediately publish your data.
We offer the best solution to the problem.
To receive our decryption software and prevent disclosure of your sensitive information contact us directly.
A quick recovery is very important to keep your business running at full capacity and minimize losses.
This is why you need to begin negotiations as soon as possible.
By the way, if you don't contact us within 5 days, we will start publishing your data.
Download TOR Browser (https://www.torproject.org/download) and follow the link:
Your username:
Your password:
Reply to the welcome email and we will get your message.
Backup contact is TOX (https://tox.chat)
```
## 11.防範措施
* 修補程式管理: CACTUS 勒索軟體主要透過利用未打補丁的VPN系統中已知的脆弱性來感染系統。 當更新和修補程式可用時立即應用可以防止惡意軟體使用此存取向量。
* 強式驗證:此勒索軟體經常嘗試從瀏覽器和 LSASS 竊取憑證,以獲得實現其目標所需的存取權限和特權。 對使用者帳戶實施多重身份驗證 (MFA)可以防止 CACTUS 使用從受感染電腦竊取的密碼。
* 網路分段: CACTUS 嘗試使用它所建立的帳戶或從受感染的電腦盜取的帳戶在網路中橫向移動。 網路分段將高價值系統與網路的其餘部分隔離開來,使攻擊者更難以訪問它們。
* 網路安全:此勒索軟體使用網路掃描和遠端存取工具透過網路運作。 網路監控和安全解決方案可以識別並阻止這些橫向移動的嘗試。
* 反勒索軟體解決方案: CACTUS 嘗試加密敏感檔案並透過雲端儲存洩露它們。 反勒索軟體解決方案可以識別這種惡意行為並消除惡意軟體感染。
## 12.Ioc
## 13.其他問題/紀錄
檔案用 pestudio 打開會崩潰
整體檔案為加殼,但是.text 跟 覆蓋 部分有超過entropy標準值
動態分析加入參數觀察(至少檔案要加密)
把驗證AES地方刪除可以成功執行 patch
為何要建立D:\\programdata
即使在虛擬機執行惡意程式也不要開網路
用gidra
如果惡意程式需要連網路才可以執行,可以把它patch掉
在 IDA 如果執行程式入口第一個byte 是 push ad 這個指令就代表是加殼