如何在數秒之內破解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.文件系統模塊,在代碼中被稱為modFS3.遠程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.tmp4.通過調用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.將二進位字元串轉換為BASE645.向消息添加時間戳(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的最新變種是如何展開攻擊的?