2011年12月16日 星期五

第三者 Ethernet 抓封包

(修改自 Wireshark 的圖片)
要研究 router 跟某台機器之間封包,一種可能是直接在這台機器安裝 Wireshark 等抓封包分析軟體來使用,但如果那台機器不是一般電腦,可能就無法安裝軟體。這時候需要另一台電腦安裝 Wireshark、接上獨立的或內建於 router 的 Ethernet switch,但這樣封包是不會跑過來的,因為現在的 Ethernet switch (或號稱 Ethernet Hub) 都採用 bridging 處理,由目標 MAC 位址決定只會送到特定的 Ethernet switch 埠。

如此一來,就可能需要其它特別的硬體配合,例如找以前舊式的 Ethernet Hub、找支援 monitoring 或 mirroring 的高階 Ethernet switch、有兩個 Ethernet 介面的電腦、使用 Passive Ethernet TAP、使用 Passive Ethernet Hub 等。

也有純粹軟體的解法,一種方式是利用 ARP Poisoning (或稱 ARP spoofing),放 ARP 毒藥給雙方,分別告訴雙方的對方是自己的 MAC 位址,掩蓋正常的 ARP,這樣雙方之間的封包就會送到自己的 MAC 位址,自己再分別轉送來維持他們通訊暢通,自己也順便「觀察」。程式 ettercap 有支援,這是我認為最方便的方式。

使用步驟如下:
  1. 安裝 ettercap,我安裝個板本是 NG-0.73
    • sudo apt-get install ettercap-gtk
  2. 執行 ettercap
    1. 「Sniff」→「Unifed Sniffing」,選自己的網卡。 (不知為何,此步驟會將 /proc/sys/net/ipv4/ip_forward 設為 0)
    2. 「Hosts」→「Scan for hosts」。會對子網上每個 IP 發 ARP 詢問。
    3. 「Hosts」→「Hosts lists」,將雙方分別「Add to Target 1」及「Add to Target 2」。 
    4. 「Mitm」→「Arp Poisoning。此時開始假冒雙方,會先 ping 雙方,再多次 ARP 雙方,雙方間的封包就會跑過來了
  3. 啟用 IP 轉發功能,維持被觀察機器的通訊暢通。(似乎不能直接 sudo 執行,所以先變成 root 再執行)
    • sudo -i
    • echo 1 > /proc/sys/net/ipv4/ip_forward
    • exit
  4. 此時 Wireshark 可以抓到雙方間的封包,封包會看到兩份,一份是進來的,一份是轉發出去的,兩者的來源 MAC 位址跟目標 MAC 位址是不同的。
  5. 停止 Arp Poisoning
    • 在 ettercap,「Mitm」→「Stop mitm attack(s)」。
註:步驟 2. 3. 4. 可以隨意組合,例如 IP 轉發可以在後來想要啟用時才啟用,但注意 ettercap 的「Sniff」→「Unifed Sniffing」會將 /proc/sys/net/ipv4/ip_forward 設為 0。
註:ettercap 也有 Windows 版,在 http://sourceforge.net/projects/ettercap/files/unofficial%20binaries/windows/ 下載。
註:Mitm 是 man-in-the-middle。
註:由此可知,你的封包是很容易被觀察的,即使硬體都沒動到。但用 ARP Poisoning 也不是都能成功,機器的 ARP 表改用靜態的、router 紀錄並檢查每個 IP 位址的 MAC 位址等可以防止封包被導向。監聽是否有異常的 ARP 回應也可以發現。
註:還有別的軟體方式,例如 MAC Flooding,用封包把 Ethernet switch 的 MAC Table 灌爆,而將所有封包都 broadcast 處理。dsniff 等軟體有支援這種功能。

參考:
  1. Wireshark: Ethernet capture setup (說明許多抓封包方式)
  2. Ettercap MITM攻擊詳細教學 (裡面所言並不是所有步驟都需要)
2011/12/20:修正 ettercap 的「Sniff」→「Unifed Sniffing」會造成 /proc/sys/net/ipv4/ip_forward 設為 0

延伸閱讀

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...