bettercap 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14c3df538db89404723e56bde2c2a8a92446d8f9
4
- data.tar.gz: 7b48c98712b2c2b879f6e7bfc67529627ba1668d
3
+ metadata.gz: 54766752ef4193add9d30875e978316b4489c9f2
4
+ data.tar.gz: dd4a0475d6156464f1bbb7b2b0bc55be09e32afc
5
5
  SHA512:
6
- metadata.gz: c35e2b12effaa67a2236427922d0f7af6d200f177304e3d2f09adb3b38db1b7c7cc6b0c7f9f6ee7f70a3d8155a99f8dedcc0351f099871819357277338e54148
7
- data.tar.gz: 1477fda71236367e364c3e392f2b44b1edbef1d19f3a792231d0a32bc613500a9b6dea86881d699a92b1afcfe5a58a61c604963df3ad16eecc99abb2a60d3d09
6
+ metadata.gz: e073d1158b3cc7f6125d7e7b98cf6f41712c491d4687418bed7d647a2435c1ff10f8c41cda3987a19c894a33351648c1fdda1e5db090286280e8f7224136e284
7
+ data.tar.gz: 538f6f46aaf601822f7b582e5da4a3432bbe57f3bb17f71f197163ea46447cac9377f909dcf98fca39cd18f67385cb2299a528a495d0137ade3530e25364e93a
data/README.md CHANGED
@@ -1,8 +1,7 @@
1
- ![logo](http://www.bettercap.org/assets/img/navbar-logo.png)
2
-
1
+ ![logo](http://www.bettercap.org/assets/img/homepage-logo.png)
3
2
  http://www.bettercap.org/
4
3
 
5
- [![Gem Version](https://badge.fury.io/rb/bettercap.svg)](http://badge.fury.io/rb/bettercap) [![Code Climate](https://codeclimate.com/github/evilsocket/bettercap/badges/gpa.svg)](https://codeclimate.com/github/evilsocket/bettercap) [![Join the chat at https://gitter.im/evilsocket/bettercap-proxy-modules](https://badges.gitter.im/evilsocket/bettercap-proxy-modules.svg)](https://gitter.im/evilsocket/bettercap-proxy-modules?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
+ [![Gem Version](https://badge.fury.io/rb/bettercap.svg)](http://badge.fury.io/rb/bettercap) [![Code Climate](https://codeclimate.com/github/evilsocket/bettercap/badges/gpa.svg)](https://codeclimate.com/github/evilsocket/bettercap) [![Join the chat at https://gitter.im/evilsocket/bettercap](https://badges.gitter.im/evilsocket/bettercap.svg)](https://gitter.im/evilsocket/bettercap?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
6
5
  ---
7
6
 
8
7
  **bettercap** is a complete, modular, portable and easily extensible **MITM** tool and framework with every kind of diagnostic
data/lib/bettercap.rb CHANGED
@@ -28,8 +28,8 @@ require 'bettercap/update_checker'
28
28
  require 'bettercap/error'
29
29
  require 'bettercap/loader'
30
30
  require 'bettercap/options'
31
- require 'bettercap/arp_reader'
32
- require 'bettercap/packet_queue'
31
+ require 'bettercap/network/arp_reader'
32
+ require 'bettercap/network/packet_queue'
33
33
  require 'bettercap/discovery/thread'
34
34
  require 'bettercap/discovery/agents/base'
35
35
  require 'bettercap/discovery/agents/arp'
@@ -42,9 +42,9 @@ require 'bettercap/factories/spoofer'
42
42
  require 'bettercap/factories/parser'
43
43
  require 'bettercap/logger'
44
44
  require 'bettercap/shell'
45
- require 'bettercap/network'
45
+ require 'bettercap/network/network'
46
46
  require 'bettercap/version'
47
- require 'bettercap/target'
47
+ require 'bettercap/network/target'
48
48
  require 'bettercap/sniffer/sniffer'
49
49
  require 'bettercap/firewalls/redirection'
50
50
  require 'bettercap/proxy/stream_logger'
@@ -100,7 +100,7 @@ class Context
100
100
  end
101
101
  Logger.debug "--------------------------------\n"
102
102
 
103
- @packets = PacketQueue.new( @ifconfig[:iface], 4 )
103
+ @packets = Network::PacketQueue.new( @ifconfig[:iface], @options.packet_throttle, 4 )
104
104
  end
105
105
 
106
106
  # Find a target given its +ip+ and +mac+ addresses inside the #targets
@@ -128,7 +128,7 @@ class Context
128
128
  def create_proxies
129
129
  if @options.has_proxy_module?
130
130
  Proxy::Module.register_modules
131
-
131
+
132
132
  raise BetterCap::Error, "#{@options.proxy_module} is not a valid bettercap proxy module." if Proxy::Module.modules.empty?
133
133
  end
134
134
 
@@ -54,6 +54,7 @@ class Thread
54
54
  @ctx.targets.each do |target|
55
55
  msg += " #{target}\n"
56
56
  end
57
+ msg += "\n"
57
58
  Logger.raw msg
58
59
  end
59
60
 
@@ -8,6 +8,7 @@ This project is released under the GPL 3 license.
8
8
  require 'bettercap/error'
9
9
 
10
10
  module BetterCap
11
+ module Network
11
12
  # This class is responsible for reading the computer ARP table.
12
13
  class ArpReader
13
14
  # Parse the current ARP cache and return a list of BetterCap::Target
@@ -76,3 +77,4 @@ class ArpReader
76
77
  end
77
78
  end
78
79
  end
80
+ end
File without changes
@@ -13,7 +13,7 @@ require 'thread'
13
13
 
14
14
  module BetterCap
15
15
  # Handles various network related tasks.
16
- class Network
16
+ module Network
17
17
  class << self
18
18
  # Return true if +ip+ is a valid IP address, otherwise false.
19
19
  def is_ip?(ip)
@@ -8,15 +8,20 @@ This project is released under the GPL 3 license.
8
8
  require 'bettercap/error'
9
9
 
10
10
  module BetterCap
11
+ module Network
11
12
  # This class is responsible for sending various network packets.
12
13
  class PacketQueue
13
14
  # Initialize the PacketQueue, it will spawn +nworkers+ thread and
14
15
  # will send packets to the +iface+ network interface.
15
- def initialize( iface, nworkers = 4 )
16
+ # If +packet_throttle+ is different than 0.0, it will be used as
17
+ # a delay between each packet to be sent.
18
+ def initialize( iface, packet_throttle = 0.0, nworkers = 4 )
16
19
  @iface = iface
17
20
  @nworkers = nworkers
21
+ @throttle = packet_throttle;
18
22
  @running = true
19
- @injector = PacketFu::Inject.new(:iface => iface)
23
+ @stream = Pcap.open_live( iface, 0xffff, false , 1 )
24
+ @mutex = Mutex.new
20
25
  @udp = UDPSocket.new
21
26
  @queue = Queue.new
22
27
  @workers = (0...nworkers).map { ::Thread.new { worker } }
@@ -49,14 +54,17 @@ class PacketQueue
49
54
 
50
55
  def dispatch_udp_packet(packet)
51
56
  ip, port, data = packet
52
- Logger.debug "Sending UDP data packet to #{ip}:#{port} ..."
53
- @udp.send( data, 0, ip, port )
57
+ @mutex.synchronize {
58
+ Logger.debug "Sending UDP data packet to #{ip}:#{port} ..."
59
+ @udp.send( data, 0, ip, port )
60
+ }
54
61
  end
55
62
 
56
63
  def dispatch_raw_packet(packet)
57
- Logger.debug "Sending #{packet.class.name} packet ..."
58
- @injector.array = [packet.headers[0].to_s]
59
- @injector.inject
64
+ @mutex.synchronize {
65
+ Logger.debug "Sending #{packet.class.name} packet ..."
66
+ @stream.inject( packet.headers[0].to_s )
67
+ }
60
68
  end
61
69
 
62
70
  def worker
@@ -77,6 +85,9 @@ class PacketQueue
77
85
  when Object
78
86
  dispatch_raw_packet(packet)
79
87
  end
88
+
89
+ sleep(@throttle) if @throttle != 0.0
90
+
80
91
  rescue Exception => e
81
92
  Logger.debug "#{self.class.name} ( #{packet.class.name} ) : #{e.message}"
82
93
 
@@ -94,3 +105,4 @@ class PacketQueue
94
105
  end
95
106
  end
96
107
  end
108
+ end
@@ -13,6 +13,7 @@ require 'bettercap/logger'
13
13
  require 'socket'
14
14
 
15
15
  module BetterCap
16
+ module Network
16
17
  # This class represents a target, namely a single endpoint device on the
17
18
  # network.
18
19
  class Target
@@ -153,3 +154,4 @@ private
153
154
  end
154
155
  end
155
156
  end
157
+ end
@@ -83,6 +83,8 @@ class Options
83
83
  # If true, bettercap won't forward packets for any target, causing
84
84
  # connections to be killed.
85
85
  attr_accessor :kill
86
+ # If different than 0, this time will be used as a delay while sending packets.
87
+ attr_accessor :packet_throttle
86
88
 
87
89
  # Create a BetterCap::Options class instance using the specified network interface.
88
90
  def initialize( iface )
@@ -97,6 +99,7 @@ class Options
97
99
  @arpcache = false
98
100
  @no_target_nbns = false
99
101
  @kill = false
102
+ @packet_throttle = 0.0
100
103
 
101
104
  @ignore = nil
102
105
 
@@ -250,13 +253,8 @@ class Options
250
253
  ctx.options.proxy_pem_file = File.expand_path v
251
254
  end
252
255
 
253
- opts.on( '--proxy-module MODULE', 'Ruby proxy module to load.' ) do |v|
254
- ctx.options.proxy = true
255
- ctx.options.proxy_module = File.expand_path v
256
-
257
- require ctx.options.proxy_module
258
-
259
- Proxy::Module.register_options(opts)
256
+ opts.on( '--proxy-module MODULE', 'Ruby proxy module to load, either a custom file or one of the following: ' + Proxy::Module.available.join(', ') + ' .' ) do |v|
257
+ Proxy::Module.load(ctx, opts, v)
260
258
  end
261
259
 
262
260
  opts.on( '--custom-proxy ADDRESS', 'Use a custom HTTP upstream proxy instead of the builtin one.' ) do |v|
@@ -293,6 +291,11 @@ class Options
293
291
  ctx.options.kill = true
294
292
  end
295
293
 
294
+ opts.on( '--packet-throttle NUMBER', 'Number of seconds ( can be a decimal number ) to wait between each packet to be sent.' ) do |v|
295
+ ctx.options.packet_throttle = v.to_f
296
+ raise BetterCap::Error, "Invalid packet throttle value specified." if ctx.options.packet_throttle <= 0.0
297
+ end
298
+
296
299
  opts.on( '--check-updates', 'Will check if any update is available and then exit.' ) do
297
300
  ctx.options.check_updates = true
298
301
  end
@@ -407,7 +410,7 @@ class Options
407
410
  Logger.warn "Invalid target specified: #{target}"
408
411
  end
409
412
 
410
- valid_targets.map { |target| Target.new(target) }
413
+ valid_targets.map { |target| Network::Target.new(target) }
411
414
  end
412
415
 
413
416
  # Parse spoofers and return a list of BetterCap::Spoofers objects. Raise a
@@ -15,7 +15,44 @@ module BetterCap
15
15
  module Proxy
16
16
  # Base class for transparent proxy modules.
17
17
  class Module
18
+ @@path = File.dirname(__FILE__) + '/modules/'
18
19
  @@modules = []
20
+
21
+ # Return a list of available builtin proxy module names.
22
+ def self.available
23
+ avail = []
24
+ Dir.foreach( @@path ) do |file|
25
+ if file =~ /.rb/
26
+ avail << file.gsub('.rb','')
27
+ end
28
+ end
29
+ avail
30
+ end
31
+
32
+ # Check if the module with +name+ is within the builtin ones.
33
+ def self.is_builtin?(name)
34
+ self.available.include?(name)
35
+ end
36
+
37
+ # Load the module with +name+.
38
+ def self.load(ctx, opts, name)
39
+ ctx.options.proxy = true
40
+
41
+ if self.is_builtin?(name)
42
+ ctx.options.proxy_module = "#{@@path}/#{name}.rb"
43
+ else
44
+ ctx.options.proxy_module = File.expand_path(name)
45
+ end
46
+
47
+ begin
48
+ require ctx.options.proxy_module
49
+
50
+ self.register_options(opts)
51
+ rescue LoadError
52
+ raise BetterCap::Error, "Invalid proxy module name '#{name}' ."
53
+ end
54
+ end
55
+
19
56
  # Return a list of registered modules.
20
57
  def self.modules
21
58
  @@modules
@@ -0,0 +1,60 @@
1
+ =begin
2
+
3
+ BETTERCAP
4
+
5
+ Author : Simone 'evilsocket' Margaritelli
6
+ Email : evilsocket@gmail.com
7
+ Blog : http://www.evilsocket.net/
8
+
9
+ This project is released under the GPL 3 license.
10
+
11
+ =end
12
+ class Injectcss < BetterCap::Proxy::Module
13
+ @@cssdata = nil
14
+ @@cssurl = nil
15
+
16
+ def self.on_options(opts)
17
+ opts.separator ""
18
+ opts.separator "Inject CSS Proxy Module Options:"
19
+ opts.separator ""
20
+
21
+ opts.on( '--css-data STRING', 'CSS code to be injected.' ) do |v|
22
+ @@cssdata = v
23
+ unless @@jsdata.include?("<style>")
24
+ @@cssdata = "<style>\n#{@@cssdata}\n</style>"
25
+ end
26
+ end
27
+
28
+ opts.on( '--css-file PATH', 'Path of the CSS file to be injected.' ) do |v|
29
+ filename = File.expand_path v
30
+ raise BetterCap::Error, "#{filename} invalid file." unless File.exists?(filename)
31
+ @@cssdata = File.read( filename )
32
+ unless @@cssdata.include?("<style>")
33
+ @@cssdata = "<style>\n#{@@cssdata}\n</style>"
34
+ end
35
+ end
36
+
37
+ opts.on( '--css-url URL', 'URL the CSS file to be injected.' ) do |v|
38
+ @@cssurl = v
39
+ end
40
+ end
41
+
42
+ def on_request( request, response )
43
+ # is it a html page?
44
+ if response.content_type =~ /^text\/html.*/
45
+ # check command line arguments.
46
+ if @@cssdata.nil? and @@cssurl.nil?
47
+ BetterCap::Logger.warn "No --css-file or --css-url options specified, this proxy module won't work."
48
+ else
49
+ BetterCap::Logger.info "Injecting CSS #{if @@cssdata.nil? then "URL" else "file" end} into http://#{request.host}#{request.url}"
50
+ # inject URL
51
+ if @@cssdata.nil?
52
+ response.body.sub!( '</head>', " <link rel=\"stylesheet\" href=\"#{@cssurl}\"></script></head>" )
53
+ # inject data
54
+ else
55
+ response.body.sub!( '</head>', "#{@@cssdata}</head>" )
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,60 @@
1
+ =begin
2
+
3
+ BETTERCAP
4
+
5
+ Author : Simone 'evilsocket' Margaritelli
6
+ Email : evilsocket@gmail.com
7
+ Blog : http://www.evilsocket.net/
8
+
9
+ This project is released under the GPL 3 license.
10
+
11
+ =end
12
+ class Injectjs < BetterCap::Proxy::Module
13
+ @@jsdata = nil
14
+ @@jsurl = nil
15
+
16
+ def self.on_options(opts)
17
+ opts.separator ""
18
+ opts.separator "Inject JS Proxy Module Options:"
19
+ opts.separator ""
20
+
21
+ opts.on( '--js-data STRING', 'Javascript code to be injected.' ) do |v|
22
+ @@jsdata = v
23
+ unless @@jsdata.include?("<script")
24
+ @@jsdata = "<script type=\"text/javascript\">\n#{@@jsdata}\n</script>"
25
+ end
26
+ end
27
+
28
+ opts.on( '--js-file PATH', 'Path of the javascript file to be injected.' ) do |v|
29
+ filename = File.expand_path v
30
+ raise BetterCap::Error, "#{filename} invalid file." unless File.exists?(filename)
31
+ @@jsdata = File.read( filename )
32
+ unless @@jsdata.include?("<script")
33
+ @@jsdata = "<script type=\"text/javascript\">\n#{@@jsdata}\n</script>"
34
+ end
35
+ end
36
+
37
+ opts.on( '--js-url URL', 'URL the javascript file to be injected.' ) do |v|
38
+ @@jsurl = v
39
+ end
40
+ end
41
+
42
+ def on_request( request, response )
43
+ # is it a html page?
44
+ if response.content_type =~ /^text\/html.*/
45
+ # check command line arguments.
46
+ if @@jsdata.nil? and @@jsurl.nil?
47
+ BetterCap::Logger.warn "No --js-file or --js-url options specified, this proxy module won't work."
48
+ else
49
+ BetterCap::Logger.info "Injecting javascript #{if @@jsdata.nil? then "URL" else "file" end} into http://#{request.host}#{request.url}"
50
+ # inject URL
51
+ if @@jsdata.nil?
52
+ response.body.sub!( '</head>', "<script src=\"#{@@jsurl}\" type=\"text/javascript\"></script></head>" )
53
+ # inject data
54
+ else
55
+ response.body.sub!( '</head>', "#{@@jsdata}</head>" )
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -13,9 +13,6 @@ This project is released under the GPL 3 license.
13
13
  require 'socket'
14
14
  require 'uri'
15
15
 
16
- require 'bettercap/logger'
17
- require 'bettercap/network'
18
-
19
16
  module BetterCap
20
17
  module Proxy
21
18
  # Transparent proxy class.
@@ -34,10 +34,10 @@ class Httpauth < Base
34
34
  decoded = Base64.decode64(encoded)
35
35
  user, pass = decoded.split(':')
36
36
 
37
- StreamLogger.log_raw( pkt, '[HTTP BASIC AUTH]'.green + " http://#{hostname}#{path} - username=#{user} password=#{pass}".yellow )
37
+ StreamLogger.log_raw( pkt, 'HTTP BASIC AUTH', "http://#{hostname}#{path} - username=#{user} password=#{pass}".yellow )
38
38
 
39
39
  elsif line =~ /Authorization:\s*Digest\s+(.+)/i
40
- StreamLogger.log_raw( pkt, '[HTTP DIGEST AUTH]'.green + " http://#{hostname}#{path}\n#{$1}".yellow )
40
+ StreamLogger.log_raw( pkt, 'HTTP DIGEST AUTH', "http://#{hostname}#{path}\n#{$1}".yellow )
41
41
  end
42
42
  end
43
43
  end
@@ -10,11 +10,6 @@ This project is released under the GPL 3 license.
10
10
 
11
11
  =end
12
12
  require 'bettercap/spoofers/base'
13
- require 'bettercap/error'
14
- require 'bettercap/context'
15
- require 'bettercap/network'
16
- require 'bettercap/logger'
17
- require 'colorize'
18
13
 
19
14
  module BetterCap
20
15
  module Spoofers
@@ -90,7 +90,7 @@ private
90
90
  def update_gateway!
91
91
  hw = Network.get_hw_address( @ctx.ifconfig, @ctx.gateway )
92
92
  raise BetterCap::Error, "Couldn't determine router MAC" if hw.nil?
93
- @gateway = Target.new( @ctx.gateway, hw )
93
+ @gateway = Network::Target.new( @ctx.gateway, hw )
94
94
 
95
95
  Logger.info "[#{'GATEWAY'.green}] #{@gateway.to_s(false)}"
96
96
  end
@@ -10,11 +10,6 @@ This project is released under the GPL 3 license.
10
10
 
11
11
  =end
12
12
  require 'bettercap/spoofers/base'
13
- require 'bettercap/error'
14
- require 'bettercap/context'
15
- require 'bettercap/network'
16
- require 'bettercap/logger'
17
- require 'colorize'
18
13
  require 'net/dns'
19
14
  require 'resolv'
20
15
 
@@ -123,7 +118,7 @@ class Icmp < Base
123
118
  else
124
119
  @ctx.firewall.enable_forwarding(true) unless @forwarding
125
120
  end
126
-
121
+
127
122
  @ctx.firewall.enable_send_redirects(false)
128
123
 
129
124
  @spoof_thread = Thread.new { icmp_spoofer }
@@ -11,7 +11,7 @@ This project is released under the GPL 3 license.
11
11
  =end
12
12
  module BetterCap
13
13
  # Current version of bettercap.
14
- VERSION = '1.2.1'
14
+ VERSION = '1.2.2'
15
15
  # Program banner.
16
16
  BANNER = File.read( File.dirname(__FILE__) + '/banner' ).gsub( '#VERSION#', "v#{VERSION}")
17
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bettercap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simone Margaritelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-13 00:00:00.000000000 Z
11
+ date: 2016-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -90,8 +90,6 @@ files:
90
90
  - CONTRIBUTING.md
91
91
  - LICENSE.md
92
92
  - README.md
93
- - TODO.md
94
- - lib/bettercap/arp_reader.rb
95
93
  - lib/bettercap/banner
96
94
  - lib/bettercap/context.rb
97
95
  - lib/bettercap/discovery/agents/arp.rb
@@ -108,15 +106,19 @@ files:
108
106
  - lib/bettercap/firewalls/osx.rb
109
107
  - lib/bettercap/firewalls/redirection.rb
110
108
  - lib/bettercap/httpd/server.rb
111
- - lib/bettercap/hw-prefixes
112
109
  - lib/bettercap/loader.rb
113
110
  - lib/bettercap/logger.rb
114
111
  - lib/bettercap/monkey/packetfu/utils.rb
115
- - lib/bettercap/network.rb
112
+ - lib/bettercap/network/arp_reader.rb
113
+ - lib/bettercap/network/hw-prefixes
114
+ - lib/bettercap/network/network.rb
115
+ - lib/bettercap/network/packet_queue.rb
116
+ - lib/bettercap/network/target.rb
116
117
  - lib/bettercap/options.rb
117
- - lib/bettercap/packet_queue.rb
118
118
  - lib/bettercap/proxy/certstore.rb
119
119
  - lib/bettercap/proxy/module.rb
120
+ - lib/bettercap/proxy/modules/injectcss.rb
121
+ - lib/bettercap/proxy/modules/injectjs.rb
120
122
  - lib/bettercap/proxy/proxy.rb
121
123
  - lib/bettercap/proxy/request.rb
122
124
  - lib/bettercap/proxy/response.rb
@@ -139,7 +141,6 @@ files:
139
141
  - lib/bettercap/spoofers/base.rb
140
142
  - lib/bettercap/spoofers/icmp.rb
141
143
  - lib/bettercap/spoofers/none.rb
142
- - lib/bettercap/target.rb
143
144
  - lib/bettercap/update_checker.rb
144
145
  - lib/bettercap/version.rb
145
146
  - lib/bettercap.rb
data/TODO.md DELETED
@@ -1,30 +0,0 @@
1
- This is a list of TODOs I use to keep track of tasks and upcoming features.
2
-
3
- ---
4
-
5
- - [x] Implement `--ignore ADDR,ADDR,ADDR` option to filter out specific addresses from the targets list.
6
- - [x] HTTP 1.1 chunked response support.
7
- - [x] Ip address to hostname resolution.
8
- - [x] Wrap every class with `module BetterCap` and refactor old code.
9
- - [x] Use StreamLogger for both Proxy and Sniffer traffic.
10
- - [x] Implement `--custom-parser REGEX` option.
11
- - [x] Let `-T|--target` [support MAC addresses](https://github.com/evilsocket/bettercap/issues/82).
12
- - [x] Fix modules structure by folder.
13
- - [x] Document classes with RDoc.
14
- - [x] ICMP Redirect ( double direct )
15
- - [ ] Implement `--mkcert FILENAME` option to create custom HTTPS `crt` files.
16
- - [ ] Implement sslstrip+ support.
17
- - [ ] Rewrite proxy class using [em-proxy](https://github.com/igrigorik/em-proxy) library.
18
- - [ ] HTTP/2 Support.
19
-
20
- **Platform Specific**
21
-
22
- - [ ] *BSD Support.
23
- - [ ] Windows Support? ( OMG PLZ NO! )
24
- - [ ] GNU/Linux [Active packet filtering/injection/etc](https://github.com/evilsocket/bettercap/issues/75) ( maybe using [this](https://github.com/gdelugre/ruby-nfqueue) ).
25
-
26
- **Maybe**
27
-
28
- - [ ] Implement event-driven core plugin infrastructure ( for webui, etc ).
29
- - [ ] Implement web-ui core plugin.
30
- - [ ] IPV6 Support.