emonti-rbkb 0.6.2 → 0.6.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -40,145 +40,36 @@ When I get some spare time, I'll try and do up some examples of using all
40
40
  the tools.
41
41
 
42
42
 
43
- === Monkey Patches
44
-
45
- Most of rbkb is implemented as a bunch of monkeypatches to Array, String,
46
- Numeric and other base classes. If this suits your fancy (some people despise
47
- monkeypatches, this is not their fancy) then you can 'require "rbkb"' from
48
- your irb sessions and own scripts. This will let you do things like the
49
- following (just some samples, see rdoc for more).
50
-
51
- My dirty secret: I use IRB for like... everything
52
-
53
- Do stuff with strings:
54
-
55
- ## sexify with hexify
56
- foo = "helu foo" #=> "helu foo"
57
- foo.hexify #=> "68656c7520666f6f"
58
-
59
- ## a little easier to read
60
- foo.hexify(:delim => ' ') #=> "68 65 6c 75 20 66 6f 6f"
61
-
62
- # and back
63
- _.unhexify #=> "helu foo"
64
-
65
- ## break out your hexdump -C styles
66
- foodump = "helu foo".hexdump(:out => StringIO.new)
67
- #=> "00000000 68 65 6c 75 20 66 6f 6f |helu foo|\n00000008\n"
68
- puts foodump
69
- # 00000000 68 65 6c 75 20 66 6f 6f |helu foo|
70
- # 00000008
71
- # => nil
72
- foo.hexdump(:out => $stdout)
73
- # 00000000 68 65 6c 75 20 66 6f 6f |helu foo|
74
- # 00000008
75
- # => nil
76
-
77
- ## reverse a hexdump
78
- foodump.dehexdump #=> "helu foo"
79
-
80
- ## 'strings' like /usr/bin/strings
81
- dat = File.read("/bin/ls")
82
- pp dat.strings
83
- # [[4132, 4143, :ascii, "__PAGEZERO\000"],
84
- # [4188, 4195, :ascii, "__TEXT\000"],
85
- # ...
86
- # [72427, 72470, :ascii, "*Apple Code Signing Certification Authority"],
87
- # [72645, 72652, :ascii, "X[N~EQ "]]
88
-
89
-
90
- ## look for stuff in binaries
91
- dat.bgrep("__PAGEZERO") #=> [[4132, 4142, "__PAGEZERO"], [40996, 41006, "__PAGEZERO"]]
92
- dat.bgrep(0xCAFEBABE.to_bytes) #=> [[0, 4, "\312\376\272\276"]]
93
-
94
-
95
- Do stuff with numbers:
96
-
97
- ## Do you have an irrational distaste for pack/unpack? I do.
98
- 0xff.to_bytes #=> "\000\000\000\377"
99
- be = 0xff.to_bytes(:big) #=> "\000\000\000\377"
100
- le = 0xff.to_bytes(:little) #=> "\377\000\000\000"
101
- le16 = 0xff.to_bytes(:little,2) #=> "\377\000"
43
+ === Plug
102
44
 
103
- ## Strings can go the other way too
104
- [be, le, le16].map {|n| n.dat_to_num(:big) } # default
105
- #=> [255, 4278190080, 65280]
106
- [be, le, le16].map {|n| n.dat_to_num(:little) }
107
- #=> [4278190080, 255, 255]
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'.
108
48
 
109
- ## Calculate padding for a given alignment
110
- 10.pad(16) #=> 6
111
- 16.pad(16) #=> 0
112
- 30.pad(16) #=> 2
113
- 32.pad(16) #=> 0
49
+ Ruby BlackBag has a similar set of network tools:
114
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).
115
55
 
116
- Web 2."oh no you di'int!":
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.
117
60
 
118
- xss="<script>alert('helu ' + document.cookie)</script"
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.
119
65
 
120
- # URL percent-encode stuff
121
- xss.urlenc
122
- #=> "%3cscript%3ealert%28%27helu%3a%20%27%20%2b%20document.cookie%29%3c%2fscript%3e"
123
66
 
124
- _.b64
125
- #=> "JTNjc2NyaXB0JTNlYWxlcnQlMjglMjdoZWx1JTNhJTIwJTI3JTIwJTJiJTIwZG9jdW1lbnQuY29va2llJTI5JTNjJTJmc2NyaXB0JTNl"
126
-
127
- ## And back
128
- _.d64
129
- #=> "%3cscript%3ealert%28%27helu%3a%20%27%20%2b%20document.cookie%29%3c%2fscript%3e"
130
-
131
- _.urldec
132
- #=> "<script>alert('helu: ' + document.cookie)</script>"
133
-
134
-
135
- Miscellaneous stuff:
136
-
137
- # rediculous laziness!
138
- 0x41.printable? #=> true
139
- 0x01.printable? #=> false
140
-
141
- # Make random gobbledygook and insults
142
- "helu foo".randomize #=> "ouofleh "
143
- "helu foo".randomize #=> "foul hoe"
144
-
145
-
146
- Pretend (badly) to be smart:
147
-
148
- # Cletus say's he's "sneaky"
149
- cletus = "my secrets are safe".xor("sneaky")
150
- #=> "\036\027E\022\016\032\001\v\021\022K\030\001\vE\022\n\037\026"
151
-
152
- # Only not really so sneaky
153
- cletus.xor "my secrets" #=> "sneakysnea&a!x qxzb"
154
- cletus.xor "my secrets are" #=> "sneakysneakysn(k*ls"
155
- cletus.xor "sneaky" #=> "my secrets are safe"
156
-
157
- # Now make Cletus feel worse. With... MATH!
158
- # (ala entropy scores)
159
- "A".entropy #=> 0.0
160
- "AB".entropy #=> 1.0
161
- "BC".entropy #=> 1.0
162
- (0..255).map {|x| x.chr}.join.entropy #=> 8.0
163
-
164
- # "You see, Cletus, you might have done this..."
165
- sdat = "my secrets are very secret "*60
166
- require 'openssl'
167
- c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
168
- c.encrypt
169
- c.key = Digest::SHA1.hexdigest("sneaky")
170
- c.iv = c.random_iv
67
+ === Monkey Patches
171
68
 
172
- # "So, Cletus, when you say 'sneaky'... this is exactly how 'sneaky' you are"
173
- c.update(sdat).entropy
174
- #=> 7.64800383393901
175
- sdat.xor("sneaky").entropy
176
- #=> 3.77687372599433
177
- sdat.entropy
178
- #=> 3.07487577558377
179
-
180
- I do recommend the rdoc if you're interested in more of these little helpers.
181
- I'll to keep the comments useful and up to date.
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_fun.rdoc' for more info.
182
73
 
183
74
 
184
75
  == REQUIREMENTS:
@@ -212,6 +103,7 @@ either add them to your PATH or copy/symlink them somewhere else like
212
103
 
213
104
  gem contents emonti-rbkb
214
105
 
106
+
215
107
  === Manual installation:
216
108
 
217
109
  ... or ... you can also install manually without rubygems.
data/bin/plugsrv CHANGED
@@ -1,18 +1,22 @@
1
1
  #!/usr/bin/env ruby
2
- # TODO refactor into rbkb/plug and add blit support
2
+ # Copyright 2009 emonti at matasano.com
3
+ # See README.rdoc for license information
3
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!
4
9
 
10
+ begin
11
+ require 'rubygems'
12
+ rescue LoadError
13
+ end
5
14
  require 'eventmachine'
6
15
  require 'socket'
7
16
  require 'optparse'
8
- require 'rbkb'
9
-
10
- def bail(*msg)
11
- STDERR.puts msg
12
- exit 1
13
- end
17
+ require 'rbkb/plug'
14
18
 
15
- class PlugSrv
19
+ class BlitPlug
16
20
  module UI
17
21
  def log( *msg )
18
22
  unless PLUG_OPTS[:quiet]
@@ -23,16 +27,24 @@ class PlugSrv
23
27
  end
24
28
 
25
29
  class Controller
26
- attr_accessor :tgtaddr, :tgtport, :tgtclient
27
- @@controllers=nil
30
+ attr_accessor :tgtaddr, :tgtport, :tgtclient, :blit, :peers
31
+ @@controller = nil
28
32
 
29
33
  def initialize(tgtaddr, tgtport, tgtclient)
30
-
31
34
  @tgtaddr = tgtaddr
32
35
  @tgtport = tgtport
33
36
  @tgtclient = tgtclient
34
37
 
35
- @@controllers = self
38
+ @@controller = self
39
+
40
+ @peers = Array.new
41
+
42
+ ## Just tack on a blit server???
43
+ @blit = EventMachine::start_server(
44
+ Plug::Blit::DEFAULT_IPADDR, Plug::Blit::DEFAULT_PORT, Plug::Blit,
45
+ :TCP, self
46
+ )
47
+
36
48
  end
37
49
 
38
50
  ##----------------------------------------
@@ -50,7 +62,7 @@ class PlugSrv
50
62
  ##----------------------------------------
51
63
 
52
64
  def self.proxy(cli)
53
- unless (ctrl = @@controllers)
65
+ unless (ctrl = @@controller)
54
66
  raise "No controller exists for this connection: #{cli.sock_peername}"
55
67
  end
56
68
 
@@ -62,9 +74,12 @@ class PlugSrv
62
74
  srv.plug_peers.push cli
63
75
  cli.plug_peers.push srv
64
76
 
77
+ ctrl.peers.push srv
78
+ ctrl.peers.push cli ### I suppose this is probably useful too..
79
+
65
80
  srv.controller = cli.controller = ctrl
66
81
  end
67
- end # class PlugSrv::Controller
82
+ end # class BlitPlug::Controller
68
83
 
69
84
 
70
85
  module BaseTCP
@@ -78,6 +93,14 @@ class PlugSrv
78
93
  @kind = :conn # default
79
94
  end
80
95
 
96
+ def name
97
+ @name
98
+ end
99
+
100
+ def say(data, sender)
101
+ log "%#{sender.kind.to_s.upcase}-SAYS", data.hexdump(:out => StringIO.new), "%"
102
+ send_data data
103
+ end
81
104
 
82
105
  def receive_data data
83
106
  log "%#{kind.to_s.upcase}-#{sock_peername}-SAYS", data.hexdump, "%"
@@ -89,12 +112,14 @@ class PlugSrv
89
112
 
90
113
 
91
114
  def notify_connection
92
- log "%#{kind.to_s.upcase}-#{@sock_peername}-CONNECTED"
115
+ @name = "#{kind.to_s.upcase}-#{sock_peername}"
116
+ log "%#{@name}-CONNECTED"
93
117
  end
94
118
 
95
119
 
96
120
  def unbind
97
- log "%#{kind.to_s.upcase}-#{@sock_peername}-CLOSED"
121
+ @name = "#{kind.to_s.upcase}-#{sock_peername}"
122
+ log "%#{@name}-CLOSED"
98
123
 
99
124
  cret = (@controller and @controller.dispatch_close(self))
100
125
 
@@ -107,7 +132,7 @@ class PlugSrv
107
132
 
108
133
 
109
134
  module TCPListener
110
- include PlugSrv::BaseTCP
135
+ include BlitPlug::BaseTCP
111
136
  attr_accessor :tgtaddr, :tgtport
112
137
 
113
138
  def post_init
@@ -116,7 +141,7 @@ class PlugSrv
116
141
  @sock_peer = Socket.unpack_sockaddr_in(get_peername).reverse
117
142
  @sock_peername = @sock_peer.join(':')
118
143
 
119
- @controller = PlugSrv::Controller.proxy(self)
144
+ @controller = BlitPlug::Controller.proxy(self)
120
145
 
121
146
  notify_connection
122
147
  end
@@ -125,7 +150,7 @@ class PlugSrv
125
150
 
126
151
 
127
152
  module TCPClient
128
- include PlugSrv::BaseTCP
153
+ include BlitPlug::BaseTCP
129
154
  attr_accessor :connected
130
155
 
131
156
  def post_init
@@ -141,16 +166,22 @@ class PlugSrv
141
166
 
142
167
  end # module TCPClient
143
168
 
144
- end # module PlugSrv
169
+ end # module BlitPlug
145
170
 
146
171
  PLUG_OPTS={ :quiet => false, :out => STDOUT }
147
172
 
173
+ def bail(*msg)
174
+ STDERR.puts msg
175
+ exit 1
176
+ end
177
+
178
+
148
179
 
149
180
  #############################################################################
150
181
  ### MAIN
151
182
  #############################################################################
152
183
  #
153
- # Get arguments
184
+ # Get option arguments
154
185
  opts = OptionParser.new do |opts|
155
186
  opts.banner = "Usage: #{$0} [options] target:tport[@[laddr:]lport]\n",
156
187
  " <target:tport> = the address of the target service\n",
@@ -203,13 +234,15 @@ PLUG_OPTS[:svraddr] ||= (m[3] || "0.0.0.0")
203
234
  PLUG_OPTS[:svrport] ||= (m[4] || PLUG_OPTS[:tgtport]).to_i
204
235
 
205
236
 
206
- # Start controller
207
- ctrl = PlugSrv::Controller.new(PLUG_OPTS[:tgtaddr], PLUG_OPTS[:tgtport], PlugSrv::TCPClient)
237
+ EventMachine::run {
238
+ # Instantiate controller
239
+ ctrl = BlitPlug::Controller.new(PLUG_OPTS[:tgtaddr], PLUG_OPTS[:tgtport], BlitPlug::TCPClient)
208
240
 
209
- # Start event loop
210
- PlugSrv::UI.log "%Starting TCP PlugServer #{PLUG_OPTS[:svraddr]}:#{PLUG_OPTS[:svrport]} -> #{PLUG_OPTS[:tgtaddr]}:#{PLUG_OPTS[:tgtport]}"
241
+ # Start event loop
242
+ BlitPlug::UI.log "%Starting TCP PlugServer #{PLUG_OPTS[:svraddr]}:#{PLUG_OPTS[:svrport]} -> #{PLUG_OPTS[:tgtaddr]}:#{PLUG_OPTS[:tgtport]}"
211
243
 
212
- EventMachine::run {
213
- EventMachine::start_server(PLUG_OPTS[:svraddr], PLUG_OPTS[:svrport], PlugSrv::TCPListener)
244
+
245
+ EventMachine::start_server(PLUG_OPTS[:svraddr], PLUG_OPTS[:svrport], BlitPlug::TCPListener)
214
246
  }
215
247
 
248
+
@@ -117,6 +117,23 @@ Takes input from a blob of data and output it with its binary length prepended.
117
117
  -l, --length=LEN Ignore all else and use LEN
118
118
 
119
119
 
120
+ === plugsrv
121
+
122
+ A blit-able reverse TCP proxy. Displays traffic hexdumps. Currently uses
123
+ the default blit port for its blit receiver.
124
+
125
+ Usage: /usr/bin/plugsrv [options] target:tport[@[laddr:]lport]
126
+ <target:tport> = the address of the target service
127
+ <@laddr:lport> = optional address and port to listen on
128
+
129
+ Options:
130
+ -o, --output FILE send output to a file
131
+ -l, --listen ADDR:PORT optional listener address:port
132
+ (default: 0.0.0.0:<tport>)
133
+ -q, --[no-]quiet Suppress/Enable conversation dumps.
134
+ -h, --help Show this message
135
+
136
+
120
137
  === rex
121
138
 
122
139
  Lazy shortcut for ruby -e "..."
@@ -157,8 +174,9 @@ eventmachine.
157
174
 
158
175
  Telson is for doing the following things with minimum fuss:
159
176
 
160
- * Run as a server or client using UDP or TCP
161
- * Debugging network protocols
177
+ * Run as a stubbed network client using UDP or TCP
178
+ * Use blit to communicate with the other side.
179
+ * Debug network protocols
162
180
  * Observe client/server behaviors using different messages at various phases
163
181
  of a conversation.
164
182
 
data/lib/rbkb/cli/b64.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # b64 converts strings or raw data to base-64 encoding.
4
7
  class Rbkb::Cli::B64 < Rbkb::Cli::Executable
5
8
  def make_parser
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # searches for a binary string in input. string can be provided 'hexified'
4
7
  class Rbkb::Cli::Bgrep < Rbkb::Cli::Executable
5
8
  def initialize(*args)
data/lib/rbkb/cli/blit.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'rbkb/cli'
2
2
  require 'rbkb/plug'
3
3
 
4
+ # Copyright 2009 emonti at matasano.com
5
+ # See README.rdoc for license information
6
+ #
4
7
  # blit is for use with any of the "plug" tools such as telson, feed, blitplug.
5
8
  # It is used to send data over a socket via their OOB blit listener.
6
9
  class Rbkb::Cli::Blit < Rbkb::Cli::Executable
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # Repeats an argument N times
4
7
  class Rbkb::Cli::Chars < Rbkb::Cli::Executable
5
8
  def make_parser
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # crc32 returns a crc32 checksum in hex from stdin or a file
4
7
  class Rbkb::Cli::Crc32 < Rbkb::Cli::Executable
5
8
  def initialize(*args)
data/lib/rbkb/cli/d64.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # d64 converts a base-64 encoded string back to its orginal form.
4
7
  class Rbkb::Cli::D64 < Rbkb::Cli::Executable
5
8
  def make_parser
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # Reverses a hexdump back to raw data. Designed to work with hexdumps created
4
7
  # by Unix utilities like 'xxd' as well as 'hexdump -C'.
5
8
  class Rbkb::Cli::Dedump < Rbkb::Cli::Executable
@@ -1,7 +1,8 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'rbkb/cli'
4
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
5
6
  # The hexify command converts a string or raw data to hex characters.
6
7
  # Input can be supplied via stdin, a string argument, or a file (with -f).
7
8
  class Rbkb::Cli::Hexify < Rbkb::Cli::Executable
data/lib/rbkb/cli/len.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # len prepends a binary length number in front of its input and outputs
4
7
  # raw on STDOUT
5
8
  class Rbkb::Cli::Len < Rbkb::Cli::Executable
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # rstrings is Unix "strings" in ruby... with some extra stuff
4
7
  class Rbkb::Cli::Rstrings < Rbkb::Cli::Executable
5
8
  def initialize(*args)
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # Returns a slice from input. This is just a shell interface to a String.slice
4
7
  # operation.
5
8
  class Rbkb::Cli::Slice < Rbkb::Cli::Executable
@@ -2,12 +2,14 @@ require 'rbkb/cli'
2
2
  require 'rbkb/plug'
3
3
  require 'eventmachine'
4
4
 
5
-
5
+ # Copyright 2009 emonti at matasano.com
6
+ # See README.rdoc for license information
7
+ #
6
8
  # This is an implementation of the original blackbag "telson" around
7
9
  # ruby and eventmachine.
8
10
  #
9
11
  # Telson can do the following things with minimum fuss:
10
- # - Run as a server or client using UDP or TCP
12
+ # - Run as a "stubbed" network client using UDP or TCP
11
13
  # - Debugging network protocols
12
14
  # - Observe client/server behaviors using different messages at
13
15
  # various phases of a conversation.
@@ -1,7 +1,8 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'rbkb/cli'
4
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
5
6
  # unhexify converts a string of hex bytes back to raw data. Input can be
6
7
  # supplied via stdin, a hex-string argument, or a file containing hex (use -f).
7
8
  class Rbkb::Cli::Unhexify < Rbkb::Cli::Executable
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # urldec converts a url percent-encoded string back to its raw form.
4
7
  # Input can be supplied via stdin, a string argument, or a file (with -f).
5
8
  # (url percent-encoding is just fancy hex encoding)
@@ -1,5 +1,8 @@
1
1
  require 'rbkb/cli'
2
2
 
3
+ # Copyright 2009 emonti at matasano.com
4
+ # See README.rdoc for license information
5
+ #
3
6
  # urlenc converts a string or raw data to a url percent-encoded string
4
7
  # Input can be supplied via stdin, a string argument, or a file (with -f).
5
8
  # (url percent-encoding is just fancy hex encoding)
data/lib/rbkb/cli/xor.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rbkb/cli'
3
3
 
4
+ # Copyright 2009 emonti at matasano.com
5
+ # See README.rdoc for license information
6
+ #
4
7
  # Repeating string xor. Takes input from a string, stdin, or a file (-f).
5
8
  class Rbkb::Cli::Xor < Rbkb::Cli::Executable
6
9
  def make_parser()
data/lib/rbkb/cli.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'rbkb'
2
2
  require 'optparse'
3
3
 
4
+ # Copyright 2009 emonti at matasano.com
5
+ # See README.rdoc for license information
6
+ #
4
7
  module Rbkb::Cli
5
8
  # Rbkb::Cli::Executable is an abstract class for creating command line
6
9
  # executables using the Ruby Black Bag framework.
@@ -11,6 +14,7 @@ module Rbkb::Cli
11
14
  end
12
15
 
13
16
  attr_accessor :stdout, :stderr, :stdin, :argv, :opts, :oparse
17
+ attr_reader :exit_status
14
18
 
15
19
  # Instantiates a new Executable object.
16
20
  #
@@ -39,6 +43,7 @@ module Rbkb::Cli
39
43
 
40
44
  # Wrapper for Kernel.exit() so we can unit test cli tools
41
45
  def exit(ret)
46
+ @exit_status = ret
42
47
  if defined? Rbkb::Cli::TESTING
43
48
  raise("Exited with return code: #{ret}") if ret != 0
44
49
  else
data/lib/rbkb/extends.rb CHANGED
@@ -1,4 +1,6 @@
1
- # Author Eric Monti (emonti at matasano)
1
+ # Copyright 2009 emonti at matasano.com
2
+ # See README.rdoc for license information
3
+ #
2
4
  require "stringio"
3
5
  require 'zlib'
4
6
  require 'open3'
@@ -1,4 +1,6 @@
1
-
1
+ # Copyright 2009 emonti at matasano.com
2
+ # See README.rdoc for license information
3
+ #
2
4
  module Plug
3
5
  module Blit
4
6
  include Base
@@ -1,3 +1,7 @@
1
+ # Copyright 2009 emonti at matasano.com
2
+ # See README.rdoc for license information
3
+ #
4
+
1
5
  require 'socket'
2
6
 
3
7
  module Plug
@@ -1,3 +1,6 @@
1
+ # Copyright 2009 emonti at matasano.com
2
+ # See README.rdoc for license information
3
+ #
1
4
 
2
5
  require "rbkb/plug/peer.rb"
3
6
  require 'stringio'
@@ -1,3 +1,6 @@
1
+ # Copyright 2009 emonti at matasano.com
2
+ # See README.rdoc for license information
3
+ #
1
4
 
2
5
  module Plug
3
6
  module Proxy
data/lib/rbkb/plug.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # Copyright 2009 emonti at matasano.com
2
+ # See README.rdoc for license information
3
+ #
1
4
 
2
5
  require "rbkb.rb"
3
6
 
data/lib_usage.rdoc ADDED
@@ -0,0 +1,176 @@
1
+
2
+ === Using the rbkb library's Monkey Patches
3
+
4
+ Much of rbkb is implemented as a bunch of monkeypatches to Array, String,
5
+ Numeric and other base classes. If this suits your fancy (some people despise
6
+ monkeypatches, this is not their fancy) then you can 'require "rbkb"' from
7
+ your irb sessions and own scripts.
8
+
9
+ The monkey-patches were designed to let you approximate use of the rbkb shell
10
+ commands from IRB or ruby scripts.
11
+
12
+ (My dirty secret: I use IRB for like... everything!)
13
+
14
+ Using the rbkb library in ruby will let you do things like the following (just
15
+ some samples, see rdoc for more info).
16
+
17
+
18
+ Do stuff with strings:
19
+
20
+ ## sexify with hexify
21
+ foo = "helu foo" #=> "helu foo"
22
+ foo.hexify #=> "68656c7520666f6f"
23
+
24
+ ## a little easier to read
25
+ foo.hexify(:delim => ' ') #=> "68 65 6c 75 20 66 6f 6f"
26
+
27
+ # and back
28
+ _.unhexify #=> "helu foo"
29
+
30
+ ## break out your hexdump -C styles
31
+ foodump = "helu foo".hexdump(:out => StringIO.new)
32
+ #=> "00000000 68 65 6c 75 20 66 6f 6f |helu foo|\n00000008\n"
33
+ puts foodump
34
+ # 00000000 68 65 6c 75 20 66 6f 6f |helu foo|
35
+ # 00000008
36
+ # => nil
37
+ foo.hexdump(:out => $stdout)
38
+ # 00000000 68 65 6c 75 20 66 6f 6f |helu foo|
39
+ # 00000008
40
+ # => nil
41
+
42
+ ## reverse a hexdump
43
+ foodump.dehexdump #=> "helu foo"
44
+
45
+ ## 'strings' like /usr/bin/strings
46
+ dat = File.read("/bin/ls")
47
+ pp dat.strings
48
+ # [[4132, 4143, :ascii, "__PAGEZERO\000"],
49
+ # [4188, 4195, :ascii, "__TEXT\000"],
50
+ # ...
51
+ # [72427, 72470, :ascii, "*Apple Code Signing Certification Authority"],
52
+ # [72645, 72652, :ascii, "X[N~EQ "]]
53
+
54
+ ## look for stuff in binaries
55
+ dat.bgrep("__PAGEZERO") #=> [[4132, 4142, "__PAGEZERO"], [40996, 41006, "__PAGEZERO"]]
56
+ dat.bgrep(0xCAFEBABE.to_bytes) #=> [[0, 4, "\312\376\272\276"]]
57
+
58
+
59
+ Do stuff with numbers:
60
+
61
+ ## Do you have an irrational distaste for pack/unpack? I do.
62
+ 0xff.to_bytes #=> "\000\000\000\377"
63
+ be = 0xff.to_bytes(:big) #=> "\000\000\000\377"
64
+ le = 0xff.to_bytes(:little) #=> "\377\000\000\000"
65
+ le16 = 0xff.to_bytes(:little,2) #=> "\377\000"
66
+
67
+ ## Strings can go the other way too
68
+ [be, le, le16].map {|n| n.dat_to_num(:big) } # default
69
+ #=> [255, 4278190080, 65280]
70
+ [be, le, le16].map {|n| n.dat_to_num(:little) }
71
+ #=> [4278190080, 255, 255]
72
+
73
+ ## Calculate padding for a given alignment
74
+ 10.pad(16) #=> 6
75
+ 16.pad(16) #=> 0
76
+ 30.pad(16) #=> 2
77
+ 32.pad(16) #=> 0
78
+
79
+
80
+ Interact with 'telson' and 'plugsrv' directly from IRB:
81
+
82
+ ## In a separate window from your irb session do something like:
83
+ #
84
+ # $ telson rubyforge.com:80 -r
85
+ # ** TELSON-192.168.11.2:58118(TCP) Started
86
+ # ** BLITSRV-127.0.0.1:25195(TCP) Started
87
+ # ** TELSON-192.168.11.2:58118(TCP) CONNECTED TO PEER-205.234.109.19:80(TCP)
88
+
89
+ ## You can blit any string from within IRB!
90
+
91
+ ## A minor setup step is required... (I put this in my .irbrc)
92
+ Plug::Blit.blit_init #=> nil
93
+
94
+ "GET / HTTP/1.0\r\n\r\n".blit #=> 28
95
+ ## Watch the basic HTTP request get made and responded to in the
96
+ ## other window.
97
+
98
+ ("GET /"+ "A"*30 +" HTTP/1.0\r\n\r\n").blit #=> 58
99
+ ## Watch the bogus HTTP request get made and responded to in the
100
+ ## other window.
101
+
102
+
103
+ Some simple web encoding stuff:
104
+
105
+ xss="<script>alert('helu ' + document.cookie)</script"
106
+
107
+ # URL percent-encode stuff
108
+ xss.urlenc
109
+ #=> "%3cscript%3ealert%28%27helu%3a%20%27%20%2b%20document.cookie%29%3c%2fscript%3e"
110
+
111
+ # Base64 encode stuff
112
+ _.b64
113
+ #=> "JTNjc2NyaXB0JTNlYWxlcnQlMjglMjdoZWx1JTNhJTIwJTI3JTIwJTJiJTIwZG9jdW1lbnQuY29va2llJTI5JTNjJTJmc2NyaXB0JTNl"
114
+
115
+ ## And back
116
+ _.d64
117
+ #=> "%3cscript%3ealert%28%27helu%3a%20%27%20%2b%20document.cookie%29%3c%2fscript%3e"
118
+
119
+ _.urldec
120
+ #=> "<script>alert('helu: ' + document.cookie)</script>"
121
+
122
+
123
+ Miscellaneous stuff:
124
+
125
+ # rediculous laziness!
126
+ 0x41.printable? #=> true
127
+ 0x01.printable? #=> false
128
+
129
+ # Make random gobbledygook and insults
130
+ "helu foo".randomize #=> "ouofleh "
131
+ "helu foo".randomize #=> "foul hoe"
132
+
133
+
134
+ Pretend (badly) to be smart:
135
+
136
+ # Cletus say's he's "sneaky"
137
+ cletus = "my secrets are safe".xor("sneaky")
138
+ #=> "\036\027E\022\016\032\001\v\021\022K\030\001\vE\022\n\037\026"
139
+
140
+ # Only not really so sneaky
141
+ cletus.xor "my secrets" #=> "sneakysnea&a!x qxzb"
142
+ cletus.xor "my secrets are" #=> "sneakysneakysn(k*ls"
143
+ cletus.xor "sneaky" #=> "my secrets are safe"
144
+
145
+ # Now make Cletus feel worse. With... MATH!
146
+ # (ala entropy scores)
147
+ "A".entropy #=> 0.0
148
+ "AB".entropy #=> 1.0
149
+ "BC".entropy #=> 1.0
150
+ (0..255).map {|x| x.chr}.join.entropy #=> 8.0
151
+
152
+ # "You see, Cletus, you might have done this..."
153
+ sdat = "my secrets are very secret "*60
154
+ require 'openssl'
155
+ c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
156
+ c.encrypt
157
+ c.key = Digest::SHA1.hexdigest("sneaky")
158
+ c.iv = c.random_iv
159
+
160
+ # "So, Cletus, when you say 'sneaky'... this is exactly how 'sneaky' you are"
161
+ c.update(sdat).entropy
162
+ #=> 7.64800383393901
163
+ sdat.xor("sneaky").entropy
164
+ #=> 3.77687372599433
165
+ sdat.entropy
166
+ #=> 3.07487577558377
167
+
168
+
169
+
170
+ I recommend reading some of the rdoc if you're interested in more of these
171
+ little helpers. Time permitting, I'll try to keep the docs useful and up
172
+ to date.
173
+
174
+ Comments are welcome.
175
+
176
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emonti-rbkb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Monti
@@ -49,7 +49,8 @@ extra_rdoc_files: []
49
49
 
50
50
  files:
51
51
  - README.rdoc
52
- - usage.txt
52
+ - cli_usage.rdoc
53
+ - lib_usage.rdoc
53
54
  - bin/b64
54
55
  - bin/bgrep
55
56
  - bin/blit
@@ -102,7 +103,8 @@ rdoc_options:
102
103
  - README.rdoc
103
104
  - --line-numbers
104
105
  - README.rdoc
105
- - usage.txt
106
+ - cli_usage.rdoc
107
+ - lib_usage.rdoc
106
108
  require_paths:
107
109
  - lib
108
110
  required_ruby_version: !ruby/object:Gem::Requirement