ronin 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +14 -0
  3. data/.rubocop.yml +21 -0
  4. data/ChangeLog.md +18 -2
  5. data/Gemfile +6 -2
  6. data/Rakefile +2 -2
  7. data/bin/ronin +6 -7
  8. data/data/new/project/Gemfile.erb +9 -9
  9. data/gemspec.yml +7 -7
  10. data/lib/ronin/cli/char_set_options.rb +1 -1
  11. data/lib/ronin/cli/cipher_command.rb +3 -1
  12. data/lib/ronin/cli/command.rb +3 -0
  13. data/lib/ronin/cli/commands/asn.rb +1 -1
  14. data/lib/ronin/cli/commands/banner_grab.rb +5 -3
  15. data/lib/ronin/cli/commands/cert_dump.rb +4 -7
  16. data/lib/ronin/cli/commands/cert_gen.rb +4 -4
  17. data/lib/ronin/cli/commands/cert_grab.rb +5 -6
  18. data/lib/ronin/cli/commands/decode.rb +14 -14
  19. data/lib/ronin/cli/commands/encode.rb +14 -14
  20. data/lib/ronin/cli/commands/extract.rb +1 -1
  21. data/lib/ronin/cli/commands/grep.rb +7 -5
  22. data/lib/ronin/cli/commands/hexdump.rb +53 -22
  23. data/lib/ronin/cli/commands/hmac.rb +1 -1
  24. data/lib/ronin/cli/commands/host.rb +2 -2
  25. data/lib/ronin/cli/commands/http.rb +42 -25
  26. data/lib/ronin/cli/commands/ip.rb +2 -2
  27. data/lib/ronin/cli/commands/iprange.rb +2 -2
  28. data/lib/ronin/cli/commands/netcat.rb +32 -38
  29. data/lib/ronin/cli/commands/new/project.rb +19 -19
  30. data/lib/ronin/cli/commands/new/script.rb +12 -12
  31. data/lib/ronin/cli/commands/proxy.rb +10 -10
  32. data/lib/ronin/cli/commands/rot.rb +11 -10
  33. data/lib/ronin/cli/commands/strings.rb +1 -1
  34. data/lib/ronin/cli/commands/unhexdump.rb +1 -1
  35. data/lib/ronin/cli/dns.rb +3 -0
  36. data/lib/ronin/cli/file_processor_command.rb +3 -0
  37. data/lib/ronin/cli/host_and_port.rb +58 -0
  38. data/lib/ronin/cli/http_shell.rb +19 -16
  39. data/lib/ronin/cli/key_options.rb +3 -5
  40. data/lib/ronin/cli/method_options.rb +0 -2
  41. data/lib/ronin/cli/pattern_options.rb +5 -6
  42. data/lib/ronin/cli/printing/syntax_highlighting.rb +3 -0
  43. data/lib/ronin/cli/typo_options.rb +1 -1
  44. data/lib/ronin/cli/value_processor_command.rb +1 -1
  45. data/lib/ronin/config.rb +3 -3
  46. data/lib/ronin/version.rb +2 -2
  47. data/man/ronin-asn.1 +11 -1
  48. data/man/ronin-asn.1.md +9 -1
  49. data/man/ronin-banner-grab.1 +1 -1
  50. data/man/ronin-banner-grab.1.md +1 -1
  51. data/man/ronin-bitflip.1 +1 -1
  52. data/man/ronin-bitflip.1.md +1 -1
  53. data/man/ronin-cert-dump.1 +1 -1
  54. data/man/ronin-cert-dump.1.md +1 -1
  55. data/man/ronin-cert-gen.1 +1 -1
  56. data/man/ronin-cert-gen.1.md +1 -1
  57. data/man/ronin-cert-grab.1 +1 -1
  58. data/man/ronin-cert-grab.1.md +1 -1
  59. data/man/ronin-decode.1 +1 -1
  60. data/man/ronin-decode.1.md +1 -1
  61. data/man/ronin-decrypt.1 +1 -1
  62. data/man/ronin-decrypt.1.md +1 -1
  63. data/man/ronin-dns.1 +1 -1
  64. data/man/ronin-dns.1.md +1 -1
  65. data/man/ronin-email-addr.1 +1 -1
  66. data/man/ronin-email-addr.1.md +1 -1
  67. data/man/ronin-encode.1 +1 -1
  68. data/man/ronin-encode.1.md +1 -1
  69. data/man/ronin-encrypt.1 +1 -1
  70. data/man/ronin-encrypt.1.md +1 -1
  71. data/man/ronin-entropy.1 +1 -1
  72. data/man/ronin-entropy.1.md +1 -1
  73. data/man/ronin-escape.1 +1 -1
  74. data/man/ronin-escape.1.md +1 -1
  75. data/man/ronin-extract.1 +1 -1
  76. data/man/ronin-extract.1.md +1 -1
  77. data/man/ronin-grep.1 +1 -1
  78. data/man/ronin-grep.1.md +1 -1
  79. data/man/ronin-help.1 +1 -1
  80. data/man/ronin-help.1.md +1 -1
  81. data/man/ronin-hexdump.1 +2 -2
  82. data/man/ronin-hexdump.1.md +2 -2
  83. data/man/ronin-highlight.1 +1 -1
  84. data/man/ronin-highlight.1.md +1 -1
  85. data/man/ronin-hmac.1 +1 -1
  86. data/man/ronin-hmac.1.md +1 -1
  87. data/man/ronin-homoglyph.1 +1 -1
  88. data/man/ronin-homoglyph.1.md +1 -1
  89. data/man/ronin-host.1 +2 -2
  90. data/man/ronin-host.1.md +2 -2
  91. data/man/ronin-http.1 +1 -1
  92. data/man/ronin-http.1.md +1 -1
  93. data/man/ronin-ip.1 +1 -1
  94. data/man/ronin-ip.1.md +1 -1
  95. data/man/ronin-iprange.1 +1 -1
  96. data/man/ronin-iprange.1.md +1 -1
  97. data/man/ronin-irb.1 +1 -1
  98. data/man/ronin-irb.1.md +1 -1
  99. data/man/ronin-md5.1 +1 -1
  100. data/man/ronin-md5.1.md +1 -1
  101. data/man/ronin-netcat.1 +1 -1
  102. data/man/ronin-netcat.1.md +1 -1
  103. data/man/ronin-new-project.1 +1 -1
  104. data/man/ronin-new-project.1.md +1 -1
  105. data/man/ronin-new-script.1 +1 -1
  106. data/man/ronin-new-script.1.md +1 -1
  107. data/man/ronin-new.1 +1 -1
  108. data/man/ronin-new.1.md +1 -1
  109. data/man/ronin-proxy.1 +1 -1
  110. data/man/ronin-proxy.1.md +1 -1
  111. data/man/ronin-public-suffix-list.1 +11 -1
  112. data/man/ronin-public-suffix-list.1.md +9 -1
  113. data/man/ronin-quote.1 +1 -1
  114. data/man/ronin-quote.1.md +1 -1
  115. data/man/ronin-rot.1 +4 -3
  116. data/man/ronin-rot.1.md +4 -3
  117. data/man/ronin-sha1.1 +1 -1
  118. data/man/ronin-sha1.1.md +1 -1
  119. data/man/ronin-sha256.1 +1 -1
  120. data/man/ronin-sha256.1.md +1 -1
  121. data/man/ronin-sha512.1 +1 -1
  122. data/man/ronin-sha512.1.md +1 -1
  123. data/man/ronin-strings.1 +1 -1
  124. data/man/ronin-strings.1.md +1 -1
  125. data/man/ronin-tips.1 +1 -1
  126. data/man/ronin-tips.1.md +1 -1
  127. data/man/ronin-tld-list.1 +11 -1
  128. data/man/ronin-tld-list.1.md +9 -1
  129. data/man/ronin-typo.1 +1 -1
  130. data/man/ronin-typo.1.md +1 -1
  131. data/man/ronin-typosquat.1 +1 -1
  132. data/man/ronin-typosquat.1.md +1 -1
  133. data/man/ronin-unescape.1 +1 -1
  134. data/man/ronin-unescape.1.md +1 -1
  135. data/man/ronin-unhexdump.1 +1 -1
  136. data/man/ronin-unhexdump.1.md +1 -1
  137. data/man/ronin-unquote.1 +1 -1
  138. data/man/ronin-unquote.1.md +1 -1
  139. data/man/ronin-url.1 +1 -1
  140. data/man/ronin-url.1.md +1 -1
  141. data/man/ronin-xor.1 +1 -1
  142. data/man/ronin-xor.1.md +1 -1
  143. data/man/ronin.1 +1 -1
  144. data/man/ronin.1.md +1 -1
  145. data/ronin.gemspec +4 -3
  146. metadata +40 -2
@@ -60,7 +60,7 @@ module Ronin
60
60
  # ## Arguments
61
61
  #
62
62
  # [FILE] Optional file to hexdump
63
- #
63
+ #
64
64
  class Hexdump < FileProcessorCommand
65
65
 
66
66
  # Supported types for the `-t,--type` option.
@@ -149,7 +149,7 @@ module Ronin
149
149
  option :length, short: '-L',
150
150
  value: {
151
151
  type: Integer,
152
- usage: 'LEN',
152
+ usage: 'LEN'
153
153
  },
154
154
  desc: 'Length of data to hexdump'
155
155
 
@@ -399,7 +399,7 @@ module Ronin
399
399
  end
400
400
 
401
401
  regexp = Regexp.new(value[1...index])
402
- style = parse_style(value[index+2..])
402
+ style = parse_style(value[(index + 2)..])
403
403
 
404
404
  return [regexp, style]
405
405
  else
@@ -408,7 +408,7 @@ module Ronin
408
408
  end
409
409
 
410
410
  pattern = value[0...index]
411
- style = parse_style(value[index+1..])
411
+ style = parse_style(value[(index + 1)..])
412
412
 
413
413
  return [pattern, style]
414
414
  end
@@ -445,34 +445,65 @@ module Ronin
445
445
  kwargs[key] = options[key] if options.has_key?(key)
446
446
  end
447
447
 
448
- if (index_style = options[:style_index]) ||
449
- (numeric_style = options[:style_numeric]) ||
450
- (chars_style = options[:style_chars])
451
- kwargs[:style] = {}
452
- kwargs[:style][:index] = index_style if index_style
453
- kwargs[:style][:numeric] = numeric_style if numeric_style
454
- kwargs[:style][:chars] = chars_style if chars_style
448
+ if options.has_key?(:style_index) ||
449
+ options.has_key?(:style_numeric) ||
450
+ options.has_key?(:style_chars)
451
+ kwargs[:style] = hexdump_style_kwargs
455
452
  end
456
453
 
457
454
  if !@highlight_index.empty? ||
458
455
  !@highlight_numeric.empty? ||
459
456
  !@highlight_chars.empty?
460
- kwargs[:highlights] = {}
457
+ kwargs[:highlights] = hexdump_highlights_kwargs
458
+ end
461
459
 
462
- unless @highlight_index.empty?
463
- kwargs[:highlights][:index] = @highlight_index
464
- end
460
+ return kwargs
461
+ end
465
462
 
466
- unless @highlight_numeric.empty?
467
- kwargs[:highlights][:numeric] = @highlight_numeric
468
- end
463
+ #
464
+ # The hexdump `style:` keyword arguments.
465
+ #
466
+ # @return [Hash{Symbol => Object}]
467
+ #
468
+ def hexdump_style_kwargs
469
+ style = {}
469
470
 
470
- unless @highlight_chars.empty?
471
- kwargs[:highlights][:chars] = @highlight_chars
472
- end
471
+ if (index_style = options[:style_index])
472
+ style[:index] = index_style
473
473
  end
474
474
 
475
- return kwargs
475
+ if (numeric_style = options[:style_numeric])
476
+ style[:numeric] = numeric_style
477
+ end
478
+
479
+ if (chars_style = options[:style_chars])
480
+ style[:chars] = chars_style
481
+ end
482
+
483
+ return style
484
+ end
485
+
486
+ #
487
+ # The hexdump `highlights:` keyword arguments.
488
+ #
489
+ # @return [Hash{Symbol => Object}]
490
+ #
491
+ def hexdump_highlights_kwargs
492
+ highlights = {}
493
+
494
+ unless @highlight_index.empty?
495
+ highlights[:index] = @highlight_index
496
+ end
497
+
498
+ unless @highlight_numeric.empty?
499
+ highlights[:numeric] = @highlight_numeric
500
+ end
501
+
502
+ unless @highlight_chars.empty?
503
+ highlights[:chars] = @highlight_chars
504
+ end
505
+
506
+ return highlights
476
507
  end
477
508
 
478
509
  end
@@ -57,7 +57,7 @@ module Ronin
57
57
  option :hash, short: '-H',
58
58
  value: {
59
59
  type: [:md5, :sha1, :sha256, :sha512],
60
- default: :sha1,
60
+ default: :sha1
61
61
  },
62
62
  desc: 'Hash algorithm to use'
63
63
 
@@ -37,10 +37,10 @@ module Ronin
37
37
  # -f, --file FILE Optional file to read values from
38
38
  # --subdomain SUBNAME Converts the hostname to a sub-domain
39
39
  # -d, --domain Converts the hostname to a domain
40
- # -T, --tld Converts the hostname to it's TLD
40
+ # -T, --tld Converts the hostname to it's TLD
41
41
  # -s, --suffix Converts the hostname to it's suffix
42
42
  # -S, --change-suffix SUFFIX Changes the suffix of each hostname
43
- # --enum-tlds Enumerates over every TLD
43
+ # --enum-tlds Enumerates over every TLD
44
44
  # --enum-suffixes[={icann|private}]
45
45
  # Enumerates over every domain suffix
46
46
  # --enum-subdomains FILE Enumerates over every subdomain in the wordlist
@@ -22,6 +22,7 @@ require 'ronin/cli/http_shell'
22
22
  require 'ronin/support/network/http'
23
23
 
24
24
  require 'command_kit/options/verbose'
25
+ require 'addressable/uri'
25
26
 
26
27
  module Ronin
27
28
  class CLI
@@ -74,6 +75,9 @@ module Ronin
74
75
  include CommandKit::Options::Verbose
75
76
  include Printing::HTTP
76
77
 
78
+ # `http://` and `https://` URL validation regex.
79
+ URL_REGEX = URI::DEFAULT_PARSER.make_regexp(%w[http https])
80
+
77
81
  usage '[options] {URL [...] | --shell URL}'
78
82
 
79
83
  option :method, value: {
@@ -147,10 +151,14 @@ module Ronin
147
151
  end
148
152
 
149
153
  option :shell, value: {
150
- type: String,
154
+ type: URL_REGEX,
151
155
  usage: 'URL'
152
156
  },
153
- desc: 'Open an interactive HTTP shell'
157
+ desc: 'Open an interactive HTTP shell' do |url|
158
+ options[:shell] = Addressable::URI.parse(url)
159
+ rescue Addressable::URI::InvalidURIError => error
160
+ raise(OptionParser::InvalidArgument,"invalid URL: #{error.message}")
161
+ end
154
162
 
155
163
  option :proxy, short: '-P',
156
164
  value: {
@@ -172,11 +180,9 @@ module Ronin
172
180
 
173
181
  option :user_agent, short: '-u',
174
182
  value: {
175
- type: Hash[
176
- Support::Network::HTTP::UserAgents::ALIASES.keys.map { |key|
177
- [key.to_s.tr('_','-'), key]
178
- }
179
- ]
183
+ type: Support::Network::HTTP::UserAgents::ALIASES.transform_keys { |key|
184
+ key.to_s.tr('_','-')
185
+ }
180
186
  },
181
187
  desc: 'The User-Agent to use' do |name|
182
188
  @user_agent = name
@@ -326,25 +332,36 @@ module Ronin
326
332
  # The URL to request.
327
333
  #
328
334
  def process_value(url)
329
- url = URI(url)
330
-
331
- Support::Network::HTTP.request(
332
- @http_method, url, proxy: @proxy,
333
- user_agent: @user_agent,
334
- user: url.user,
335
- password: url.password,
336
- query_params: @query_params,
337
- headers: @headers,
338
- body: @body,
339
- form_data: @form_data
340
- ) do |response|
341
- # NOTE: we must call HTTP.request with a block to avoid causing
342
- # #read_body to be called twice.
343
- print_response(response)
335
+ unless url =~ URL_REGEX
336
+ print_error "invalid URL: #{url.inspect}"
337
+ return
338
+ end
339
+
340
+ uri = begin
341
+ Addressable::URI.parse(url)
342
+ rescue Addressable::URI::InvalidURIError => error
343
+ print_error "invalid URL: #{error.message}"
344
+ return
345
+ end
346
+
347
+ begin
348
+ Support::Network::HTTP.request(
349
+ @http_method, uri, proxy: @proxy,
350
+ user_agent: @user_agent,
351
+ query_params: @query_params,
352
+ headers: @headers,
353
+ body: @body,
354
+ form_data: @form_data
355
+ ) do |response|
356
+ # NOTE: we must call HTTP.request with a block to avoid causing
357
+ # #read_body to be called twice.
358
+ print_response(response)
359
+ end
360
+ rescue StandardError => error
361
+ if verbose? then print_exception(error)
362
+ else print_error(error.message)
363
+ end
344
364
  end
345
- rescue => error
346
- print_error(error.message)
347
- exit(1)
348
365
  end
349
366
 
350
367
  #
@@ -135,12 +135,12 @@ module Ronin
135
135
  desc: 'The query string for the URI'
136
136
 
137
137
  option :http, desc: 'Converts the IP address into a http:// URI' do
138
- options[:uri] = true
138
+ options[:uri] = true
139
139
  options[:uri_scheme] = 'http'
140
140
  end
141
141
 
142
142
  option :https, desc: 'Converts the IP address into a https:// URI' do
143
- options[:uri] = true
143
+ options[:uri] = true
144
144
  options[:uri_scheme] = 'https'
145
145
  end
146
146
 
@@ -47,7 +47,7 @@ module Ronin
47
47
  # ronin iprange 1.1.2-4.10-50
48
48
  # ronin iprange --start 1.1.1.10 --stop 1.1.4.100
49
49
  # ronin iprange --file list.txt
50
- #
50
+ #
51
51
  class Iprange < ValueProcessorCommand
52
52
 
53
53
  usage '[options] [IP_RANGE ... | --start IP --stop IP]'
@@ -104,7 +104,7 @@ module Ronin
104
104
  if !@start.empty? && !@stop.empty?
105
105
  unless @start.length == @stop.length
106
106
  print_error "must specify an equal number of --start and --stop options"
107
- exit -1
107
+ exit(-1)
108
108
  end
109
109
 
110
110
  @start.zip(@stop).each do |(start,stop)|
@@ -132,16 +132,14 @@ module Ronin
132
132
 
133
133
  option :ssl_key, value: {
134
134
  type: String,
135
- usage: 'FILE',
135
+ usage: 'FILE'
136
136
  },
137
137
  desc: 'Specifies the SSL key file'
138
138
 
139
139
  option :ssl_verify, value: {
140
- type: Hash[
141
- Support::Network::SSL::VERIFY.keys.map { |key|
142
- [key.to_s.tr('_','-'), key]
143
- }
144
- ]
140
+ type: Support::Network::SSL::VERIFY.transform_keys { |key|
141
+ key.to_s.tr('_','-')
142
+ }
145
143
  },
146
144
  desc: 'SSL verification mode'
147
145
 
@@ -301,16 +299,15 @@ module Ronin
301
299
  # The client event loop.
302
300
  #
303
301
  def client_loop
304
- endpoint = async_endpoint
305
- stdin = async_stdin
306
- finished = Async::Notification.new
307
-
302
+ finished = Async::Notification.new
303
+ endpoint = async_endpoint
304
+ stdin = async_stdin
308
305
  buffer_size = options[:buffer_size]
309
306
 
310
307
  Async do |task|
311
308
  socket = begin
312
309
  endpoint.connect
313
- rescue => error
310
+ rescue StandardError => error
314
311
  print_error(error.message)
315
312
  exit(1)
316
313
  end
@@ -319,25 +316,23 @@ module Ronin
319
316
 
320
317
  begin
321
318
  client = task.async do
322
- begin
323
- while (data = stream.read_partial(buffer_size))
324
- print_data(data)
325
- end
326
- rescue EOFError
327
- ensure
328
- finished.signal
319
+ while (data = stream.read_partial(buffer_size))
320
+ print_data(data)
329
321
  end
322
+ rescue EOFError
323
+ # ignore EOFError
324
+ ensure
325
+ finished.signal
330
326
  end
331
327
 
332
328
  user = task.async do
333
- begin
334
- while (data = stdin.read_partial(buffer_size))
335
- socket.write(data)
336
- end
337
- rescue EOFError
338
- ensure
339
- finished.signal
329
+ while (data = stdin.read_partial(buffer_size))
330
+ socket.write(data)
340
331
  end
332
+ rescue EOFError
333
+ # ignore EOFError
334
+ ensure
335
+ finished.signal
341
336
  end
342
337
 
343
338
  finished.wait
@@ -353,12 +348,11 @@ module Ronin
353
348
  # The server event loop.
354
349
  #
355
350
  def server_loop
356
- endpoint = async_endpoint
357
- stdin = async_stdin
358
- finished = Async::Notification.new
359
-
351
+ finished = Async::Notification.new
352
+ endpoint = async_endpoint
353
+ stdin = async_stdin
354
+ clients = []
360
355
  buffer_size = options[:buffer_size]
361
- clients = []
362
356
 
363
357
  Async do |task|
364
358
  endpoint.accept do |socket|
@@ -374,6 +368,7 @@ module Ronin
374
368
  print_data(data)
375
369
  end
376
370
  rescue EOFError
371
+ # ignore EOFError
377
372
  end
378
373
 
379
374
  clients.delete(socket)
@@ -384,18 +379,17 @@ module Ronin
384
379
  end
385
380
 
386
381
  task.async do
387
- begin
388
- while (data = stdin.read_partial(buffer_size))
389
- clients.each { |client| client.write(data) }
390
- end
391
- rescue EOFError
392
- ensure
393
- finished.signal
382
+ while (data = stdin.read_partial(buffer_size))
383
+ clients.each { |client| client.write(data) }
394
384
  end
385
+ rescue EOFError
386
+ # ignore EOFError
387
+ ensure
388
+ finished.signal
395
389
  end
396
390
 
397
391
  finished.wait
398
- rescue => error
392
+ rescue StandardError => error
399
393
  print_error(error.message)
400
394
  exit(1)
401
395
  ensure
@@ -23,26 +23,26 @@ require 'ronin/root'
23
23
  module Ronin
24
24
  class CLI
25
25
  module Commands
26
- #
27
- # Creates new Ruby project directory.
28
- #
29
- # ## Usage
30
- #
31
- # ronin new project [options] DIR
32
- #
33
- # ## Options
34
- #
35
- # --git Initializes a git repo
36
- # --ruby-version VERSION The desired ruby version for the project
37
- # --rakefile Creates a Rakefile
38
- # -D, --dockerfile Adds a Dockerfile to the new project
39
- # -h, --help Print help information
40
- #
41
- # ## Arguments
42
- #
43
- # PATH The directory to create
44
- #
45
26
  class New < Command
27
+ #
28
+ # Creates new Ruby project directory.
29
+ #
30
+ # ## Usage
31
+ #
32
+ # ronin new project [options] DIR
33
+ #
34
+ # ## Options
35
+ #
36
+ # --git Initializes a git repo
37
+ # --ruby-version VERSION The desired ruby version for the project
38
+ # --rakefile Creates a Rakefile
39
+ # -D, --dockerfile Adds a Dockerfile to the new project
40
+ # -h, --help Print help information
41
+ #
42
+ # ## Arguments
43
+ #
44
+ # PATH The directory to create
45
+ #
46
46
  class Project < Command
47
47
 
48
48
  include Core::CLI::Generator
@@ -23,25 +23,25 @@ require 'ronin/root'
23
23
  module Ronin
24
24
  class CLI
25
25
  module Commands
26
- #
27
- # Creates a new standalone Ruby script.
28
- #
29
- # ## Usage
30
- #
31
- # ronin new script PATH
32
- #
33
- # ## Arguments
34
- #
35
- # PATH The script file to create
36
- #
37
26
  class New < Command
27
+ #
28
+ # Creates a new standalone Ruby script.
29
+ #
30
+ # ## Usage
31
+ #
32
+ # ronin new script PATH
33
+ #
34
+ # ## Arguments
35
+ #
36
+ # PATH The script file to create
37
+ #
38
38
  class Script < Command
39
39
 
40
40
  include Core::CLI::Generator
41
41
 
42
42
  template_dir File.join(ROOT,'data','new')
43
43
 
44
- usage' PATH'
44
+ usage 'PATH'
45
45
 
46
46
  argument :path, required: true,
47
47
  desc: 'The script file to create'
@@ -17,6 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'ronin/cli/command'
20
+ require 'ronin/cli/host_and_port'
20
21
  require 'ronin/core/cli/logging'
21
22
 
22
23
  require 'ronin/support/network/tcp/proxy'
@@ -76,6 +77,7 @@ module Ronin
76
77
  #
77
78
  class Proxy < Command
78
79
 
80
+ include HostAndPort
79
81
  include Core::CLI::Logging
80
82
 
81
83
  usage '[PROXY_HOST:]PROXY_PORT UPSTREAM_HOST:UPSTREAM_PORT'
@@ -115,7 +117,7 @@ module Ronin
115
117
 
116
118
  option :rewrite_client, value: {
117
119
  type: String,
118
- usage: '/REGEXP/:STRING',
120
+ usage: '/REGEXP/:STRING'
119
121
  },
120
122
  desc: 'Client rewrite rules' do |value|
121
123
  @rewrite_client << parse_rewrite_rule(value)
@@ -123,14 +125,14 @@ module Ronin
123
125
 
124
126
  option :rewrite_server, value: {
125
127
  type: String,
126
- usage: '/REGEXP/:STRING',
128
+ usage: '/REGEXP/:STRING'
127
129
  },
128
130
  desc: 'Server rewrite rules' do |value|
129
131
  @rewrite_server << parse_rewrite_rule(value)
130
132
  end
131
133
 
132
134
  option :ignore, short: '-i',
133
- value: {type: Regexp},
135
+ value: {type: Regexp},
134
136
  desc: 'Ignore rules' do |regexp|
135
137
  @ignore << regexp
136
138
  end
@@ -146,7 +148,7 @@ module Ronin
146
148
  end
147
149
 
148
150
  option :close, short: '-C',
149
- value: {type: Regexp},
151
+ value: {type: Regexp},
150
152
  desc: 'Close rules' do |regexp|
151
153
  @close << regexp
152
154
  end
@@ -294,14 +296,12 @@ module Ronin
294
296
  local, upstream = *args
295
297
 
296
298
  if local.include?(':')
297
- proxy_host, proxy_port = local.split(':',2)
298
- proxy_port = proxy_port.to_i
299
+ proxy_host, proxy_port = host_and_port(local)
299
300
  else
300
301
  proxy_port = local.to_i
301
302
  end
302
303
 
303
- upstream_host, upstream_port = upstream.split(':',2)
304
- upstream_port = upstream_port.to_i
304
+ upstream_host, upstream_port = host_and_port(upstream)
305
305
 
306
306
  if options[:hexdump]
307
307
  @hexdumper = Hexdump::Hexdump.new
@@ -430,7 +430,7 @@ module Ronin
430
430
  end
431
431
 
432
432
  regexp = Regexp.new(string[1...index])
433
- pattern = string[index+2..]
433
+ pattern = string[(index + 2)..]
434
434
 
435
435
  return regexp, pattern
436
436
  end
@@ -465,7 +465,7 @@ module Ronin
465
465
  def address(connection)
466
466
  case connection
467
467
  when Array
468
- socket, (host, port) = connection
468
+ _socket, (host, port) = connection
469
469
 
470
470
  "#{host}:#{port}"
471
471
  when TCPSocket, UDPSocket
@@ -37,7 +37,7 @@ module Ronin
37
37
  # -M, --multiline Process each line separately
38
38
  # --keep-newlines Preserves newlines at the end of each line
39
39
  # -A, --alphabet ABC... Alphabet characters
40
- # -n, --modulu NUM Number of characters to rotate
40
+ # -n, --modulo NUM Number of characters to rotate (Default: 13)
41
41
  # -h, --help Print help information
42
42
  #
43
43
  # ## Arguments
@@ -55,13 +55,14 @@ module Ronin
55
55
  @alphabets << str.chars
56
56
  end
57
57
 
58
- option :modulu, short: '-n',
58
+ option :modulo, short: '-n',
59
59
  value: {
60
- type: Integer,
61
- usage: 'NUM'
60
+ type: Integer,
61
+ usage: 'NUM',
62
+ default: 13
62
63
  },
63
64
  desc: 'Number of characters to rotate' do |num|
64
- @n = num
65
+ @modulo = num
65
66
  end
66
67
 
67
68
  description "Rotates each character of data within an alphabet"
@@ -71,7 +72,7 @@ module Ronin
71
72
  # The number of characters to rotate.
72
73
  #
73
74
  # @return [Integer]
74
- attr_reader :n
75
+ attr_reader :modulo
75
76
 
76
77
  # The alphabets to rotate within.
77
78
  #
@@ -87,7 +88,7 @@ module Ronin
87
88
  def initialize(**kwargs)
88
89
  super(**kwargs)
89
90
 
90
- @n = 13
91
+ @modulo = 13
91
92
  @alphabets = []
92
93
  end
93
94
 
@@ -101,10 +102,10 @@ module Ronin
101
102
  # The rotated string.
102
103
  #
103
104
  def process_string(string)
104
- if !@alphabets.empty?
105
- Support::Crypto.rot(string,@n, alphabets: @alphabets)
105
+ unless @alphabets.empty?
106
+ Support::Crypto.rot(string,@modulo, alphabets: @alphabets)
106
107
  else
107
- Support::Crypto.rot(string,@n)
108
+ Support::Crypto.rot(string,@modulo)
108
109
  end
109
110
  end
110
111
 
@@ -85,7 +85,7 @@ module Ronin
85
85
  description 'Prints all strings within a file/stream belonging to the given character set'
86
86
 
87
87
  examples [
88
- '--hex -n 32 file.bin',
88
+ '--hex -n 32 file.bin'
89
89
  ]
90
90
 
91
91
  man_page 'ronin-strings.1'
@@ -140,7 +140,7 @@ module Ronin
140
140
  desc: 'Numerical base of the hexdumped numbers'
141
141
 
142
142
  option :address_base, short: '-A',
143
- value: {type: BASES},
143
+ value: {type: BASES},
144
144
  desc: 'Numerical base of the address column'
145
145
 
146
146
  option :named_chars, long: '--[no-]named-chars',
data/lib/ronin/cli/dns.rb CHANGED
@@ -20,6 +20,9 @@ require 'ronin/support/network/dns'
20
20
 
21
21
  module Ronin
22
22
  class CLI
23
+ #
24
+ # Mixin for adding DNS support to commands.
25
+ #
23
26
  module DNS
24
27
  #
25
28
  # Adds the `-N,--nameserver HOST|IP` option to the command which is