作者:K&Nan@知道創宇404高級威脅情報團隊
原文鏈接:https://mp.weixin.qq.com/s/WU0VnMCf-FQyXiBkZfZAEw

1. PatchWork組織描述

Patchwork APT組織,也稱為Dropping Elephant、Chinastrats、Monsoon、Sarit、Quilted Tiger、APT-C-09和ZINC EMERSON,于2015年12月首次被發現,使用一套定制的攻擊工具,針對多名外交官和經濟學家發起攻擊。這些攻擊通常是通過魚叉式網絡釣魚活動或水坑攻擊進行的。該組織被懷疑由一個隸屬于南亞某國的威脅行為者運營,主要攻擊目標是巴基斯坦、斯里蘭卡、尼泊爾,孟加拉國、緬甸、柬埔寨等國。

近2年來,知道創宇404高級威脅情報團隊多次提前&即時發現該組織針對國內重點高校、研究院、科研所等相關研究組織機構開展攻擊活動,多次成功預警。

2. 武器基本信息

樣本來源 持續追蹤
SHA-256 6e0db3722abb04be57696d12f4debf078f053d6e4839e621c864c325f20b8ca4
武器名稱 EyeShell
武器類型 后門程序
針對平臺 Windows

3. 武器功能模塊圖

圖片

4. EyeShell武器綜述

近期404高級威脅情報團隊在對PatchWork的持續追蹤過程中,發現其武器庫中出現了一款由.NET開發的精簡后門,目標框架為.NET Framework 4,狩獵追蹤過程中我們發現該后門與BADNEWS(BADNEWS為PatchWork組織專用自研木馬名稱)共同出現,故我們有理由猜測該后門用于配合BADNEWS共同使用,該后門使用的命名空間為Eye,為了方便后續追蹤及區分,我們根據命名空間將這款后門稱之為EyeShell。

4.1 EyeShell功能描述

EyeShell整體來看是一款非常精簡的后門程序,推測其版本為v1.0版本,EyeShell按功能模塊劃分可將整體劃分為三個模塊,分別如下:

  • 初始化模塊

初始化模塊分為兩個部分,間隔點為C2是否在線。

第一部分用于程序初始化,內容如下:

本次發現的EyeShell創建的互斥體為“fdghsdfgjhh”,互斥體用于確保程序唯一運行,避免發生競爭問題。

C2地址及端口采用數組的方式保存:

char[] C2Address = new char[13]
 {
    '1', '7', '2', '.', '8', '1', '.', '6', '1', '.',
    '2', '2', '4'
   };
int[] C2Port = new int[4] { 2, 0, 2, 4 };

由于EyeShell的C2信息使用的是數組保存,進行Connect(string hostname, int port)API調用時會進行一次類型轉換,地址在轉換string類型時只需要強制轉換即可,EyeShell在處理端口時采用的方式是遍歷冪運算累加的方式:

C2Port.Select((int t, int i) => t * Convert.ToInt32(Math.Pow(10.0, pop.Length - i - 1))).Sum()

EyeShell的所有網絡交互均采用AES-128加密:

AESKey = {'q', 'w', 'e', 'r', '1', '2', '3', '4', 'a', 's', 'd', 'f', '5', '6', '7', '8'};
AESIV = {'7', '3', '9', '1', '8', '4', '2', '6', '5', '7', '8', '9', '5', '1', '2', '3'}

向服務端發送數據的加密方式與服務端下發命令所采用的加密方式相同,采用的處理流程為原始數據(byte[])---> To Base64 ---> To AES-128 ---> To Base64(最終發送的數據)。

第二部分用于交互初始化

交互初始化需要一個前置條件,當且僅當C2在線時才會進行交互初始化。

交互初始化主要內容為創建cmd.exe進程并創建OutputData Received事件,通過OutputHandler事件委派將標準輸出流重新導向,TCPStream寫入接口,從而達到將標準輸出流重定向至服務端操作,EyeShell在完成事件委派后會創建TCPStream Read/Write兩個接口分別為后續交互提供支持。

其中Write接口與OutputHandler事件委派中的重定向產生關聯。

  • 上線模塊

在初始初始化完成后,EyeShell會嘗試進行C2在線檢測,直到C2在線后才會進行后續操作否則將持續檢測C2是否在線。

如若C2在線EyeShell收集的上線信息分別為UUID、UserName、OSVersion,上線格式如下:

**<UUID>+ "\*" +<UserName>+ "\*" +<OSVersion>+"\*1.0"**

其中根據經驗來看上線信息尾部的硬編碼字符*1.0我們猜測為EyeShell版本號v1.0。

完成上述操作后EyeShell進入交互模塊。

  • 交互模塊

交互模塊是一個死循環模塊,交互開始是通過從TCPStream Read接口讀取服務端下發的指令,根據EyeShell的命令控制列表我們可以確定EyeShell支持十三條指令,相關指令及功能如下所述:

"drive"

該指令含義為枚舉并向服務端上傳當前主機的邏輯卷名稱,上傳格式如下:

<vol1.Name> +"\*"+ <vol2.Name> +"\*"+ … + <voln.Name>

"fileData"

該指令含義為獲取指定文件大小,如果為目錄則會獲取當前目錄其子目錄大小。異常則返回“0”。

"FileRec"

該指令含義為獲取當前目錄其子目錄名稱。上傳格式為:

fo\*l\*d\*er** **+"\*"+ <folder1> +"\*"+ <folder2> + …

"FileList"

該指令含義為列舉當前目錄、子目錄及目錄中文件名稱,類似于ls指令上傳格式由*分割。

"downFile"

該指令含義為將受害主機中指定的文件上傳至服務端,若長傳成功服務端返回"Done"。

"upload"

該指令含義為從服務端下載文件保存至受害主機指定路徑,成功則返回"asdf"。

"Exec"

該指令含義為執行受害主機中的指定文件,執行成功返回"asdf",否則返回異常信息。

"Delete"

該指令含義為刪除受害主機中的指定文件,執行成功返回"asdf",否則返回異常信息。

"Rev"

該指令用于執行服務端下發命令,并更改OutputHandler事件委派中的返回狀體為開啟,此時服務端與客戶端建立起交互式Shell。

"RevEnd"

該指令用于關閉交互式Shell,更改OutputHandler事件委派中的返回狀體為關閉,此時服務端與客戶端關閉交互式Shell。

"ScreenS"

該指令用于獲取受害主機當前桌面屏幕截屏。

"UplExe"

該指令有兩個操作:

操作一:從服務端下發文件并保存至受害主機%temp%路徑下的指定文件名稱并立即執行。

操作二:獲取當前進程的ID并將該數據保存在%temp%\ip1.txt文件中。

"Alive"

無操作,使客戶端進入等待狀態。

4.2 EyeShell細節描述

圖片

網絡流加密流程

圖片

網絡流解密流程

圖片

AES-128 KEY&IV

圖片

互斥體創建及初始化C2

圖片

初始化Shell并創建事件委托

圖片

事件委托

圖片

創建TcpStream 讀寫接口

圖片

構建并發送上線信息

圖片

交互入口

圖片

獲取文件列表

圖片

獲取邏輯卷信息

圖片

文件上傳

圖片

獲取文件大小

圖片

獲取屏幕截圖

圖片

文件保存執行及PID獲取

圖片

創建指定進程

圖片

刪除指定文件

圖片

啟動交互式Shell

圖片

獲取目錄信息


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/2074/