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 +4 -4
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/bin/evil-proxy +36 -3
- data/evil-proxy.gemspec +0 -1
- data/lib/evil-proxy/agentproxy.rb +5 -3
- data/lib/evil-proxy/httpproxy.rb +39 -25
- data/lib/evil-proxy/mitmproxy.rb +21 -9
- data/lib/evil-proxy/version.rb +1 -1
- metadata +5 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e12b1710eab8280289c94ab841cdb69271e39b89
|
4
|
+
data.tar.gz: 8d435616b24ca533588b7be6985a16f35758465a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5de1a8b09415db4ec3b66b5e889b68c1bdfaa702c11f9499e090b21670da7ffb079edf9134448ed63dcb061b2d14c625759373ceb3bfd28a3d7d00744a097d25
|
7
|
+
data.tar.gz: 3c8bba1bb4da4d7b33430093f74a525c0dfc4304e3e33eb0cfe4233c032b6446f75becbcb4af03543d3b33ee73309ebf74376ab5318b096c7206c77703879b11
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/bin/evil-proxy
CHANGED
@@ -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
|
-
|
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
|
-
|
8
|
-
|
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
|
data/evil-proxy.gemspec
CHANGED
@@ -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
|
-
|
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
|
data/lib/evil-proxy/httpproxy.rb
CHANGED
@@ -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
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
51
|
-
|
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
|
data/lib/evil-proxy/mitmproxy.rb
CHANGED
@@ -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
|
82
|
-
if @mitm_servers[
|
83
|
-
return @mitm_servers[
|
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[
|
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
|
-
|
104
|
-
|
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
|
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
|
-
|
122
|
+
if !@mitm_pattern || req.unparsed_uri =~ @mitm_pattern
|
123
|
+
do_MITM req, res
|
124
|
+
end
|
113
125
|
super
|
114
126
|
end
|
115
127
|
|
data/lib/evil-proxy/version.rb
CHANGED
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
|
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:
|
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.
|
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.
|