Spartacus勒索軟體:一個充滿教育意義的勒索軟體

Spartacus勒索軟體:一個充滿教育意義的勒索軟體

來自專欄安全客


譯文聲明

本文是翻譯文章,文章原作者,文章來源:blog.malwarebytes.com/

原文地址:blog.malwarebytes.com/t

譯文僅供參考,具體內容表達以及含義原文為準


寫在前面的話

最近我們發現一款名為Spartacus勒索新病毒。軟體主要用C#編寫,可是原始樣本是被混淆的,所以只有我們將其提取到可讀狀態時才可以繼續分析。

可以講Spartacus是一個相對簡單的勒索軟體,它使用了一些類似ShiOne, Blackheart和Satyr的技術和代碼,這我們在過去曾研究過的。然而,這些樣本和參與者之間並沒有確定的關係。我提到它僅僅是為了表明它們有相似的功能。不要多想。

在分析在Satyr和Blackheart的時候,我們發現他倆代碼幾乎完全相同,Spartacus也只是做了一些修改。如果非我要做一個假設的話,我會說他們要麼是出於一人之手,要麼他們使用相同的代碼。但是,現在還沒有證據證明這一點。

一般來說,我們注意到一有NET勒索軟體出現了,它們都差不多是一樣的或者相似的。這僅僅是罪犯創造的一種簡單的贖金形式,因為它不需要花費太多的時間或腦力。

Spartacus沒有什麼特別之處。那麼我們為什麼要寫關於Spartacus的分析,我想最主要原因那應該是可以用來作為分析基本的.NET勒索軟體的基礎知識吧!

本文將詳細了解代碼,並了解如何將混淆的.NET示例轉化為可讀狀態。

Spartacus

在開始之前,我想提一下Spartacus加密方法的一個特點。Spartacus首先生成了一個獨特的密鑰,用於對Rijndael演算法進行加密。(Rijndael演算法是AES的一個版本。)

該密鑰被保存並用於加密每個文件,這意味著兩個相同的文件將具有相同的密碼文本。AES密鑰使用嵌入在文件中的RSA密鑰進行加密。密碼文本被編碼並顯示給用戶在勒索信中。

RSA密鑰被靜態地嵌入到勒索軟體中,這意味著私鑰存在於勒索軟體作者系統的伺服器端。因此,如果所有AES密鑰被泄漏,則可以使用此密鑰解密所有受害者的所有AES密鑰。由於這個勒索軟體並不十分複雜,我們將直接進行深入的技術分析和代碼演練。

拆包

當我們首次打開ILSpy的Spartacus樣品時,我們看到這樣的結果:

這些函數的代碼是不可見的,正如你所看到的,所有的東西都是混淆的。一般在這種情況下,我喜歡使用de4dot工具。它將處理文件並輸出可讀版本。-r標誌是您設置目錄的位置,其中包含混淆的.NET示例。

這給了我們清晰的版本,我們將在接下來的分析中使用它。

分析

讓我們從下面顯示的Main函數開始。

它首先要確保系統上只運行該惡意軟體的一個實例。這是通過CheckRunProgram函數來實現,除此之外,它還創建一個互斥鎖並確保它是唯一的。

檢查完成後,它會在一個線程中執行 smethod_3。在調用smethod_3開始之前,這個類的構造函數會自動調用,並設置所有私有成員(變數),其中包含要搜索和加密的所有特殊文件夾。它還使用KeyGenerator.GetUniqueKey(133)函數生成對受害者來說唯一的AES密鑰。並在勒索軟體中被引用以開始文件夾遍歷。特殊文件夾可以在下面查看

我提到的keygen函數是GetUniqueKey(),本質上,它只是使用RNGCryptoServiceProvider.GetNonZeroBytes API函數創建一系列加密的強隨機數。然後它使用該系列的隨機數作為字符集

array =「abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890」的 索引來構建一個唯一的字元串。這是AES密鑰,它將加密所有運行的文件。

現在該類的構造函數已經啟動了,讓我們來看看被調用的smethod_3 函數。

該功能對在構造函數中生成的特殊文件夾列表進行迭代,並開始使用smethod_6函數對文件夾中的每個文件進行遞歸遍歷加密。這裡要注意的一點是,加密循環不會區分文件類型或特殊文件。也就是說它會加密所有的東西。此外,還可以看到這裡調用了smethod_1函數。但這可能是程序員的一個錯誤,因為它在程序的任何地方都沒有使用。正如我前面提到的,smethod_6函數是執行加密的函數,smethod_5函數是一個遞歸函數,它將深入到任何位置的每個子文件夾中,然後在每個迭代中調用smethod_6來加密該子文件夾中的文件。

正如您所看到的,它會自行調用,以便最終覆蓋每個子文件夾。然後它調用smethod_6來執行加密,循環遍歷該文件夾中的每個文件。

此方法迭代當前文件夾中的所有文件。唯一的判斷是否該文件加密。它只是確保擴展它確保擴展是不是.Spartacus:

if (Path.GetExtension(text) == ".Spartacus")

{

return;

}

如果這個檢查通過,它調用smethod_7對加密的版本執行文件內容重寫。

該函數調用smethod_0,它對原始文件數據進行加密,然後接下來的兩行代碼將加密的數據寫入文件中,並使用.Spartacus擴展名對其進行重命名。提示:每個文件都使用相同的密鑰加密,這個勒索軟體不會將加密的AES密鑰寫入文件中,我們在其他的勒索軟體中看到,它們執行唯一的文件加密。

正如你在這裡看到的,它使用Rijndael方法—使用ECB模式的AES。在構造函數中生成的密鑰是用MD5散列的,而這實際上是用作密鑰本身的密鑰。現在我們已經完成了在主文件系統上進行文件加密的整個過程,通過在父函數smethod_3中調用的所有子函數。現在讓我們回到主函數到下一行,它調用smethod_4():

smethod_4基本上執行與smethod_3中所看到的完全相同的一組遞歸函數調用,但是,它不是循環訪問特殊文件夾,而是遍歷所有連接到系統的邏輯驅動器。因此,所有外部或映射的驅動器也將被加密。

我們現在不需要遍歷所有這些細節,因為我們已經討論了它們的功能,因為它們與前面的函數調用是相同的。我唯一要提到的是smethod_6被調用兩次。這樣做很可能通過在兩個線程上運行來加速加密。

回到main:下一個也是最後一個重要的函數調用是:

Application.Run(new Form1());

這將向用戶顯示贖金記錄並在贖金記錄中顯示加密的AES密鑰。

它首先調用smethod_1()。正如我上面提到的,這只是簡單地使用AES鍵,它是在開始時生成的,並使用硬編碼的公共RSA密鑰對其進行加密。

public static string smethod_1()

{

return Convert.ToBase64String(Class1.smethod_2("<RSAKeyValue><Modulus>xA4fTMirLDPi4rnQUX1GNvHC41PZUR/fDIbHnNBtpY0w2Qc4H2HPaBsKepU33RPXN5EnwGqQ5lhFaNnLGnwYjo7w6OCkU+q0dRev14ndx44k1QACTEz4JmP9VGSia6SwHPbD2TdGJsqSulPkK7YHPGlvLKk4IYF59fUfhSPiWleURYiD50Ll2YxkGxwqEYVSrkrr7DMnNRId502NbxrLWlAVk/XE2KLvi0g9B1q2Uu/PVrUgcxX+4wu9815Ia8dSgYBmftxky427OUoeCC4jFQWjEJlUNE8rvQZO5kllCvPDREvHd42nXIBlULvZ8aiv4b7NabWH1zcd2buYHHyGLQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>", Encoding.UTF8.GetBytes(Class2.smethod_0())));

}

RSA密鑰被硬編碼並嵌入到勒索軟體中,這意味著作者已經預先生成了私鑰。然後迭代所有驅動器並在那裡寫入贖金記錄。最後,它打開了勒索信,顯示了信息和加密的AES密鑰,這將被受害者用於解密。

在完成所有這些之後,它所做的最後一件事就是調用smethod_0,刪除陰影卷以防止用戶用作Windows還原點。

最後

這個勒索軟體是完全離線的因為沒有任何網路通信可以追溯到作者或任何C2伺服器。勒索軟體的作者不知道他感染了誰,直到他們用他們的個人ID給他發電子郵件,這是AES鍵。這也意味著,作者將發送的解密工具很可能嵌入了AES鍵,當然,它將是受害者才有的。這個樣本沒有特別的或創新的,但這並不意味著它不是危險的。它還會在沒有解密的情況下繼續工作。如果你意識到自己正在遭受這種惡意軟體攻擊,唯一可能的辦法就是執行進程內存轉儲,在這種情況下,從內存中提取密鑰的可能性很小。一般來說,在殺死進程之前,儘可能在系統上執行任何惡意軟體的內存轉儲是一個好方法,因為有些密鑰可能會被恢復。

作者:threst

推薦閱讀:

蜜04 勒索病毒啟示錄
破解加密演算法的切入點與分析 讓勒索軟體告彆強制綁定時代!
最近霸屏的勒索病毒,其實已經肆虐十幾年了
關於新勒索病毒Petya你最想知道的5個問題
新型勒索病毒又爆發!通過郵件傳播 贖金0.18比特幣

TAG:勒索病毒 | 信息安全 | 科技 |