盡管安全行業的大多數人都知道加密是什么,但很多人對如何在惡意軟件中使用它們缺乏基本的了解 – 特別是勒索軟件。 因此,我們認為在加密機制介紹性入門以及如何將其用于惡意目的是有益的。
首先,我們將介紹什么是加密技術,然后,講解勒索軟件加密文件時所用的主要方法。
什么是加密?簡單來說,加密就是對信息進行編碼處理,使得只有授權方才可以訪問明文信息,而未授權方則無法訪問這些信息。從計算的角度來看,加密就是將數據從可讀形式(明文)轉換為編碼形式(密文)的過程,以達到只有有權訪問解密密鑰的一方才能對密文進行正確解碼的目的。過去很長時間以來,軍隊一直都在使用加密技術作為通信保密的手段,時至今日,該技術已廣泛用于保護數據的傳輸和存儲,以及身份的證明和驗證等領域。
不幸的是,加密也被用于惡意目的,例如勒索軟件就屬于這種情況。
分析加密算法
如果惡意軟件分析人員想要有效評估惡意加密,他需要觀察創建或接收加密數據的計算機上的加密。 如果您有權訪問在執行加密階段之前運行的任何進程,則通常會有足夠的數據能夠解密或僅查看本機解密的數據。
要想在無需破解加密的情況下恢復文件的話,成為觀察者是唯一的機會。但是,對于勒索軟件攻擊情形來說,成為觀察者通常是不可能的。這是因為,當惡意軟件運行結束并發送加密密鑰后,我們就無法觀察其加密過程了。這時,我們就必須依靠分析代碼,并寄希望于加密系統存在某些弱點了。
那么,成為解密和加密的觀察者究竟意味著什么呢?有人曾問筆者:為什么惡意軟件作者不總是對C2服務器的通信進行加密處理呢?
筆者的回答是,因為惡意軟件是可以公開獲取的,畢竟它可能運行于世界各個角落的受害者系統上。作為逆向工程師,我們能夠訪問二進制文件,并可以在最低、最詳細的級別上考察軟件。而在這個級別上,安全通信毫無意義,因為我們可以在加密前和解密后“窺視”系統。
在客戶端(受害者計算機)上接收到的SSL或https通信將在內存中解密,以便以惡意軟件所打算的方式處理數據。 此時,我們將始終能夠檢查內存并以原始形式提取解密的通信,所以當服務器將加密數據發送到正在分析的惡意軟件時,它確實不會隱藏任何內容。
前面的邏輯同樣適用于勒索軟件和文件加密的情形。如果我們在“窺視”勒索軟件的過程中,它在本地生成了加密密鑰,那么,我們就可以在內存中看到該密鑰,并將其保存下來,之后,就可以用它來解密勒索軟件加密的文件了,當然,這要求我們了解勒索軟件所使用的加密算法。
在勒索軟件運行和加密文件的時候,如果用戶轉儲了其內存的話,就有機會成為觀察者并恢復文件。不幸的是,事情并不總是如我們所愿,因為受害者的第一本能并不是在創建內存轉儲的同時繼續允許進程運行。但作為一個理論示例來說,至少在技術上是行得通的。
勒索軟件使用的算法
多年來,我們遇到了很多用來保存受害者檔案人質的算法。 其中最常見的涉及使用標準,公開和經過驗證的算法進行非對稱加密。 但偶爾我們會看到自定義加密(可能會更弱),或者甚至是簡單的混淆方法來保存文件作為人質。
多年前,當筆者剛開始接觸勒索惡意軟件時,它們通常會使用其他方法“綁架”受害者計算機來從事勒索,而不是加密驅動器上的所有文件。現在,他們的勒索手段已經變得五花八門,從文件隱藏、自定義加密算法到主引導記錄(MBR)重寫,真可謂應有盡有。
文件混淆
在文件混淆的情況下,勒索軟件只會移動或隱藏目標文件 – 文件及其認為受害者會關心的任何其他文件 – 并要求贖金來恢復文件。 在這種情況下,恢復是微不足道的。 您可以簡單地反轉正在執行隱藏的代碼,并能夠撤消所執行的操作。
下面給出一個示例:彈出窗口聲稱硬盤驅動器已損壞,并要求受害者回電咨詢,這時他們就要求支付“支持”費用以恢復文件。在某些惡意軟件中,會顯示一個彈出窗口(如下所示),并將所有文檔和桌面文件簡單地移到一個隱蔽位置的新文件夾中。要想解決這個問題,可以查看代碼,就能找出哪些文件被移動到了哪個位置。
自定義加密算法
在處理自定義密碼時,通常會通過以標準方式修改文件的算法傳遞文件。 一個簡單的例子就是文件中的每個字節被一個常量或循環字節組異或。 在這些情況下,您幾乎可以將算法本身視為關鍵。 如果您可以反轉該算法,則可以確定它是如何修改或加密文件的。 然后,簡單地顛倒步驟會給你原來的文件。 相比之下,當面對非對稱加密時,算法本身不會為您提供足夠的解密文件。
MBR重寫
在第三種情況下,MBR將被一個需要密碼或序列號訪問的小程序重寫。 惡意軟件會強制重新啟動計算機,在系統加載Windows之前,它會首先提示用戶如何支付贖金以接收密碼。 在這種情況下,反轉啟動記錄中的串行或密碼驗證算法(實質上是創建一個keygen),將為您提供知道哪些密碼允許訪問的功能。 或者,使用出廠引導記錄重寫硬盤的那部分也會禁用計算機上的鎖定。
除了逆向算法之外,剩下的難點就是需要了解如何重寫MBR,以將原始代碼恢復到驅動器的引導區中。
以下是一個MBR鎖的示例代碼。需要注意的是,它沒有要求輸入任何ID,這意味著鎖定過程無需特定的數據,并且可能需要靜態解鎖代碼。
現在,這三種替代方法并沒有在標準意義上使用加密,但我在這里提到它們是因為它表明自定義的書面封閉源混淆有時可能會被打破。 大多數犯罪分子使用標準化,公開的開放源代碼加密算法來加密文件以進行勒索是因為它們經過了測試并且具有可靠的安全性。 這意味著您可以了解有關加密算法的每一個細節,但這并不重要 – 除了擁有加密密鑰之外,您無法通過任何方法解密加密。
為什么要強調這一點呢?因為有些使用標準算法的開源加密算法,其安全性是建立在加密密鑰之間特定關系之上的。例如,有的算法會導出兩個既相互關聯又相互獨立密鑰。這類算法被稱為非對稱密碼術,它是目前絕大多數勒索軟件作者所采用的加密方法。
非對稱密碼加密
非對稱加密涉及生成兩個完全不同的密鑰; 然而,他們有共同的關系。 一個密鑰(公鑰)用于將數據加密為密文,而其伴侶(私鑰)用于將密文解密為原始明文。 它被稱為不對稱,因為公鑰雖然用于加密,但不能用于解密。 私鑰需要解密。
對基于非對稱密碼算法的加密通信來說,兩個密鑰都是在本地生成的——無論公鑰還是私鑰。公鑰可向所有人公開。如果我們想給Bob發送一則只有他才能閱讀的消息,這時候,可以使用Bob的公鑰來加密消息:因為他的公鑰無法用于解密郵件,所以這樣做是十分安全的。只有借助于相應的私鑰,Bob才能解密該郵件,從而看到原始文本。
下面給出了一些示意圖,可以幫助讀者加深理解。
這與勒索軟件作者用于文件加密的方法相同。 加密過程的基本運行如下:
首先,生成一個隨機數組。在進行第一輪文件加密操作前,將會用到這個字節序列。通常,算法會對公鑰進行一系列的數學運算,實際上就是通過隨機初始化操作,根據初始密鑰來創建子密鑰。然后,用這個子密鑰加密文件數據。在加密過程的第一階段,會生成第二個隨機數組,并將其用作初始化向量(IV)。在接下來的各個階段,都將使用前一階段的輸出作為其新的IV。
最初,算法會使用隨機數作為IV,然后,將生成的密文用于下一輪加密。
密鑰本身的生成也依賴于隨機數生成器。 正如你可以想象的那樣,擁有一個堅實的“盡可能隨機”的發電機是非常重要的。
文件加密算法
現代勒索軟件通常會做以下幾件事情之一:它可以在本地動態生成密鑰,并將它們發送到連接到客戶端ID的C2服務器,或者密鑰由作者生成并預先加載到勒索軟件本身中。
雖然后一種做法要更安全一些,但其缺點是,需要為每個受害者生成一個全新的二進制文件,所以需要大量額外工作;或者可以退一步,在每次攻擊活動中,讓同一版本的惡意軟件使用相同的密鑰。這里需要注意的是,雖然密鑰生成無法被直接觀察到,并且分析人員也無法檢查算法代碼本身的弱點,但不同受害者實際上將具有相同的加密密鑰。因此,如果一個受害者支付贖金并分享密鑰的話,那么受這一版本影響的其他人就都能免費解密自己的文件了。我們稱這種弱點為泄漏密鑰。
如果密鑰是動態生成的,那么就存在使用內存轉儲來恢復文件的可能性(盡管這個可能性很小),以及分析師可以在加密代碼中找到漏洞的可能性(盡管這個可能性也很小)。內存轉儲對于惡意軟件作者來說并沒有太大威脅,如前所述,畢竟清楚應該在何時創建轉儲文件的用戶并不多見。然而,這種本地密鑰生成方法的優點是,惡意軟件是完全動態的,沒有兩個人會共享相同的密鑰。也就是說,上面的兩種方法各有優缺點。
現代勒索軟件作者通常使用這些標準化加密形式之一AES,RSA,Blowfish等試圖在受害者的文件不可恢復的情況下不提供解密密鑰。 筆者“嘗試”的原因是因為很多情況下這些好的算法被濫用(這將允許相同的密鑰被生成兩次)。 另外,密鑰的傳輸和生成可以被攔截。