文章目錄
- 一、ATT&CK
- 二、T1583 獲取基礎架構
- 2.1 匿名網絡
- 2.2 專用設備
- 2.3 滲透測試虛擬機
- 三、T1588.002 C2
- 3.1 開源/商用 C2
- 3.1.1 C2 調研
- Sliver
- Sliver 對比 CS
- 3.1.2 CS Beacon流量分析
- 流量規避
- 免殺上線
- 3.1.3 C2 魔改
- 3.1.4 C2 隱匿
- 3.1.5 C2 準入
- 應用場景
- 安裝
- 配置說明
- 工具使用
- CS 配置監聽器
- 3.2 自研 C2 Demo
- 3.2.1 實現
- 構造定義gRPC API
- Server端
- Implant端
- Clinet端
- 編碼問題
- 流量加密
- 3.2.2 使用
- 編譯命令
- 3.3 另類 “C2”
- 四、T1588.002 其他工具
- 4.2 隧道工具
- 4.1.1 FRP
- 特征修改
- 運行后刪除配置文件
- 4.3 協同平臺
- 4.5 快速部署
紅隊是一種全范圍的多層攻擊模擬,旨在衡量公司的人員和網絡、應用程序和物理安全控制,用以抵御現實對手的攻擊。在紅隊交戰期間,訓練有素的安全顧問會制定攻擊方案,以揭示潛在的物理、硬件、軟件和人為漏洞。紅隊的參與也為壞的行為者和惡意內部人員提供了機會來破壞公司的系統和網絡,或者損壞其數據。
滲透測試中只關注給定目標系統的漏洞,紅隊測試則完全不一樣。紅隊在測試過程中關注的是如何規劃一條攻擊路徑來達到目的。在整個紅隊測試過程中不一定要也不一定會發現目標組織的漏洞,只要能達到目的,任何形式的攻擊手段都可以使用,包括但不限于web或者操作系統漏洞、社會工程學、物理滲透、攻擊上下游合作供應商等。
紅隊基礎設施建設是指在進行紅隊行動(模擬攻擊)前,搭建和配置一系列用于支持模擬攻擊的基礎設施和工具。紅隊基礎設施建設的目的是模擬真實世界中對抗惡意攻擊者的情境,以幫助組織測試其安全防御措施的有效性、檢測潛在的安全風險,并提供有針對性的安全培訓,在建設過程中應遵循以下原則:
- 1.基礎設施的匿名性(redteam服務器和域名等信息資產)
- 2.紅隊?具的匿名性(減少TTP被追蹤的可能性)
- 3.?絡通訊的匿名性(代理,VPN,物聯卡等)
- 4.?絡身份的匿名性(郵箱,社交賬號,虛擬身份等)
參考鏈接:
- 淺談紅隊基礎設施架構和配置
- Red-Team-Infrastructure-Wiki
- 紅隊基礎建設、你確定不來了解一下?
課題參考ATT&CK框架結構,從網絡、主機、工具三個層面進行技術分析
一、ATT&CK
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge)框架是由 MITRE 公司開發的一個用于描述和組織威脅行為的知識庫。該框架旨在提供一個共享的、詳細的、結構化的關于威脅者行為的資源,使安全專業人員能夠更好地理解、檢測和應對網絡攻擊。
ATT&CK框架的主要組成部分包括:
- 戰術(Tactics): 描述了攻擊者的高層次目標,涵蓋了攻擊的總體目標和策略。ATT&CK框架定義了多個戰術,如初始訪問(Initial Access)、執行(Execution)、持久性(Persistence)等
- 技術(Techniques): 描述了攻擊者在每個戰術下使用的具體技術。每個技術都是攻擊者實現目標的具體手段,如使用惡意軟件、繞過身份驗證等
- 過程(Procedures): 描述了攻擊者在執行特定技術時可能采用的具體步驟。這有助于更深入地理解攻擊者的操作方式
- 軟件(Software): 描述了攻擊者可能使用的特定惡意軟件和工具,包括惡意代碼、后門、漏洞利用工具等
- 持久性(Persistence): 描述了攻擊者在目標網絡中保持持久存在的方法,包括注冊表修改、定時任務、服務安裝等
文章參考了 ATT&CK 框架技術結構,主要體現使用
- T583(獲取基礎架構):攻擊者可能會購買、租賃或租用可在定位期間使用的基礎設施。存在用于托管和編排對手操作的各種基礎結構。基礎架構解決方案包括物理或云服務器、域和第三方 Web 服務。此外,僵尸網絡可供出租或購買
- T1588(獲取能力):攻擊者可能會購買和/或竊取可在瞄準過程中使用的功能。對手不是在內部開發自己的能力,而是可以購買、免費下載或竊取它們。活動可能包括獲取惡意軟件、軟件(包括許可證)、漏洞利用、證書以及與漏洞相關的信息。攻擊者可以獲得在對手生命周期的許多階段支持其操作的能力
參考鏈接:
- 基于ATT&CK攻擊框架整理的紅隊工具
- ATT&CK中文
二、T1583 獲取基礎架構
攻擊者可能會購買、租賃或租用可在定位期間使用的基礎設施。存在用于托管和編排對手操作的各種基礎結構。基礎架構解決方案包括物理或云服務器、域和第三方 Web 服務。此外,僵尸網絡可供出租或購買
2.1 匿名網絡
個人電腦網絡
攻擊隊在使用個人電腦網絡時,應遵守以下行為準則:
- 務必每人使用一個匿名物聯網流量卡,不使用單位熱點及個人熱點防止被溯源
- 使用軟路由或者代理進行流量轉發,防止網絡被封禁影響攻擊效率
- 提前購買代理池節點或這使用其他手段如:秒撥等手段實現快速 IP 切換,實現在 IP 被對方防火墻拉黑后快速切換,保證滲透測試的連續性
- 匿名上網做到身份隔離,這樣踩蜜罐后防守方也無法獲取有用信息
- 非本人賬號:非本人個人信息的微信號、QQ 號、脈脈賬號等社交軟件賬號
- 銀行卡“四件套”(一般是指銀行卡、對應綁定的手機卡、身份證和U盾)
相關參考:
- [勉強能用 匿名上網方案](file://192.168.137.1/e/iCloudDrive/_%E5%85%AC%E4%BC%97%E5%8F%B7%E5%A5%BD%E6%96%87/%E5%8B%89%E5%BC%BA%E8%83%BD%E7%94%A8%20%E5%8C%BF%E5%90%8D%E4%B8%8A%E7%BD%91%E6%96%B9%E6%A1%88.html)
- 紅隊行動之身份隱匿
- 匿名:《紅隊攻擊安全配置》
2.2 專用設備
如果使用專用電腦,最好是完全重裝系統之后的,保證沒有任何個人信息,包括個人文件,網頁瀏覽記錄,軟件登錄記錄等
2.3 滲透測試虛擬機
在沒有專用電腦的情況下,可以使用專用虛擬機來完成滲透測試工作,但是需要保證:
- 滲透測試虛擬機內無任何個人文件,所有攻擊操作在虛擬機內完成
- 關閉物理機的網絡,只保留虛擬機網絡,確保滲透測試虛擬機和物理機網絡不在同一網段
一般創建 2-3 臺虛擬機;三臺的話,一臺用于掃描探測、一臺用于實施滲透、一臺用于存儲/分析數據。如果是兩臺的話,掃描和滲透就用同一臺
物理機和虛擬機隔離
確保 VMware USB Arbitration Service 是開啟的
虛擬機->可移動設備->連接到虛擬機
將所有物理機網卡全部禁用,并將虛擬機設置為與隨身 WIFI 網段對應的靜態 IP,可以看到物理機處于斷網狀態,虛擬機正常上網
PC安全基線配置
- 用 VeraCrypt 將虛擬機與物理機的所有盤符(包括C盤)加密
然后再根據安全基線手冊,一條條加固,這里舉例部分:
- 開機按F12(不同版本的BIOS管理軟件快捷鍵不同,自行查詢)進入BIOS,在BIOS中將麥克風,攝像頭禁用(Disabled);將某些自動更新的選項禁用,不同的BIOS功能不同,請自行檢查
- 安裝操作系統時選擇合適的時區、語言、地區(不要選ZG時區、中文、ZG)設置;安裝界面的隱私設置下,將位置、診斷、相關廣告(AD ID)、語音識別、****診斷數據改進體驗等選項全部關閉**
- 自定義設置界面,將瀏覽器保護、連接和錯誤報告、自動連接到我的聯系人共享的網絡、向Microsoft發送錯誤和診斷信息**全部關閉
- 操作系統使用的用戶名盡量全部設置為常見的英文名,比如 Tom,Jerry 等等
- 應用軟件的安裝位置不要和系統盤一起,應用程序的自動隨操作系統的啟動一般情況下禁止;應用軟件從官方網站下載;SHA1 或者 MD5 的 Hash 值校驗
- 不要在瀏覽器留下任何隱私信息、任何賬號密碼、任何搜索記錄
- 盡量不要偷懶,每滲透完一個目標,就將虛擬機全部釋放,下次滲透別的目標時再重新安裝
- 后面還有很多比如安裝后的很多隱私信息,和敏感的服務一條條全部關閉。計劃任務、啟動項、端口、VMware、等等配置就不細說了,網上很多。做到這一步后即使踩到蜜罐,被蜜罐獲取到有效信息也不多了
- 盡量使用不帶有個人特色的工具、不常見的工具、未報過通用漏洞的自研工具、和及時將使用完的虛擬機釋放、等等值得注意的地方
三、T1588.002 C2
這部分為 ATT&CK 中 T1588.002 工具技術,這里我們特指 C2 工具
攻擊者可能會購買、竊取或下載可在瞄準過程中使用的軟件工具。工具可以是開源的或閉源的,免費的或商業的。工具可以被對手用于惡意目的,但(與惡意軟件不同)不打算用于這些目的(例如:PsExec)。工具獲取可能涉及商業軟件許可證的采購,包括Cobalt Strike等紅隊工具的采購。商業軟件可以通過購買、竊取許可證(或軟件的許可副本)或破解試用版獲得
C2 是指攻擊者使用的一種架構或系統,用于與已被入侵的目標進行通信和控制。攻擊者使用 C2 系統向受感染的計算機發送命令,以執行各種活動,例如數據盜竊、惡意軟件傳播、系統破壞等。C2 通常包括兩個主要組件:
- Command Server(命令服務器): 這是攻擊者使用的服務器,用于發布命令和控制被感染的系統。攻擊者可以通過命令服務器向受感染的計算機發送指令,例如下載和執行其他惡意軟件、竊取敏感信息等。
- Agent or Implant(代理或植入物): 這是在受感染的系統上運行的惡意軟件或代碼。該代理會連接到命令服務器,接收并執行從服務器發送的命令。這個代理通常隱藏在系統中,以避免被檢測和清除。
C2 體系結構是許多先進威脅和網絡攻擊的核心組成部分。對抗 C2 是網絡防御中的一個重要方面,包括檢測和阻止與 C2 服務器的通信、清除受感染的系統以及防范未來攻擊。在實際網絡安全操作中,分析 C2 系統的行為和通信模式對于檢測和響應潛在威脅至關重要
注意:所有工具開發及工具使用階段都應遵循 OPSEC 準則,全稱為Operations Security
,即行動安全
3.1 開源/商用 C2
3.1.1 C2 調研
C2 調研的目標是深入了解惡意 C2 網絡的運作方式,包括其協議、通信模式、加密手段、使用的工具和技術等。這有助于網絡安全專業人員更好地理解和防御與 C2 相關的威脅
- awesome-command-control
- C2Matrix 比較表格
Sliver
Sliver 是一款使用 GO 語言開發的開源 C2(Command and Control)框架,主要用于滲透測試和紅隊操作。這個框架被設計為輕量級、模塊化、易于使用,并提供了許多功能,使滲透測試人員和紅隊成員能夠遠程控制受感染的系統
Sliver 主要由四部分構成:
- 服務器控制臺 - 服務器控制臺是主界面,通過 sliver-server 可執行文件啟動,所有操作代碼都在客戶/服務器控制臺之間共享;服務器控制臺通過一個gRPC接口與服務器進行通信。
- Sliver C2 服務器 - Sliver C2 服務器是 sliver-server 可執行文件的一部分,管理內部數據庫,啟動和停止網絡監聽器。與服務器交互的主要接口是gRPC接口,所有的功能都是通過它實現的。
- 客戶端控制臺 - 客戶端控制臺是用于與Sliver C2服務器互動的主要用戶界面。
- 植入物 - 植入物是在目標系統上運行的惡意代碼(exe、ps1等)
參考文章:
-
威脅行為者Sliver C2框架使用分析(上)
-
紅隊工具研究篇 - Sliver C2
-
紅隊工具研究篇 - Sliver C2 通信流量分析
-
紅隊工具研究篇 - SliverC2 Stager研究(上)
-
紅隊工具研究篇 - SliverC2 Stager研究(下)
-
https://github.com/BishopFox/sliver-gui
Sliver 對比 CS
- sliver 支持 linux 系統
- beacon 通過指定參數實現沙箱繞過
- 支持多種協議并存通信
- 隱蔽性比 cs 要好
- 紅隊C2工具Sliver(一)| Sliver和CS及MSF的對比
3.1.2 CS Beacon流量分析
參考文章:
- Cobaltstrike4.0 學習——驗證機制學習
- Cobaltstrike4.0 學習——http分階段stagebeacon上線流量刨根問底
- 反制Cobaltstrike的那些手段
流量規避
- 定制 profile
- Cobalt Strike 的 ExternalC2
- 隨機生成 profile,使用項目https://github.com/threatexpress/random_c2_profile
直接使用腳本生成隨機的 profile 配置文件
在 CS 的 TeamServer 直接使用配置文件啟動
免殺上線
-
shellcode 加載器(實現較為簡單,需要學習cs shellcode)
推薦使用項目:https://github.com/Techryptic/Pokemon-Shellcode-Loader
可以對 shellcode 進行編碼從而繞過靜態檢測
-
自寫 cs beacon(只實現基礎功能較為簡單,但是cs功能較多,高級功能實現困難)
- https://github.com/darkr4y/geacon Geacon代碼學習&上線指南
- https://github.com/mai1zhi2/SharpBeacon
3.1.3 C2 魔改
c2 的魔改指 c2 進行破解和功能改造,4.7及以上的版本對于防破解做了很多改變,不再是雙端共用了,服務端的二進制文件無疑是加大了破解難度,針對 cs 代碼的學習可以參考 4.5 版本代碼使用雙端 java 容易理解
Cobalt Strike系列|從0開始破解
3.1.4 C2 隱匿
參考文章:
- 紅隊攻防基礎建設—神隱之路
- C2 基礎設施威脅情報對抗策略
- APT級CS隱藏教程:使用反向代理、C2-Profile和CDN拉滿溯源難度
常用的幾種方法:
- 更改端口和證書
- 更改 c2 默認配置
- 使用 Profile 與 CDN
接下來演示使用 CDN 域前置隱藏 C2
首先,需要有一個域名去接入 Cloudflare,域名可以去 Godaddy 或 namesilo 購買
-
更改域名 NS Server 到 Cloudflare
配置 DNS 的 A 記錄,解析到 VPS 的 IP,后續上線用
-
修改 cs profile 中的值,共有四處:
- https-certificate 塊中更改 keystore 和密碼
- http-stager、http-get、http-post 塊中的 Host Header
-
保存修改,然后準備我們的keystore。因為接入了CDN,所以證書我推薦直接使用Cloudflare提供的證書。CDN的坑會在下面講。當然要是沒有接入CDN的打算,可以使用letsencrypt這樣的免費證書。
使用默認配置生成證書和秘鑰后,復制粘貼到你的服務器上,這里我選擇的文件名是server.pem和server.key。
# 這里cdn.xxx.club是我的域名 openssl pkcs12 -export -in server.pem -inkey server.key -out cdn.xxx.club.p12 -name cdn.xxx.club -passout pass:123456 keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore cdn.xxx.club.store -srckeystore cdn.xxx.club.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias cdn.xxx.club
在生成keystore文件后將該文件放在CS的根目錄下,務必確保keystore文件名與密碼和https-certificate中設置的一致。
在一切準備就緒后可以使用CS自帶的c2lint對profile語法進行檢查,沒有報錯的話說明配置是ok的。
./c2lint jquery-c2.4.3.profile
需要注意的是免費版的Cloudflare對代理的端口有限制。我們只能成如下端口:
- http:80、8080、8880、2052、2082、2086、2095
- https:443、2053、2083、2087、2096、8443
3.1.5 C2 準入
- https://github.com/D00Movenok/BounceBack
- https://mp.weixin.qq.com/s/0oxXMeAnmQ5uMeby01tFxA
- C2 前端流量控制工具 - RedGuard
- 基于Caddy實現的C2前置代理 - RedCaddy
RedGuard,是一款 C2 設施前置流量控制技術的衍生作品,有著更加輕量的設計、高效的流量交互、以及使用 go 語言開發具有的可靠兼容性。它所解決的核心問題也是在面對日益復雜的紅藍攻防演練行動中,給予攻擊隊更加優秀的 C2 基礎設施隱匿方案,賦予 C2 設施的交互流量以流量控制功能,攔截那些“惡意”的分析流量,更好的完成整個攻擊任務
RedGuard是一個 C2 設施前置流量控制工具,可以避免 Blue Team,AVS,EDR,Cyberspace Search Engine的檢查
應用場景
- 攻防演練中防守方根據態勢感知平臺針對C2交互流量的分析溯源
- 根據 JA3 指紋庫識別防范云沙箱環境下針對木馬樣本的惡意分析
- 阻止惡意的請求來實施重放攻擊,實現混淆上線的效果
- 在明確上線服務器IP的情況下,以白名單的方式限制訪問交互流量的請求
- 防范網絡空間測繪技術針對 C2 設施的掃描識別,并重定向或攔截掃描探針的流量
- 支持對多個 C2 服務器的前置流量控制,并可實現域前置的效果實現負載均衡上線,達到隱匿的效果
- 能夠通過請求IP反查API接口針對根據 IP 地址的歸屬地進行地域性的主機上線限制
- 在不更改源碼的情況下,解決分階段 checksum8 規則路徑解析存在的強特征。
- 通過目標請求的攔截日志分析藍隊溯源行為,可用于跟蹤對等連接事件/問題
- 具有自定義對樣本合法交互的時間段進行設置,實現僅在工作時間段內進行流量交互的功能
- Malleable C2 Profile 解析器能夠嚴格根據 malleable profile 驗證入站 HTTP/S 請求,并在違規情況下丟棄外發數據包(支持Malleable Profiles 4.0+)
- 內置大量與安全廠商相關聯的設備、蜜罐、云沙箱的 IPV4 地址黑名單,實現自動攔截重定向請求流量
- 可通過自定義工具與樣本交互的 SSL 證書信息、重定向 URL,以規避工具流量的固定特征
安裝
可以直接下載并使用已經編譯好的版本,也可以遠程下載go包進行自主編譯執行。
git clone https://github.com/wikiZ/RedGuard.git
cd RedGuard
# 也可以使用upx壓縮編譯后的文件體積
go build -ldflags "-s -w" -trimpath
# 賦予工具可執行權限,并進行初始化操作
chmod +x ./RedGuard&&./RedGuard
配置說明
初始化,如下圖,首先對 RedGuard 賦予可執行權限并進行初始化操作,第一次運行會在當前用戶目錄下生成配置文件,以實現靈活的功能配置,配置文件名:.RedGuard_CobaltStrike.ini
配置文件
重點關注 3 個配置
- PORT_HTTPS
- PORT_HTTP
- HostTarget
如上圖,當前配置的意思是將 Port_http 的 80 端口綁定到本機 127.0.0.1 的 8080 端口,當有請求訪問服務器的 80 端口,RedGuard 會對請求特征做判斷,當請求不符合規則 (及 host 頭不是 360.net,這個可以隨意設置),請求會被重定向到 https://360.net,否則請求會被轉發到 cs 的監聽端口 8080 端口。請求會不會被重定向取決于 DROP 參數,如 DORP 參數設置為 true 將直接丟棄請求包
同理 ,443 端口被綁定到本機 127.0.0.1 的 8443 端口,當請求不符合規則時將請求重定向到 https://360.net,當 host 頭為 360.com 時將請求轉發到 cs 的 8443 監聽端口,主要取決于你 cs 的監聽器是 http 還是 https
更多設置,如過濾上線 ip、上線時間、上線省份請參考作者官方文檔 RedGuard 文檔
當然,這種場景適合將反代和 cs 服務器建在同一臺機器上,比較節省資源,配合 iptables 可防止網絡空間搜索引擎將你的服務器標記
工具使用
如果直接對反向代理的端口進行訪問,則會觸發攔截規則,這里通過輸出的日志可以看到客戶端請求根目錄,但是因為其請求過程未帶有請求的憑證,也就是正確的 HOST 請求頭所以觸發了基礎攔截的規則,流量被重定向到了https://360.net
CS 配置監聽器
以 https 監聽器為例:cs 新建監聽,c2 端口設置為 RedGaurd 的反代端口,bind 設置為 cs 的監聽端口,注意 host header 可以隨意設置,但一定要和配置文件里的一致
再配置 IPtables,只允許 127.0.0.1 訪問本機的 8443 端口
iptables -I INPUT -p tcp --dport 8443 -j DROP #丟棄所有訪問8443端口的包
iptables -I INPUT -p tcp -s 127.0.0.1 --dport 8443 -j ACCEPT #只允許127.0.0.1訪問本機的8443端口
3.2 自研 C2 Demo
3.2.1 實現
構建一個簡單的遠控木馬需要編寫三個獨立的部分:植入程序、服務端程序和管理程序
- 植入程序是運行在目標機器上的遠控木馬的一部分。植入程序會定期輪詢服務器以查找新的命令,然后將命令輸出發回給服務器
- 管理程序是運行在用戶機器上的客戶端,用于發出實際的命令
- 服務端則負責與植入程序和客戶端的交互,接收客戶端的指令,并在植入程序請求時,將命令發送給植入程序,隨后將植入程序發送來的結果傳遞給客戶端
項目結構
構造定義gRPC API
使用 Protobuf 作為數據傳輸格式,Protobuf 是一種與語言無關、與平臺無關,是一種可擴展的用于序列化和結構化數據的方法,常用于用于通信協議,數據存儲等
- ProtoBuf 是一種序列化數據結構的協議
- protoc 是一個能把 proto 數據結構轉換為各種語言代碼的工具
- RPC 是一種 通信協議
- gRPC是一種使用 ProtoBuf 作為接口描述語言的一個 RPC 實現方案
protobuf 可以把結構體序列化成二進制,也可以把對應二進制反序列化回結構體。說白了 pb 單純就是做編解碼。你可以把你程序中的一些對象用 pb 序列化,然后存到本地文件,過一會兒再讀取文件,然后恢復出那些對象
Service
在 proto 文件中定義了兩個service,分別對應植入程序服務端和管理程序服務端
在植入程序服務中,定義了三個方法FetchCommand、SendOutput和GetSleepTime
FetchCommand:將從服務器檢索所有為執行的命令
SendOutput:會將一個Command消息發送服務器
GetSleepTime:從服務端檢索sleep時間間隔
在管理程序服務中,定義的兩個方法RunCommand和SetSleepTime
RunCommand:接收一個Command消息作為參數,并期望獲讀回一個Command消息
SetSleepTime:向服務器發送一個SleepTime消息作為時間間隔
Message
最后看到定義的三個message:Command、SleepTime和Empty
Command:消息中的兩個參數分別代表了輸入的命令和命令對應的結果。都為string類型,要說明的是后面兩個數字是代表了消息本身兩個字段出現的偏移量,也就是In將首先出現,然后是Out
SleepTime:唯一 一個字段就是用來標明休眠時間間隔的
Empty:用來代替null的空消息 定義這個Empty類型是由于gRPC不顯式地允許空值
protobuf 文件如下,其中
syntax = "proto3";
package grpcapi;
option go_package = "./grpcapi";
service Implant {rpc FetchCommand (Empty) returns (Command);rpc SendOutput (Command) returns (Empty);rpc GetSleepTime(Empty) returns (SleepTime);
}service Admin {rpc RunCommand (Command) returns (Command);rpc SetSleepTime(SleepTime) returns (Empty);
}//Command消息包含兩個字段,一個用于維護操作系統的命令;一個用于維護命令執行的輸出
message Command {string In = 1;string Out = 2;
}
message SleepTime {int32 time = 1;
}//Empty 用來代替null的空消息 定義這個Empty類型是由于gRPC不顯式地允許空值
message Empty {
}
生成對應的 go 文件
-
Windows 安裝 protoc
protoc 下載:[官方下載地址],然后將 bin 路徑添加到 path 環境變量下去
-
安裝 protoc-gen-go 插件
# 需要 GOOS=linux,可以使用命令 go env -w GOOS=linux,確保生成的是 EXE 可執行文件 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
將生成的 exe 文件放到 $GPATH/bin 目錄下,確保可以直接訪問執行
-
編譯 Proto 文件
對于Golang使用如下命令編譯
.proto
文件。會根據你的.proto
文件生成Go文件這個生成的新文件回包含Protobuf模式中創建的服務和消息的結構和結構體定義。后續將利用它構造服務端、植入程序和客戶端
protoc --go_out=./ --go-grpc_opt=require_unimplemented_servers=false --go-grpc_out=./ implant.proto
Server端
首先,創建兩個結構體adminServer
和implantServer
,它們都包含兩個 Command 通道,用于發送和接收命令以及命令的輸出。這兩個結構體會實現 gRPC API 中定義的服務端接口。并且需要為這兩個結構體定義輔助函數NewAdminServer
和NewImplantServer
,用于創建新的實例,可以確保通道正確的初始化
implantServer
對于植入程序服務端,需要實現的方法有FetchCommand()
、SendOutput()
和GetSleepTime()
-
*FetchCommand:*植入程序將調用方法 FetchCommand 作為一種輪詢機制,它會詢問“有工作給我嗎?”。在代碼中,將根據select語句,當 work 通道中有數據時會從中讀取數據到實例化的 Command 中,并返回。如果沒有讀取到數據,就會返回一個空的 Command
-
*SendOutput:*將接收一個 Command,其中包含了從植入程序中獲取的命令執行的結果。并將這個 Command 推送到 output 通道中,以便管理程序的后續讀取
-
GetSleepTime:植入程序在每次sleep之前就會調用此方法,向服務端詢問sleep的時間。這個方法將返回從變量sleepTIme中讀取到的數據
adminServer
對于管理程序服務端,需要實現的方法有RunCommand
和SetSleepTime
*RunCommand:*該方法接收一個尚未發送到植入程序的 Command,它表示管理程序希望在植入程序上執行的工作。并將工作發送給 work 通道。因為使用無緩沖的通道,該操作將會阻塞程序的執行,但同時又需要從 output 通道中接收數據,因此使用 goroutine 將工作放入 work 通道中
調用這個方法時,會將命令發送給服務端,并等待植入程序執行完后的發送回的結果
*SetSleepTime:*管理程序客戶端調用此方法,將從命令行輸入的時間發送給服務端后,設置到 sleepTIme 變量中
Implant端
使用 grpc 通道連接 Server 端,每過 sleep 時間輪詢 FetchCommand 一次獲取要執行的命令,負責具體命令的實現,支持截圖、文件上傳、文件下載功能
-
截圖功能借助于
github.com/kbinani/screenshot
實現植入端獲取到截圖命令后,會先獲取當前屏幕的數量,并根據順序進行截圖,并將圖片存放到
[]byte
字節切片中,進行加密編碼后發出 -
上傳文件,要求輸入的格式為
upload 本地文件 目標文件
管理程序會根據輸入的本地文件,將本地文件讀取到
[]byte
字節切片當中,并進行AES加密和BASE64編碼。也就是說最終向服務端傳遞的數據將變成經過加密、編碼后的字符串。這里會將這個字符串存放在Command.Out中。這里可能游戲額難以理解,command.Out不是用來存放執行結果的嗎?其實在服務端中,會將管理程序客戶端的命令放到work中,然后將植入程序執行完以后會才會將結果封裝在command.Out,而在這之前command.Out是空的。這里上傳文件實際上是在管理程序客戶端時“借用”command.Out的位置,將要上傳的數據與上傳命令一起發送給植入程序 -
下載文件, 要求輸入的格式為
download 目標文件 本地文件
客戶端將下載命令發送給服務端。客戶端會從
cmd.out
中讀取到數據后解密,并根據用戶輸入的本地文件寫入文件
Clinet端
Client 端通過連接 Server 端后發送命令,獲取命令執行結果
編碼問題
go 的編碼是 UTF-8,而 CMD 的活動頁是 GBK 編碼的,因此使用 GoLang 進行命令執行時,對于命令執行結果返回的中文會產生亂碼的現象
雖然在植入程序中會執行命令,但是在通過植入程序再向服務端發送結果時由于包含亂碼,植入程序向服務端發送的數據為空。(因此服務端就沒有接收這個數據),result 中沒有數據,所以植入程序的服務端在向 output 輸入數據時會阻塞。由于管理服務端和植入程序服務端共享通道,output 中沒有數據,進而引發管理服務端也阻塞(直到 output 中有數據)
中文亂碼問題的解決依賴于golang.org/x/text/encoding/simplifiedchinese
當然在解決掉亂碼問題后,這一問題也就消失了
流量加密
管理程序客戶端獲取到用戶從命令行鍵入的命令,將對這個命令進行 base64+aes 加密,再發送給服務端。服務端接收到這個消息后,直接將消息寫入通道中
待植入程序客請求服務端時,就會讀取到這段密文,進行解密后執行命令,并將執行的結果進行加密發送給服務端。最終管理程序會從結果通道中讀取到執行的結果,解密后并進行編碼格式的轉變,輸出到控制臺
3.2.2 使用
server:運行在服務端,通過參數iport和aport指定植入程序和客戶端對應的端口號
server.exe -iport 1961 -aport 1962-aport intAdmin server port (default 1962)
-iport intImplant server port (default 1961)
client
client.exe -session start -IP 127.0.0.1 -port 1962 -sleep 5-ip stringServer IP (default "127.0.0.1")
-port intAdminServer Port (default 1962)-session stringstart session-sleep intsleep time
截圖以png格式保存client.exe運行目錄下
上傳、下載文件大小限制在10MB內
截圖: screenshot
上傳: upload 本地文件 目標文件
下載: download 目標文件 本地文件
編譯命令
# windows 交叉編譯
go env -w CGO_ENABLED=0
go env -w GOOS=linux
go build -ldflags "-s -w" -trimpath -o output.exe
3.3 另類 “C2”
- 云上天然cs遠控
- 集權設備既c2
- intel 相關工具:V Pro,Intel AMT
四、T1588.002 其他工具
4.2 隧道工具
4.1.1 FRP
在 frp 使用時開啟 tls_enable 參數、use_compression 參數可以視情況而定
-
在開啟 use_encryption = true 參數之后,基礎特征以及源 ip 地址沒有被加密,目的地址和代理的口令被加密了
-
在開啟了 tls 加密之后 內容變成加密的了,tls_enable = true,建立鏈接的時候第一個字節為0x17
特征修改
-
修改連接時的交互信息
注釋寫的很清楚,當 frpc 即客戶端建立連接時,會發送以下信息給服務端
將其任意修改為其它信息即可
源 IP 信息修改
-
修改版本信息 pkg/util/version/version.go
-
修改 tls 首字節
修改 pkg/util/net/tls.go 文件中 FRPTLSHeadByte 參數的值
運行后刪除配置文件
frp 原來使用 -c 參數指定 ini 文件來運行,但是 ini 配置文件中直接泄露了我們 vps 的地址,非常的不安全,有以下幾種方法實現
1.加上命令行參數
這種查命令其實還是容易被發現,需要再加一層參數加解密
2.遠程加載配置文件
這樣需要通過域名或者 ip 解析遠程加載,也需要花時間隱藏
3.執行后刪除 frpc.ini
這種方法比直接在源碼中寫死更靈活,也能很有效的隱藏
直接使用第三種方法,在 frpc\sub\root.go 文件 init 方法中添加一個參數,false 表示默認不刪除,加 -d 參數刪除
在 startService 函數下添加刪除函數
重新編譯
交叉編譯設置&&編譯
常見的系統、架構:常見系統及架構_123hello123的博客-CSDN博客禁用CGO
set CGO_ENABLED=0
設置目標平臺為linux / windows
set GOOS=windows # go env -w GOOS=linux
設置目標處理器架構是amd64
set GOARCH=amd64
編譯frps.exe
go build -trimpath -ldflags "-s -w" -buildvcs=false -o bin/frps.exe ./cmd/frps
編譯frpc.exe
go build -trimpath -ldflags "-s -w" -buildvcs=false -o bin/frpc.exe ./cmd/frpc
參考文章:
- 【神兵利器】手把手教你魔改frp
- FRP改造計劃
- 其他:加殼再改特征
4.3 協同平臺
認證方式:401 認證 + 網頁登錄密碼認證
攻防演練過程中團隊協同面臨以下幾點考驗
- 部分隊員被"隔離",信息同步困難
- 涉及大量企業敏感信息,在互聯網平臺存儲存在安全風險
經過綜合對比幾款開源的團隊協同平臺
名稱 | 鏈接 | 優點 | 缺點 |
---|---|---|---|
EtherPad | https://github.com/ether/etherpad-lite | 界面簡潔,具備基礎功能,插件豐富 | 不能上傳文件,聊天功能太過弱化不能上傳圖片 |
Collaborative-Platform | https://github.com/zach-xing/Collaborative-Platform | 最符合需求 | 沒有開源,文檔不全,產品化程度低,需要引用阿里云oss存儲 |
hedgedoc | https://github.com/hedgedoc/hedgedoc | md文檔編輯器 | 沒有聊天功能 |
4.5 快速部署
- 紅/藍隊環境自動化部署工具
- QAX-A-Team/LuWu 紅隊基礎設施自動化部署工具
有價值的星球:
- 攻擊隊之家
- 漏洞百出,代碼審計,賽博回憶錄
- 黑客在思考和他的朋友們
- dot net安全矩陣