ronin 2.0.0.beta1 → 2.0.0.beta2

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -4
  3. data/data/new/project/Rakefile +3 -3
  4. data/data/new/project/project.rb.erb +1 -1
  5. data/gemspec.yml +12 -6
  6. data/lib/ronin/cli/char_set_options.rb +81 -68
  7. data/lib/ronin/cli/commands/dns.rb +3 -95
  8. data/lib/ronin/cli/commands/extract.rb +17 -7
  9. data/lib/ronin/cli/commands/grep.rb +17 -7
  10. data/lib/ronin/cli/commands/hexdump.rb +8 -2
  11. data/lib/ronin/cli/commands/host.rb +6 -88
  12. data/lib/ronin/cli/commands/http.rb +11 -11
  13. data/lib/ronin/cli/commands/public_suffix_list.rb +16 -2
  14. data/lib/ronin/cli/commands/tld_list.rb +16 -2
  15. data/lib/ronin/cli/dns.rb +136 -0
  16. data/lib/ronin/cli/pattern_options.rb +200 -85
  17. data/lib/ronin/cli.rb +5 -0
  18. data/lib/ronin/version.rb +1 -1
  19. data/man/ronin-extract.1 +52 -12
  20. data/man/ronin-extract.1.md +42 -12
  21. data/man/ronin-grep.1 +52 -12
  22. data/man/ronin-grep.1.md +42 -12
  23. data/man/ronin-http.1 +2 -2
  24. data/man/ronin-http.1.md +1 -1
  25. data/ronin.gemspec +2 -1
  26. metadata +15 -25
  27. data/spec/cli/command_spec.rb +0 -10
  28. data/spec/cli/commands/decode_spec.rb +0 -152
  29. data/spec/cli/commands/encode_spec.rb +0 -152
  30. data/spec/cli/commands/escape_spec.rb +0 -128
  31. data/spec/cli/commands/quote_spec.rb +0 -76
  32. data/spec/cli/commands/unescape_spec.rb +0 -128
  33. data/spec/cli/commands/unquote_spec.rb +0 -80
  34. data/spec/cli/fixtures/file.txt +0 -3
  35. data/spec/cli/fixtures/file2.txt +0 -3
  36. data/spec/cli/key_options_spec.rb +0 -56
  37. data/spec/cli/method_options_spec.rb +0 -71
  38. data/spec/cli/string_methods_command_spec.rb +0 -25
  39. data/spec/cli/string_processor_command_spec.rb +0 -258
  40. data/spec/cli/value_processor_command_spec.rb +0 -127
  41. data/spec/spec_helper.rb +0 -5
  42. data/spec/version_spec.rb +0 -11
@@ -275,8 +275,14 @@ module Ronin
275
275
  @highlight_chars = {}
276
276
  end
277
277
 
278
+ #
279
+ # Runs the `ronin hexdump` command.
280
+ #
281
+ # @param [Array<String>] files
282
+ # Additional files to hexdump.
283
+ #
278
284
  def run(*files)
279
- @hexdump = ::Hexdump::Hexdump.new(**hexdump_options)
285
+ @hexdump = ::Hexdump::Hexdump.new(**hexdump_kwargs)
280
286
 
281
287
  super(*files)
282
288
  end
@@ -432,7 +438,7 @@ module Ronin
432
438
  #
433
439
  # @return [Hash{Symbol => Object}]
434
440
  #
435
- def hexdump_options
441
+ def hexdump_kwargs
436
442
  kwargs = {}
437
443
 
438
444
  HEXDUMP_OPTIONS.each do |key|
@@ -17,6 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'ronin/cli/value_processor_command'
20
+ require 'ronin/cli/dns'
20
21
  require 'ronin/support/network/host'
21
22
 
22
23
  require 'wordlist/file'
@@ -60,6 +61,8 @@ module Ronin
60
61
  #
61
62
  class Host < ValueProcessorCommand
62
63
 
64
+ include DNS
65
+
63
66
  usage '[options] [HOST ...]'
64
67
 
65
68
  option :subdomain, value: {
@@ -99,15 +102,6 @@ module Ronin
99
102
  },
100
103
  desc: 'Enumerates over every subdomain in the wordlist'
101
104
 
102
- option :nameserver, short: '-N',
103
- value: {
104
- type: String,
105
- usage: 'HOST|IP'
106
- },
107
- desc: 'Send DNS queries to the nameserver' do |ip|
108
- @nameservers << ip
109
- end
110
-
111
105
  option :ips, short: '-I',
112
106
  desc: "Converts the hostname to it's IP addresses"
113
107
 
@@ -155,21 +149,6 @@ module Ronin
155
149
 
156
150
  man_page 'ronin-host.1'
157
151
 
158
- #
159
- # Initializes the `ronin dns` command.
160
- #
161
- def initialize(**kwargs)
162
- super(**kwargs)
163
-
164
- @nameservers = []
165
- end
166
-
167
- def dns_options
168
- kwargs = {}
169
- kwargs[:nameservers] = @nameservers unless @nameservers.empty?
170
- kwargs
171
- end
172
-
173
152
  #
174
153
  # Queries the given host.
175
154
  #
@@ -228,7 +207,9 @@ module Ronin
228
207
  elsif options[:has_addresses]
229
208
  puts host if host.has_addresses?
230
209
  elsif options[:has_records]
231
- puts host unless host.get_records(options[:has_records]).empty?
210
+ records = host.get_records(options[:has_records])
211
+
212
+ puts host unless records.empty?
232
213
  elsif options[:query]
233
214
  print_records(query_records(host))
234
215
  else
@@ -236,69 +217,6 @@ module Ronin
236
217
  end
237
218
  end
238
219
 
239
- #
240
- # Queries the records for the given host name.
241
- #
242
- # @param [String] host
243
- # The host name to query.
244
- #
245
- # @return [Array<Resolv::DNS::Resource>]
246
- # The returned DNS resource records.
247
- #
248
- def query_records(host)
249
- if options[:type]
250
- resolver.get_records(host,options[:type].downcase)
251
- else
252
- resolver.get_a_records(host) + resolver.get_aaaa_records(host)
253
- end
254
- end
255
-
256
- #
257
- # Prints multiple DNS records.
258
- #
259
- # @param [Array<Resolv::DNS::Resource>] records
260
- # The DNS resource records to print.
261
- #
262
- def print_records(records)
263
- records.each do |record|
264
- print_record(record)
265
- end
266
- end
267
-
268
- #
269
- # Prints a DNS record.
270
- #
271
- # @param [Resolv::DNS::Resource] record
272
- # The DNS resource record to print.
273
- #
274
- def print_record(record)
275
- case record
276
- when Resolv::DNS::Resource::IN::A,
277
- Resolv::DNS::Resource::IN::AAAA
278
- puts record.address
279
- when Resolv::DNS::Resource::IN::NS,
280
- Resolv::DNS::Resource::IN::CNAME,
281
- Resolv::DNS::Resource::IN::PTR
282
- puts record.name
283
- when Resolv::DNS::Resource::IN::MX
284
- puts record.exchange
285
- when Resolv::DNS::Resource::IN::TXT
286
- puts record.strings.join
287
- when Resolv::DNS::Resource::IN::HINFO
288
- puts "#{record.cpu} #{record.os}"
289
- when Resolv::DNS::Resource::IN::LOC
290
- puts "#{record.latitude} #{record.longitude}"
291
- when Resolv::DNS::Resource::IN::MINFO
292
- puts "#{record.emailbx}@#{record.rmailbx}"
293
- when Resolv::DNS::Resource::IN::SOA
294
- puts "#{record.mname} #{record.rname} #{record.serial} #{record.refresh} #{record.retry} #{record.expire} #{record.ttl}"
295
- when Resolv::DNS::Resource::IN::SRV
296
- puts "#{record.port} #{record.priority} #{record.weight} #{record.target}"
297
- when Resolv::DNS::Resource::IN::WKS
298
- puts "#{record.address} #{record.protocol}"
299
- end
300
- end
301
-
302
220
  end
303
221
  end
304
222
  end
@@ -319,17 +319,17 @@ module Ronin
319
319
  def process_value(url)
320
320
  url = URI(url)
321
321
 
322
- Support::Network::HTTP.connect_uri(url, proxy: @proxy,
323
- user_agent: @user_agent) do |http|
324
- http.request(
325
- @http_method, url.request_uri, user: url.user,
326
- password: url.password,
327
- query_params: @query_params,
328
- headers: @headers,
329
- body: @body,
330
- form_data: @form_data,
331
- &method(:print_response))
332
- end
322
+ Support::Network::HTTP.request(
323
+ @http_method, url, proxy: @proxy,
324
+ user_agent: @user_agent,
325
+ user: url.user,
326
+ password: url.password,
327
+ query_params: @query_params,
328
+ headers: @headers,
329
+ body: @body,
330
+ form_data: @form_data,
331
+ &method(:print_response)
332
+ )
333
333
  end
334
334
 
335
335
  #
@@ -69,8 +69,11 @@ module Ronin
69
69
 
70
70
  man_page 'ronin-public-suffix-list.1'
71
71
 
72
- def run(*args)
73
- if !File.file?(options[:path])
72
+ #
73
+ # Runs the `ronin public-suffix-list` command.
74
+ #
75
+ def run
76
+ if !downloaded?
74
77
  download
75
78
  elsif options[:update] || stale?
76
79
  update
@@ -83,9 +86,20 @@ module Ronin
83
86
  end
84
87
  end
85
88
 
89
+ #
90
+ # Determines if the public suffix list file has been downloaded yet.
91
+ #
92
+ # @return [Boolean]
93
+ #
94
+ def downloaded?
95
+ List.downloaded?(options[:path])
96
+ end
97
+
86
98
  #
87
99
  # Determines if the public suffix list file is stale.
88
100
  #
101
+ # @return [Boolean]
102
+ #
89
103
  def stale?
90
104
  List.stale?(options[:path])
91
105
  end
@@ -69,8 +69,11 @@ module Ronin
69
69
 
70
70
  man_page 'ronin-tld-list.1'
71
71
 
72
- def run(*args)
73
- if !File.file?(options[:path])
72
+ #
73
+ # Runs the `ronin tld-list` command.
74
+ #
75
+ def run
76
+ if !downloaded?
74
77
  download
75
78
  elsif options[:update] || stale?
76
79
  update
@@ -83,9 +86,20 @@ module Ronin
83
86
  end
84
87
  end
85
88
 
89
+ #
90
+ # Determines if the TLD list file has been downloaded already.
91
+ #
92
+ # @return [Boolean]
93
+ #
94
+ def downloaded?
95
+ List.downloaded?(options[:path])
96
+ end
97
+
86
98
  #
87
99
  # Determines if the TLD list file is stale.
88
100
  #
101
+ # @return [Boolean]
102
+ #
89
103
  def stale?
90
104
  List.stale?(options[:path])
91
105
  end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Ronin. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/network/dns'
20
+
21
+ module Ronin
22
+ class CLI
23
+ module DNS
24
+ #
25
+ # Adds the `-N,--nameserver HOST|IP` option to the command which is
26
+ # including {DNS}.
27
+ #
28
+ # @param [Class<Command>] command
29
+ # The command which is including {DNS}.
30
+ #
31
+ def self.included(command)
32
+ command.option :nameserver, short: '-N',
33
+ value: {
34
+ type: String,
35
+ usage: 'HOST|IP'
36
+ },
37
+ desc: 'Send DNS queries to the nameserver' do |ip|
38
+ @nameservers << ip
39
+ end
40
+ end
41
+
42
+ # The configured nameservers to query.
43
+ #
44
+ # @return [Array<String>]
45
+ attr_reader :nameservers
46
+
47
+ #
48
+ # Initializes the command.
49
+ #
50
+ def initialize(**kwargs)
51
+ super(**kwargs)
52
+
53
+ @nameservers = []
54
+ end
55
+
56
+ #
57
+ # The resolver to use.
58
+ #
59
+ # @return [Ronin::Network::DNS::Resolver]
60
+ # The DNS resolver.
61
+ #
62
+ def resolver
63
+ @resolver ||= unless @nameservers.empty?
64
+ Support::Network::DNS.resolver(
65
+ nameservers: @nameservers
66
+ )
67
+ else
68
+ Support::Network::DNS.resolver
69
+ end
70
+ end
71
+
72
+ #
73
+ # Queries the records for the given host name.
74
+ #
75
+ # @param [String] host
76
+ # The host name to query.
77
+ #
78
+ # @return [Array<Resolv::DNS::Resource>]
79
+ # The returned DNS resource records.
80
+ #
81
+ def query_records(host)
82
+ if options[:type]
83
+ resolver.get_records(host,options[:type].downcase)
84
+ else
85
+ resolver.get_a_records(host) + resolver.get_aaaa_records(host)
86
+ end
87
+ end
88
+
89
+ #
90
+ # Prints multiple DNS records.
91
+ #
92
+ # @param [Array<Resolv::DNS::Resource>] records
93
+ # The DNS resource records to print.
94
+ #
95
+ def print_records(records)
96
+ records.each do |record|
97
+ print_record(record)
98
+ end
99
+ end
100
+
101
+ #
102
+ # Prints a DNS record.
103
+ #
104
+ # @param [Resolv::DNS::Resource] record
105
+ # The DNS resource record to print.
106
+ #
107
+ def print_record(record)
108
+ case record
109
+ when Resolv::DNS::Resource::IN::A,
110
+ Resolv::DNS::Resource::IN::AAAA
111
+ puts record.address
112
+ when Resolv::DNS::Resource::IN::NS,
113
+ Resolv::DNS::Resource::IN::CNAME,
114
+ Resolv::DNS::Resource::IN::PTR
115
+ puts record.name
116
+ when Resolv::DNS::Resource::IN::MX
117
+ puts record.exchange
118
+ when Resolv::DNS::Resource::IN::TXT
119
+ puts record.strings.join
120
+ when Resolv::DNS::Resource::IN::HINFO
121
+ puts "#{record.cpu} #{record.os}"
122
+ when Resolv::DNS::Resource::IN::LOC
123
+ puts "#{record.latitude} #{record.longitude}"
124
+ when Resolv::DNS::Resource::IN::MINFO
125
+ puts "#{record.emailbx}@#{record.rmailbx}"
126
+ when Resolv::DNS::Resource::IN::SOA
127
+ puts "#{record.mname} #{record.rname} #{record.serial} #{record.refresh} #{record.retry} #{record.expire} #{record.ttl}"
128
+ when Resolv::DNS::Resource::IN::SRV
129
+ puts "#{record.port} #{record.priority} #{record.weight} #{record.target}"
130
+ when Resolv::DNS::Resource::IN::WKS
131
+ puts "#{record.address} #{record.protocol}"
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end