rbkb 0.6.10
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/History.txt +74 -0
- data/README.rdoc +149 -0
- data/Rakefile +47 -0
- data/bin/b64 +5 -0
- data/bin/bgrep +5 -0
- data/bin/blit +5 -0
- data/bin/c +5 -0
- data/bin/crc32 +5 -0
- data/bin/d64 +5 -0
- data/bin/dedump +5 -0
- data/bin/feed +5 -0
- data/bin/hexify +5 -0
- data/bin/len +5 -0
- data/bin/plugsrv +271 -0
- data/bin/rex +10 -0
- data/bin/rstrings +5 -0
- data/bin/slice +5 -0
- data/bin/telson +5 -0
- data/bin/unhexify +5 -0
- data/bin/urldec +5 -0
- data/bin/urlenc +5 -0
- data/bin/xor +5 -0
- data/cli_usage.rdoc +285 -0
- data/doctor-bag.jpg +0 -0
- data/lib/rbkb.rb +51 -0
- data/lib/rbkb/cli.rb +219 -0
- data/lib/rbkb/cli/b64.rb +35 -0
- data/lib/rbkb/cli/bgrep.rb +86 -0
- data/lib/rbkb/cli/blit.rb +89 -0
- data/lib/rbkb/cli/chars.rb +24 -0
- data/lib/rbkb/cli/crc32.rb +35 -0
- data/lib/rbkb/cli/d64.rb +28 -0
- data/lib/rbkb/cli/dedump.rb +52 -0
- data/lib/rbkb/cli/feed.rb +229 -0
- data/lib/rbkb/cli/hexify.rb +65 -0
- data/lib/rbkb/cli/len.rb +76 -0
- data/lib/rbkb/cli/rstrings.rb +108 -0
- data/lib/rbkb/cli/slice.rb +47 -0
- data/lib/rbkb/cli/telson.rb +87 -0
- data/lib/rbkb/cli/unhexify.rb +50 -0
- data/lib/rbkb/cli/urldec.rb +35 -0
- data/lib/rbkb/cli/urlenc.rb +35 -0
- data/lib/rbkb/cli/xor.rb +43 -0
- data/lib/rbkb/extends.rb +725 -0
- data/lib/rbkb/http.rb +21 -0
- data/lib/rbkb/http/base.rb +172 -0
- data/lib/rbkb/http/body.rb +214 -0
- data/lib/rbkb/http/common.rb +74 -0
- data/lib/rbkb/http/headers.rb +370 -0
- data/lib/rbkb/http/parameters.rb +104 -0
- data/lib/rbkb/http/request.rb +58 -0
- data/lib/rbkb/http/response.rb +86 -0
- data/lib/rbkb/plug.rb +9 -0
- data/lib/rbkb/plug/blit.rb +222 -0
- data/lib/rbkb/plug/cli.rb +83 -0
- data/lib/rbkb/plug/feed_import.rb +74 -0
- data/lib/rbkb/plug/peer.rb +67 -0
- data/lib/rbkb/plug/plug.rb +215 -0
- data/lib/rbkb/plug/proxy.rb +26 -0
- data/lib/rbkb/plug/unix_domain.rb +75 -0
- data/lib_usage.rdoc +176 -0
- data/rbkb.gemspec +38 -0
- data/spec/rbkb_spec.rb +7 -0
- data/spec/spec_helper.rb +16 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/test/test_cli_b64.rb +35 -0
- data/test/test_cli_bgrep.rb +137 -0
- data/test/test_cli_blit.rb +11 -0
- data/test/test_cli_chars.rb +21 -0
- data/test/test_cli_crc32.rb +108 -0
- data/test/test_cli_d64.rb +22 -0
- data/test/test_cli_dedump.rb +118 -0
- data/test/test_cli_feed.rb +11 -0
- data/test/test_cli_helper.rb +96 -0
- data/test/test_cli_hexify.rb +63 -0
- data/test/test_cli_len.rb +96 -0
- data/test/test_cli_rstrings.rb +15 -0
- data/test/test_cli_slice.rb +73 -0
- data/test/test_cli_telson.rb +11 -0
- data/test/test_cli_unhexify.rb +43 -0
- data/test/test_cli_urldec.rb +50 -0
- data/test/test_cli_urlenc.rb +44 -0
- data/test/test_cli_xor.rb +71 -0
- data/test/test_helper.rb +5 -0
- data/test/test_http.rb +27 -0
- data/test/test_http_helper.rb +60 -0
- data/test/test_http_request.rb +136 -0
- data/test/test_http_response.rb +222 -0
- data/test/test_rbkb.rb +19 -0
- metadata +238 -0
data/History.txt
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
== 0.6.10 / 2009-09-30
|
2
|
+
* added -b/--blitsrv argument to plugsrv
|
3
|
+
* added --target-tls/--server-tls arguments to plugsrv for TLS support
|
4
|
+
|
5
|
+
== 0.6.9.1 / 2009-09-08
|
6
|
+
* fixed a typo in random_string()
|
7
|
+
|
8
|
+
== 0.6.9 / 2009-09-01
|
9
|
+
* Enhancements
|
10
|
+
* telson and feed now support -s/--source address:port using TCP with
|
11
|
+
bind_connect via eventmachine
|
12
|
+
* random_string and random_alphanum helper methods added
|
13
|
+
* Bug-Fix
|
14
|
+
* Plug's PeerList.find_peers was returning nil resulting in problems for
|
15
|
+
blit -l amongst other things.
|
16
|
+
|
17
|
+
== 0.6.8.1 / 2009-06-12
|
18
|
+
* Enhancements
|
19
|
+
* Added String.rotate_bytes per request for a rotation cypher by
|
20
|
+
wardwouts@github. I pilfered this implementation mostly from Timur Duehr.
|
21
|
+
|
22
|
+
== 0.6.8 / 2009-06-04
|
23
|
+
* Enhancements
|
24
|
+
* 0.6.8 is geared towards beginning to make rbkb compatible with ruby 1.9.x
|
25
|
+
(tested on 1.9.1). Had to sacrifice the 'uuid' helper method
|
26
|
+
since something happened to SHA1 in ruby 1.9. It may make a comeback if
|
27
|
+
anybody yells about this.
|
28
|
+
* Known Issues:
|
29
|
+
* There are problems with binary releases of eventmachine with 1.9.1 on win32
|
30
|
+
this does not appear to be caused by rbkb, however we're keeping an eye on
|
31
|
+
it. For now, this is causing the plug tools to crash and test cases to
|
32
|
+
fail on 1.9.1 win32.
|
33
|
+
|
34
|
+
== 0.6.7
|
35
|
+
* Enhancements
|
36
|
+
* Http::Parameters was given the same treatement as headers got in 0.6.6.
|
37
|
+
Technically params are supposed to be unique, but we try to stay flexible
|
38
|
+
in Rbkb.
|
39
|
+
* Bug-fix:
|
40
|
+
* Fixed a silly typing bug in Http::Parameters.set_param introduced
|
41
|
+
around 0.6.6
|
42
|
+
|
43
|
+
== 0.6.6
|
44
|
+
* Bug-fix:
|
45
|
+
* Http library improperly made headers unique by name. The library has
|
46
|
+
been changed so that headers no longer tries to pretend to be a hash.
|
47
|
+
|
48
|
+
== 0.6.5.2
|
49
|
+
* Enhancements
|
50
|
+
* d64 and b64 now support the -f option for input files as rdoc indicates
|
51
|
+
Thanks to Cory Scott for catching this doc error and for his patch.
|
52
|
+
|
53
|
+
== 0.6.5.1
|
54
|
+
* Minor bug-fix
|
55
|
+
* fixed a problem with the gem, version bump is for github visibility
|
56
|
+
|
57
|
+
== 0.6.5 / 2009-03-24
|
58
|
+
|
59
|
+
* Enhancements
|
60
|
+
* Added a http protocol library (Rbkb::Http)
|
61
|
+
* Added TLS support to telson (-S/--start-tls in cli)
|
62
|
+
* Added raw dump output to telson (-d raw/hex in cli : hex is default)
|
63
|
+
|
64
|
+
== 0.6.4 / 2009-03-20
|
65
|
+
|
66
|
+
* Enhancements
|
67
|
+
* Added unit tests for all cli utilities. Most are fairly complete.
|
68
|
+
|
69
|
+
== 0.6.3 / 2009-03-10
|
70
|
+
|
71
|
+
* Enhancements
|
72
|
+
* Started using bones to help manage this mess. History.txt is born!
|
73
|
+
* begun adding test cases for cli utils
|
74
|
+
* crc32 takes an optional filename argument as first arg
|
data/README.rdoc
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
= rbkb
|
2
|
+
|
3
|
+
* http://emonti.github.com/rbkb
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
Ruby BlackBag (rbkb)
|
8
|
+
|
9
|
+
A miscellaneous collection of command-line tools and ruby library helpers
|
10
|
+
related to pen-testing and reversing.
|
11
|
+
|
12
|
+
=== Rationale
|
13
|
+
|
14
|
+
Disclaimer:
|
15
|
+
Most of what's in the black bag came from a desire to do less typing.
|
16
|
+
But there might be a few clever things that were added by accident.
|
17
|
+
|
18
|
+
rbkb is inspired by Matasano BlackBag (a set of similar tools written in C).
|
19
|
+
|
20
|
+
See:
|
21
|
+
* http://www.matasano.com/log/1048/blackbag-091-new-link-and-minor-fixes/
|
22
|
+
* http://www.matasano.com/log/552/code-release-blackbag-09-binary-protocol-reversing-unix-thingies/
|
23
|
+
|
24
|
+
Things go into the black bag as they are stolen (as a compliment!) or dreamed
|
25
|
+
up, usually for simplifying some repetetive task or a desire for a new tool.
|
26
|
+
|
27
|
+
Along the way, some of tools in the blackbag spirit make their way into 'rbkb'
|
28
|
+
that may or may not make it to 'bkb' right away (if ever). Similarly some of
|
29
|
+
the things in 'bkb' have not yet made it to 'rbkb' (and may not).
|
30
|
+
|
31
|
+
|
32
|
+
== SYNOPSIS:
|
33
|
+
|
34
|
+
=== Command Line Tools
|
35
|
+
|
36
|
+
The tools almost all support '-h', but I'll admit this only goes so far.
|
37
|
+
See cli_usage.rdoc for usage and a bit of extra info on the various tools.
|
38
|
+
|
39
|
+
When I get some spare time, I'll try and do up some examples of using all
|
40
|
+
the tools.
|
41
|
+
|
42
|
+
|
43
|
+
=== Plug
|
44
|
+
|
45
|
+
Black Bag includes several tools for testing network protocols using plugboard
|
46
|
+
proxies. Users of the original Matasano BlackBag may be familiar with the
|
47
|
+
commands 'bkb replug', 'bkb telson', and 'bkb blit'.
|
48
|
+
|
49
|
+
Ruby BlackBag has a similar set of network tools:
|
50
|
+
|
51
|
+
* 'blit' : Uses a simple homegrown OOB IPC mechanism (local socket) to
|
52
|
+
communicate with 'blit-capable' tools like telson and plugsrv and send
|
53
|
+
data to network endpoints through them. Use 'blit' to send raw
|
54
|
+
messages to servers or clients then watch how they respond (see below).
|
55
|
+
|
56
|
+
* 'telson' : Similar to 'bkb telson'. Opens a TCP or UDP client connection
|
57
|
+
which is little more than a receiver for 'blit' messages. Use this to
|
58
|
+
pretend to be a client and send raw messages to some service while observing
|
59
|
+
raw replies.
|
60
|
+
|
61
|
+
* 'plugsrv' : Similar to 'bkb replug'. Sits as a reverse TCP proxy between
|
62
|
+
one or more clients and a server. Accepts 'blit' messages which can be
|
63
|
+
directed at client or server ends of a conversation. The original 'replug'
|
64
|
+
didn't do this, which makes plugsrv kindof neat.
|
65
|
+
|
66
|
+
|
67
|
+
=== Monkey Patches
|
68
|
+
|
69
|
+
Much of rbkb is implemented as a bunch of monkeypatches to Array, String,
|
70
|
+
Numeric and other base classes. If this suits your fancy (some people despise
|
71
|
+
monkeypatches, this is not their fancy) then you can 'require "rbkb"' from
|
72
|
+
your irb sessions and own scripts. See 'lib_usage.rdoc' for more info.
|
73
|
+
|
74
|
+
|
75
|
+
== REQUIREMENTS:
|
76
|
+
|
77
|
+
* eventmachine >= 0.12.8
|
78
|
+
|
79
|
+
|
80
|
+
== INSTALL:
|
81
|
+
|
82
|
+
=== Gem Installation
|
83
|
+
|
84
|
+
rbkb is available as a gem from github:
|
85
|
+
|
86
|
+
gem sources -a http://gems.github.com #(you only have to do this once)
|
87
|
+
gem install emonti-rbkb
|
88
|
+
|
89
|
+
|
90
|
+
==== Gem Install Note
|
91
|
+
|
92
|
+
Installing the gem as root may be risky depending on your rubygems
|
93
|
+
configuration so I don't really recommend using 'sudo gem install'.
|
94
|
+
Worst case scenario I know of is I blew away my OSX-shipped '/usr/bin/crc32'
|
95
|
+
this way. It was written in perl, so I considered this providence and didn't
|
96
|
+
look back. But you may feel differently about 'rubygems' clobbering a file in
|
97
|
+
/usr/bin.
|
98
|
+
|
99
|
+
When installing as a regular user, however, rubygems may stick rbkb's
|
100
|
+
executable bin/* files somewhere unexpected. To find out where these are and
|
101
|
+
either add them to your PATH or copy/symlink them somewhere else like
|
102
|
+
/usr/local/bin/ do this:
|
103
|
+
|
104
|
+
gem contents emonti-rbkb
|
105
|
+
|
106
|
+
|
107
|
+
=== Manual installation:
|
108
|
+
|
109
|
+
git clone git://github.com/emonti/rbkb.git
|
110
|
+
cd rbkb
|
111
|
+
rake gem:install
|
112
|
+
|
113
|
+
|
114
|
+
or ... you can also install manually without rubygems.
|
115
|
+
|
116
|
+
You can access the rbkb project at github. You'll want git installed:
|
117
|
+
|
118
|
+
cp -r rbkb/lib/* /usr/lib/ruby/1.8/site_ruby/1.8 # or another ruby libdir
|
119
|
+
cp bin/* ~/bin # or wherever else in your PATH
|
120
|
+
|
121
|
+
Run this to generate docs with rdoc the same way the gem would have:
|
122
|
+
|
123
|
+
rake doc:rdoc
|
124
|
+
|
125
|
+
== LICENSE:
|
126
|
+
|
127
|
+
(The MIT License)
|
128
|
+
|
129
|
+
Copyright (c) 2009 Eric Monti, Matasano Security
|
130
|
+
|
131
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
132
|
+
a copy of this software and associated documentation files (the
|
133
|
+
'Software'), to deal in the Software without restriction, including
|
134
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
135
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
136
|
+
permit persons to whom the Software is furnished to do so, subject to
|
137
|
+
the following conditions:
|
138
|
+
|
139
|
+
The above copyright notice and this permission notice shall be
|
140
|
+
included in all copies or substantial portions of the Software.
|
141
|
+
|
142
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
143
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
144
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
145
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
146
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
147
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
148
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
149
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Look in the tasks/setup.rb file for the various options that can be
|
2
|
+
# configured in this Rakefile. The .rake files in the tasks directory
|
3
|
+
# are where the options are used.
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'bones'
|
7
|
+
Bones.setup
|
8
|
+
rescue LoadError
|
9
|
+
begin
|
10
|
+
load 'tasks/setup.rb'
|
11
|
+
rescue LoadError
|
12
|
+
raise RuntimeError, '### please install the "bones" gem ###'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
ensure_in_path 'lib'
|
17
|
+
require 'rbkb'
|
18
|
+
|
19
|
+
task :default => 'test:run'
|
20
|
+
|
21
|
+
PROJ.name = 'rbkb'
|
22
|
+
PROJ.authors = 'Eric Monti'
|
23
|
+
PROJ.email = 'emonti@matasano.com'
|
24
|
+
PROJ.description = 'Rbkb is a collection of ruby-based pen-testing and reversing tools. Inspired by Matasano Blackbag.'
|
25
|
+
PROJ.url = 'http://emonti.github.com/rbkb'
|
26
|
+
PROJ.version = Rbkb::VERSION
|
27
|
+
PROJ.rubyforge.name = 'rbkb'
|
28
|
+
PROJ.readme_file = 'README.rdoc'
|
29
|
+
|
30
|
+
PROJ.spec.opts << '--color'
|
31
|
+
|
32
|
+
PROJ.rdoc.opts << '--line-numbers'
|
33
|
+
|
34
|
+
#PROJ.rdoc.opts << '--diagram'
|
35
|
+
PROJ.notes.tags << "X"+"XX" # muhah! so we don't note our-self
|
36
|
+
|
37
|
+
# exclude rcov.rb and external libs from rcov report
|
38
|
+
PROJ.rcov.opts += [
|
39
|
+
"--exclude", "rcov.rb",
|
40
|
+
"--exclude", "eventmachine",
|
41
|
+
"--exclude", "pcap_misc.rb",
|
42
|
+
"--exclude", "pcaplet.rb"
|
43
|
+
]
|
44
|
+
|
45
|
+
depend_on 'eventmachine', '>= 0.12.8'
|
46
|
+
|
47
|
+
# EOF
|
data/bin/b64
ADDED
data/bin/bgrep
ADDED
data/bin/blit
ADDED
data/bin/c
ADDED
data/bin/crc32
ADDED
data/bin/d64
ADDED
data/bin/dedump
ADDED
data/bin/feed
ADDED
data/bin/hexify
ADDED
data/bin/len
ADDED
data/bin/plugsrv
ADDED
@@ -0,0 +1,271 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright 2009 emonti at matasano.com
|
3
|
+
# See README.rdoc for license information
|
4
|
+
#
|
5
|
+
# A blit-able reverse TCP proxy. Displays traffic hexdumps. Currently uses
|
6
|
+
# the default blit port for its blit receiver.
|
7
|
+
#
|
8
|
+
# XXX TODO - refactor me!
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'rubygems'
|
12
|
+
rescue LoadError
|
13
|
+
end
|
14
|
+
require 'eventmachine'
|
15
|
+
require 'socket'
|
16
|
+
require 'optparse'
|
17
|
+
require 'rbkb/plug'
|
18
|
+
|
19
|
+
class BlitPlug
|
20
|
+
module UI
|
21
|
+
def log( *msg )
|
22
|
+
unless PLUG_OPTS[:quiet]
|
23
|
+
PLUG_OPTS[:out].puts msg
|
24
|
+
end
|
25
|
+
end
|
26
|
+
module_function :log
|
27
|
+
end
|
28
|
+
|
29
|
+
class Controller
|
30
|
+
attr_accessor :tgtaddr, :tgtport, :tgtclient, :blit, :peers
|
31
|
+
@@controller = nil
|
32
|
+
|
33
|
+
def initialize(tgtaddr, tgtport, tgtclient)
|
34
|
+
@tgtaddr = tgtaddr
|
35
|
+
@tgtport = tgtport
|
36
|
+
@tgtclient = tgtclient
|
37
|
+
|
38
|
+
@@controller = self
|
39
|
+
|
40
|
+
@peers = Array.new
|
41
|
+
|
42
|
+
## Just tack on a blit server???
|
43
|
+
@blit = EventMachine::start_server(
|
44
|
+
PLUG_OPTS[:blit_addr], PLUG_OPTS[:blit_port], Plug::Blit, :TCP, self
|
45
|
+
)
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
##----------------------------------------
|
50
|
+
|
51
|
+
def dispatch_rcv(snder, data)
|
52
|
+
data # for now
|
53
|
+
end
|
54
|
+
|
55
|
+
##----------------------------------------
|
56
|
+
|
57
|
+
def dispatch_close(snder)
|
58
|
+
nil # for now
|
59
|
+
end
|
60
|
+
|
61
|
+
##----------------------------------------
|
62
|
+
|
63
|
+
def self.proxy(cli)
|
64
|
+
unless (ctrl = @@controller)
|
65
|
+
raise "No controller exists for this connection: #{cli.sock_peername}"
|
66
|
+
end
|
67
|
+
|
68
|
+
tgtaddr = ctrl.tgtaddr
|
69
|
+
tgtport = ctrl.tgtport
|
70
|
+
tgtclient = ctrl.tgtclient
|
71
|
+
|
72
|
+
srv = EventMachine::connect(tgtaddr, tgtport, tgtclient)
|
73
|
+
srv.plug_peers.push cli
|
74
|
+
cli.plug_peers.push srv
|
75
|
+
|
76
|
+
ctrl.peers.push srv
|
77
|
+
ctrl.peers.push cli ### I suppose this is probably useful too..
|
78
|
+
|
79
|
+
srv.controller = cli.controller = ctrl
|
80
|
+
end
|
81
|
+
end # class BlitPlug::Controller
|
82
|
+
|
83
|
+
|
84
|
+
module BaseTCP
|
85
|
+
include UI
|
86
|
+
|
87
|
+
attr_accessor :plug_peers, :controller, :kind
|
88
|
+
attr_reader :sock_peer, :sock_peername
|
89
|
+
|
90
|
+
def post_init
|
91
|
+
@plug_peers = Array.new
|
92
|
+
@kind = :conn # default
|
93
|
+
end
|
94
|
+
|
95
|
+
def name
|
96
|
+
@name
|
97
|
+
end
|
98
|
+
|
99
|
+
def say(data, sender)
|
100
|
+
log "%#{sender.kind.to_s.upcase}-SAYS", data.hexdump(:out => StringIO.new), "%"
|
101
|
+
send_data data
|
102
|
+
end
|
103
|
+
|
104
|
+
def receive_data data
|
105
|
+
log "%#{kind.to_s.upcase}-#{sock_peername}-SAYS", data.hexdump, "%"
|
106
|
+
if @controller and (data = @controller.dispatch_rcv(self, data)).nil?
|
107
|
+
return
|
108
|
+
end
|
109
|
+
@plug_peers.each {|p| p.send_data data}
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
def notify_connection
|
114
|
+
@name = "#{kind.to_s.upcase}-#{sock_peername}"
|
115
|
+
log "%#{@name}-CONNECTED"
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
def unbind
|
120
|
+
@name = "#{kind.to_s.upcase}-#{sock_peername}"
|
121
|
+
log "%#{@name}-CLOSED"
|
122
|
+
|
123
|
+
cret = (@controller and @controller.dispatch_close(self))
|
124
|
+
|
125
|
+
@plug_peers.each do |p|
|
126
|
+
p.plug_peers.delete(self)
|
127
|
+
p.close_connection unless cret
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
module TCPListener
|
134
|
+
include BlitPlug::BaseTCP
|
135
|
+
attr_accessor :tgtaddr, :tgtport
|
136
|
+
|
137
|
+
def post_init
|
138
|
+
super
|
139
|
+
@kind = :client
|
140
|
+
@sock_peer = Socket.unpack_sockaddr_in(get_peername).reverse
|
141
|
+
@sock_peername = @sock_peer.join(':')
|
142
|
+
|
143
|
+
@controller = BlitPlug::Controller.proxy(self)
|
144
|
+
|
145
|
+
start_tls if PLUG_OPTS[:svr_tls]
|
146
|
+
|
147
|
+
notify_connection
|
148
|
+
end
|
149
|
+
|
150
|
+
end # module TCPListener
|
151
|
+
|
152
|
+
|
153
|
+
module TCPClient
|
154
|
+
include BlitPlug::BaseTCP
|
155
|
+
attr_accessor :connected
|
156
|
+
|
157
|
+
def post_init
|
158
|
+
super
|
159
|
+
@kind = :server
|
160
|
+
end
|
161
|
+
|
162
|
+
def connection_completed
|
163
|
+
@sock_peer = Socket.unpack_sockaddr_in(get_peername).reverse
|
164
|
+
@sock_peername = @sock_peer.join(':')
|
165
|
+
notify_connection
|
166
|
+
start_tls if PLUG_OPTS[:tgt_tls]
|
167
|
+
end
|
168
|
+
|
169
|
+
end # module TCPClient
|
170
|
+
|
171
|
+
end # module BlitPlug
|
172
|
+
|
173
|
+
PLUG_OPTS={
|
174
|
+
:quiet => false,
|
175
|
+
:out => STDOUT,
|
176
|
+
:blit_addr => Plug::Blit::DEFAULT_IPADDR,
|
177
|
+
:blit_port => Plug::Blit::DEFAULT_PORT,
|
178
|
+
}
|
179
|
+
|
180
|
+
def bail(*msg)
|
181
|
+
STDERR.puts msg
|
182
|
+
exit 1
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
#############################################################################
|
188
|
+
### MAIN
|
189
|
+
#############################################################################
|
190
|
+
#
|
191
|
+
# Get option arguments
|
192
|
+
opts = OptionParser.new do |opts|
|
193
|
+
opts.banner = "Usage: #{File.basename $0} [options] target:tport[@[laddr:]lport]\n",
|
194
|
+
" <target:tport> = the address of the target service\n",
|
195
|
+
" <@laddr:lport> = optional address and port to listen on\n"
|
196
|
+
|
197
|
+
opts.separator ""
|
198
|
+
opts.separator "Options:"
|
199
|
+
|
200
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
201
|
+
puts opts
|
202
|
+
exit 1
|
203
|
+
end
|
204
|
+
|
205
|
+
opts.on("-o", "--output FILE", "send output to a file") do |o|
|
206
|
+
PLUG_OPTS[:out] = File.open(o, "w") rescue (bail $!)
|
207
|
+
end
|
208
|
+
|
209
|
+
opts.on("-l", "--listen ADDR:PORT",
|
210
|
+
"optional listener address:port",
|
211
|
+
"(default: 0.0.0.0:<tport>)"
|
212
|
+
) do |addr|
|
213
|
+
|
214
|
+
unless m = /^([\w\.]+)?(?::(\d+))?$/.match(addr)
|
215
|
+
STDERR.puts "invalid listener address"
|
216
|
+
exit 1
|
217
|
+
end
|
218
|
+
PLUG_OPTS[:svraddr] = m[1]
|
219
|
+
PLUG_OPTS[:svrport] = (m[2])? m[2].to_i : nil
|
220
|
+
end
|
221
|
+
|
222
|
+
opts.on("-q", "--[no-]quiet", "Suppress/Enable conversation dumps.") do |q|
|
223
|
+
PLUG_OPTS[:quiet] = q
|
224
|
+
end
|
225
|
+
|
226
|
+
opts.on("-b", "--blitsrv ADDR:PORT",
|
227
|
+
"specify blit listener [address:]port",
|
228
|
+
"(default: #{PLUG_OPTS[:blit_addr]}:#{PLUG_OPTS[:blit_port]})"
|
229
|
+
) do |addr|
|
230
|
+
|
231
|
+
unless m = /^(?:([\w\.]+):)?(\d+)$/.match(addr)
|
232
|
+
STDERR.puts "invalid blit listener argument"
|
233
|
+
exit 1
|
234
|
+
end
|
235
|
+
PLUG_OPTS[:blit_addr] = m[1] if m[1]
|
236
|
+
PLUG_OPTS[:blit_port] = m[2].to_i
|
237
|
+
end
|
238
|
+
|
239
|
+
opts.on("--[no-]target-tls", "enable/disable TLS to target") {|t| PLUG_OPTS[:tgt_tls] = t }
|
240
|
+
opts.on("--[no-]server-tls", "enable/disable TLS to clients") {|t| PLUG_OPTS[:svr_tls] = t }
|
241
|
+
|
242
|
+
end
|
243
|
+
|
244
|
+
opts.parse!(ARGV) rescue (STDERR.puts $!; exit 1)
|
245
|
+
|
246
|
+
|
247
|
+
# Get target/listen argument
|
248
|
+
rx = /^([\w\.]+):(\d+)(?:@(?:([\w\.]+):)?(\d+))?$/
|
249
|
+
unless (m = rx.match(ARGV.shift)) and ARGV.shift.nil?
|
250
|
+
$stderr.puts opts.banner
|
251
|
+
exit 1
|
252
|
+
end
|
253
|
+
|
254
|
+
PLUG_OPTS[:tgtaddr] = m[1]
|
255
|
+
PLUG_OPTS[:tgtport] = m[2].to_i
|
256
|
+
PLUG_OPTS[:svraddr] ||= (m[3] || "0.0.0.0")
|
257
|
+
PLUG_OPTS[:svrport] ||= (m[4] || PLUG_OPTS[:tgtport]).to_i
|
258
|
+
|
259
|
+
|
260
|
+
EventMachine::run {
|
261
|
+
# Instantiate controller
|
262
|
+
ctrl = BlitPlug::Controller.new(PLUG_OPTS[:tgtaddr], PLUG_OPTS[:tgtport], BlitPlug::TCPClient)
|
263
|
+
|
264
|
+
# Start event loop
|
265
|
+
BlitPlug::UI.log "%Starting TCP PlugServer #{PLUG_OPTS[:svraddr]}:#{PLUG_OPTS[:svrport]} -> #{PLUG_OPTS[:tgtaddr]}:#{PLUG_OPTS[:tgtport]}"
|
266
|
+
|
267
|
+
|
268
|
+
EventMachine::start_server(PLUG_OPTS[:svraddr], PLUG_OPTS[:svrport], BlitPlug::TCPListener)
|
269
|
+
}
|
270
|
+
|
271
|
+
|