ronin 1.4.1 → 1.5.0.rc1
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.
- data/.document +1 -0
- data/.gitignore +1 -0
- data/ChangeLog.md +38 -1
- data/Gemfile +10 -10
- data/README.md +1 -1
- data/Rakefile +13 -2
- data/bin/ronin-net-proxy +25 -0
- data/gemspec.yml +21 -2
- data/lib/bond/completions/ronin.rb +16 -5
- data/lib/ronin/arch.rb +5 -5
- data/lib/ronin/auto_load.rb +22 -1
- data/lib/ronin/campaign.rb +1 -1
- data/lib/ronin/database/database.rb +36 -25
- data/lib/ronin/installation.rb +2 -2
- data/lib/ronin/model/model.rb +5 -6
- data/lib/ronin/model/types/description.rb +0 -3
- data/lib/ronin/os.rb +2 -2
- data/lib/ronin/password.rb +1 -1
- data/lib/ronin/repository.rb +6 -6
- data/lib/ronin/script/path.rb +1 -2
- data/lib/ronin/spec/database.rb +16 -4
- data/lib/ronin/ui/cli/cli.rb +1 -1
- data/lib/ronin/ui/cli/command.rb +50 -7
- data/lib/ronin/ui/cli/commands/console.rb +15 -6
- data/lib/ronin/ui/cli/commands/creds.rb +1 -1
- data/lib/ronin/ui/cli/commands/database.rb +41 -29
- data/lib/ronin/ui/cli/commands/emails.rb +20 -15
- data/lib/ronin/ui/cli/commands/help.rb +18 -5
- data/lib/ronin/ui/cli/commands/hosts.rb +34 -27
- data/lib/ronin/ui/cli/commands/install.rb +21 -4
- data/lib/ronin/ui/cli/commands/ips.rb +34 -23
- data/lib/ronin/ui/cli/commands/net/proxy.rb +403 -0
- data/lib/ronin/ui/cli/commands/repos.rb +4 -4
- data/lib/ronin/ui/cli/commands/uninstall.rb +10 -0
- data/lib/ronin/ui/cli/commands/update.rb +11 -1
- data/lib/ronin/ui/cli/commands/urls.rb +39 -30
- data/lib/ronin/ui/cli/commands/wordlist.rb +11 -1
- data/lib/ronin/ui/console.rb +1 -0
- data/lib/ronin/ui/console/commands.rb +16 -98
- data/lib/ronin/ui/console/shell.rb +184 -0
- data/lib/ronin/url.rb +3 -3
- data/lib/ronin/url_scheme.rb +3 -3
- data/lib/ronin/version.rb +1 -1
- data/man/ronin-campaigns.1.md +78 -0
- data/man/ronin-console.1.md +72 -0
- data/man/ronin-creds.1.md +66 -0
- data/man/ronin-database.1.md +82 -0
- data/man/ronin-emails.1.md +72 -0
- data/man/ronin-exec.1.md +49 -0
- data/man/ronin-help.1.md +34 -0
- data/man/ronin-hosts.1.md +78 -0
- data/man/ronin-install.1.md +79 -0
- data/man/ronin-ips.1.md +81 -0
- data/man/ronin-net-proxy.1.md +86 -0
- data/man/ronin-repos.1.md +77 -0
- data/man/ronin-uninstall.1.md +67 -0
- data/man/ronin-update.1.md +67 -0
- data/man/ronin-urls.1.md +84 -0
- data/man/ronin-wordlist.1.md +53 -0
- data/man/ronin.1.md +26 -0
- data/ronin.gemspec +38 -109
- data/spec/installation_spec.rb +2 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/ui/cli/classes/test_command.rb +7 -0
- data/spec/ui/cli/command_spec.rb +235 -7
- metadata +217 -96
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
require 'ronin/ui/cli/command'
|
21
21
|
require 'ronin/ui/cli/cli'
|
22
|
+
require 'ronin/installation'
|
22
23
|
|
23
24
|
module Ronin
|
24
25
|
module UI
|
@@ -47,7 +48,7 @@ module Ronin
|
|
47
48
|
|
48
49
|
summary 'Displays the list of available commands or prints information on a specific command'
|
49
50
|
|
50
|
-
argument :command, :type =>
|
51
|
+
argument :command, :type => String,
|
51
52
|
:description => 'The command to display'
|
52
53
|
|
53
54
|
#
|
@@ -55,11 +56,23 @@ module Ronin
|
|
55
56
|
#
|
56
57
|
def execute
|
57
58
|
if command?
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
print_error "unknown command: #{@command}"
|
59
|
+
unless CLI.commands.include?(command)
|
60
|
+
print_error "Unknown command: #{command.dump}"
|
61
|
+
return false
|
62
62
|
end
|
63
|
+
|
64
|
+
man_page = "ronin-#{command.tr(':','-')}.1"
|
65
|
+
|
66
|
+
Installation.paths.each do |path|
|
67
|
+
man_path = File.join(path,'man',man_page)
|
68
|
+
|
69
|
+
if File.file?(man_path)
|
70
|
+
return system('man',man_path)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
print_error "No man-page for the command: #{@command}"
|
75
|
+
return false
|
63
76
|
else
|
64
77
|
print_array CLI.commands, :title => 'Available commands'
|
65
78
|
end
|
@@ -56,33 +56,40 @@ module Ronin
|
|
56
56
|
|
57
57
|
summary 'Manages HostNames'
|
58
58
|
|
59
|
-
query_option :with_ips, :type
|
60
|
-
:flag
|
61
|
-
:usage
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
:
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
option :
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
:
|
59
|
+
query_option :with_ips, :type => Array,
|
60
|
+
:flag => '-I',
|
61
|
+
:usage => 'IP [...]',
|
62
|
+
:description => 'Searches for the associated IP(s)'
|
63
|
+
|
64
|
+
query_option :with_ports, :type => Array[Integer],
|
65
|
+
:flag => '-p',
|
66
|
+
:usage => 'PORT [...]',
|
67
|
+
:description => 'Searches for the associated PORT(s)'
|
68
|
+
|
69
|
+
query_option :domain, :type => String,
|
70
|
+
:flag => '-D',
|
71
|
+
:usage => 'DOMAIN',
|
72
|
+
:description => 'Searches for the associated parent DOMAIN'
|
73
|
+
|
74
|
+
query_option :tld, :type => String,
|
75
|
+
:flag => '-T',
|
76
|
+
:usage => 'TLD',
|
77
|
+
:description => 'Searches for the associated TLD'
|
78
|
+
|
79
|
+
option :list, :type => true,
|
80
|
+
:default => true,
|
81
|
+
:flag => '-l',
|
82
|
+
:description => 'Lists the HostNames'
|
83
|
+
|
84
|
+
option :lookup, :type => String,
|
85
|
+
:flag => '-L',
|
86
|
+
:usage => 'IP',
|
87
|
+
:description => 'Looks up HostNames for the IP'
|
88
|
+
|
89
|
+
option :import, :type => String,
|
90
|
+
:flag => '-i',
|
91
|
+
:usage => 'FILE',
|
92
|
+
:description => 'Imports HostNames from the FILE'
|
86
93
|
|
87
94
|
#
|
88
95
|
# Queries the {HostName} model.
|
@@ -46,19 +46,36 @@ module Ronin
|
|
46
46
|
# ## Arguments
|
47
47
|
#
|
48
48
|
# URI The URI of the Repository
|
49
|
+
#
|
50
|
+
# ## Examples
|
51
|
+
#
|
52
|
+
# ronin install git://github.com/user/repo.git
|
53
|
+
# ronin install --git git@example.com:/home/secret/repo
|
49
54
|
#
|
50
55
|
class Install < Command
|
51
56
|
|
52
57
|
summary 'Installs Ronin Repositories'
|
53
58
|
|
54
|
-
option :rsync, :type
|
55
|
-
|
56
|
-
|
57
|
-
option :
|
59
|
+
option :rsync, :type => true,
|
60
|
+
:description => 'Install via rsync'
|
61
|
+
|
62
|
+
option :svn, :type => true,
|
63
|
+
:description => 'Install via SubVersion (SVN)'
|
64
|
+
|
65
|
+
option :hg, :type => true,
|
66
|
+
:description => 'Install via Mercurial (Hg)'
|
67
|
+
|
68
|
+
option :git, :type => true,
|
69
|
+
:description => 'Install via Git'
|
58
70
|
|
59
71
|
argument :uri, :type => String,
|
60
72
|
:description => 'The URI of the Repository'
|
61
73
|
|
74
|
+
examples [
|
75
|
+
"ronin install git://github.com/user/repo.git",
|
76
|
+
"ronin install --git git@example.com:/home/secret/repo"
|
77
|
+
]
|
78
|
+
|
62
79
|
#
|
63
80
|
# Sets up the install command.
|
64
81
|
#
|
@@ -58,32 +58,43 @@ module Ronin
|
|
58
58
|
|
59
59
|
summary 'Manages IPAddresses'
|
60
60
|
|
61
|
-
query_option :v4, :type => true,
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
61
|
+
query_option :v4, :type => true,
|
62
|
+
:flag => '-4',
|
63
|
+
:description => 'Searches for IPv4 addresses'
|
64
|
+
|
65
|
+
query_option :v6, :type => true,
|
66
|
+
:flag => '-6',
|
67
|
+
:description => 'Searches for IPv6 addresses'
|
68
|
+
|
69
|
+
query_option :with_ports, :type => Array[Integer],
|
70
|
+
:flag => '-p',
|
71
|
+
:usage => 'PORT [...]',
|
72
|
+
:description => 'Searches for the associated PORT(s)'
|
73
|
+
|
74
|
+
query_option :with_macs, :type => Array,
|
75
|
+
:flag => '-M',
|
76
|
+
:usage => 'MAC [...]',
|
77
|
+
:description => 'Searches for the associated MAC address(es)'
|
78
|
+
|
79
|
+
query_option :with_hosts, :type => Array,
|
80
|
+
:flag => '-H',
|
81
|
+
:usage => 'HOST [...]',
|
82
|
+
:description => 'Searches for the associated HOST(s)'
|
83
|
+
|
84
|
+
option :list, :type => true,
|
85
|
+
:default => true,
|
86
|
+
:flag => '-l',
|
87
|
+
:description => 'Lists the IP addresses'
|
88
|
+
|
89
|
+
option :lookup, :type => String,
|
90
|
+
:flag => '-L',
|
91
|
+
:usage => 'HOST',
|
92
|
+
:description => 'Looks up the IP addresses for the HOST'
|
83
93
|
|
84
94
|
option :import, :type => String,
|
85
95
|
:flag => '-i',
|
86
|
-
:usage => 'FILE'
|
96
|
+
:usage => 'FILE',
|
97
|
+
:description => 'Imports IP addresses from the FILE'
|
87
98
|
|
88
99
|
#
|
89
100
|
# Queries the {IPAddress} model.
|
@@ -0,0 +1,403 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin.
|
5
|
+
#
|
6
|
+
# Ronin is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'ronin/ui/cli/command'
|
21
|
+
require 'ronin/network/tcp/proxy'
|
22
|
+
require 'ronin/network/udp/proxy'
|
23
|
+
|
24
|
+
require 'hexdump/dumper'
|
25
|
+
|
26
|
+
module Ronin
|
27
|
+
module UI
|
28
|
+
module CLI
|
29
|
+
module Commands
|
30
|
+
module Net
|
31
|
+
#
|
32
|
+
# Starts a TCP/UDP intercept proxy.
|
33
|
+
#
|
34
|
+
# ## Usage
|
35
|
+
#
|
36
|
+
# ronin net:proxy [options]
|
37
|
+
#
|
38
|
+
# ## Options
|
39
|
+
#
|
40
|
+
# -v, --[no-]verbose Enable verbose output.
|
41
|
+
# -q, --[no-]quiet Disable verbose output.
|
42
|
+
# --[no-]silent Silence all output.
|
43
|
+
# --[no-]color Enables color output.
|
44
|
+
# Default: true
|
45
|
+
# -t, --[no-]tcp TCP Proxy.
|
46
|
+
# Default: true
|
47
|
+
# -u, --[no-]udp UDP Proxy.
|
48
|
+
# -x, --[no-]hexdump Enable hexdump output.
|
49
|
+
# -H, --host [HOST] Host to listen on.
|
50
|
+
# Default: "0.0.0.0"
|
51
|
+
# -p, --port [PORT] Port to listen on.
|
52
|
+
# -s, --server [HOST[:PORT]] Server to forward connections to.
|
53
|
+
# -r, --rewrite [/REGEXP/:STRING] Rewrite rules.
|
54
|
+
# --rewrite-client [/REGEXP/:STRING]
|
55
|
+
# Client rewrite rules.
|
56
|
+
# --rewrite-server [/REGEXP/:STRING]
|
57
|
+
# Server rewrite rules.
|
58
|
+
# -i, --ignore [/REGEXP/ [...]] Ignore rules.
|
59
|
+
# --ignore-client [/REGEXP/ [...]]
|
60
|
+
# Client ignore rules.
|
61
|
+
# --ignore-server [/REGEXP/ [...]]
|
62
|
+
# Server ignore rules.
|
63
|
+
# -C, --close [/REGEXP/ [...]] Close rules.
|
64
|
+
# --close-client [/REGEXP/ [...]]
|
65
|
+
# Client close rules.
|
66
|
+
# --close-server [/REGEXP/ [...]]
|
67
|
+
# Server close rules.
|
68
|
+
# -R, --reset [/REGEXP/ [...]] Reset rules.
|
69
|
+
# --reset-client [/REGEXP/ [...]]
|
70
|
+
# Client reset rules.
|
71
|
+
# --reset-server [/REGEXP/ [...]]
|
72
|
+
# Server reset rules.
|
73
|
+
#
|
74
|
+
# @since 1.5.0
|
75
|
+
#
|
76
|
+
class Proxy < Command
|
77
|
+
|
78
|
+
summary 'Starts a TCP/UDP intercept proxy'
|
79
|
+
|
80
|
+
option :tcp, :type => true,
|
81
|
+
:default => true,
|
82
|
+
:flag => '-t',
|
83
|
+
:description => 'TCP Proxy'
|
84
|
+
|
85
|
+
option :udp, :type => true,
|
86
|
+
:flag => '-u',
|
87
|
+
:description => 'UDP Proxy'
|
88
|
+
|
89
|
+
option :hexdump, :type => true,
|
90
|
+
:flag => '-x',
|
91
|
+
:description => 'Enable hexdump output'
|
92
|
+
|
93
|
+
option :host, :type => String,
|
94
|
+
:default => Network::Proxy::DEFAULT_HOST,
|
95
|
+
:flag => '-H',
|
96
|
+
:usage => 'HOST',
|
97
|
+
:description => 'Host to listen on'
|
98
|
+
|
99
|
+
option :port, :type => Integer,
|
100
|
+
:flag => '-p',
|
101
|
+
:usage => 'PORT',
|
102
|
+
:description => 'Port to listen on'
|
103
|
+
|
104
|
+
option :server, :type => String,
|
105
|
+
:flag => '-s',
|
106
|
+
:usage => 'HOST[:PORT]',
|
107
|
+
:description => 'Server to forward connections to'
|
108
|
+
|
109
|
+
option :rewrite, :type => Hash[Regexp => String],
|
110
|
+
:flag => '-r',
|
111
|
+
:usage => '/REGEXP/:STRING',
|
112
|
+
:description => 'Rewrite rules'
|
113
|
+
|
114
|
+
option :rewrite_client, :type => Hash[Regexp => String],
|
115
|
+
:usage => '/REGEXP/:STRING',
|
116
|
+
:description => 'Client rewrite rules'
|
117
|
+
|
118
|
+
option :rewrite_server, :type => Hash[Regexp => String],
|
119
|
+
:usage => '/REGEXP/:STRING',
|
120
|
+
:description => 'Server rewrite rules'
|
121
|
+
|
122
|
+
option :ignore, :type => Set[Regexp],
|
123
|
+
:flag => '-i',
|
124
|
+
:usage => '/REGEXP/ [...]',
|
125
|
+
:description => 'Ignore rules'
|
126
|
+
|
127
|
+
option :ignore_client, :type => Set[Regexp],
|
128
|
+
:usage => '/REGEXP/ [...]',
|
129
|
+
:description => 'Client ignore rules'
|
130
|
+
|
131
|
+
option :ignore_server, :type => Set[String],
|
132
|
+
:usage => '/REGEXP/ [...]',
|
133
|
+
:description => 'Server ignore rules'
|
134
|
+
|
135
|
+
option :close, :type => Set[Regexp],
|
136
|
+
:flag => '-C',
|
137
|
+
:usage => '/REGEXP/ [...]',
|
138
|
+
:description => 'Close rules'
|
139
|
+
|
140
|
+
option :close_client, :type => Set[Regexp],
|
141
|
+
:usage => '/REGEXP/ [...]',
|
142
|
+
:description => 'Client close rules'
|
143
|
+
|
144
|
+
option :close_server, :type => Set[Regexp],
|
145
|
+
:usage => '/REGEXP/ [...]',
|
146
|
+
:description => 'Server close rules'
|
147
|
+
|
148
|
+
option :reset, :type => Set[Regexp],
|
149
|
+
:flag => '-R',
|
150
|
+
:usage => '/REGEXP/ [...]',
|
151
|
+
:description => 'Reset rules'
|
152
|
+
|
153
|
+
option :reset_client, :type => Set[Regexp],
|
154
|
+
:usage => '/REGEXP/ [...]',
|
155
|
+
:description => 'Client reset rules'
|
156
|
+
|
157
|
+
option :reset_server, :type => Set[Regexp],
|
158
|
+
:usage => '/REGEXP/ [...]',
|
159
|
+
:description => 'Server reset rules'
|
160
|
+
|
161
|
+
#
|
162
|
+
# Sets up the proxy command.
|
163
|
+
#
|
164
|
+
def setup
|
165
|
+
super
|
166
|
+
|
167
|
+
unless server?
|
168
|
+
print_error "Must specify the SERVER argument"
|
169
|
+
exit -1
|
170
|
+
end
|
171
|
+
|
172
|
+
@server_host, @server_port = server.split(':',2)
|
173
|
+
@server_port = if @server_port
|
174
|
+
@server_port.to_i
|
175
|
+
end
|
176
|
+
|
177
|
+
if hexdump?
|
178
|
+
@hexdumper = Hexdump::Dumper.new
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# Executes the proxy command.
|
184
|
+
#
|
185
|
+
def execute
|
186
|
+
@proxy = proxy_class.new(
|
187
|
+
:port => @port,
|
188
|
+
:host => @host,
|
189
|
+
:server => [@server_host, @server_port]
|
190
|
+
)
|
191
|
+
|
192
|
+
if tcp?
|
193
|
+
@proxy.on_client_connect do |client|
|
194
|
+
print_outgoing client, '[connecting]'
|
195
|
+
end
|
196
|
+
|
197
|
+
@proxy.on_client_disconnect do |client,server|
|
198
|
+
print_outgoing client, '[disconnecting]'
|
199
|
+
end
|
200
|
+
|
201
|
+
@proxy.on_server_connect do |client,server|
|
202
|
+
print_incoming client, '[connected]'
|
203
|
+
end
|
204
|
+
|
205
|
+
@proxy.on_server_disconnect do |client,server|
|
206
|
+
print_incoming client, '[disconnected]'
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
if @reset_client
|
211
|
+
@reset_client.each do |pattern|
|
212
|
+
@proxy.on_client_data do |client,server,data|
|
213
|
+
@proxy.reset! if data =~ pattern
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
if @close_client
|
219
|
+
@close_client.each do |pattern|
|
220
|
+
@proxy.on_client_data do |client,server,data|
|
221
|
+
@proxy.close! if data =~ pattern
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
if @ignore_client
|
227
|
+
@ignore_client.each do |pattern|
|
228
|
+
@proxy.on_client_data do |client,server,data|
|
229
|
+
@proxy.ignore! if data =~ pattern
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
if @rewrite_client
|
235
|
+
@rewrite_client.each do |pattern,replace|
|
236
|
+
@proxy.on_client_data do |client,server,data|
|
237
|
+
data.gsub!(pattern,replace)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
if @reset_server
|
243
|
+
@reset_server.each do |pattern|
|
244
|
+
@proxy.on_server_data do |client,server,data|
|
245
|
+
@proxy.reset! if data =~ pattern
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
if @close_server
|
251
|
+
@close_server.each do |pattern|
|
252
|
+
@proxy.on_server_data do |client,server,data|
|
253
|
+
@proxy.close! if data =~ pattern
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
if @ignore_server
|
259
|
+
@ignore_server.each do |pattern|
|
260
|
+
@proxy.on_server_data do |client,server,data|
|
261
|
+
@proxy.ignore! if data =~ pattern
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
if @rewrite_server
|
267
|
+
@rewrite_server.each do |pattern,replace|
|
268
|
+
@proxy.on_server_data do |client,server,data|
|
269
|
+
data.gsub!(pattern,replace)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
if @reset
|
275
|
+
@reset.each do |pattern|
|
276
|
+
@proxy.on_data do |client,server,data|
|
277
|
+
@proxy.reset! if data =~ pattern
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
if @close
|
283
|
+
@close.each do |pattern|
|
284
|
+
@proxy.on_data do |client,server,data|
|
285
|
+
@proxy.close! if data =~ pattern
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
if @ignore
|
291
|
+
@ignore.each do |pattern|
|
292
|
+
@proxy.on_data do |client,server,data|
|
293
|
+
@proxy.ignore! if data =~ pattern
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
if @rewrite
|
299
|
+
@rewrite.each do |pattern,replace|
|
300
|
+
@proxy.on_data do |client,server,data|
|
301
|
+
data.gsub!(pattern,replace)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
@proxy.on_client_data do |client,server,data|
|
307
|
+
print_outgoing client
|
308
|
+
print_data data
|
309
|
+
end
|
310
|
+
|
311
|
+
@proxy.on_server_data do |client,server,data|
|
312
|
+
print_incoming client
|
313
|
+
print_data data
|
314
|
+
end
|
315
|
+
|
316
|
+
@proxy.start
|
317
|
+
end
|
318
|
+
|
319
|
+
protected
|
320
|
+
|
321
|
+
#
|
322
|
+
# Determines the Proxy class based on the `--tcp` or `--udp`
|
323
|
+
# options.
|
324
|
+
#
|
325
|
+
# @return [Network::TCP::Proxy, Network::UDP::Proxy]
|
326
|
+
# The proxy class.
|
327
|
+
#
|
328
|
+
def proxy_class
|
329
|
+
if udp?
|
330
|
+
Network::UDP::Proxy
|
331
|
+
elsif tcp?
|
332
|
+
Network::TCP::Proxy
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
#
|
337
|
+
# Returns the address for the connection.
|
338
|
+
#
|
339
|
+
# @param [(UDPSocket,(host, port)), TCPSocket, UDPSocket] connection
|
340
|
+
# The connection.
|
341
|
+
#
|
342
|
+
# @return [String]
|
343
|
+
# The address of the connection.
|
344
|
+
#
|
345
|
+
def address(connection)
|
346
|
+
case connection
|
347
|
+
when Array
|
348
|
+
socket, (host, port) = connection
|
349
|
+
|
350
|
+
"#{host}:#{port}"
|
351
|
+
when TCPSocket, UDPSocket
|
352
|
+
addrinfo = connection.peeraddr
|
353
|
+
|
354
|
+
"#{addrinfo[3]}:#{addrinfo[1]}"
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
#
|
359
|
+
# Prints a connection header for an incoming event.
|
360
|
+
#
|
361
|
+
# @param [(UDPSocket,(host, port)), TCPSocket, UDPSocket] client
|
362
|
+
# The client.
|
363
|
+
#
|
364
|
+
# @param [String] event
|
365
|
+
# The optional name of the event.
|
366
|
+
#
|
367
|
+
def print_incoming(client,event=nil)
|
368
|
+
print_info "#{address(client)} <- #{@proxy} #{event}"
|
369
|
+
end
|
370
|
+
|
371
|
+
#
|
372
|
+
# Prints a connection header for an outgoing event.
|
373
|
+
#
|
374
|
+
# @param [(UDPSocket,(host, port)), TCPSocket, UDPSocket] client
|
375
|
+
# The client.
|
376
|
+
#
|
377
|
+
# @param [String] type
|
378
|
+
# The optional name of the event.
|
379
|
+
#
|
380
|
+
def print_outgoing(client,type=nil)
|
381
|
+
print_info "#{address(client)} -> #{@proxy} #{type}"
|
382
|
+
end
|
383
|
+
|
384
|
+
#
|
385
|
+
# Prints data from a message.
|
386
|
+
#
|
387
|
+
# @param [String] data
|
388
|
+
# The data from a message.
|
389
|
+
#
|
390
|
+
def print_data(data)
|
391
|
+
if hexdump?
|
392
|
+
@hexdumper.dump(data)
|
393
|
+
else
|
394
|
+
puts data
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|