C2 複刻 09 | Command and Control 資料傳輸格式

by iok
2K 人次瀏覽
C2 複刻 09 | Command and Control 資料傳輸格式

延續上節,若惡意程式採用 TCP 或 UDP 網路傳輸協定,亦會自定義一套與 C2 溝通的專屬格式。

在復刻 C2 上,常利用逆向工程與分析封包手法,去拼湊出每個 C2 控制指令,所對應的傳輸格式與內容。

而在傳輸格式中,最廣泛使用就屬 TLV (Type-Length-Value) 。TLV 格式描述資料清楚、易懂且彈性,且解析 TLV 資料時,不像 JSON、XML 格式,需引入外部函式庫,程式相依性較低。

TLV 格式

該格式分為以下 3 個部份:

  • Type: 資料類型
  • Length: 資料長度
  • Value: 資料內容

在 C 語言實做時,可用如下資料結構呈現:

struct TLV {
        uint8_t type;
        uint32_t length;
        char *value;
}

實際在傳輸時,資料會以 16 進位編碼呈現,例如:

010401020304

則依序將資料解讀為 Type(01)、Length(04)與 Value(01020304)。

  • 資料類型代碼:01,每個代碼代表一種資料類型,其值唯一。
  • 資料內容長度:4 個 Bytes (04)
  • 資料內容:01020304

你或許會問,如果一次傳輸多種資料類型的內容,要如何處理?

一般會用TLVTLVTLV …等格式,依序疊加多個 TLV 資料而成。例如:

0104010203040204050607080304090A0B0C

資料依據資料類型「01」、「02」與「03」,是由3 份 TLV 資料疊加而成,「010401020304」、「020405060708」與「0304090A0B0C」。

若某個類型的資料已知且為固定長度,實務上會省略長度的資訊,將Type 資訊即接續 Value 的資訊。

舉 IOT Botnet 程式 Mirai 為例,發送UDP Flood 攻擊指令內容,以16進制 TLV 格式編碼,如下:

00110000001E00010A0A0A200107023830

僅傳輸 17 個 Bytes,解讀 C2 控制命令意思是「Bot 請向 IP位址(10.10.10.10/32)的 Port 80 進行 UDP Flooding 滿頻攻擊,攻擊時間持續 30秒」。

將這 17 個 Bytes 依造資料類型,依 Type、Length 與 Value 解讀後可填為以下表格。

Length 欄位 (F)表示為固定長度,其資訊是被省略的。Length 欄位 (D) 表示資訊有提供。

在 Value 欄位,括號內容為值代表的意義。例如 Attack Vector(攻擊向量) 為 00,表示為 UDP Flooding。

TypeLength (F/D)Value
Total Length2(F)11(17 Bytes)
Attack Duration4(F)0000001E (30 秒)
Attack Vector1(F)00 (UDP Flooding)
Target Count1(F)01
Target IP4(F)0A0A0A0A (10.10.10.10)
Target Netmask1(F)20(/32)
Option amounts1(F)01(1 Option)
Option Type1(F)07 (Attack Dest Port)
Option Length1(F)02 (5)
Option Value2(D)3830 (80)

總而言之,以 Mirai 為例,預先定義 TLV 傳輸格式與內容,後續 C2 僅需花費 17個 Bytes,即能傳送控制指令給 Bot。

故在復刻 C2 上,利用逆向工程與封包分析手法,拼湊 C2 控制指令所對應的 TLV 資料傳輸格式與內容,便可成功對 Bot 下達控制指令。

複刻 C2 系列文章

相關文章

留言