1. 程式人生 > 其它 >Cobalt Strike 之: Malleable C2

Cobalt Strike 之: Malleable C2

鄭重宣告:
本筆記編寫目的只用於安全知識提升,並與更多人共享安全知識,切勿使用筆記中的技術進行違法活動,利用筆記中的技術造成的後果與作者本人無關。倡導維護網路安全人人有責,共同維護網路文明和諧。

Cobalt Strike 之: Malleable C2

目錄

Malleable C2 是 Cobalt Strike 的一項功能, 意為 "可定製的" 的 C2 伺服器。Malleable C2 允許通過修改c2配置檔案,改變 Beacon 與 C2 通訊時的流量特徵與行為,偽造正常的通訊的流量,實現一些 IDS 入侵檢測防火牆的繞過。

1 Malleable-C2-Profiles 簡單使用

  1. 下載 Malleable-C2-Profiles

    rsmudge/Malleable-C2-Profiles: Malleable C2 is a domain specific language to redefine indicators in Beacon's communication. This repository is a collection of Malleable C2 profiles that you may use. These profiles work with Cobalt Strike 3.x. (github.com)

    threatexpress/malleable-c2: Cobalt Strike Malleable C2 Design and Reference Guide (github.com)

  2. 呼叫 Malleable-C2-Profiles

    # ./teamserver [external IP] [password] [/path/to/my.profile]
    ./teamserver 192.168.0.2 qweasd malleable-c2/jquery-c2.4.0.profile
    
  3. 驗證配置檔案

    ./c2lint [/path/to/my.profile]
    

2 配置檔案簡析

2.1 配置檔案結構

# this is a comment
set global_option "value";

protocol-transaction {
	set local_option "value";

	client {
		# customize client indicators
	}

	server {
		# customize server indicators
	}
}

2.2 配置檔案文句

# 以 http-get 配置部分舉例:
http-get {
	set uri "/foobar";
	client {
		metadata {
			base64;
			prepend "user=";
			header "Cookie";
		}
}

2.2.1 定義Beacon客戶端傳送的元資料

當客戶端(Beacon payload)回連TeamServer時,它會發送關於自身的元資料給 Cobalt Strike。配置檔案中,我們必須定義如何編碼此元資料和如何使用我們的 HTTP GET 請求傳送元資料:

序號 處理步驟 作用 資料
0 Start metadata
1 base64 Base64 編碼資料 bWV0YWRhdGE=
2 prepend "user=" 在資料前新增"user="字串 user=bWV0YWRhdGE=
3 header "Cookie" 轉換後的元資料儲存在Cookie的客戶端 HTTP 頭中

2.2.2 定義 Beacon 伺服器提取元資料

假設我們的 Cobalt Strike 的 web 伺服器收到了獲取 URI
/foobar 的 GET 請求,需要提取元資料:

序號 處理步驟 作用 資料
0 Start
1 header "Cookie" 恢復儲存在Cookie的客戶端 HTTP 頭中的資料 user=bWV0YWRhdGE=
2 prepend "user=" 移除客戶端新增的"user="字串 bWV0YWRhdGE=
3 base64 Base64 解碼資料 metadata

2.2.3 資料轉換語言

2.2.4 終止語句

資料轉換始以終止語句結束。在一個數據轉換中只能使用一個終止語句。這個語句告訴 Beacon 和它的伺服器在哪裡儲存轉換後的資料。

2.2.5 特殊字串

2.2.6 Headers 和 Parameters

新增額外資訊到 beacon 中進行互動通訊,直譯器會按順序解釋你的 header 語句和 parameter 語句。格式如下:

# 強制 Beacon 在發出請求時向 /foobar URI 新增 bar=blah 引數。
http-get {
  client {
    parameter "bar" "blah";
       
# 新增一個header來讓迷惑網路安全監控團隊。此地無銀。
http-get {
   server {
       header "X-Not-Malware" "I promise!";

2.2.7 引數選項

sleeptime:設定心跳包時間,單位為毫秒
jitter:預設的抖動因子(0-99%)
maxdns:通過DNS上傳資料時的主機名最大長度(0-255)
uri:指定多個URI要以空格分隔。URI大小寫敏感。Cobalt Strike在檢入時將為每個主機隨機分配URI。http-get和http-post之間的URL不能相同 ,所有URI必須唯一。

2.2.8 HTTP Staging

Beacon 是一個分階段的 payload。這意味著 payload 被一個 stager 下載然後注入到記憶體中。使用C2 的 http-stager 自定義 HTTP staging 過程。

# uri_x86 選項設定用於下載 x86 payload stage 的 URI。
# uri_x64 選項設定用於下載 x64 payload stage 的 URI。
http-stager {
   set uri_x86 "/get32.gif";
   set uri_x64 "/get64.gif";
    
    # client 關鍵字定義 HTTP 事務的客戶端。
    # 使用 parameter 關鍵字來給 URI 增加一個引數。
	# 使用 header 關鍵字來給 stager 的 HTTP GET 請求增加一個頭欄位。
    client {
     parameter "id" "1234";
     header "Cookie" "SomeValue";
   }
    
    # server 關鍵字定義 HTTP 事務的伺服器端。
    # header 關鍵字給伺服器的響應增加一個伺服器頭欄位。
    # output 關鍵字是一個改變 payload stage 的資料轉換。這個資料轉換可能僅僅是在 stage 之前新增字串或給 stage 增加字串。使用 print 終止語句來關閉這個輸出語句塊。
   server {
     header "Content-Type" "image/gif";
     output {
       prepend "GIF89a";
       print;
     }
   }
}

2.2.9 HTTP 伺服器配置

http-config {
    set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type";
    header "Server" "Apache";
    header "Keep-Alive" "timeout=5, max=100";
    header "Connection" "Keep-Alive”;
    set trust_x_forwarded_for "true";
    set block_useragents "curl*,lynx*,wget*";
}

# set headers:指定 HTTP 頭欄位在 HTTP 響應中傳遞的順序,不在列表中的 HTTP 頭會被新增到末尾。
# header:在 HTTP 響應中新增 HTTP 頭,如果頭的值已經在響應包中存在,則忽略該值。
# set trust_x_forwarded_for:決定 Cobalt Strike 是否使用 X-Forwarded-For HTTP 頭來確定請求的遠端地址。如果你的 Cobalt Strike 伺服器在一個 HTTP 重定向器後,請使用此選項。
# set block_useragents:配置一個阻止或回覆404的 UA 列表。預設阻止 curl, lynx, wget,具體見下圖。

2.2.10 自簽名 SSL 證書

https-certificate {
    set CN       "www.bing.com";
    set O        "Microsoft Corporation";
    set C        "US";
    set L        "Redmond";
    set OU       "Microsoft IT";
    set ST       "WA";
    set validity "365";
}

2.2.11 有效的 Beacon SSL 證書

https-certificate {
    set keystore "domain.store";
    set password "mypassword";
}

製作有效的Beacon SSL 證書步驟

  1. 建立一個 Java Keystore檔案

    keytool -genkey -keyalg RSA -keysize 2048 -keystore domain.store
    
  2. 生成 Certificate Signing Request (CSR),將生成的檔案提交給你的 SSL 證書供應商,他們將驗證你的身份並頒發證書

    $keytool -certreq -keyalg RSA -file domain.csr -keystore domain.store
    
  3. 匯入SSL 廠商提供你的 Root 和其他中間證書

    $keytool -import -trustcacerts -alias FILE -file FILE.crt -keystore domain.store
    
  4. 安裝域名證書

    $keytool -import -trustcacerts -alias mykey -file domain.crt -keystore domain.store
    

3 流量分析

未經偽造的流量:

經過偽造的流量: