透過已知明文攻擊破解弱加密演算法

2hYan9發表於2024-10-19

樣本分析日誌

實習期間在微步沙箱上找到一個樣本,其SHA256: 36c3405eafd9bdb4c6dd0ca98a2a4779ab34b8777a36b38347316f09109a87e6,在沙箱上檢測為木馬。

透過分析發現該樣本總共分為三個階段:第一階段的邏輯是先檢查當前路徑,然後自複製到公共目錄並執行,最後從遠端FTP伺服器上下載第二階段的惡意程式碼,並將其載入到記憶體並執行。第二階段的攻擊就是透過所下載的遠端檔案實現,主要行為是從資源節中釋放第三階段實施攻擊的程式碼。這裡主要討論第二階段的資源釋放過程。

透過IDA反編譯可以發現二階段程式碼中存在載入資源節的行為:
release_resource

並且在微步沙箱中檢查到該樣本的資源節的熵值偏高,所以懷疑其資源節可能是加了密的。

使用Resource Hacker開啟樣本的資源節,可以發現樣本的資源節中存放了多個二進位制檔案。

resource section

資源節中的這些資源都是DLL(Dynamic Linkage Library)檔案,除了127號檔案,熵值偏高,好像是加密了的。

密文分析

因為這個檔案是加了密的,並且難以在二階段樣本中定位到解密的程式碼(二階段樣本使用了某種程式碼混淆的機制),所以需要先對其進行破解才能進行下一步的分析。

在破解密文之前,至少需要知道密文加密的方式。雖然在二階段沒能定位到相關程式碼,但是該樣本一階段有一個解密過程,(遠端FTP伺服器上的檔案是加密儲存的,所以一階段將二階段檔案下載下來後還需要進行解密),所以可以猜測資源節中的密文也是和一階段的解密流程採用類似的演算法。

decryption

可以看到樣本使用的解密演算法其實和維吉尼亞演算法類似,只不過將維吉尼亞演算法中移位運算換成了按位異或。

樣本一階段解密使用的金鑰是"Ww6",嘗試用這個金鑰解密上面的密文,結果當然是失敗了。

不過,因為這個密文大機率是一個PE格式的檔案,而PE檔案頭的部分資訊總是固定的,因此能夠知道這個密文中的一部分明文。

比如從第3個位元組開始的前面58個位元組的取值為:{0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},並且在檔案第78個位元組的偏移處有一個DOS頭的字串:"!This program cannot be run in DOS mode."。

破解密文

在知道了這部分的明文資訊後,就足以對其實施已知明文攻擊(Known Plaintext Attack),因為根據前面的假設,這個加密檔案所使用的加密演算法本身就屬於一種弱加密手段。

因為加密演算法是透過異或操作進行的,所以這裡直接將上面這些明文與密文進行異或,可以得到加密這部分明文所使用的金鑰流。

異或的結果如下:

可以看到,這裡所使用的金鑰週期還是3,但是金鑰的第一個位元組是在變化的,用記事本將這些變化的位元組單獨拿出來看能不能找到一些規律。

changed bytes

將這些變化的位元組放到一起後,還是能夠觀察出變化規律:每16個位元組進行一次模0x80加0x50的運算。

有了這些變化規律後,就可以直接對密文進行破解,程式碼如下:

crack cipher

破解密文後,放到IDA中檢視其字串,可以看到IDA能夠載入該檔案,並且字串中也包含一些特徵字串。

peek strings

這些字串是Nitol木馬家族的特徵字串。

相關文章