https://newera17031.activehosted.com/index.php?action=social&chash=01e9565cecc4e989123f9620c1d09c09.2117&nosocial=1

觀點

WannaCry 勒索軟體分析-加密與解密原理

2017 / 08 / 02
台灣電腦網路危機處理暨協調中心資料提供
WannaCry 勒索軟體分析-加密與解密原理

今年五月全球傳出大量遭 WannaCry 勒索軟體攻擊之災情,經多家資安公司與組織報導指出被勒索之受害者會被要求支付 300 至 600 美金等價之比特幣以解密被其加密之檔案。

WannaCry 最早可追溯至 2016 年 8 月Shadow Broker 駭客集團宣稱成功竊取另一 Equation Group 駭客集團之多項攻擊程式,其中包含數個路由器相關零時差弱點攻擊工具,但多數工具以加密保護,以競標方式出售,得標者可獲得解密金鑰。 今年 4 月Shadow Broker 駭客集團公開其中之多項攻擊程式,其中之一即為 EternalBlue (永恆之藍)。同年 5 月全球傳出大量遭 WannaCry 勒索軟體攻擊災情,而此攻擊即利用 EternalBlue (CVE-2017-0145) 工具攻擊網路芳鄰弱點取得遠端控制權後,進行蠕蟲自動擴散。微軟於今 年 3 月發布 MS17-010 更新,其中包含多項 SMB 網路芳鄰相關漏洞之修補,並於今年 5 月 13 日,罕見的發布已停止支援之 Win XP 作業系統更新,以避免 WannaCry 災情擴大。 本文將針對 WannaCry 之加密與解密原理進行深入的分析。

加密原理
WannaCry 運作過程中運用多把 RSA 與 AES 金鑰,整體運作流程(圖一)。主要負責加密之 DLL 於執行時會先將內嵌於其內之命名為 RSA1 之 RSA公鑰 (Pub1) 載入,此金鑰所對應之私鑰 (Pri1) 為勒索者所掌控,理論上若可取得 Pri1私鑰,所有遭該版本勒索軟體加密之檔案應可解密。此 DLL 動態產生一組每個受害者不同之 RSA 公鑰 (Pub2) 與私鑰 (Pri2),並將 Pub2 保存於 000000000.pky 檔案中,而 Pri2 則以 Pub1 加密後保存於 00000000.eky 檔案中(若可於受害者電腦中找出 Pri2,則可將該電腦之所有被加密檔案復原)。最後,DLL 會對每個受害者檔案動態產生一個 AES 金鑰,並將該檔案以此 AES 金鑰加密後,再以 Pub2 將此 AES 金鑰加密,並刪除原始檔案。 

                      
                                                                 圖一、 檔案加密流程

解密原理
如上所述,理論上解密時若將 00000000.eky 傳送給勒索者,勒索者使用其 Pri1 私鑰將 Pri2 私鑰解出,即可將所有被加密檔案之 AES 金鑰解出,進而還原檔案內容。然而交付贖金後,勒索者是否會提供解密服務,則是無法保證。

另一種解密方式為尋找WannaCry 程式記憶體是否存在大質數,並計算解密金鑰。去年5月一位法國人AdrienGuinet公開其搜尋WannaCry之解密金鑰程式WannaKey [1]。由於WannaCry程式所呼叫之 Windows API 並未於製作完 RSA 金鑰後,將過程中所使用到之兩個大質數於記憶體中清除乾淨,因此只要記憶體未被覆寫、程式沒有被關閉或電腦沒有重啟,就有機會從記憶體中找出這兩個大質數。一旦找出,便可計算出解密金鑰 Pri2,進而解出 AES 金鑰將檔案復原。隔日 Benjamin Delpy 參考 WannaKey 原理,發佈 Wanakiwi [2] 解密程式,並驗證可於 Windows XP (x86)、Windows 7 (x86)、與 Server 2003 環境成功復原檔案。截至目前為止,WannaKey 最新版本為 6 月 3 日所釋出之 2.2 版,並已被驗證可於Windows XP、Windows 7 x86、Windows Vista、Windows Server 2003、與 Windows Server 2008 版本作業系統解密成功。以下將對最早提出解密原理的 WannaKey 程式原始碼進行分析。

WannaKey 首先於檔案00000000.pky中將Pub2讀入。Pub2 內包含一 N 值,為兩個大質數相乘之結果,且此兩質數通常位數接近,因此可由 N 之長度除以二之計算,推估其中一個質數之長度(圖二)。 

                                     
                                         圖二、取出public key中N之值與長度,並推算質數長度

根據該長度,搜尋WannaCry程式記憶體中是否存在質數,若找到質數,則檢查 N 是否可整除此質數,驗證此質數確為 N 之兩質數其中之一。此外,在判斷某數值是否為質數前,可先計算該數值之亂度,若數值不夠亂則判定為不是大質數,如此可提升程式運作效率(圖三)。 

      
         圖三、搜尋WannaCry記憶體中是否存在質數, 並驗證此質數是否為 N 之兩質數其中之一

確認其中一大質數後,即可以 N 除以該質數方式,求出另一大質數。最後,便可利用這兩個大質數計算 private key解密金鑰 d(圖四)。 

                            
                                                     圖四、計算 RSA private key 解密金鑰

此解密方式須滿足多項先決條件:
1. WannaCry 主程式 (非呈現使用者介面之程式) 未被關閉,可於該程式記憶體中找出此二質數,因此若使用者於遭攻擊成功後將電腦關機,則不適用此方式。
2. 儘管 WannaCry 主程式未被關閉,但存放此二質數之記憶體狀態為被釋放回收,因此有可能WannaCry 運作過程中被重新配置而覆蓋。
3.目前此原理僅被驗證可於 Windows XP、Windows 7 x86、Windows Vista、Windows Server 2003、與 Windows Server 2008 版本作業系統有機會解密成功。

此次受害對象皆為未即時更新系統者,因此保持系統更新是降低被攻擊或勒索風險方法之一。

註:
[1] AdrienGuinet, WannaKey - https://github.com/aguinet/wannakey
[2] Benjamin Delpy, Wanakiwi - https://github.com/gentilkiwi/wanakiwi