如何在數秒之內破解APT28流量?

安全公司Redsocks最近發布了一個有趣的報告,解密了如何在幾秒鐘內破解APT28流量。

在2016年年底,Redsocks就曾對APT28所使用過的過期域( expired domain)的安全性進行過研究,APT28利用這些過期域的攻擊受到加密通信通道的阻礙。雖然許多關於APT28的研究組織,如ESET都提到了RC4加密演算法,但並沒有詳細介紹所使用的密鑰細節和RC4實現的細節,也沒有對其進行靜態特徵進行分析。在本研究中,Redsocks就旨在為我們揭示x-agent惡意軟體的整個運行過程,以解密其怎樣干預流量。XAgent具有反調試,鍵盤記錄,下載文件和加密通信等惡意能力,在各種主流操作系統中都有樣本出現。

本文首先通過使用APT28 dropper開始進行調查:

由於Redsocks調查的重點是解密APT28的通信流量,因此,本文詳細闡述了x-agent的加密功能,並研究了關於開發x-agent通信流量的問題。也就是說,Redsocks不但對x-agent的加密功能進行了破解,還對以下3各方面進行了研究:

1. dropper和x-agent的執行行為

2.x-agent的網路行為

3. 在幾秒鐘內破解APT28的加密演算法

按照Redsocks提出的加密及解密方案,只要大家通過本文所介紹的互聯網掃描和URL模式,相信你一定可以找到當前活躍的APT28伺服器和有關的受害者,並對這些伺服器進行進一步調查。

X-agent dropper

dropper功能的實現要分為兩步,在第一步,它只解壓縮到Windows文件夾的dll,由於文件的名稱是固定的(靜態的),所以它不會被多次執行或被不同的工作站所改變。在第二步中,dropper通過調用shell32庫的ShellExecuteW函數載入dll。此函數由rundll32.exe和「C: Windows 83D2CDE2-8311-40CB-B51D-EBE20FA803D1.dll」,init「作為參數調用。這意味著X-agent的蹤跡應該在rundll32執行中查看。 dropper還在Windows文件夾中創建「ose00000.exe」文件,並使用dll和dropper path address的參數調用它。總而言之,dropper會在具有隱藏屬性的Windows目錄中創建兩個文件「83D2CDE2-8311-40CB-B51D-EBE20FA803D1.dll」和「ose00000.exe」(請參見表1相應的哈希值),並使用rundll32.exe載入一個文件。 dropper執行的結果是rundll32.exe和ose00000.exe分別作為兩個單獨的進程,在dropper執行期間是觀察不到任何網路活動的。

X-agent刪除rootkit

dropper的目標是將控制項轉移到具有鍵盤記錄和遠程執行代碼的rootkit的83D2CDE2-8311-40CB-B51D-EBE20FA803D1.dll(參見表1中的SHA256哈希)。

X-agent架構

x-agent具有複雜的架構,它具有功能和通信通道實現的模塊化結構。圖1給出了我們分析的樣本的x-agent架構。

X-agent執行

執行從rundll32載入dll的init函數開始,將控制轉移到Init後的第一個有趣的事件是調用KERNEL32.GetVolumeInformationW。在這個調用之後,Init函數就開始初始化全局變數:

接下來,init函數初始化可用的模塊,本文列舉了X-agent的3個惡意攻擊模塊:

1.KeyLogging模塊,在代碼中被稱為modKey

2.文件系統模塊,在代碼中被稱為modFS

3.遠程Shell模塊,在代碼中被稱為modProcRet

在初始化這些模塊的數據結構之後,CHOPSTICK為不同的任務創建不同的線程。模塊會基於它們的配置循環創建,並且AgentKernel的創建方式不同:

創建線程後,執行將傳輸到AgentKernel和Module線程。代理內核模塊一開始就為伺服器準備一條消息,然後等待伺服器使用命令進行響應。該消息是通過代理ID將受害者引入伺服器,並報告支持的模塊開始執行。此消息將寫入臨時文件夾中的edg6EF885E2.tmp文件。本文分析的樣本是通過HTTP通道進行通信,以實現使用WININET API。

在發送數據之前,通道線程要檢查與伺服器的連接。首先,會嘗試連接「adobeincorp.com」域名,如果連接失敗,它會嘗試連接到兩個硬編碼的IP地址。成功連接到伺服器後,會根據其他模塊準備的數據創建URL請求並發布數據。X-agent首先要發送獲取請求,然後發送發送請求。在此過程中,通信會始終加密。

總而言之,下面這8個操作過程會發生在x-agent的每次執行中:

1.調用KERNEL32.GetVolumeInformationW

2.創建至少5個不同的線程

3.在temp目錄下讀寫edg6EF885E2.tmp

4.通過調用socket.connect檢查連接

5.加密URL查詢字元串和POST數據

6.發送獲取請求

7.發送發送請求

8.使用WININET Http API將支持的命令和代理號碼發送到伺服器。

X-agent流量通信

為了解密APT28流量,我們首先需要了解X-agent的流量模式。本文所分析的x-agent版本就是通過發送HTTP發送請求之後的初始GET請求進行通信。除請求的一個查詢字元串外,HTTP請求頭值被硬編碼,x-agent流量的URL如下所示:

/ webhp?rel = psy&hl = 7&ai = L2Bd93t_o-jl022K1Og4Bm9mSk8QO88K_3ZQZuKcoPwur-5Q7Y =

「/ webhp?rel = psy&hl = 7&ai =」作為URL的一部分,最後的「=」符號可以連接到不同的進程中。事實上,代碼中的「/ webhp?rel = psy&hl = 7&ai =」是硬編碼的。接下來的51個位元組都不是明文形式的,簡要地說,它包含請求的時間戳和代理的ID。 x-agent的初始POST數據為71位元組,並以a =結尾。數據被加密,解密時等於:

56 34 4D 47 | 4E 78 5A 57 | 6C 76 63 6D | 68 6A 4F 47 | 39 79 5A 51 | 6B 30 84 F2 | 01 00 00 01 | 00 23 01 10 |23 01 11 23 | 01 13 23

這段解密的代碼是由四部分組成,分別是代理人(受害人)的身份號,發送數據的模塊的ID以及由#字元(0x23)分隔成的兩部分模塊,如下圖所示:

以下是x-agent通道的Http實現:

X-agent流量加密

加密模塊

加密模塊是使用兩個參數調用加密過程的,指針包含兩個數據結構,這些數據結構提供了加密類的兩個參數:

1.種子加密

2.要加密的數據

種子是經過硬編碼的,除此以外,init函數使用即時常量將其複製到數據段:

接下來,在代碼中,4個隨機位元組被附加到種子上,與這些字母一起形成加密的核心。種子為50位元組,密鑰長度為54位元組。數據的大小可變,例如,來自AgentKernel的默認初始請求總共為39個位元組(見圖4),包括:代理ID,模塊ID(消息的發送方)和支持的模塊。這些數據總是附加到20位元組的數據令牌,代理ID和發件人模塊ID。該數據令牌用於伺服器的解密結果驗證。使用RC4創建密碼後,加密過程將向消息添加8個隨機值,然後將整個二進位字元串轉換為兼容URL的BASE64。 接下來,加密過程會向消息中添加一個7位元組的時間戳。總而言之,加密的過程包含以下5個操作:

1. 隨機生成4位元組

2.使用RC4加密消息

3.向消息中添加8個隨機位元組

4.將二進位字元串轉換為BASE64

5.向消息添加時間戳(BASE64中為7個位元組)

RC4的功能

RC4是流密碼演算法,基於位元組置換。以下代碼是由x-agent實現的RC4演算法。函數的參數是附加到種子和明文數據的4位元組隨機值:

如何解密x-agent數據

如上所述,x-agent加密中唯一的隨機性是附加到上一節中給出的50位元組種子的4個隨機位元組。由於RC4是同步流密碼,所以只能使用與加密相同的密鑰來解密流量。在x-agent的解密演算法中必須使用相同的RC4函數進行解密。密碼輸入必須是來自http請求的相同的數據位元組流,即時間戳和隨機位元組必須被刪除。必須以強制方式調用RC4函數,其中所有可能的值都是從0到-1。由於這是一個已知的純文本攻擊,所以解密結果必須包含「V4MGNXZWlvcmhjOG9yZQ」。

本文翻譯自:Cracking APT28 traffic in a few seconds ,如若轉載,請註明來源於嘶吼: 如何在數秒之內破解APT28流量? 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

我也想躺著收錢:一個比特幣套利系統的實現
《克羅談投資策略》的讀書筆記
賺錢是一種巧
惡意軟體Disttrack的最新變種是如何展開攻擊的?

TAG:技术分析 | 信息安全 |