破解加密演算法的切入點與分析 讓勒索軟體告彆強制綁定時代!

通過我們以往的文章中可以了解到加密演算法其實是非常強大的,為了破解一個加密演算法,加密演算法本身必須具備一定的設計缺陷。設計加密演算法的人可能會忽略某個因素,而破解加密演算法的難度就在於我們要去識別並分析程序員所使用的加密方法,然後尋找並利用開發人員在實現加密演算法時意外出現的安全漏洞。今天我們將跟大家介紹分享如何去破解一個加密演算法。

定位加密演算法

在你嘗試去尋找加密演算法中的缺陷之前,你首先要知道它使用的是哪種加密演算法。其實非常簡單,在大多數情況下識別加密演算法就跟查找API調用一樣容易。下面給出的是我們之前在分析ShiOne時定位到的加密演算法:

有的時候,加密演算法是靜態編譯到惡意軟體中的,甚至有些攻擊者還會使用自己編寫的加密演算法。在這種情況下,你必須要了解加密演算法的內部工作原理,才能夠識別出加密代碼。

一份文件的內容會在經過加密之後重新寫迴文件,所以定位加密演算法最快的方法就是直接尋找ReadFile和WriteFile這兩個API調用,而加密演算法往往就會在這兩個API調用之間去實現自己的加密功能。

識別加密代碼

正如我們之前所提到的那樣,在尋找靜態編譯的加密演算法代碼時,我們可以通過尋找某些API調用來定位加密演算法的大概位置。當然了,對這些加密演算法工作機制的基本了解還是必要的。

接下來,我們將跟大家介紹AES加密演算法的工作流程。一般來說,大多數同步加密演算法的工作流程都比較相似。不同的地方可能是執行的數學計算操作類型不同,但是核心思想都是一樣的。因此,我們可以把了解AES加密演算法的工作流程作為一個初始起點,然後再對現實世界中其他的加密演算法進行分析。

AES是一種對稱加密演算法,它需要執行一系列數學計算和邏輯運算,其關鍵因素有下面這三個:

明文數據需要被加密;

靜態位元組是加密演算法的一部分(查詢表);

所使用的加密密鑰;

一般來說,AES的加密過程是在一個4×4的位元組矩陣上運作,這個矩陣又稱為「狀態(state)矩陣」,其初值就是一個明文區塊(矩陣中一個元素大小就是明文區塊中的一個Byte)。AES加密有很多輪的重複和變換。大致步驟如下:1、密鑰擴展(KeyExpansion),2、初始輪(Initial Round),3、重複輪(Rounds),每一輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最終輪(Final Round),最終輪沒有MixColumns。

-AddRoundKey — 矩陣中的每一個位元組都與該次輪秘鑰(round key)做異或運算;每個子密鑰由密鑰生成方案產生。

-SubBytes — 通過非線性的替換函數,用查找表的方式把每個位元組替換成對應的位元組。

-ShiftRows — 將矩陣中的每個橫列進行循環式移位。

-MixColumns — 為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每列的四個位元組。

註:最後一個加密循環中省略MixColumns步驟,而以另一個AddRoundKey取代。

AES可以進行10-14輪運算,這也就意味著當你在查看代碼中的加密演算法時,它將會是一個擁有非常多重複代碼的函數,這一點可以幫助你快速定位到加密代碼的所在位置。

下面給出的是一輪加密計算的另一個樣本,其實對稱加密的實現邏輯都是差不多的:

你會看到,運算操作的順序可能會有不同,不過這不重要,我們又不是加密演算法領域的研究人員。一般來說,我們不會去尋找AES演算法本身的漏洞,我們要找的是程序在實現加密演算法時出現的安全問題。我們之所以要介紹演算法的運行細節,是為了幫助你快速識別並定位加密代碼。

我們的樣本代碼是從之前分析Scarab勒索軟體時獲取到的,它使用了靜態編譯的AES來加密文件(不涉及API調用)。

我們可以從上面這個流程圖中看到,它不僅會對文件加密,而且演算法還會對之前的密鑰進行加密,這也是我們尋找漏洞並破解加密的著手點。

理論上來說,我們可以一次性使用多種加密演算法(結合使用),但是我們需要了解每一個加密演算法在整個程序架構中所扮演的角色。只要有一個加密演算法沒有正確實現,我們就可以想辦法破解它。

隨機數生成器

在尋找加密演算法的實現漏洞時,另一個切入點就是加密密鑰生成器,大多數情況下使用的都是某種形式的隨機數生成器。可能隨機數生成器的重要性大家都知道,如果你可以讓隨機數生成器強制重新生成之前加密過程中所生成的數值,你就可以獲取到原始的加密密鑰了。

在下面這張圖片中,一個弱隨機數生成器使用了系統時間來作為隨機數生成種子:

大多數情況下,計算機程序只能進行有限的一系列操作,如果一個函數的輸入參數固定,輸出也就是一樣的。但是對於隨機數生成器來說,由於隨機數種子的存在,所以相同的輸入並不會生成相同的輸出。比如說,某些弱隨機數生成器會使用時間來作為種子,所以很明顯,這種條件是可以複製的。因此,我們要使用足夠隨機化的輸入,才能得到足夠的熵。

你可以看到,牛X一點的隨機數生成器可以採集音頻數據,並使用滑鼠點擊信息和其他因素來讓輸出數據儘可能的隨機化。

破解弱RNG的理論過程

接下來我們分析一下如何破解RNG這樣的弱生成器。我們假設一款勒索軟體使用了RNG(以當前時間(毫秒級)作為種子),並使用了標準加密演算法。下面就是展開攻擊的基本操作步驟:

網路管理員分析了勒索軟體,並看到了公鑰,公鑰是用來進行加密的,並作為勒索軟體的目標用戶ID。

網路管理員通過查看網路日誌可以知道設備受感染的大概時間,比如說發生在上午10:00:00到10:00:10之間,大概有10秒鐘的時間窗口。

由於RNG使用的是毫秒級時間,那我們就假設有10,000,000種可能的種子。

如果勒索軟體使用時間作為隨機數種子值-x,那加密代碼就要生成密鑰對-KEYx。

然後從10:00:00開始,利用軟體逐個測試密鑰對。

看看x(10:00:00)是否能夠匹配公鑰(目標用戶ID);

如果不匹配,意味著RNG沒有使用10:00:00作為種子。

接下來測試x+1,依此類推,直到測試到10:00:10。

最終,他會得到一個匹配的值。

接下來,私鑰也是一樣的。得到了公鑰和私鑰之後,就可以恢復被加密的文件了。

但是,如果我們增加了足夠多的參數,那暴力破解可能就不太現實了:

實踐中的解密

下面給出的是我們成功破解的勒索軟體以及所使用的方法:

-7ev3、XORist和Bart:弱加密演算法

-Petya:加密演算法的實現存在漏洞

-DMALocker和CryptXXX:弱密鑰生成器

-Cerber:伺服器端漏洞

-Chimera:密鑰泄露

弱加密演算法

DES演算法誕生於1970年,並且自誕生之日起就得到了廣泛使用,但由於其密鑰大小的問題,DES已經被認為是一種弱加密演算法了。密鑰的長度是衡量一個加密演算法是否健壯的因素之一,密鑰位數足夠長,破解所需的時間也就越多。

接下來,我跟大家分析一下如何定義一個安全性較弱的加密演算法。一般來說,通過可視化的形式可以幫我們直觀地了解加密演算法的作用:

大家可以看到,這個加密演算法的熵很低,加密後的數據看起來跟原始數據也很類似,典型的弱加密演算法。

下面是另一個加密演算法,這個加密演算法的熵就很高了:

最後,我們可以通過這種方式來迅速了解一個加密演算法的健壯程度。在這篇文章中,我們簡單介紹了如何識別並破解一個加密演算法,從理論上來說,我們可以從本文所介紹的幾個因素來著手,並嘗試解密某個勒索軟體

推薦閱讀:

肆虐各國的WannaCry,如果重新來過,會有不同嗎?
木馬開啟智能識別?深度解析新型變形惡意軟體LokiBot!
全球刑警的夢魘,黑客手裡的萬能鎖
最近霸屏的勒索病毒,其實已經肆虐十幾年了

TAG:勒索病毒 | 數據恢復 | 硬碟數據恢復 |