- 概述
為了確保通信安全和隱私以及應對各種竊聽和中間人攻擊,越來越多的網絡流量被加密,然而,攻擊者也可以通過這種方式來隱藏自己的信息和行蹤。近期我們捕獲了一個樣本,此樣本就是使用了加密通信,為了深入研究此樣本的加密通信機制,接下來我們來逐層剖析它。
域名 |
*.dDNS.NET |
威脅類型 |
木馬 |
樣本性質 |
曾關聯海蓮花等APT組織 |
- 準備工作
解密硬編碼字符串
將樣本記錄的硬編碼字符串的每一個字節(jié)加0x23,可以獲得密鑰、域名、注冊表鍵
字符串 |
作用 |
*.ddns.net |
C2服務器域名 |
Softwaremicrosoftwindows NTCurrentversion |
注冊表鍵 |
ProductName |
注冊表鍵,系統版本 |
ComSpec |
環(huán)境變量:CMD.EXE的路徑 |
2q36kj8*6t9w5 |
密鑰:數據加密解密時使用的密鑰 |
- 通信行為-接收
3.1 建立通信
樣本采用TCP自定義加密通信,IP為域名(*.ddns.net)解析成功后得到的IP,端口為5832。
3.2 接收、校驗數據
樣本使用TCP協議傳輸數據,TCP載荷部分使用自定義加密協議,并且協議格式中含有身份校驗位,只有校驗通過才解析后面的內容,不通過則繼續(xù)接收數據。
包類型 |
1、2、3、4、5字節(jié) |
6、7字節(jié) |
8、9字節(jié) |
10、11字節(jié) |
后續(xù) |
連接包 |
會話ID |
/ |
/ |
/ |
/ |
命令與控制包 |
會話ID |
數據大小 |
指令碼 |
是否解密標志位 |
傳輸的數據 |
備注 |
單次會話值相同 |
做大小校驗 |
不同指令執(zhí)行不同的操作 |
為0則不解密數據,大于0解密 |
需要解密的數據 |
接收數據包格式一覽表
每次對接收的數據的校驗方式如上表。第一次連接或者重新連接的數據包的前5個字節(jié)的值作為會話ID。
接收的數據包由三部分組成:
- 填充數據(長度可變)
- 11個字節(jié)的校驗數據、指令
- 后續(xù)操作需要的參數、數據
為了防止單次會話中接收的數據因為前5個字節(jié)相同而出現規(guī)律性,會在校驗前先獲取有效的傳輸數據即移除填充數據,找到數據中與同一次會話的標志值相同的數據的位置,這也算是第一次校驗。
接下來,校驗有效數據的大小,有效數據的大小記錄在第6、7字節(jié),校驗通過會根據第10、11字節(jié)的值來決定是否解密后續(xù)的數據。
3.3 解密數據
解密操作就是由硬編碼得到的密鑰和數據進行按位異或,返回的數據包也是這種方式加密的。
- 執(zhí)行指令
接收數據的第8、9字節(jié)的值是樣本的指令碼,根據不同的指令執(zhí)行不同的操作。
指令大致分為三類
- 獲取基本信息
- 操作CMD.EXE
- 關閉進程、線程
4.1 獲取信息
獲取電腦系統信息、磁盤盤符、文件信息、進程信息以及TCP&UDP表的信息,并將獲取的信息按照不同的格式拼接,然后將拼接好的數據與密鑰做加密操作,并且將加密后的數據拷貝到發(fā)送緩沖區(qū)中。(具體的發(fā)送格式以及指令功能見文章末尾的發(fā)送數據包結構一覽表)
4.2 操作CMD.EXE
創(chuàng)建兩個匿名管道,獲取環(huán)境變量ComSpec的值即CMD.EXE的路徑,以這個路徑創(chuàng)建進程CMD.EXE,并且在創(chuàng)建進程的時候將進程的輸入、輸出各綁定一個匿名管道,這樣就可以通過管道來對CMD.EXE進行遠程操作,其中輸入CMD的指令就是有效數據中解密后的數據,輸出即回顯通過管道獲取,再拼接相應的格式后加密存放到發(fā)送緩沖區(qū)中。
4.3 關閉進程、線程
關閉CMD.EXE進程
- 通信行為—發(fā)送
發(fā)送的數據格式如下表,按照自定義格式組成數據包內容后,加密發(fā)送:
指令碼 |
操作 |
發(fā)包格式1、2、3、4、5字節(jié) |
發(fā)包格式6、7字節(jié) |
數據 |
備注 |
3017 |
結束指定線程,斷開連接,然后重新啟動網絡連接 |
/ |
/ |
/ |
不發(fā)包 |
3000 |
獲取電腦基本信息 |
會話ID |
3000 |
電腦名稱|系統版本|用戶名|主模塊全路徑|AN|.10* |
單個數據包 |
3001 |
獲取磁盤盤符信息 |
會話ID |
3001 |
C:\D:\(電腦所有盤符信息)| |
單個數據包 |
3002 |
遍歷文件信息 |
會話ID |
3002 |
<>文件名:?文件大小:?文件時間字符串:? |
單個數據包 數據信息小于9084字節(jié) |
|
遍歷文件信息 |
會話ID |
3003 |
xxxx(多次發(fā)包的個數INT)xxxx(多個包的實際大小) |
單個數據包 數據信息大于9084字節(jié) 發(fā)送數據總大小 |
3004 |
文件信息 |
會話ID |
3004 |
9084字節(jié)數據(或者剩下不足9084字節(jié)的數據) |
多個數據包 |
3005 |
創(chuàng)建文件 |
會話ID |
3010 |
q7gf |
創(chuàng)建文件失敗 |
|
創(chuàng)建文件 |
會話ID |
3006 |
1 |
創(chuàng)建文件成功 |
3006 |
寫文件 |
會話ID |
3006 |
x(文件操作次數) |
單個數據包 |
3007 |
文件大小 |
會話ID |
3008 |
xxxx(假設9084字節(jié)為頁,這里記錄的頁數INT)xxxx(文件的實際大小) |
單個數據包 |
3009 |
文件數據 |
會話ID |
3009 |
9084字節(jié)數據(或者剩下不足9084字節(jié)的數據) |
多個數據包 |
3012 |
創(chuàng)建遠程可交互式CMD匿名管道傳輸數據 |
會話ID |
3013 |
回顯數據 |
單個數據包 數據信息小于9084字節(jié) |
|
匿名管道傳輸數據 |
會話ID |
3014 |
xxxx(多次發(fā)包的個數INT)xxxx(多個包的實際大小) |
單個數據包 數據信息大于9084字節(jié) 發(fā)送數據總大小 |
3013 |
給CMD傳輸命令 |
會話ID |
3013 |
回顯數據 |
單個數據包 數據信息小于9084字節(jié) |
|
給CMD傳輸命令 |
會話ID |
3014 |
xxxx(多次發(fā)包的個數INT)xxxx(多個包的實際大小) |
單個數據包 數據信息大于9084字節(jié) 發(fā)送數據總大小 |
3015 |
發(fā)送回顯數據 |
會話ID |
3015 |
9084字節(jié)數據(或者剩下不足9084字節(jié)的數據) |
多個數據包 |
3016 |
關閉CMD進程 |
/ |
/ |
/ |
不發(fā)包 |
3019 |
遍歷TCP、UDP終結點表 |
會話ID |
3019 |
TCP信息UDP信息 |
單個數據包 數據信息小于9084字節(jié) |
|
遍歷TCP、UDP終結點表 |
會話ID |
3020 |
xxxx(多次發(fā)包的個數INT)xxxx(多個包的實際大小) |
單個數據包 數據信息大于9084字節(jié) 發(fā)送數據總大小 |
3021 |
負責TCPUDP表信息傳輸 |
會話ID |
3021 |
9084字節(jié)數據(或者剩下不足9084字節(jié)的數據) |
多個數據包 |
3022 |
關閉指定進程 |
會話ID |
3022 |
t |
關閉進程成功 |
|
關閉指定進程 |
會話ID |
3022 |
#%r |
關閉進程失敗 |
3023 |
遍歷進程信息 |
會話ID |
3023 |
(進程ID)8tr$(進程名字)8tr$(AD)t#21 |
單個數據包 數據信息小于9084字節(jié) |
|
遍歷進程信息 |
會話ID |
3024 |
xxxx(多次發(fā)包的個數INT)xxxx(多個包的實際大小) |
單個數據包 數據信息大于9084字節(jié) 發(fā)送數據總大小 |
3025 |
進程信息傳輸 |
會話ID |
3025 |
9084字節(jié)數據(或者剩下不足9084字節(jié)的數據) |
多個數據包 |
/ |
每60秒 |
xxxx(與接收數據包前4字節(jié)相同) |
/ |
/ |
每當間隔大于60秒判斷一次,如果發(fā)送的數據不是多包中的數據則發(fā)送一個單獨的包 |
發(fā)送數據包結構一覽表
- 總結
樣本使用TCP自定義加密通信,通信成功會首先進行身份校驗、然后解析數據中的指令碼,根據指令碼的不同執(zhí)行不同的功能,其中有一個高危的功能,通過匿名管道的方式實現遠程可交互式CMD,CMD執(zhí)行的命令和執(zhí)行結果(回顯)在通信流量載荷中加密傳輸。
利用TCP/UDP等協議承載自定義加密載荷進行攻擊的APT組織、各類黑客工具層出不窮。因自定義加密格式不定,變化靈活,因此這種加密流量檢測的難度進一步提高。我們一直針對各類使用自定義加密的最新威脅保持密切跟蹤,并隨時更新方案進行應對。