前言
上一篇ARP欺騙與中間人攻擊講到了MITM攻擊的基礎和原理,並且在實驗中成功對網關和目標主機進行了ARP毒化,從而使得無論目標的外出數據或流入數據都會經過本機這個“中間人”。在上篇后記里也略為提及到,中間人可以做的事情有很多,但是沒有詳細介紹。因此本文就來談談如何截取目標流量以及如何對目標看似雜亂無章的數據進行提取,分析和修改。
流量分析
通常我們成功變成中間人之后,會一直捕捉目標的流量數據並且保存為本地的cap文件,然后再用工具對數據信息進行分析。流量抓取的方式有很多,比如Linux下的tcpdump(Window下為Windump),ettercap和wireshark(曾經的ehtereal)等,但是說到流量分析,就不能不提到大名鼎鼎的Wireshark。wireshark是一款用於網絡封包的協議分析的開源軟件,其最基本的功能就是捕捉指定網絡接口的流量數據,並且按照其協議格式顯示。我們這里僅用其來捕捉和分析數據,網絡專家還可以用它來debug網絡協議實現細節,檢查安全問題,網絡協議內部構件等等。
過濾報文
面對大量來自各個客戶端各種協議的報文,我們需要對其進行過濾篩選,比如指定IP地址的HTTP報文等過濾條件,可以在filter欄里直接寫過濾條件,或者在Analyze->Display Filter里面定義並添加自己的過濾條件。另外Wireshark還提供了追蹤TCP/UDP流的功能,直接右鍵封包點擊Follow TCP stream即可看見服務器和目標之間的全部會話,值得注意的是,關閉會話數據窗口后,過濾條件會被自動引用。
雖然我們暫時不必理解各個協議的實現細節,但是對基本的HTTP,TCP/IP和ARP等協議的層次結構還是需要有一定理解的,況且到了某個階段當我們不滿足於僅僅用腳本進行攻擊的時候,仍然還是需要了解協議實現細節並找到攻擊漏洞,當然這是后話了。常見協議的基本模型如下圖所示:
統計信息
在wireshark的標題欄中有一個選項Statistics里面包含了許多本次capfile的統計信息,如wireshark的IO Graphs等,我們可以用wireshark的IO Graphs工具來分析抓包的數據流。IO Graphs是一個非常好用的工具。基本的Wireshark IO graph會顯示抓包文件中的整體流量情況,通常是以每秒為單位(報文數或字節數)。默認X軸時間間隔是1秒,Y軸是每一時間間隔的報文數。如果想要查看 每秒bit數或byte數,點擊“Unit”,在“Y Axis”下拉列表中選擇想要查看的內容。這是一種基本的應用,對於查看流量中的波峰/波谷很有幫助。另外還可以查看protocol hierarchy(顯示捕捉文件包含的所有協議的樹狀分支);也可以查看會話統計(conversation)。
這里單獨說一下Statistics里的HTTP統計。分別可以查看packet counter,requests 和 load distribution的信息,針對每個信息,還可以設置特定的過濾規則,如要獲得指定HTTP主機的統計信息,設置過濾條件http.host contains <host_name> 或 http.host==<host_name>,再如,通過設置過濾條件http.host contains xxoo.com,可以獲得站點xxoo.com的統計信息。值得一提的是,當我們打開一個網頁,通常會向若干個URL發送請求,比如頁面重定向,外鏈和廣告等,可以自己設置合適的規則來過濾。比如目標主機瀏覽了豆瓣,知乎和dudata,
全部截取的http request流量是這樣的:
經過自定義過濾規則,可以把一些不必要的信息去掉,下面的過濾規則為 http.host contains www
wireshark還有很多其他功能,比如以endpoint來查看數據包的統計信息等,總而言之,wireshark是個很強大的網絡分析工具,詳細的用法可以自己在幫助手冊中查看。
會話劫持
會話劫持(session hijacker)是最基本的一種中間人攻擊手段。攻擊者通過分析目標的HTTP流量來獲得其賬戶的cookie,從而用此信息來取得含有身份信息的會話頁面。其原理十分簡單,就是用工具(如上面的wireshark)在捕捉到的數據包里提取出HTTP數據中含有cookie字段的信息,然后用工具(如火狐瀏覽器的Firebug)按樣填寫cookie對應字段即可登錄原網站。我這里是用了火狐的Greasemonkey+cookie injector來實現cookie的登錄。值得一提的是,Greasemonkey是一個非常有用的瀏覽器插件,可以根據瀏覽的網站來執行特定的javascript腳本,比如cookie injector就是一個根據wireshark復制的cookie格式來登錄頁面的一個js腳本,從而可以在自己的瀏覽器上登錄目標帳號。此外在這個網站還能找到其他很多有意思的腳本,可以自己去發掘。
除了用傳統方式劫持會話,還有一些其他的小工具可以使這個過程變得簡單化,比如ferret和hamster等等。
會話修改
會話劫持可以有效窺視目標的隱私信息,但是中間人能做的不止於此。既然目標所接收到的數據都是經過中間人轉發的,那么中間人自然可以對其進行修改。這里要用到ettercap工具,之前也提到過很多次了,這里就稍微詳細介紹一下。ettercap是一個多用途的嗅探器/內容過濾器,常用於中間人的攻擊中。其一般命令格式為:
ettercap [OPTIONS] [TARGET1] [TARGET2]
其中, TARGET可以是MAC/IP/IPV6/端口,其中IP和端口可以用范圍表示,比如/192.168.1.100-120/20,22
修改網頁內容
ettercap有強大的過濾腳本功能,其原理是對要轉發到目標的數據包進行修改,可以實現替換網頁內容、替換下載鏈接和插入js腳本等效果。過濾腳本是指在ettercap中用於描述修改規則的.filter文件,下面舉例說明。
首先是在目標請求的網頁里插入js腳本,這里以最簡單的彈窗為例,etterfilter過濾腳本如下:
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 (ip.proto == TCP && tcp.src == 80) { replace("<head>", "<head><script type="text/javascript">alert('big brother is watching at you');</script>"); replace("<HEAD>", "<HEAD><script type="text/javascript">alert('big brother is watching at you');</script>"); msg("Injecting OK!!\n"); }
過濾腳本的語法很簡單,可以直接man etterfilter查看。上述腳本的第一個if塊的含義是使得請求的數據包不要進行壓縮。需要特別注意的是,if和括號之間必須有空格,而函數和括號之間不能有空格。將上述過濾腳本保存為alert.filter,然后編譯:
etterfilter alert.filter -o alert.ef
其中編譯后的alert.ef是ettercap可識別的二進制過濾文件。
這里假設要攻擊的目標為192.168.1.106,網關為192.168.1.1,使用上述過濾腳本進行攻擊的方法為:
ettercap -i wlan0 -Tq -M arp:remote /192.168.1.106/ /192.168.1.1/ -F alert.ef
運行后當目標用瀏覽器瀏覽http網站的時候,就會出現彈窗顯示“big brother is watching at you”
除了插入腳本,還可以替換網頁的圖片和文本等內容,這里以替換圖片為例,過濾腳本為:
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 (ip.proto == TCP && tcp.src == 80)
{ replace("img src=", "img src=\"http://www.irongeek.com/images/jollypwn.png\" "); replace("IMG SRC=", "img src=\"http://www.irongeek.com/images/jollypwn.png\" "); msg("Replace OK.\n"); }
運行方法還是與之前類似。這里用到了內置函數replace(),etterfilter里還有很多有用的內置函數,詳情可以在manpage中查看。
替換效果如下:
DNS欺騙
DNS為域名解析,即從url網址到ip地址的轉換過程,通過DNS欺騙,我們可以把目標的請求重定向到指定的ip地址去,比如釣魚地址。利用現有的工具,比如SET(social engineering toolkit)就可以很容易偽造釣魚網站從而使目標上當,當然這是后話了。通過ettercap的dns_spoof插件就可以對目標的DNS進行污染,值得一提的是,ettercap里有很多插件,都通過-P選項來調用。
要使用DNS欺騙,首先修改/usr/local/share/ettercap/etter.dns文件,添加對應的url到ip的映射關系,
baidu.com A 202.89.233.101
*.baidu.com A 202.89.233.101
www.baidu.com PTR 202.89.233.101
然后再運行
ettercap -i wlan0 -Tq -M arp:remote /192.168.1.106/ /192.168.1.1/ -P dns_spoof
此時目標(192.168.1.106)訪問百度的時候,就會被重定向到202.89.233.101,這里注意的是前提要目標之前最近沒訪問過百度,也就是說要求目標DNS緩存里沒有百度的ip,否則就需要刷新其DNS緩存才能生效。
針對SSL的中間人攻擊
在中間人嗅探目標和服務器之間的流量的時候,如果目標使用的是HTTP鏈接,當其填寫表單並提交的時候,我們一般可以捕捉到明文的帳號密碼信息。然而,如果目標使用的是HTTPS,則我們抓到的數據是加密過的亂碼,無法得到有用的信息。HTTPS即為HTTP+SSL,在應用層和網絡層之間加入了SSL(加密套接字協議層)。具體的協議詳情就不說了,只講一下在這種情況下的應對方法。
SSL卸載
SSL卸載的原理是,利用目標的疏忽,將其HTTPS鏈接替換成HTTP,從而達到嗅探明文信息的目的。這里使用Moxie Marlinspike開發的sslstrip工具來實現:
首先打開sslstrip,指定監聽的端口,默認為端口10000,這里使用默認端口,“-l 10000“可以不寫。
sslstrip -l 10000
然后開啟內核轉發,將HTTP(80端口)的流量轉發到sslstrip監聽的端口上去。關於轉發的具體選項可以參考我上一篇ARP欺騙與中間人攻擊。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 10000
最后使用ettercap進行中間人攻擊
ettercap -i wlan0 -Tq -M arp:remote /192.168.1.106/ /192.168.1.1/
此時目標訪問https的網站時,會自動變成http,於是我們就能抓取明文的數據了。
偽造SSL證書
要偽造SSL證書,需要了解SSL的認證過程,其主要分為服務器認證和用戶認證兩個階段,其中:
服務器認證階段:1)客戶端向服務器發送一個開始信息“Hello”以便開始一個新的會話連接;2)服務器根據客戶的信息確定是否需要生成新的主密鑰,如需要則服務器在響應客戶的“Hello”信息時將包含生成主密鑰所需的信息;3)客戶根據收到的服務器響應信息,產生一個主密鑰,並用服務器的公開密鑰加密后傳給服務器;4)服務器回復該主密鑰,並返回給客戶一個用主密鑰認證的信息,以此讓客戶認證服務器。用戶認證階段:在此之前,服務器已經通過了客戶認證,這一階段主要完成對客戶的認證。經認證的服務器發送一個提問給客戶,客戶則返回(數字)簽名后的提問和其公開密鑰,從而向服務器提供認證。
作為中間人,我們可以在認證過程中也插一腳。大體流程如下:
首先偽造一組rsa公/私鑰對,可以用openssl來生成:
openssl genrsa -out private.key 1024 openssl rsa -in private.key -pubout -out public.key
由於SSL協議走的不是80端口而是443端口,我們需要開啟本機內核轉發功能,用iptable將流向網關和目標的443端口數據重定向到本機:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to 192.168.1.100 (假設192.168.1.100是攻擊者IP)
最后在本機上對目標和服務器進行雙向SSL認證,結果使得目標和中間人進行了SSL鏈接,中間人和服務器進行SSL鏈接,這樣中間人轉發數據的同時,也擁有了明文的信息。具體實現可以用libssl+socket自己寫,限於篇幅這里就不細說了。另外值得一提的是,對於偽造的SSL證書,目標瀏覽器在上網的時候會提示該證書不受信任,因此這只是提供一種思路,除非目標十分粗心大意,否則並沒有太大的攻擊效用。
SSL/TLS破解
要知道SSL采用RSA加密,要暴力破解幾乎是不可能的,但是由於SSL/TLS中使用"記錄協議數據包"來封裝上層的應用數據,而且 SSL/TLS使用CBC加密模式進行分組對稱加密,不同"記錄協議數據包"之間並不是獨立的IV,不同的數據包之間形成一個整體的CBC模式 ,因此 攻擊者可以在返回流量中注入js代碼,根據攻擊者已知的IV和Ciper,來窮舉出下一個數據包中包含的cookie信息,從而破解出HTTPS的明文數據。具體實現過程可以參考討論相關技術的博文,如BEAST、CRIME等針對openssl漏洞的攻擊。
后記
中間人攻擊的手段多種多樣,用於MITM攻擊的工具也已經有很多,比如driftnet、dsniff、ettercap、sslstrip等,本文主要介紹了其中的一部分;但是最主要的還是要理解其原理,即ARP,修改以及轉發,知道其工作過程后,我們甚至可以不借助工具,通過socket編程就能自己寫一個簡單的中間人攻擊程序。另外作為一個普通的用戶而言,面對中間人的潛在威脅,也需要提高自己的安全防范意識,比如盡量使用https鏈接保護自身隱私,對於SSL證書的異常提醒也要非常注意,尤其是在涉及到金錢交易的網站之時,更是需要小心慎重,以免落入他人的陷阱之中。