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