rex 2.0.8 → 2.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rex.rb +1 -0
  3. data/lib/rex/arch.rb +5 -0
  4. data/lib/rex/arch/x86.rb +19 -5
  5. data/lib/rex/arch/zarch.rb +17 -0
  6. data/lib/rex/compat.rb +5 -4
  7. data/lib/rex/constants.rb +3 -1
  8. data/lib/rex/encoder/alpha2/alpha_mixed.rb +70 -9
  9. data/lib/rex/encoder/alpha2/alpha_upper.rb +67 -8
  10. data/lib/rex/exploitation/cmdstager.rb +1 -0
  11. data/lib/rex/exploitation/cmdstager/certutil.rb +115 -0
  12. data/lib/rex/exploitation/cmdstager/echo.rb +6 -3
  13. data/lib/rex/exploitation/egghunter.rb +1 -1
  14. data/lib/rex/google/geolocation.rb +68 -0
  15. data/lib/rex/io/bidirectional_pipe.rb +0 -4
  16. data/lib/rex/java/serialization.rb +2 -0
  17. data/lib/rex/java/serialization/decode_error.rb +11 -0
  18. data/lib/rex/java/serialization/encode_error.rb +11 -0
  19. data/lib/rex/java/serialization/model.rb +2 -0
  20. data/lib/rex/java/serialization/model/annotation.rb +3 -3
  21. data/lib/rex/java/serialization/model/block_data.rb +3 -3
  22. data/lib/rex/java/serialization/model/block_data_long.rb +3 -3
  23. data/lib/rex/java/serialization/model/class_desc.rb +6 -6
  24. data/lib/rex/java/serialization/model/contents.rb +17 -10
  25. data/lib/rex/java/serialization/model/field.rb +12 -11
  26. data/lib/rex/java/serialization/model/long_utf.rb +3 -3
  27. data/lib/rex/java/serialization/model/new_array.rb +22 -23
  28. data/lib/rex/java/serialization/model/new_class.rb +57 -0
  29. data/lib/rex/java/serialization/model/new_class_desc.rb +15 -16
  30. data/lib/rex/java/serialization/model/new_enum.rb +5 -5
  31. data/lib/rex/java/serialization/model/new_object.rb +22 -17
  32. data/lib/rex/java/serialization/model/proxy_class_desc.rb +109 -0
  33. data/lib/rex/java/serialization/model/reference.rb +4 -4
  34. data/lib/rex/java/serialization/model/stream.rb +7 -7
  35. data/lib/rex/java/serialization/model/utf.rb +3 -3
  36. data/lib/rex/json_hash_file.rb +94 -0
  37. data/lib/rex/logging/log_sink.rb +1 -0
  38. data/lib/rex/logging/sinks/timestamp_flatfile.rb +21 -0
  39. data/lib/rex/parser/appscan_nokogiri.rb +13 -23
  40. data/lib/rex/parser/fs/ntfs.rb +10 -5
  41. data/lib/rex/parser/nmap_nokogiri.rb +3 -1
  42. data/lib/rex/parser/openvas_nokogiri.rb +70 -73
  43. data/lib/rex/parser/winscp.rb +108 -0
  44. data/lib/rex/parser/x509_certificate.rb +92 -0
  45. data/lib/rex/payloads.rb +0 -1
  46. data/lib/rex/payloads/meterpreter/config.rb +154 -0
  47. data/lib/rex/payloads/meterpreter/uri_checksum.rb +136 -0
  48. data/lib/rex/post/meterpreter.rb +1 -1
  49. data/lib/rex/post/meterpreter/client.rb +26 -3
  50. data/lib/rex/post/meterpreter/client_core.rb +387 -75
  51. data/lib/rex/post/meterpreter/extensions/android/android.rb +127 -37
  52. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +46 -25
  53. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +4 -0
  54. data/lib/rex/post/meterpreter/extensions/extapi/ntds/ntds.rb +39 -0
  55. data/lib/rex/post/meterpreter/extensions/extapi/pageant/pageant.rb +44 -0
  56. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +9 -0
  57. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +16 -1
  58. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +1 -1
  59. data/lib/rex/post/meterpreter/extensions/python/python.rb +114 -0
  60. data/lib/rex/post/meterpreter/extensions/python/tlv.rb +21 -0
  61. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +17 -14
  62. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +33 -12
  63. data/lib/rex/post/meterpreter/extensions/stdapi/fs/mount.rb +57 -0
  64. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3 -3
  65. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +3 -1
  66. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +2 -0
  67. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +16 -3
  68. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +29 -6
  69. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +5 -1
  70. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +18 -6
  71. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +2 -2
  72. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +34 -36
  73. data/lib/rex/post/meterpreter/packet.rb +29 -0
  74. data/lib/rex/post/meterpreter/packet_dispatcher.rb +20 -7
  75. data/lib/rex/post/meterpreter/ui/console.rb +1 -0
  76. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +230 -72
  77. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +544 -34
  78. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +188 -57
  79. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +115 -93
  80. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +1 -1
  81. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +1 -1
  82. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +49 -15
  83. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +11 -2
  84. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/python.rb +187 -0
  85. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +324 -133
  86. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +52 -2
  87. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +68 -65
  88. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +9 -1
  89. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +113 -118
  90. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +3 -0
  91. data/lib/rex/powershell.rb +62 -0
  92. data/lib/rex/powershell/command.rb +359 -0
  93. data/lib/rex/{exploitation/powershell → powershell}/function.rb +0 -2
  94. data/lib/rex/{exploitation/powershell → powershell}/obfu.rb +0 -2
  95. data/lib/rex/{exploitation/powershell → powershell}/output.rb +11 -5
  96. data/lib/rex/{exploitation/powershell → powershell}/param.rb +0 -2
  97. data/lib/rex/powershell/parser.rb +182 -0
  98. data/lib/rex/powershell/payload.rb +78 -0
  99. data/lib/rex/{exploitation/powershell → powershell}/psh_methods.rb +16 -2
  100. data/lib/rex/{exploitation/powershell → powershell}/script.rb +2 -4
  101. data/lib/rex/proto/dcerpc/client.rb +6 -6
  102. data/lib/rex/proto/dcerpc/exceptions.rb +26 -0
  103. data/lib/rex/proto/http/client.rb +3 -3
  104. data/lib/rex/proto/http/client_request.rb +0 -5
  105. data/lib/rex/proto/http/response.rb +86 -0
  106. data/lib/rex/proto/ipmi/utils.rb +30 -26
  107. data/lib/rex/proto/kerberos/client.rb +1 -1
  108. data/lib/rex/proto/kerberos/model/kdc_request.rb +2 -2
  109. data/lib/rex/proto/rfb/client.rb +8 -3
  110. data/lib/rex/proto/rfb/constants.rb +1 -1
  111. data/lib/rex/proto/rmi.rb +2 -0
  112. data/lib/rex/proto/rmi/decode_error.rb +10 -0
  113. data/lib/rex/proto/rmi/exception.rb +10 -0
  114. data/lib/rex/proto/rmi/model.rb +5 -0
  115. data/lib/rex/proto/rmi/model/call.rb +4 -4
  116. data/lib/rex/proto/rmi/model/call_data.rb +137 -0
  117. data/lib/rex/proto/rmi/model/dgc_ack.rb +2 -2
  118. data/lib/rex/proto/rmi/model/element.rb +26 -11
  119. data/lib/rex/proto/rmi/model/output_header.rb +4 -4
  120. data/lib/rex/proto/rmi/model/ping.rb +2 -2
  121. data/lib/rex/proto/rmi/model/ping_ack.rb +2 -2
  122. data/lib/rex/proto/rmi/model/protocol_ack.rb +2 -2
  123. data/lib/rex/proto/rmi/model/return_data.rb +5 -5
  124. data/lib/rex/proto/rmi/model/return_value.rb +124 -0
  125. data/lib/rex/proto/rmi/model/unique_identifier.rb +77 -0
  126. data/lib/rex/proto/steam.rb +3 -0
  127. data/lib/rex/proto/steam/message.rb +125 -0
  128. data/lib/rex/proto/tftp/client.rb +35 -14
  129. data/lib/rex/random_identifier_generator.rb +2 -0
  130. data/lib/rex/ropbuilder.rb +1 -1
  131. data/lib/rex/socket/parameters.rb +9 -0
  132. data/lib/rex/socket/ssl_tcp.rb +25 -41
  133. data/lib/rex/socket/ssl_tcp_server.rb +10 -21
  134. data/lib/rex/sslscan/result.rb +20 -1
  135. data/lib/rex/text.rb +241 -55
  136. data/lib/rex/ui/output.rb +0 -3
  137. data/lib/rex/ui/subscriber.rb +0 -10
  138. data/lib/rex/ui/text/color.rb +9 -0
  139. data/lib/rex/ui/text/dispatcher_shell.rb +1 -0
  140. data/lib/rex/ui/text/output.rb +15 -4
  141. data/lib/rex/ui/text/output/file.rb +1 -0
  142. data/lib/rex/ui/text/output/stdio.rb +0 -16
  143. data/lib/rex/ui/text/shell.rb +3 -0
  144. data/lib/rex/ui/text/table.rb +85 -19
  145. data/lib/rex/user_agent.rb +118 -0
  146. data/rex.gemspec +2 -2
  147. metadata +41 -14
  148. data/lib/rex/exploitation/powershell.rb +0 -62
  149. data/lib/rex/exploitation/powershell/parser.rb +0 -183
  150. data/lib/rex/payloads/meterpreter.rb +0 -2
  151. data/lib/rex/payloads/meterpreter/patch.rb +0 -136
data/lib/rex/ui/output.rb CHANGED
@@ -30,9 +30,6 @@ class Output
30
30
  def print_good(msg='')
31
31
  end
32
32
 
33
- def print_debug(msg='')
34
- end
35
-
36
33
  #
37
34
  # Prints a status line.
38
35
  #
@@ -56,16 +56,6 @@ module Subscriber
56
56
  end
57
57
  end
58
58
 
59
- #
60
- # Wraps user_output.print_debug
61
- #
62
- def print_debug(msg='')
63
- if (user_output)
64
- print_blank_line if user_output.prompting?
65
- user_output.print_debug(msg)
66
- end
67
- end
68
-
69
59
  #
70
60
  # Wraps user_output.print_warning
71
61
  #
@@ -75,6 +75,15 @@ module Color
75
75
  str.gsub!(/%und/, pre_color+colorize('underline')+post_color)
76
76
  str.gsub!(/%bld/, pre_color+colorize('bold')+post_color)
77
77
  str.gsub!(/%clr/, pre_color+colorize('clear')+post_color)
78
+ # Background Color
79
+ str.gsub!(/%bgblu/, pre_color+colorize('on_blue')+post_color)
80
+ str.gsub!(/%bgyel/, pre_color+colorize('on_yellow')+post_color)
81
+ str.gsub!(/%bggrn/, pre_color+colorize('on_green')+post_color)
82
+ str.gsub!(/%bgmag/, pre_color+colorize('on_magenta')+post_color)
83
+ str.gsub!(/%bgblk/, pre_color+colorize('on_black')+post_color)
84
+ str.gsub!(/%bgred/, pre_color+colorize('on_red')+post_color)
85
+ str.gsub!(/%bgcyn/, pre_color+colorize('on_cyan')+post_color)
86
+ str.gsub!(/%bgwhi/, pre_color+colorize('on_white')+post_color)
78
87
 
79
88
  str
80
89
  end
@@ -426,6 +426,7 @@ module DispatcherShell
426
426
  else
427
427
  dispatcher.send('cmd_' + method, *arguments)
428
428
  end
429
+ ensure
429
430
  self.busy = false
430
431
  end
431
432
 
@@ -55,10 +55,6 @@ class Output < Rex::Ui::Output
55
55
  print_line("%bld%grn[+]%clr #{msg}")
56
56
  end
57
57
 
58
- def print_debug(msg = '')
59
- print_line("%bld%cya[!]%clr #{msg}")
60
- end
61
-
62
58
  def print_status(msg = '')
63
59
  print_line("%bld%blu[*]%clr #{msg}")
64
60
  end
@@ -78,6 +74,21 @@ class Output < Rex::Ui::Output
78
74
  def reset
79
75
  end
80
76
 
77
+ def puts(*args)
78
+ args.each do |argument|
79
+ line = argument.to_s
80
+ print_raw(line)
81
+
82
+ unless line.ends_with? "\n"
83
+ # yes, this is output, but `IO#puts` uses `rb_default_rs`, which is
84
+ # [`$/`](https://github.com/ruby/ruby/blob/3af8e150aded9d162bfd41426aaaae0279e5a653/io.c#L12168-L12172),
85
+ # which is [`$INPUT_RECORD_SEPARATOR`](https://github.com/ruby/ruby/blob/3af8e150aded9d162bfd41426aaaae0279e5a653/lib/English.rb#L83)
86
+ print_raw($INPUT_RECORD_SEPARATOR)
87
+ end
88
+ end
89
+
90
+ nil
91
+ end
81
92
  end
82
93
 
83
94
  end
@@ -31,6 +31,7 @@ class Output::File < Rex::Ui::Text::Output
31
31
  self.fd.flush
32
32
  msg
33
33
  end
34
+ alias_method :write, :print_raw
34
35
 
35
36
  def close
36
37
  self.fd.close if self.fd
@@ -71,22 +71,6 @@ class Output::Stdio < Rex::Ui::Text::Output
71
71
  end
72
72
  alias_method :write, :print_raw
73
73
 
74
- def puts(*args)
75
- args.each do |argument|
76
- line = argument.to_s
77
- write(line)
78
-
79
- unless line.ends_with? "\n"
80
- # yes, this is output, but `IO#puts` uses `rb_default_rs`, which is
81
- # [`$/`](https://github.com/ruby/ruby/blob/3af8e150aded9d162bfd41426aaaae0279e5a653/io.c#L12168-L12172),
82
- # which is [`$INPUT_RECORD_SEPARATOR`](https://github.com/ruby/ruby/blob/3af8e150aded9d162bfd41426aaaae0279e5a653/lib/English.rb#L83)
83
- write($INPUT_RECORD_SEPARATOR)
84
- end
85
- end
86
-
87
- nil
88
- end
89
-
90
74
  def supports_color?
91
75
  case config[:color]
92
76
  when true
@@ -178,6 +178,9 @@ module Shell
178
178
  input.prompt.gsub!(/%J/, framework.jobs.length.to_s)
179
179
  input.prompt.gsub!(/%L/, Rex::Socket.source_address("50.50.50.50"))
180
180
  input.prompt.gsub!(/%D/, ::Dir.getwd)
181
+ if framework.db.active
182
+ input.prompt.gsub!(/%W/, framework.db.workspace.name)
183
+ end
181
184
  self.init_prompt = input.prompt
182
185
  end
183
186
 
@@ -72,8 +72,10 @@ class Table
72
72
  self.prefix = opts['Prefix'] || ''
73
73
  self.postfix = opts['Postfix'] || ''
74
74
  self.colprops = []
75
+ self.scterm = /#{opts['SearchTerm']}/mi if opts['SearchTerm']
75
76
 
76
77
  self.sort_index = opts['SortIndex'] || 0
78
+ self.sort_order = opts['SortOrder'] || :forward
77
79
 
78
80
  # Default column properties
79
81
  self.columns.length.times { |idx|
@@ -112,7 +114,7 @@ class Table
112
114
  if (is_hr(row))
113
115
  str << hr_to_s
114
116
  else
115
- str << row_to_s(row)
117
+ str << row_to_s(row) if row_visible(row)
116
118
  end
117
119
  }
118
120
 
@@ -128,10 +130,9 @@ class Table
128
130
  str = ''
129
131
  str << ( columns.join(",") + "\n" )
130
132
  rows.each { |row|
131
- next if is_hr(row)
133
+ next if is_hr(row) || !row_visible(row)
132
134
  str << ( row.map{|x|
133
135
  x = x.to_s
134
-
135
136
  x.gsub(/[\r\n]/, ' ').gsub(/\s+/, ' ').gsub('"', '""')
136
137
  }.map{|x| "\"#{x}\"" }.join(",") + "\n" )
137
138
  }
@@ -174,7 +175,10 @@ class Table
174
175
  raise RuntimeError, 'Invalid number of columns!'
175
176
  end
176
177
  fields.each_with_index { |field, idx|
178
+ # Remove whitespace and ensure String format
179
+ field = field.to_s.strip
177
180
  if (colprops[idx]['MaxWidth'] < field.to_s.length)
181
+ old = colprops[idx]['MaxWidth']
178
182
  colprops[idx]['MaxWidth'] = field.to_s.length
179
183
  end
180
184
  }
@@ -187,21 +191,26 @@ class Table
187
191
  # If the supplied index is an IPv4 address, handle it differently, but
188
192
  # avoid actually resolving domain names.
189
193
  #
190
- def sort_rows(index=sort_index)
194
+ def sort_rows(index = sort_index, order = sort_order)
191
195
  return if index == -1
192
196
  return unless rows
193
197
  rows.sort! do |a,b|
194
198
  if a[index].nil?
195
- -1
199
+ cmp = -1
196
200
  elsif b[index].nil?
197
- 1
201
+ cmp = 1
198
202
  elsif Rex::Socket.dotted_ip?(a[index]) and Rex::Socket.dotted_ip?(b[index])
199
- Rex::Socket::addr_atoi(a[index]) <=> Rex::Socket::addr_atoi(b[index])
203
+ cmp = Rex::Socket::addr_atoi(a[index]) <=> Rex::Socket::addr_atoi(b[index])
200
204
  elsif a[index] =~ /^[0-9]+$/ and b[index] =~ /^[0-9]+$/
201
- a[index].to_i <=> b[index].to_i
205
+ cmp = a[index].to_i <=> b[index].to_i
206
+ elsif a[index].kind_of?(IPAddr) && a[index].kind_of?(IPAddr) && a[index].ipv6? && b[index].ipv4?
207
+ cmp = 1
208
+ elsif a[index].kind_of?(IPAddr) && b[index].kind_of?(IPAddr) && a[index].ipv4? && b[index].ipv6?
209
+ cmp = -1
202
210
  else
203
- a[index] <=> b[index] # assumes otherwise comparable.
211
+ cmp = a[index] <=> b[index] # assumes otherwise comparable.
204
212
  end
213
+ order == :forward ? cmp : -cmp
205
214
  end
206
215
  end
207
216
 
@@ -215,6 +224,51 @@ class Table
215
224
  #
216
225
  # Returns new sub-table with headers and rows maching column names submitted
217
226
  #
227
+ #
228
+ # Flips table 90 degrees left
229
+ #
230
+ def drop_left
231
+ tbl = self.class.new(
232
+ 'Columns' => Array.new(self.rows.count+1,' '),
233
+ 'Header' => self.header,
234
+ 'Indent' => self.indent)
235
+ (self.columns.count+1).times do |ti|
236
+ row = self.rows.map {|r| r[ti]}.unshift(self.columns[ti]).flatten
237
+ # insert our col|row break. kind of hackish
238
+ row[1] = "| #{row[1]}" unless row.all? {|e| e.nil? || e.empty?}
239
+ tbl << row
240
+ end
241
+ return tbl
242
+ end
243
+
244
+ #
245
+ # Build table from CSV dump
246
+ #
247
+ def self.new_from_csv(csv)
248
+ # Read in or keep data, get CSV or die
249
+ if csv.is_a?(String)
250
+ csv = File.file?(csv) ? CSV.read(csv) : CSV.parse(csv)
251
+ end
252
+ # Adjust for skew
253
+ if csv.first == ["Keys", "Values"]
254
+ csv.shift # drop marker
255
+ cols = []
256
+ rows = []
257
+ csv.each do |row|
258
+ cols << row.shift
259
+ rows << row
260
+ end
261
+ tbl = self.new('Columns' => cols)
262
+ rows.in_groups_of(cols.count) {|r| tbl << r.flatten}
263
+ else
264
+ tbl = self.new('Columns' => csv.shift)
265
+ while !csv.empty? do
266
+ tbl << csv.shift
267
+ end
268
+ end
269
+ return tbl
270
+ end
271
+
218
272
  def [](*col_names)
219
273
  tbl = self.class.new('Indent' => self.indent,
220
274
  'Header' => self.header,
@@ -243,10 +297,18 @@ class Table
243
297
  attr_accessor :columns, :rows, :colprops # :nodoc:
244
298
  attr_accessor :width, :indent, :cellpad # :nodoc:
245
299
  attr_accessor :prefix, :postfix # :nodoc:
246
- attr_accessor :sort_index # :nodoc:
300
+ attr_accessor :sort_index, :sort_order, :scterm # :nodoc:
247
301
 
248
302
  protected
249
303
 
304
+ #
305
+ # Returns if a row should be visible or not
306
+ #
307
+ def row_visible(row)
308
+ return true if self.scterm.nil?
309
+ row_to_s(row).match(self.scterm)
310
+ end
311
+
250
312
  #
251
313
  # Defaults cell widths and alignments.
252
314
  #
@@ -272,14 +334,15 @@ protected
272
334
  last_idx = nil
273
335
  columns.each_with_index { |col,idx|
274
336
  if (last_col)
275
- nameline << pad(' ', last_col, last_idx)
276
-
277
- remainder = colprops[last_idx]['MaxWidth'] - last_col.length
278
- if (remainder < 0)
279
- remainder = 0
280
- end
337
+ # This produces clean to_s output without truncation
338
+ # Preserves full string in cells for to_csv output
339
+ padding = pad(' ', last_col, last_idx)
340
+ nameline << padding
341
+ remainder = padding.length - cellpad
342
+ remainder = 0 if remainder < 0
281
343
  barline << (' ' * (cellpad + remainder))
282
344
  end
345
+
283
346
  nameline << col
284
347
  barline << ('-' * col.length)
285
348
 
@@ -308,7 +371,6 @@ protected
308
371
  if (idx != 0)
309
372
  line << pad(' ', last_cell.to_s, last_idx)
310
373
  end
311
- # line << pad(' ', cell.to_s, idx)
312
374
  # Limit wide cells
313
375
  if colprops[idx]['MaxChar']
314
376
  last_cell = cell.to_s[0..colprops[idx]['MaxChar'].to_i]
@@ -328,8 +390,12 @@ protected
328
390
  # some text and a column index.
329
391
  #
330
392
  def pad(chr, buf, colidx, use_cell_pad = true) # :nodoc:
331
- remainder = colprops[colidx]['MaxWidth'] - buf.length
332
- val = chr * remainder;
393
+ # Ensure we pad the minimum required amount
394
+ max = colprops[colidx]['MaxChar'] || colprops[colidx]['MaxWidth']
395
+ max = colprops[colidx]['MaxWidth'] if max.to_i > colprops[colidx]['MaxWidth'].to_i
396
+ remainder = max - buf.length
397
+ remainder = 0 if remainder < 0
398
+ val = chr * remainder
333
399
 
334
400
  if (use_cell_pad)
335
401
  val << ' ' * cellpad
@@ -0,0 +1,118 @@
1
+ # -*- coding: binary -*-
2
+
3
+ #
4
+ # A helper module for using and referencing comming user agent strings.
5
+ #
6
+ module Rex::UserAgent
7
+
8
+ #
9
+ # List from https://techblog.willshouse.com/2012/01/03/most-common-user-agents/
10
+ # This article was updated on July 11th 2015. It's probably worth updating this
11
+ # list over time.
12
+ #
13
+ # This list is in the order of most common to least common.
14
+ #
15
+ COMMON_AGENTS = [
16
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
17
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
18
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
19
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/600.6.3 (KHTML, like Gecko) Version/8.0.6 Safari/600.6.3',
20
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
21
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
22
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
23
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
24
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
25
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0',
26
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
27
+ 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0',
28
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12',
29
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36',
30
+ 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
31
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
32
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0',
33
+ 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
34
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
35
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
36
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36',
37
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
38
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36',
39
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/600.5.17 (KHTML, like Gecko) Version/8.0.5 Safari/600.5.17',
40
+ 'Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0',
41
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
42
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
43
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
44
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.6.3 (KHTML, like Gecko) Version/7.1.6 Safari/537.85.15',
45
+ 'Mozilla/5.0 (iPad; CPU OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F69 Safari/600.1.4',
46
+ 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
47
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0',
48
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0',
49
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
50
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4',
51
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/600.5.17 (KHTML, like Gecko) Version/8.0.6 Safari/600.6.3',
52
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36',
53
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36',
54
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:38.0) Gecko/20100101 Firefox/38.0',
55
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
56
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:39.0) Gecko/20100101 Firefox/39.0',
57
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36',
58
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
59
+ 'Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0',
60
+ 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
61
+ 'Mozilla/5.0 (Windows NT 6.1; rv:39.0) Gecko/20100101 Firefox/39.0',
62
+ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
63
+ 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
64
+ 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
65
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
66
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.4.10 (KHTML, like Gecko) Version/8.0.4 Safari/600.4.10',
67
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.11 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.11',
68
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.78.2 (KHTML, like Gecko) Version/6.1.6 Safari/537.78.2',
69
+ 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36',
70
+ 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0',
71
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/8.0.3 Safari/600.3.18',
72
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0',
73
+ 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
74
+ 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0',
75
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:38.0) Gecko/20100101 Firefox/38.0',
76
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10',
77
+ 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
78
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:38.0) Gecko/20100101 Firefox/38.0',
79
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
80
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36',
81
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36',
82
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0',
83
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:38.0) Gecko/20100101 Firefox/38.0',
84
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
85
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.7.0',
86
+ 'Mozilla/5.0 (iPad; CPU OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H143 Safari/600.1.4',
87
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',
88
+ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
89
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36',
90
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/7.1.7 Safari/537.85.16',
91
+ 'Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0',
92
+ 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
93
+ 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0',
94
+ ]
95
+
96
+ #
97
+ # Pick a random agent from the common agent list.
98
+ #
99
+ def self.random
100
+ COMMON_AGENTS.sample
101
+ end
102
+
103
+ #
104
+ # Choose the agent with the shortest string (for use in payloads)
105
+ #
106
+ def self.shortest
107
+ @@shortest_agent ||= COMMON_AGENTS.min { |a, b| a.size <=> b.size }
108
+ end
109
+
110
+ #
111
+ # Choose the most frequent user agent
112
+ #
113
+ def self.most_common
114
+ COMMON_AGENTS[0]
115
+ end
116
+
117
+ end
118
+
data/rex.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  APP_NAME = "rex"
4
- VERSION = "2.0.8"
4
+ VERSION = "2.0.9"
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = APP_NAME
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.description = "Rex provides a variety of classes useful for security testing and exploit development."
12
12
  s.license = "BSD"
13
13
  s.authors = ["HD Moore", "Jacob Hammack"]
14
- s.email = ["hd_moore@rapid7.com", "jacob.hammack@hammackj.com"]
14
+ s.email = ["x@hdm.io", "jacob.hammack@hammackj.com"]
15
15
  s.files = Dir['rex.gemspec'] + Dir['examples/**'] + Dir['lib/rex.rb'] + Dir['lib/**/*']
16
16
  s.require_paths = ["lib"]
17
17
  s.extra_rdoc_files = ["README.markdown"]