先前有在 Facebook 貼文分享關於 Egress Busting 的內容,但由於貼文會被洗掉,所以發一篇文章留個紀錄。
HackerCat 臉書粉絲專頁:https://www.facebook.com/hackercat1215/
先前跟同事聊天,同事提到他滲透時遇到一台目標主機,有跟我說主機上有做出站限制,沒辦法對外連線。我就反問了一下他是怎麼知道的(當然我完全相信他的判斷是正確),有沒有做Egress Buster。
所以這篇就是來分享一下甚麼是 Egress Busting(也可稱Egress Buster),其實是一個在後滲透來說相對重要卻經常被忽略的小東西。Egress Busting 是一種技術概念,較長於滲透測試、紅隊演練(Red Teaming)、威脅獵捕(Threat Hunting)中出現。
Egress Busting 指的是測試與識別從內部網路到外部網路(出口流量, egress traffic)是否存在可用的連線路徑或安全設備的防護弱點。這通常是攻擊者或滲透測試人員在內部網路取得一定的存取權限後,用來找出可以用來向外部傳輸數據(如 C2 連線)的方法。
Egress busting 的目的通常是:
- 繞過防火牆規則 – 測試是否有未受控的對外連線端口
- 識別允許的協議 – 測試哪些協議(如 HTTP、DNS、ICMP)可以正常通行
- 發掘安全設備的監測能力 – 觀察 SIEM、NDR 或 EDR 是否能偵測或封鎖異常流量
不賣弄技術名詞,白話來說,就是我現在入侵一台主機之後,我要測試該主機有甚麼可以向外面發起連線或是往外傳輸數據的管道。
從 Reverse Shell 來理解
我提一下我自己的觀點 (相信很多人跟我也一樣)。
從一個大家如果常打靶機要取得 reverse shell 的問題來舉例解釋。你今天可以執行 RCE,你使用了一個 reverse shell 的payload,那你攻擊主機的 Listening Port會用甚麼呢?
(1) 第一個首先我會使用常見 Port,也就是 53,80,443,3389 這些常見協定的 Port 來監聽。
(2) 其次可能是透過 Port Scan 結果上面發現的 Port。例如我 Port Scan 發現在目標主機有開啟 25,143,8080 Port 之類,我的反向監聽就用他有開啟的 Port。有人可能會想說這沒道理阿,inbound 跟 outbound 的規則是可以分開的,不一定 inbound通,你就可以 outbound 出來。確實是這樣沒錯,但一來是有可能基於各種原因所以雙向開通,第二個是有些滲透練習平台的靶機都喜歡搞這招 XD
(3) 第三個就是你在第一二種方法都找不到有哪個 Port 可以出站(outbound) 的時候,就要使用到這篇提到的 Egress busting 。透過在目標主機上面執行指令,往攻擊機的每個 Port 丟一個封包(類似反向的Port Scan,但目的與用途不同)。在攻擊機上面我們可以用 wireshark 或 tcpdump 看有哪一個封包是有成功到達的。攻擊機上沒有沒有監聽服務不重要,只是要看封包有沒有成功回來,因為只要有一個是有通的,我們至少就可以確認該 Port 的出站是通的,並沒有被防火牆規則或其他設備阻擋。
Egress Busting 方法
即使前面提到的 Egress busting 都有省略一個詞,叫做 Port。也就是我們這篇文章專注的只有 Port-based Egress busting,是關注在於防火牆對外連線當中有哪些 Port 是可以對外通行的。
要執行這類型的 Egress busting,首先要在攻擊者主機上使用 wireshark 或 tcpdump 監聽。
接著在目標主機下可以使用下列任一方法來進行。
若目標上有 nmap,可以直接使用 nmap 對攻擊者主機 IP 進行全部 port 掃描,測試哪些 TCP/UDP 端口可以連出:
nmap -Pn -sT -p 1-65535 <external-server>
Code language: HTML, XML (xml)
如果目標是 Linux 主機,可以使用一句話 Bash 指令:
for p in {1..65535}; do (echo > /dev/tcp/<external-server>/$p) >/dev/null 2>&1 && echo "Port $p open"; done
Code language: PHP (php)
如果目標是 Windows 主機,可以使用一句話 Powershell 指令:
1..65535 | % {try{$c=New-Object Net.Sockets.TcpClient;$c.Connect("<external-server>",$_)}catch{}}
Code language: PHP (php)
Egress Busting vs. Port Scan
也補充一下 Egress Busting 跟 Port Scan 的區別。
Port Scan 主要是指外部攻擊者與滲透人員用來探測內部網路的開放端口,分析攻擊面;而 Egress Busting 則是內部攻擊者(攻擊者已入侵到內部)或滲透測試人員測試對外連線的可能性。兩者的技術雖然有類似之處,但方向與用途不同。
Port Scan 目的是關注在主機上面有開放的端口以及服務;而 Egress Busting 的情況下,並不在意目標端的端口是否有開啟(如同前面的範例,我們的攻擊主機其實都沒有開啟任何端口服務),關注的是防火牆或是防護設備允許的規則,查看有哪些 Port 或是協定是可以通訊的。
Egress Busting | Port Scan | |
方向性 | 內部→外部 | 外部→內部 |
目的 | 測試哪些端口/協議可以對外連線 | 探測內部主機開放的端口 |
攻擊者視角 | 已進入內部網路,嘗試對外建立連線 | 外部攻擊者試圖找到可入侵的目標 |