bettercap 1.1.0

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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +225 -0
  3. data/README.md +96 -0
  4. data/bettercap.gemspec +28 -0
  5. data/bin/bettercap +184 -0
  6. data/example_proxy_module.rb +21 -0
  7. data/lib/bettercap/base/ifirewall.rb +28 -0
  8. data/lib/bettercap/base/ispoofer.rb +24 -0
  9. data/lib/bettercap/context.rb +124 -0
  10. data/lib/bettercap/discovery/arp.rb +37 -0
  11. data/lib/bettercap/discovery/icmp.rb +37 -0
  12. data/lib/bettercap/discovery/syn.rb +88 -0
  13. data/lib/bettercap/discovery/udp.rb +74 -0
  14. data/lib/bettercap/error.rb +16 -0
  15. data/lib/bettercap/factories/firewall_factory.rb +32 -0
  16. data/lib/bettercap/factories/parser_factory.rb +53 -0
  17. data/lib/bettercap/factories/spoofer_factory.rb +36 -0
  18. data/lib/bettercap/firewalls/linux.rb +55 -0
  19. data/lib/bettercap/firewalls/osx.rb +70 -0
  20. data/lib/bettercap/hw-prefixes +19651 -0
  21. data/lib/bettercap/logger.rb +53 -0
  22. data/lib/bettercap/monkey/packetfu/utils.rb +96 -0
  23. data/lib/bettercap/network.rb +131 -0
  24. data/lib/bettercap/proxy/module.rb +39 -0
  25. data/lib/bettercap/proxy/proxy.rb +262 -0
  26. data/lib/bettercap/proxy/request.rb +77 -0
  27. data/lib/bettercap/proxy/response.rb +76 -0
  28. data/lib/bettercap/shell.rb +31 -0
  29. data/lib/bettercap/sniffer/parsers/base.rb +31 -0
  30. data/lib/bettercap/sniffer/parsers/ftp.rb +19 -0
  31. data/lib/bettercap/sniffer/parsers/httpauth.rb +45 -0
  32. data/lib/bettercap/sniffer/parsers/https.rb +36 -0
  33. data/lib/bettercap/sniffer/parsers/irc.rb +19 -0
  34. data/lib/bettercap/sniffer/parsers/mail.rb +19 -0
  35. data/lib/bettercap/sniffer/parsers/ntlmss.rb +38 -0
  36. data/lib/bettercap/sniffer/parsers/post.rb +24 -0
  37. data/lib/bettercap/sniffer/parsers/url.rb +28 -0
  38. data/lib/bettercap/sniffer/sniffer.rb +39 -0
  39. data/lib/bettercap/spoofers/arp.rb +130 -0
  40. data/lib/bettercap/spoofers/none.rb +23 -0
  41. data/lib/bettercap/target.rb +52 -0
  42. data/lib/bettercap/version.rb +14 -0
  43. metadata +129 -0
@@ -0,0 +1,39 @@
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
+ require 'bettercap/logger'
13
+ require 'bettercap/factories/parser_factory'
14
+ require 'colorize'
15
+ require 'packetfu'
16
+
17
+ class Sniffer
18
+ include PacketFu
19
+
20
+ @@parsers = nil
21
+
22
+ def self.start( ctx )
23
+ Logger.info 'Starting sniffer ...'
24
+
25
+ @@parsers = ParserFactory.load_by_names ctx.options[:parsers]
26
+
27
+ cap = Capture.new(:iface => ctx.options[:iface], :start => true)
28
+ cap.stream.each do |p|
29
+ pkt = Packet.parse p
30
+ if not pkt.nil? and pkt.is_ip?
31
+ next if ( pkt.ip_saddr == ctx.iface[:ip_saddr] or pkt.ip_daddr == ctx.iface[:ip_saddr] ) and !ctx.options[:local]
32
+
33
+ @@parsers.each do |parser|
34
+ parser.on_packet pkt
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,130 @@
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
+ require 'bettercap/error'
13
+ require 'bettercap/context'
14
+ require 'bettercap/base/ispoofer'
15
+ require 'bettercap/network'
16
+ require 'bettercap/logger'
17
+ require 'colorize'
18
+
19
+ class ArpSpoofer < ISpoofer
20
+ def initialize
21
+ @ctx = Context.get
22
+ @gw_hw = nil
23
+ @forwarding = @ctx.firewall.forwarding_enabled?
24
+ @spoof_thread = nil
25
+ @running = false
26
+
27
+ Logger.debug 'ARP SPOOFER SELECTED'
28
+
29
+ Logger.info "Getting gateway #{@ctx.gateway} MAC address ..."
30
+ @gw_hw = Network.get_hw_address( @ctx.iface, @ctx.gateway )
31
+ if @gw_hw.nil?
32
+ raise BetterCap::Error, "Couldn't determine router MAC"
33
+ end
34
+
35
+ Logger.info " Gateway MAC : #{@gw_hw}"
36
+ end
37
+
38
+ def send_spoofed_packed( saddr, smac, daddr, dmac )
39
+ pkt = PacketFu::ARPPacket.new
40
+ pkt.eth_saddr = smac
41
+ pkt.eth_daddr = dmac
42
+ pkt.arp_saddr_mac = smac
43
+ pkt.arp_daddr_mac = dmac
44
+ pkt.arp_saddr_ip = saddr
45
+ pkt.arp_daddr_ip = daddr
46
+ pkt.arp_opcode = 2
47
+
48
+ pkt.to_w(@ctx.iface[:iface])
49
+ end
50
+
51
+ def start
52
+ stop() unless @running == false
53
+
54
+ Logger.info 'Starting ARP spoofer ...'
55
+
56
+ if @forwarding == false
57
+ Logger.debug 'Enabling packet forwarding.'
58
+
59
+ @ctx.firewall.enable_forwarding(true)
60
+ end
61
+
62
+ @running = true
63
+ @spoof_thread = Thread.new do
64
+ prev_size = @ctx.targets.size
65
+ loop do
66
+ if not @running
67
+ Logger.debug 'Stopping spoofing thread ...'
68
+ Thread.exit
69
+ break
70
+ end
71
+
72
+ size = @ctx.targets.size
73
+
74
+ if size > prev_size
75
+ Logger.warn "Aquired #{size - prev_size} new targets."
76
+ elsif size < prev_size
77
+ Logger.warn "Lost #{prev_size - size} targets."
78
+ end
79
+
80
+ Logger.debug "Spoofing #{@ctx.targets.size} targets ..."
81
+
82
+ @ctx.targets.each do |target|
83
+ # targets could change, update mac addresses if needed
84
+ if target.mac.nil?
85
+ Logger.warn "Getting target #{target.ip} MAC address ..."
86
+
87
+ hw = Network.get_hw_address( @ctx.iface, target.ip, 1 )
88
+ if hw.nil?
89
+ Logger.warn "Couldn't determine target MAC"
90
+ next
91
+ else
92
+ Logger.info " Target MAC : #{hw}"
93
+
94
+ target.mac = hw
95
+ end
96
+ end
97
+
98
+ send_spoofed_packed @ctx.gateway, @ctx.iface[:eth_saddr], target.ip, target.mac
99
+ send_spoofed_packed target.ip, @ctx.iface[:eth_saddr], @ctx.gateway, @gw_hw
100
+ end
101
+
102
+ prev_size = @ctx.targets.size
103
+
104
+ sleep(1)
105
+ end
106
+ end
107
+ end
108
+
109
+ def stop
110
+ raise 'ARP spoofer is not running' unless @running
111
+
112
+ Logger.info 'Stopping ARP spoofer ...'
113
+
114
+ Logger.debug "Resetting packet forwarding to #{@forwarding} ..."
115
+ @ctx.firewall.enable_forwarding( @forwarding )
116
+
117
+ @running = false
118
+ @spoof_thread.join
119
+
120
+ Logger.info "Restoring ARP table of #{@ctx.targets.size} targets ..."
121
+
122
+ @ctx.targets.each do |target|
123
+ if !target.mac.nil?
124
+ send_spoofed_packed @ctx.gateway, @gw_hw, target.ip, target.mac
125
+ send_spoofed_packed target.ip, target.mac, @ctx.gateway, @gw_hw
126
+ end
127
+ end
128
+ sleep 1
129
+ end
130
+ end
@@ -0,0 +1,23 @@
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
+ require 'bettercap/base/ispoofer'
13
+ require 'bettercap/logger'
14
+
15
+ class NoneSpoofer < ISpoofer
16
+ def initialize
17
+ Logger.warn 'Spoofing disabled.'
18
+ end
19
+
20
+ def start; end
21
+
22
+ def stop; end
23
+ end
@@ -0,0 +1,52 @@
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
+ require 'bettercap/logger'
13
+
14
+ class Target
15
+ attr_accessor :ip, :mac, :vendor, :hostname
16
+
17
+ @@prefixes = nil
18
+
19
+ def initialize( ip, mac )
20
+ @ip = ip
21
+ @mac = mac
22
+ @vendor = Target.lookup_vendor(mac) if not mac.nil?
23
+ @hostname = nil # for future use
24
+ end
25
+
26
+ def mac=(value)
27
+ @mac = value
28
+ @vendor = Target.lookup_vendor(@mac) if not @mac.nil?
29
+ end
30
+
31
+ def to_s
32
+ "#{@ip} : #{@mac}" + ( @vendor ? " ( #{@vendor} )" : "" )
33
+ end
34
+
35
+ private
36
+
37
+ def self.lookup_vendor( mac )
38
+ if @@prefixes == nil
39
+ Logger.debug 'Preloading hardware vendor prefixes ...'
40
+
41
+ @@prefixes = {}
42
+ filename = File.dirname(__FILE__) + '/hw-prefixes'
43
+ File.open( filename ).each do |line|
44
+ if line =~ /^([A-F0-9]{6})\s(.+)$/
45
+ @@prefixes[$1] = $2
46
+ end
47
+ end
48
+ end
49
+
50
+ @@prefixes[ mac.split(':')[0,3].join('').upcase ]
51
+ end
52
+ end
@@ -0,0 +1,14 @@
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
+ module BetterCap
13
+ VERSION = '1.1.0'
14
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bettercap
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Simone Margaritelli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: packetfu
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.10
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.10
41
+ - !ruby/object:Gem::Dependency
42
+ name: pcaprub
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 0.12.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.12.0
55
+ description: A complete, modular, portable and easily extensible MITM framework.
56
+ email: evilsocket@gmail.com
57
+ executables:
58
+ - bettercap
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/bettercap/base/ifirewall.rb
63
+ - lib/bettercap/base/ispoofer.rb
64
+ - lib/bettercap/context.rb
65
+ - lib/bettercap/discovery/arp.rb
66
+ - lib/bettercap/discovery/icmp.rb
67
+ - lib/bettercap/discovery/syn.rb
68
+ - lib/bettercap/discovery/udp.rb
69
+ - lib/bettercap/error.rb
70
+ - lib/bettercap/factories/firewall_factory.rb
71
+ - lib/bettercap/factories/parser_factory.rb
72
+ - lib/bettercap/factories/spoofer_factory.rb
73
+ - lib/bettercap/firewalls/linux.rb
74
+ - lib/bettercap/firewalls/osx.rb
75
+ - lib/bettercap/hw-prefixes
76
+ - lib/bettercap/logger.rb
77
+ - lib/bettercap/monkey/packetfu/utils.rb
78
+ - lib/bettercap/network.rb
79
+ - lib/bettercap/proxy/module.rb
80
+ - lib/bettercap/proxy/proxy.rb
81
+ - lib/bettercap/proxy/request.rb
82
+ - lib/bettercap/proxy/response.rb
83
+ - lib/bettercap/shell.rb
84
+ - lib/bettercap/sniffer/parsers/base.rb
85
+ - lib/bettercap/sniffer/parsers/ftp.rb
86
+ - lib/bettercap/sniffer/parsers/httpauth.rb
87
+ - lib/bettercap/sniffer/parsers/https.rb
88
+ - lib/bettercap/sniffer/parsers/irc.rb
89
+ - lib/bettercap/sniffer/parsers/mail.rb
90
+ - lib/bettercap/sniffer/parsers/ntlmss.rb
91
+ - lib/bettercap/sniffer/parsers/post.rb
92
+ - lib/bettercap/sniffer/parsers/url.rb
93
+ - lib/bettercap/sniffer/sniffer.rb
94
+ - lib/bettercap/spoofers/arp.rb
95
+ - lib/bettercap/spoofers/none.rb
96
+ - lib/bettercap/target.rb
97
+ - lib/bettercap/version.rb
98
+ - bin/bettercap
99
+ - LICENSE
100
+ - README.md
101
+ - bettercap.gemspec
102
+ - example_proxy_module.rb
103
+ homepage: http://github.com/evilsocket/bettercap
104
+ licenses:
105
+ - GPL3
106
+ metadata: {}
107
+ post_install_message:
108
+ rdoc_options:
109
+ - --charset=UTF-8
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.0.14
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: A complete, modular, portable and easily extensible MITM framework.
128
+ test_files: []
129
+ has_rdoc: