evil-proxy 0.0.3 → 0.1.0

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: 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.