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