evil-proxy 0.0.3 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53684305896f9e807ca7a800ce16365d1075047b
4
- data.tar.gz: 9f3436b932cd284a97d572630b8eef0c82f8ccba
3
+ metadata.gz: e12b1710eab8280289c94ab841cdb69271e39b89
4
+ data.tar.gz: 8d435616b24ca533588b7be6985a16f35758465a
5
5
  SHA512:
6
- metadata.gz: f4ab48b584aedfb81bdd292a29764fbcd17a2b55f91ad648ef1c07f572ccc5a8552bcea270a088c5766dc806bbf6f1243b6d77e0c34e4e9ed9fcc70503ff15f8
7
- data.tar.gz: 6f4f16d5c257a680e7e13a6b8090ffa2bc561f324e75e7b29d302ee36f5dcd146ba761333942066042ffdd6af54900b2e34f2e30da7cfe4ead31d7fa9f3852fa
6
+ metadata.gz: 5de1a8b09415db4ec3b66b5e889b68c1bdfaa702c11f9499e090b21670da7ffb079edf9134448ed63dcb061b2d14c625759373ceb3bfd28a3d7d00744a097d25
7
+ data.tar.gz: 3c8bba1bb4da4d7b33430093f74a525c0dfc4304e3e33eb0cfe4233c032b6446f75becbcb4af03543d3b33ee73309ebf74376ab5318b096c7206c77703879b11
data/.gitignore CHANGED
@@ -10,6 +10,8 @@ coverage
10
10
  doc/
11
11
  lib/bundler/man
12
12
  pkg
13
+ bin
14
+ data
13
15
  certs
14
16
  rdoc
15
17
  spec/reports
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in evil-proxy.gemspec
4
4
  gemspec
5
+
6
+ gem 'colorize'
7
+ gem 'pry-byebug'
8
+ gem 'activesupport'
@@ -1,8 +1,41 @@
1
+ # encoding: utf-8
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'evil-proxy'
5
+ require 'active_support/all'
6
+ require 'colorize'
4
7
 
5
- logger = WEBrick::Log.new(nil, 5)
8
+ Options = { BindAddress: '0.0.0.0', Port: 8080, AccessLog: [] }
9
+ # PROXY = EvilProxy::MITMProxyServer.new Options
10
+ PROXY = EvilProxy::HTTPProxyServer.new Options
6
11
 
7
- proxy = EvilProxy::MITMProxyServer.new Port: 8080, Logger: logger
8
- proxy.start
12
+ def puts_include str, match
13
+ puts str.inspect.colorize(:red) if str && str.include?(match)
14
+ end
15
+
16
+ file = ARGV.first || 'evil-proxy'
17
+ file = "#{file}.rb"
18
+ fullpath = File.expand_path file, File.dirname(__FILE__)
19
+ require fullpath
20
+
21
+ interrupted = false
22
+ stoped = false
23
+ Signal.trap("INT") do
24
+ print "\r" # cleanup ^C
25
+ Thread.new do
26
+ sleep 1
27
+ interrupted = false
28
+ end
29
+
30
+ if interrupted # double CTRL-C to quit full program
31
+ PROXY.stop
32
+ PROXY.exit if stoped
33
+ stoped = true
34
+ else
35
+ interrupted = true
36
+ PROXY.logger.info "RELOAD #{file}, double CTRL-C to quit full program"
37
+ load fullpath
38
+ end
39
+ end
40
+
41
+ PROXY.start
@@ -20,5 +20,4 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.6"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency "pry-byebug"
24
23
  end
@@ -3,8 +3,6 @@ require 'webrick/https'
3
3
  require 'webrick/httpproxy'
4
4
  require 'openssl'
5
5
 
6
- require 'pry-byebug'
7
-
8
6
  class EvilProxy::AgentProxyServer < EvilProxy::HTTPProxyServer
9
7
 
10
8
  def initialize_callbacks config
@@ -49,6 +47,10 @@ class EvilProxy::AgentProxyServer < EvilProxy::HTTPProxyServer
49
47
  res.body = response.body
50
48
  end
51
49
 
52
- alias_method :service, :proxy_service
50
+ def service req, res
51
+ fire :before_request, req
52
+ proxy_service req, res
53
+ fire :before_response, req, res
54
+ end
53
55
 
54
56
  end
@@ -4,12 +4,15 @@ require 'webrick/httpproxy'
4
4
  class EvilProxy::HTTPProxyServer < WEBrick::HTTPProxyServer
5
5
  attr_reader :callbacks
6
6
 
7
- VALID_CALBACKS = Array.new
8
7
  DEFAULT_CALLBACKS = Hash.new
9
8
 
10
9
  def initialize config = {}, default = WEBrick::Config::HTTP
11
10
  initialize_callbacks config
12
11
  fire :when_initialize, config, default
12
+ config.merge!(
13
+ Logger: WEBrick::Log.new(nil, 0),
14
+ AccessLog: []
15
+ ) if config[:Quiet]
13
16
  super
14
17
  end
15
18
 
@@ -22,6 +25,22 @@ class EvilProxy::HTTPProxyServer < WEBrick::HTTPProxyServer
22
25
  end
23
26
  end
24
27
 
28
+ def stop
29
+ self.logger.info "#{self.class}#stop: pid=#{$$}"
30
+ super
31
+ end
32
+
33
+ def exit
34
+ self.logger.info "#{self.class}#exit: pid=#{$$}"
35
+ Kernel.exit
36
+ end
37
+
38
+ def restart &block
39
+ self.logger.info "#{self.class}#restart: pid=#{$$}" if @status == :Running
40
+ initialize_callbacks Hash.new
41
+ instance_exec &block if block
42
+ end
43
+
25
44
  def fire key, *args
26
45
  return unless @callbacks[key]
27
46
  @callbacks[key].each do |callback|
@@ -35,11 +54,23 @@ class EvilProxy::HTTPProxyServer < WEBrick::HTTPProxyServer
35
54
  fire :before_response, req, res
36
55
  end
37
56
 
38
- VALID_CALBACKS << :when_initialize
39
- VALID_CALBACKS << :when_start
40
- VALID_CALBACKS << :when_shutdown
41
- VALID_CALBACKS << :before_request
42
- VALID_CALBACKS << :before_response
57
+ def self.define_callback_methods callback
58
+ define_method callback do |&block|
59
+ @callbacks[callback] ||= []
60
+ @callbacks[callback] << block
61
+ end
62
+
63
+ define_singleton_method callback do |&block|
64
+ DEFAULT_CALLBACKS[callback] ||= []
65
+ DEFAULT_CALLBACKS[callback] << block
66
+ end
67
+ end
68
+
69
+ define_callback_methods :when_initialize
70
+ define_callback_methods :when_start
71
+ define_callback_methods :when_shutdown
72
+ define_callback_methods :before_request
73
+ define_callback_methods :before_response
43
74
 
44
75
  %w(GET HEAD POST OPTIONS CONNECT).each do |method|
45
76
  do_method = "do_#{method}".to_sym
@@ -47,8 +78,8 @@ class EvilProxy::HTTPProxyServer < WEBrick::HTTPProxyServer
47
78
  before_method = "before_#{method.downcase}".to_sym
48
79
  after_method = "after_#{method.downcase}".to_sym
49
80
 
50
- VALID_CALBACKS << before_method
51
- VALID_CALBACKS << after_method
81
+ define_callback_methods before_method
82
+ define_callback_methods after_method
52
83
 
53
84
  alias_method do_method_without_callbacks, do_method
54
85
  define_method do_method do |req, res|
@@ -58,13 +89,6 @@ class EvilProxy::HTTPProxyServer < WEBrick::HTTPProxyServer
58
89
  end
59
90
  end
60
91
 
61
- VALID_CALBACKS.each do |callback|
62
- define_method callback do |&block|
63
- @callbacks[callback] ||= []
64
- @callbacks[callback] << block
65
- end
66
- end
67
-
68
92
  private
69
93
  def initialize_callbacks config
70
94
  @callbacks = Hash.new
@@ -72,14 +96,4 @@ private
72
96
  @callbacks[key] = callbacks.clone
73
97
  end
74
98
  end
75
-
76
- class << self
77
- VALID_CALBACKS.each do |callback|
78
- define_method callback do |&block|
79
- DEFAULT_CALLBACKS[callback] ||= []
80
- DEFAULT_CALLBACKS[callback] << block
81
- end
82
- end
83
- end
84
-
85
99
  end
@@ -6,13 +6,14 @@ class EvilProxy::MITMProxyServer < EvilProxy::HTTPProxyServer
6
6
 
7
7
  def initialize config
8
8
  super
9
+ @mitm_pattern = config[:MITMPattern]
9
10
  @mitm_servers = {}
10
11
  @mitm_port = 4433
11
12
  end
12
13
 
13
14
  def ca
14
15
  return @ca if @ca
15
- logger.info "Create CA"
16
+ logger.info "Create CA root cert"
16
17
 
17
18
  ca_config = {}
18
19
  ca_config[:hostname] = 'ca'
@@ -70,6 +71,9 @@ class EvilProxy::MITMProxyServer < EvilProxy::HTTPProxyServer
70
71
  config = config.merge(Port: @mitm_port)
71
72
  mitm_server = EvilProxy::AgentProxyServer.new config
72
73
  rescue Errno::EADDRINUSE
74
+ rescue Errno::EINVAL => e
75
+ logger.error e.message
76
+ return
73
77
  ensure
74
78
  @mitm_port += 1
75
79
  return mitm_server if mitm_server
@@ -78,9 +82,9 @@ class EvilProxy::MITMProxyServer < EvilProxy::HTTPProxyServer
78
82
  raise RuntimeError, "No avaliable port found, stop retrying"
79
83
  end
80
84
 
81
- def start_mitm_server unparsed_uri, host, port
82
- if @mitm_servers[unparsed_uri]
83
- return @mitm_servers[unparsed_uri].config[:Port]
85
+ def start_mitm_server host, port
86
+ if @mitm_servers[host]
87
+ return @mitm_servers[host].config[:Port]
84
88
  else
85
89
  cert, key = create_self_signed_cert host
86
90
  agent_config = self.config.merge(
@@ -92,24 +96,32 @@ class EvilProxy::MITMProxyServer < EvilProxy::HTTPProxyServer
92
96
  )
93
97
  mitm_server = retry_start_agent_server agent_config
94
98
 
95
- @mitm_servers[unparsed_uri] = mitm_server
99
+ @mitm_servers[host] = mitm_server
96
100
 
97
101
  Thread.new do mitm_server.start end
98
102
  return mitm_server.config[:Port]
99
103
  end
100
104
  end
101
105
 
106
+ define_callback_methods :before_mitm
107
+ define_callback_methods :after_mitm
108
+
102
109
  def do_MITM req, res
103
- unparsed_uri = req.unparsed_uri
104
- host, port = unparsed_uri.split(":")
110
+ fire :before_mitm, req
111
+
112
+ host, port = req.unparsed_uri.split(":")
105
113
  port ||= 443
106
114
 
107
- mitm_port = start_mitm_server unparsed_uri, host, port
115
+ mitm_port = start_mitm_server host, port
108
116
  req.unparsed_uri = "127.0.0.1:#{mitm_port}"
117
+
118
+ fire :after_mitm, req, res
109
119
  end
110
120
 
111
121
  def do_CONNECT req, res
112
- do_MITM req, res
122
+ if !@mitm_pattern || req.unparsed_uri =~ @mitm_pattern
123
+ do_MITM req, res
124
+ end
113
125
  super
114
126
  end
115
127
 
@@ -1,3 +1,3 @@
1
1
  module EvilProxy
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evil-proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2017-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,25 +38,12 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: pry-byebug
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  description: A ruby http/https proxy, with SSL MITM support.
56
42
  email:
57
43
  - bbtfrr@gmail.com
58
44
  executables:
59
45
  - evil-proxy
46
+ - evil-proxy.rb
60
47
  extensions: []
61
48
  extra_rdoc_files: []
62
49
  files:
@@ -66,6 +53,7 @@ files:
66
53
  - README.md
67
54
  - Rakefile
68
55
  - bin/evil-proxy
56
+ - bin/evil-proxy.rb
69
57
  - evil-proxy.gemspec
70
58
  - lib/evil-proxy.rb
71
59
  - lib/evil-proxy/agentproxy.rb
@@ -97,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
85
  version: '0'
98
86
  requirements: []
99
87
  rubyforge_project:
100
- rubygems_version: 2.4.6
88
+ rubygems_version: 2.6.11
101
89
  signing_key:
102
90
  specification_version: 4
103
91
  summary: A ruby http/https proxy to do EVIL things.