Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86375874

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

Ransomware-r3d1.png

Vice Society 是一種勒索軟件,採用強大的加密算法來鎖定存儲在受感染系統上的數據Vice Society 是一個相對較新的惡意軟件,於2021 年年中首次出現。

在最近一次事件響應(IR)活動中,unit42團隊發現,Vice Society勒索軟件組織使用自定義的Microsoft PowerShell(PS)腳本從受害者網絡中竊取數據。我們將對所使用的腳本進行分解,解釋每個函數是如何工作的,以便了解這種數據竊取方法。

該組織使用多種方法從受害者的網絡中竊取數據。一些使用者會使用外部工具,包括FileZilla、WinSCP和rclone等工具。還有使用者使用LOLBAS(Living off the Land Binaries And Scripts)技術,如PS腳本,通過遠程桌面協議(RDP)複製/粘貼和微軟的Win32 API(例如Wininet.dll調用)。讓我們來看看當使用PS腳本自動執行勒索軟件攻擊的數據洩露階段時會發生什麼。

使用LOLBAS等內置數據洩露方法的攻擊者不需要引入可能被安全軟件或基於人工的安全檢測機制標記的外部工具。這些方法還可以隱藏在一般操作環境中,很容易躲過安全檢測。

例如,PS腳本經常在典型的Windows環境中使用。當攻擊者想要悄無聲息地發起攻擊時,PS代碼通常是首選。

2023年初,unit42團隊發現Vice Society勒索軟件組織使用了一個名為為w1.ps1的腳本從受害網絡中竊取數據。在本例中,腳本是從Windows事件日誌(WEL)中恢復的。具體而言,該腳本是從Microsoft Windows PowerShell/Operational WEL提供程序中發現的事件ID 4104:腳本塊日誌記錄事件中恢復的。

雖然必須在Windows中啟用腳本塊日誌記錄才能記錄所有腳本塊,但Microsoft默認情況下使用一些未記錄的後端魔法來記錄其認為是惡意的事件。因此,即使在腳本塊日誌記錄尚未完全啟用的環境中,事件ID 4104事件也可能對你的分析有用。

unit42研究人員看到了使用以下PS命令執行的腳本:

1.png

此腳本調用使用統一資源名稱(URN)路徑中的本地域控制器(DC)IP地址(如上面的[redected_IP]所示),指定DC上的s$admin共享。請注意,由於腳本是通過客戶端的DC部署的,因此目標計算機可能是攻擊者尚未獲得直接訪問權限的計算機。因此,網絡中的任何端點都可能成為腳本的目標。為PS可執行文件提供-ExecutionPolicy Bypass參數以繞過任何執行策略限制。

該腳本不需要任何參數,因為從網絡複製哪些文件是腳本本身負責的。是的,你沒有看錯:腳本是自動化的,因此可以選擇應該竊取的數據。

腳本分析腳本首先聲明兩個用於受害者識別的常量$id和$token。在我們識別的腳本中,這些值分別被硬編碼為“TEST”和“TEST_1”:

2.png

從邏輯上講,這些變量可以設置為更具體的值,以識別實際的受害者。我們不確定這是否真的是一個測試階段,或者這些值是否會簡單地保持在這個測試狀態。

接下來,腳本聲明代碼庫中的重要函數。表1提供了腳本函數的概述。這是按照函數被調用的順序列出的,而不是它們被聲明的順序。

3.png

腳本函數概述

下圖概述了函數之間的流程,有助於突出顯示腳本的函數。

4.png

w1.ps1腳本的函數圖

起始進程在調用任何聲明的函數之前,腳本會通過Windows Management Instrumentation(WMI)識別系統上安裝的任何驅動器。通過一些簡單的篩選來獲取wmiobject win32_volume的調用提供了一個名為$drives的數組,該數組將包含安裝在計算機上的驅動器列表。然後將找到的每個驅動器路徑分別傳遞給Work()函數。下圖顯示了相關的代碼片段。

5.png

腳本的前導碼,用於識別並處理每個掛載卷

在前導碼中採取了以下操作:

1.它創建一個名為$drives的數組,並用主機上掛載的捲列表填充該數組。 win32_volume中的DriveType枚舉引用本地磁盤。有關詳細信息,請參閱Microsoft的Win32_Volume Class文檔。

2.它作為$drive遍歷主機上標識的驅動器,將每個標識的驅動器路徑傳遞給Work()函數。

下圖顯示了這段代碼在隻掛載了一個驅動器的普通Windows主機上可能執行的操作示例。

6.png

帶有單個掛載驅動器的主機上的$drives和$drive變量的示例值

對於標識的每個驅動器名稱,前導碼都會調用Work()函數來處理驅動器上的目錄。

Work()函數每次調用Work()時,函數都會作為$disk接收一個驅動器路徑,用於目錄搜索和處理。下圖顯示了Work()函數的開頭。

7.png

Work()函數的開頭

在上述代碼中採取以下操作:

1.它創建$folders和$jobs數組;

2.它創建$store元組,用於存儲上面創建的數組;

3.它聲明了Show()函數。

下圖顯示了Work()函數的其餘代碼,它位於Show()函數下方。

8.png

Work()函數的剩餘部分

在上述代碼中採取了以下操作:

4.它將當前卷字符串傳遞給Get-ChildItem,並篩選出一系列31個潛在的目錄路徑,以避免處理基於系統或應用程序的文件。然後,它將每個根目錄名稱傳遞給Show()函數以進行進一步處理。

有關被忽略的根目錄的列表,請參見附錄。

5.將根目錄文件夾傳遞給Show()函數後,Work()函數遞歸地搜索根目錄中的子目錄。與前面的篩選類似,與排除列表不匹配的子目錄會被發送到Show()函數進行處理。

有關被忽略的根子目錄的列表,請參見附錄。

6.Show()函數創建PowerShell作業以方便竊取數據。該函數一次處理5個目錄組。這部分代碼可以起到保護作用,以確保處理所有剩餘的文件夾分組。

例如,如果總共識別了212個目錄,這段代碼將確保處理最後兩個目錄。

Show() 函數Show()函數的作用是接收要處理的目錄名。 Show()函數的概述如下所示

9.png

Show()函數的概述

在上述代碼中採取了以下操作:

1.該函數收集提供的目錄名,直到它可以創建一個由5個目錄名組成的分組。一旦向函數提供了5個目錄名,它將它們傳遞給CreateJobLocal()函數以創建PowerShell作業,以便從目錄組中導出數據。

2.該腳本實現了速率限制,因為它一次只希望處理5個目錄組的最多10個作業。如果正在運行的作業超過10個,腳本將休眠5秒鐘,並重新檢查正在運行的作業的數量。

注意:這顯示了在整體腳本設計方面的專業編碼水平。腳本的編寫是為了避免主機的資源被淹沒。造成這種情況的確切原因在於開發者,但該方法與一般的編碼最佳實踐相一致。

CreateJobLocal()函數CreateJobLocal()函數為竊取數據設置了一個多處理隊列。下圖顯示了CreateJobLocal()函數的開頭部分。

10.png

CreateJobLocal()函數的概述

在上述代碼中採取了以下操作:

1.它為正在創建的作業創建一個偽隨機名稱。作業名稱將由5個字母字符組成(包括小寫和大寫字符)。

例如,以下是腳本在隨機調試會話中生成的五個作業名稱:iZUIb、dlHxF、VCHYu、FyrCb和GVILA。

2.它設置一個PowerShell作業,該作業具有一個代碼結構,該代碼結構將是腳本中此時創建的腳本塊。

此時,在CreateJobLocal()中聲明了fill()函數。我們將很快回到這個問題。首先,我們將繼續處理CreateJobLocal()函數的剩餘部分。下圖顯示了這段代碼的下一部分。

11.png

屬於CreateJobLocal()函數的附加代碼

下面是上述CreateJobLocal()代碼庫的描述:

3.它為要竊取的文件創建一個$fileList數組,然後循環遍歷當前組中的目錄(如上所述,它通常以五個為一組處理目錄)。

4.它設置名為$include和$ excluded的包含和排除數組。

5.有關這些數組的值列表,請參見附錄。

它循環遍歷給定目錄組中的目錄,並使用正則表達式根據$include數組中硬編碼的值篩選要包含的文件夾。

此時,函數使用excludes來進一步篩選應該被盜取的文件。

12.png

CreateJobLocal()函數的剩餘部分

以下是剩餘CreateJobLocal()代碼庫的描述:

1.如果某個目錄與包含列表匹配,則它會查找該目錄中沒有在排除列表中找到的擴展名、大於10 KB且具有擴展名的所有文件。

注意:測試證實,該腳本會忽略大小小於10 KB的文件和沒有文件擴展名的文件。

2.即使一個目錄沒有通過正則表達式匹配包含列表,也會檢查目錄的文件,以確定是否應將其包含在竊取內容中。

這看起來是文件匹配包含列表的第二次嘗試,因為比較是使用Get-ChildItem cmdlet的-Include參數完成的,而不是在上面第5步中執行正則表達式比較的-Like比較。

它循環遍歷標識為竊取的文件,並調用fill()函數來竊取每個文件。

下圖顯示了在我們的惡意軟件分析虛擬機(VM)中運行時選擇的第一組五個文件夾的腳本。這些值將因運行腳本的計算機而異。我們只是想展示腳本始在測試環境中搜索數據的位置。

13.png

該腳本的示例運行顯示了標識為竊取的前5個目錄

Fill()函數fill()函數執行實際的數據竊取。此函數用於構建將用於竊取文件的URL,並使用System.Net.Webclient對象通過HTTP POST事件使用對象的.UploadFile方法執行實際的竊取。下圖顯示了fill()函數。

14.png

fill()函數的概述

在上述代碼中採取了以下操作:

1.雖然從技術上講不是實際的fill()函數的一部分,但在每個文件上傳URL中都使用了整個腳本前兩行的變量$id和$token。

2.它構建了一個$prefix值,其中包括腳本中兩個最重要的攻擊指標(IoC)。

2.1 IP地址

這是攻擊者的基礎設施/服務器IP地址,文件將被上傳到該IP地址。

2.2網絡端口號

這個端口號可以是80443,也可以是一個自定義端口號,例如通常與臨時端口範圍相關聯的端口號。

3.它實例化一個WebClient對象,該對象將用於執行基於HTTP的數據竊取。

4.它構建了一個$fullPath變量,這是正在上傳文件的完整文件路徑。

注意:這一點很重要,因為這意味著每個HTTPPOST事件都將包括文件的完整路徑。如果你能夠通過此路徑獲得源主機的IP地址,那麼你將能夠在事後構建一個被竊取文件的列表。

5.它通過組合$prefix、$token、$id和$fullPath變量來構建文件上傳的完整URL $uri。

6.它調用WebClient.UploadFile()方法來上傳文件。

注意:這將創建一個HTTP POST事件。

HTTP活動示例為了查看腳本的POST請求在攻擊者的web服務器上是什麼樣子,研究人員在本地虛擬機上設置了一個服務器,引導他們的惡意軟件分析機器使用該虛擬機作為其網關並運行腳本。下面是腳本在測試環境中執行時創建的三個POST請求示例。

15.png

請注意,上面的192.168.42[.]100地址是研究人員使用的測試客戶端虛擬機的IP。在現實場景中,Vice Society的網絡服務器會在這個位置指示受害者的出口IP地址。

基於以上結果,我們可以獲得關於腳本啟動的HTTP活動的一些重要信息:

1.fullpath POST參數不包括發送文件的驅動器號。

2.該腳本沒有向web服務器提供用戶代理字符串。

如果你的環境中運行了網絡安全監控(NSM)或入侵檢測系統(IDS)(如Zeek),或者數據包捕獲系統,那麼就可能能夠看到傳出的POST請求。這些傳出的日誌可能以字節為單位顯示請求的長度(重點關注傳出的字節數與總字節數),這有助於確定哪些版本的文件被竊取掉了。

總結Vice Society的PowerShell數據竊取腳本是一個簡單的數據竊取工具。使用多處理和排隊來確保腳本不會消耗太多系統資源。然而,該腳本將重點放在文件擴展名超過10 KB的文件以及符合其包含列表的目錄中,這意味著該腳本不會竊取不符合此描述的數據。

不幸的是,Windows環境中PS腳本的性質使得我們難以預防這種類型的威脅。不過研究人員在檢測中總結了一些提前發現它們的線索和技巧。