ronin-recon 0.1.0.rc1 → 0.1.0

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/ChangeLog.md +1 -1
  4. data/README.md +2 -1
  5. data/data/completions/ronin-recon +17 -17
  6. data/data/wordlists/raft-small-directories.txt.gz +0 -0
  7. data/data/wordlists/subdomains-1000.txt.gz +0 -0
  8. data/gemspec.yml +6 -6
  9. data/lib/ronin/recon/builtin/api/crt_sh.rb +111 -0
  10. data/lib/ronin/recon/builtin/dns/subdomain_enum.rb +1 -0
  11. data/lib/ronin/recon/builtin/net/port_scan.rb +1 -0
  12. data/lib/ronin/recon/builtin/net/service_id.rb +1 -1
  13. data/lib/ronin/recon/builtin/ssl/cert_grab.rb +12 -4
  14. data/lib/ronin/recon/builtin/web/dir_enum.rb +13 -6
  15. data/lib/ronin/recon/builtin/web/email_addresses.rb +10 -5
  16. data/lib/ronin/recon/builtin/web/spider.rb +6 -2
  17. data/lib/ronin/recon/cli/commands/run.rb +7 -7
  18. data/lib/ronin/recon/cli/commands/test.rb +4 -1
  19. data/lib/ronin/recon/cli/printing.rb +19 -18
  20. data/lib/ronin/recon/config.rb +2 -2
  21. data/lib/ronin/recon/engine.rb +15 -15
  22. data/lib/ronin/recon/graph.rb +4 -4
  23. data/lib/ronin/recon/importer.rb +3 -3
  24. data/lib/ronin/recon/message/job_completed.rb +2 -2
  25. data/lib/ronin/recon/message/job_failed.rb +2 -2
  26. data/lib/ronin/recon/message/job_started.rb +2 -2
  27. data/lib/ronin/recon/mixins/http.rb +0 -1
  28. data/lib/ronin/recon/output_formats/dir.rb +2 -2
  29. data/lib/ronin/recon/output_formats/dot.rb +5 -5
  30. data/lib/ronin/recon/output_formats/graph_format.rb +2 -2
  31. data/lib/ronin/recon/output_formats/graphviz_format.rb +3 -3
  32. data/lib/ronin/recon/scope.rb +7 -3
  33. data/lib/ronin/recon/value_status.rb +3 -3
  34. data/lib/ronin/recon/values/domain.rb +4 -0
  35. data/lib/ronin/recon/values/email_address.rb +1 -1
  36. data/lib/ronin/recon/values/host.rb +4 -1
  37. data/lib/ronin/recon/values/ip.rb +1 -1
  38. data/lib/ronin/recon/values/ip_range.rb +1 -1
  39. data/lib/ronin/recon/values/open_port.rb +1 -1
  40. data/lib/ronin/recon/values/url.rb +1 -2
  41. data/lib/ronin/recon/values/website.rb +38 -10
  42. data/lib/ronin/recon/values/wildcard.rb +1 -1
  43. data/lib/ronin/recon/version.rb +1 -1
  44. data/lib/ronin/recon/worker.rb +3 -3
  45. data/man/ronin-recon-run.1 +1 -1
  46. data/man/ronin-recon-run.1.md +1 -1
  47. metadata +16 -16
  48. data/lib/ronin/recon/builtin/ssl/cert_sh.rb +0 -77
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a9c5f1341f2119335b680ceb29bed06bafa19a74664bacf71d4385ec2b517cb
4
- data.tar.gz: b0ba0ddde38138cb220ba5dc8b6a31005811622086b37ed51a1de5a3f80cc717
3
+ metadata.gz: fb12d7c803f46db1479703050ae863e2c684bcf02c27e56845f57aabadba8295
4
+ data.tar.gz: 3ecef315a0ef47934ba2b6b7117ad9b2bc9813508f4db64d96e851b09469008b
5
5
  SHA512:
6
- metadata.gz: 9d6dac836e0943da2c2dc1478ce4bc557328811c4a9c4edb035462aaae0cfe3827f8b40acb7863a0ea61060c7f110a934e3f58ed5658decc776595064be664ba
7
- data.tar.gz: 13e2d6e10d7c38e70af52a616cc64f07b794d29535d80195d25e33c2e7f04430ef35964c557bcbfc65ac29177fde916141dc9f25fab261535ea590fc38498cd3
6
+ metadata.gz: 8d4956f0572724eb5db72c774ac20202dfef0d56513d1569a3d309c5329a988a3f085db9c3d58bb23f4f7922a6da87c67f69d43971efff50704e89a2486393e9
7
+ data.tar.gz: 87eb036e8d7702d7a9bd2645c1bf152b797e990a6bf0a7f566db8c1f787217a9c14b19f9d93940f6f8645745367bba63cf27ee6b9700214d73567a17b324da6f
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.1
1
+ ruby-3.3
data/ChangeLog.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.1.0 / 2024-XX-XX
1
+ ### 0.1.0 / 2024-07-22
2
2
 
3
3
  * Initial release:
4
4
  * Uses asynchronous I/O and fibers.
data/README.md CHANGED
@@ -56,6 +56,7 @@ and uses asynchronous I/O to maximize efficiency.
56
56
 
57
57
  * Does not require API keys to run.
58
58
  * Not just a script that runs a bunch of other recon tools.
59
+ * Does not use AI.
59
60
 
60
61
  ## Synopsis
61
62
 
@@ -86,6 +87,7 @@ List all available recon workers:
86
87
 
87
88
  ```shell
88
89
  $ ronin-recon workers
90
+ api/crt_sh
89
91
  dns/lookup
90
92
  dns/mailservers
91
93
  dns/nameservers
@@ -95,7 +97,6 @@ $ ronin-recon workers
95
97
  dns/suffix_enum
96
98
  net/cert_enum
97
99
  net/cert_grab
98
- net/cert_sh
99
100
  net/ip_range_enum
100
101
  net/port_scan
101
102
  net/service_id
@@ -11,7 +11,7 @@ _ronin-recon_completions_filter() {
11
11
 
12
12
  if [[ "${cur:0:1}" == "-" ]]; then
13
13
  echo "$words"
14
-
14
+
15
15
  else
16
16
  for word in $words; do
17
17
  [[ "${word:0:1}" != "-" ]] && result+=("$word")
@@ -29,67 +29,67 @@ _ronin-recon_completions() {
29
29
 
30
30
  case "$compline" in
31
31
  'run'*'--config-file')
32
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
32
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
33
33
  ;;
34
34
 
35
35
  'run'*'--worker-file')
36
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
36
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
37
37
  ;;
38
38
 
39
39
  'worker'*'--file')
40
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
40
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
41
41
  ;;
42
42
 
43
43
  'run'*'--output')
44
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
44
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
45
45
  ;;
46
46
 
47
47
  'test'*'--file')
48
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
48
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
49
49
  ;;
50
50
 
51
51
  'completion'*)
52
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-recon_completions_filter "--print --install --uninstall")" -- "$cur" )
52
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_ronin-recon_completions_filter "--print --install --uninstall")" -- "$cur")
53
53
  ;;
54
54
 
55
55
  'worker'*'-f')
56
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
56
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
57
57
  ;;
58
58
 
59
59
  'test'*'-f')
60
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
60
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
61
61
  ;;
62
62
 
63
63
  'run'*'-C')
64
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
64
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
65
65
  ;;
66
66
 
67
67
  'run'*'-o')
68
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A file -- "$cur" )
68
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
69
69
  ;;
70
70
 
71
71
  'worker'*)
72
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-recon_completions_filter "--file -f --verbose -v")" -- "$cur" )
72
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_ronin-recon_completions_filter "--file -f --verbose -v")" -- "$cur")
73
73
  ;;
74
74
 
75
75
  'test'*)
76
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-recon_completions_filter "--file -f --debug -D --param -p")" -- "$cur" )
76
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_ronin-recon_completions_filter "--file -f --debug -D --param -p")" -- "$cur")
77
77
  ;;
78
78
 
79
79
  'new'*)
80
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-recon_completions_filter "--type -t --author -a --author-email -e --summary -S --description -D --reference -R --accepts -A --outputs -O --intensity -I")" -- "$cur" )
80
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_ronin-recon_completions_filter "--type -t --author -a --author-email -e --summary -S --description -D --reference -R --accepts -A --outputs -O --intensity -I")" -- "$cur")
81
81
  ;;
82
82
 
83
83
  'run'*)
84
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-recon_completions_filter "--debug -D --db --db-uri --db-file --config-file -C --worker -w --enable -e --disable -d --worker-file --param -p --concurrency -c --intensity --max-depth --output -o --output-format -F --import --ignore -I")" -- "$cur" )
84
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_ronin-recon_completions_filter "--debug -D --db --db-uri --db-file --config-file -C --worker -w --enable -e --disable -d --worker-file --param -p --concurrency -c --intensity --max-depth --output -o --output-format -F --import --ignore -I")" -- "$cur")
85
85
  ;;
86
86
 
87
87
  *)
88
- while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-recon_completions_filter "--version -V help completion irb new run test worker workers")" -- "$cur" )
88
+ while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_ronin-recon_completions_filter "--version -V help completion irb new run test worker workers")" -- "$cur")
89
89
  ;;
90
90
 
91
91
  esac
92
92
  } &&
93
- complete -F _ronin-recon_completions ronin-recon
93
+ complete -F _ronin-recon_completions ronin-recon
94
94
 
95
95
  # ex: filetype=sh
Binary file
data/gemspec.yml CHANGED
@@ -45,13 +45,13 @@ dependencies:
45
45
  async-http: ~> 0.60
46
46
  wordlist: ~> 1.0, >= 1.0.3
47
47
  # Ronin dependencies:
48
- ronin-support: ~> 1.1.0.rc1
49
- ronin-core: ~> 0.2.0.rc1
50
- ronin-db: ~> 0.2.0.rc1
48
+ ronin-support: ~> 1.1
49
+ ronin-core: ~> 0.2
50
+ ronin-db: ~> 0.2
51
51
  ronin-repos: ~> 0.1
52
- ronin-masscan: ~> 0.1.0.rc1
53
- ronin-nmap: ~> 0.1.0.rc1
54
- ronin-web-spider: ~> 0.2.0.rc1
52
+ ronin-masscan: ~> 0.1
53
+ ronin-nmap: ~> 0.1
54
+ ronin-web-spider: ~> 0.2
55
55
 
56
56
  development_dependencies:
57
57
  bundler: ~> 2.0
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-recon - A micro-framework and tool for performing reconnaissance.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-recon is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-recon is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-recon. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/recon/worker'
22
+ require 'ronin/support/text/patterns/network'
23
+
24
+ require 'async/http/internet/instance'
25
+ require 'set'
26
+
27
+ module Ronin
28
+ module Recon
29
+ module API
30
+ #
31
+ # A recon worker that queries https://crt.sh and returns host from each
32
+ # domains certificate
33
+ #
34
+ class CrtSh < Worker
35
+
36
+ register 'api/crt_sh'
37
+
38
+ summary 'Queries https://crt.sh'
39
+
40
+ description <<~DESC
41
+ Queries https://crt.sh and returns the host names from each valid
42
+ certificate for the domain.
43
+ DESC
44
+
45
+ accepts Domain
46
+ outputs Host
47
+ intensity :passive
48
+ concurrency 1
49
+
50
+ # The HTTP client for `https://crt.sh`.
51
+ #
52
+ # @return [Async::HTTP::Client]
53
+ #
54
+ # @api private
55
+ attr_reader :client
56
+
57
+ #
58
+ # Initializes the `api/crt_sh` worker.
59
+ #
60
+ # @param [Hash{Symbol => Object}] kwargs
61
+ # Additional keyword arguments.
62
+ #
63
+ # @api private
64
+ #
65
+ def initialize(**kwargs)
66
+ super(**kwargs)
67
+
68
+ @client = Async::HTTP::Client.new(
69
+ Async::HTTP::Endpoint.for('https','crt.sh')
70
+ )
71
+ end
72
+
73
+ # Regular expression to verify valid host names.
74
+ #
75
+ # @api private
76
+ HOST_NAME_REGEX = /\A#{Support::Text::Patterns::HOST_NAME}\z/
77
+
78
+ #
79
+ # Returns host from each domains certificate.
80
+ #
81
+ # @param [Values::Domain] domain
82
+ # The domain value to check.
83
+ #
84
+ # @yield [host]
85
+ # If the domain has certificates, then a host value will be
86
+ # yielded.
87
+ #
88
+ # @yieldparam [Values::Host] host
89
+ # The host from certificate.
90
+ #
91
+ def process(domain)
92
+ path = "/?dNSName=#{domain}&exclude=expired&output=json"
93
+ response = @client.get(path)
94
+ certs = JSON.parse(response.read, symbolize_names: true)
95
+ hostnames = Set.new
96
+
97
+ certs.each do |cert|
98
+ common_name = cert[:common_name]
99
+
100
+ if common_name &&
101
+ common_name =~ HOST_NAME_REGEX &&
102
+ hostnames.add?(common_name)
103
+ yield Host.new(common_name)
104
+ end
105
+ end
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
@@ -33,6 +33,7 @@ module Ronin
33
33
  #
34
34
  class SubdomainEnum < DNSWorker
35
35
 
36
+ # The path to the default common subdomains wordlist.
36
37
  DEFAULT_WORDLIST = File.join(WORDLISTS_DIR, 'subdomains-1000.txt.gz')
37
38
 
38
39
  register 'dns/subdomain_enum'
@@ -41,6 +41,7 @@ module Ronin
41
41
 
42
42
  accepts IP
43
43
  outputs OpenPort
44
+ concurrency 1 # prevents overloading the network interface
44
45
 
45
46
  param :ports, String, desc: 'Optional port list to scan'
46
47
 
@@ -64,7 +64,7 @@ module Ronin
64
64
  else
65
65
  yield Website.http(open_port.host,open_port.number)
66
66
  end
67
- when 'https'
67
+ when 'https', 'https-alt'
68
68
  yield Website.https(open_port.host,open_port.number)
69
69
  end
70
70
  end
@@ -58,14 +58,22 @@ module Ronin
58
58
  #
59
59
  def process(open_port)
60
60
  if open_port.ssl?
61
+ context = OpenSSL::SSL::SSLContext.new
62
+
63
+ context.verify_mode = OpenSSL::SSL::VERIFY_NONE
64
+
61
65
  address = open_port.address
62
66
  port = open_port.number
63
- endpoint = Async::IO::Endpoint.ssl(address,port)
67
+ endpoint = Async::IO::Endpoint.ssl(address,port, ssl_context: context)
64
68
 
65
- endpoint.connect do |socket|
66
- peer_cert = socket.peer_cert
69
+ begin
70
+ endpoint.connect do |socket|
71
+ peer_cert = socket.peer_cert
67
72
 
68
- yield Cert.new(peer_cert)
73
+ yield Cert.new(peer_cert)
74
+ end
75
+ rescue OpenSSL::SSL::SSLError
76
+ # abort if we cannot successfully establish a SSL/TLS connection
69
77
  end
70
78
  end
71
79
  end
@@ -69,6 +69,9 @@ module Ronin
69
69
  def process(website)
70
70
  wordlist = Wordlist.open(params[:wordlist] || DEFAULT_WORDLIST)
71
71
  queue = Async::LimitedQueue.new(params[:concurrency])
72
+ endpoint = Async::HTTP::Endpoint.for(
73
+ website.scheme, website.host, port: website.port
74
+ )
72
75
  base_url = website.to_s
73
76
 
74
77
  Async do |task|
@@ -83,19 +86,23 @@ module Ronin
83
86
  # spawn the sub-tasks
84
87
  params[:concurrency].times do
85
88
  task.async do
86
- http = Async::HTTP::Internet.instance
89
+ http = Async::HTTP::Client.new(endpoint)
87
90
 
88
91
  while (dir = queue.dequeue)
89
92
  path = "/#{URI.encode_uri_component(dir)}"
90
- url = "#{base_url}#{path}"
91
93
  retries = 0
92
94
 
93
95
  begin
94
- response = http.head(url)
96
+ response = http.head(path)
97
+ status = response.status
95
98
 
96
- if VALID_STATUS_CODES.include?(response.status)
97
- yield URL.new(url, status: response.status,
98
- headers: response.headers)
99
+ if VALID_STATUS_CODES.include?(status)
100
+ headers = response.headers.to_h
101
+
102
+ yield URL.new(
103
+ "#{base_url}#{path}", status: status,
104
+ headers: headers
105
+ )
99
106
  end
100
107
  rescue Errno::ECONNREFUSED,
101
108
  SocketError
@@ -55,12 +55,17 @@ module Ronin
55
55
  # Email address found on the page.
56
56
  #
57
57
  def process(url)
58
- return nil unless url.body
58
+ if (body = url.body)
59
+ if body.encoding == Encoding::ASCII_8BIT
60
+ # forcibly convert and scrub binary data into UTF-8 data
61
+ body = body.dup
62
+ body.force_encoding(Encoding::UTF_8)
63
+ body.scrub!
64
+ end
59
65
 
60
- email_pattern = Ronin::Support::Text::Patterns::EMAIL_ADDRESS
61
-
62
- url.body.force_encoding(Encoding::UTF_8).scan(email_pattern) do |email|
63
- yield EmailAddress.new(email)
66
+ body.scan(Support::Text::Patterns::EMAIL_ADDRESS) do |email|
67
+ yield EmailAddress.new(email)
68
+ end
64
69
  end
65
70
  end
66
71
 
@@ -32,10 +32,14 @@ module Ronin
32
32
 
33
33
  register 'web/spider'
34
34
 
35
- summary 'Spiders a website'
35
+ summary 'Spiders a website and finds every URL'
36
36
 
37
37
  description <<~DESC
38
- Spiders a website and returns every URL.
38
+ Spiders a website and finds every URL.
39
+
40
+ * Visits every `a`, `iframe`, `frame`, `link`, and `script` URL.
41
+ * Extracts paths from JavaScript.
42
+ * Extracts URLs from JavaScript.
39
43
  DESC
40
44
 
41
45
  accepts Website
@@ -50,7 +50,7 @@ module Ronin
50
50
  # --worker-file FILE Loads a worker from a file
51
51
  # -p, --param WORKER.NAME=VALUE Sets a param for a worker
52
52
  # -c, --concurrency WORKER=NUM Sets the concurrency of a worker
53
- # --max-depth NUM The maximum recon depth (Default: 3)
53
+ # --max-depth NUM The maximum recon depth (Default: 10)
54
54
  # -o, --output FILE The output file to write results to
55
55
  # -I, --ignore VALUE The values to ignore in result
56
56
  # -F txt|list|csv|json|ndjson|dot|svg|png|pdf,
@@ -144,7 +144,7 @@ module Ronin
144
144
  option :max_depth, value: {
145
145
  type: Integer,
146
146
  usage: 'NUM',
147
- default: 3
147
+ default: 10
148
148
  },
149
149
  desc: 'The maximum recon depth'
150
150
 
@@ -226,7 +226,7 @@ module Ronin
226
226
 
227
227
  # The values that are out of scope.
228
228
  #
229
- # @return [Array<Values::Value>]
229
+ # @return [Array<Value>]
230
230
  attr_reader :ignore
231
231
 
232
232
  #
@@ -318,7 +318,7 @@ module Ronin
318
318
  # @param [String] value
319
319
  # The value to parse.
320
320
  #
321
- # @return [Values::Value]
321
+ # @return [Value]
322
322
  # The parsed value.
323
323
  #
324
324
  def parse_value(value)
@@ -393,7 +393,7 @@ module Ronin
393
393
  #
394
394
  # Imports a discovered value into ronin-db.
395
395
  #
396
- # @param [Values::Value] value
396
+ # @param [Value] value
397
397
  # A discovered recon value to import.
398
398
  #
399
399
  def import_value(value)
@@ -403,10 +403,10 @@ module Ronin
403
403
  #
404
404
  # Imports a connection between two values into ronin-db.
405
405
  #
406
- # @param [Values::Value] value
406
+ # @param [Value] value
407
407
  # A discovered recon value to import.
408
408
  #
409
- # @param [Values::Value] parent
409
+ # @param [Value] parent
410
410
  # The parent value of the discovered recon value.
411
411
  #
412
412
  def import_connection(value,parent)
@@ -54,7 +54,7 @@ module Ronin
54
54
  include Core::CLI::Logging
55
55
  include Core::CLI::Options::Param
56
56
 
57
- usage '[options] {IP | IP-range | DOMAIN | HOST | WILDCARD | WEBSITE}'
57
+ usage '[options] {--file FILE | NAME} {IP | IP-range | DOMAIN | HOST | WILDCARD | WEBSITE}'
58
58
 
59
59
  argument :value, required: true,
60
60
  usage: 'IP|IP-range|DOMAIN|HOST|WILDCARD|WEBSITE',
@@ -70,6 +70,9 @@ module Ronin
70
70
  # @param [String, nil] name
71
71
  # The optional worker name to load and print metadata for.
72
72
  #
73
+ # @param [String] value
74
+ # The input value for the worker.
75
+ #
73
76
  def run(name=nil,value)
74
77
  super(name)
75
78
 
@@ -33,17 +33,17 @@ module Ronin
33
33
  # Mapping of {Value} classes to printable names.
34
34
  VALUE_CLASS_NAMES = {
35
35
  Values::Domain => 'domain',
36
+ Values::Mailserver => 'mailserver',
37
+ Values::Nameserver => 'nameserver',
38
+ Values::Wildcard => 'wildcard host name',
36
39
  Values::Host => 'host',
37
40
  Values::IP => 'IP address',
38
41
  Values::IPRange => 'IP range',
39
- Values::Mailserver => 'mailserver',
40
- Values::Nameserver => 'nameserver',
41
42
  Values::OpenPort => 'open port',
42
43
  Values::Cert => 'SSL/TLS certificate',
43
- Values::EmailAddress => 'email addresse',
44
- Values::URL => 'URL',
45
44
  Values::Website => 'website',
46
- Values::Wildcard => 'wildcard host name'
45
+ Values::URL => 'URL',
46
+ Values::EmailAddress => 'email addresse'
47
47
  }
48
48
 
49
49
  #
@@ -66,7 +66,7 @@ module Ronin
66
66
  #
67
67
  # Formats a value object into a human readable string.
68
68
  #
69
- # @param [Values::Value] value
69
+ # @param [Value] value
70
70
  # The value object to format.
71
71
  #
72
72
  # @return [String]
@@ -77,17 +77,18 @@ module Ronin
77
77
  #
78
78
  def format_value(value)
79
79
  case value
80
- when Values::Domain then "domain #{value}"
81
- when Values::Mailserver then "mailserver #{value}"
82
- when Values::Nameserver then "nameserver #{value}"
83
- when Values::Host then "host #{value}"
84
- when Values::IP then "IP address #{value}"
85
- when Values::IPRange then "IP range #{value}"
86
- when Values::OpenPort then "open #{value.protocol.upcase} port #{value}"
87
- when Values::Cert then "SSL/TLS certificate #{value.subject}"
88
- when Values::URL then "URL #{value}"
89
- when Values::Website then "website #{value}"
90
- when Values::Wildcard then "wildcard host name #{value}"
80
+ when Values::Domain then "domain #{value}"
81
+ when Values::Mailserver then "mailserver #{value}"
82
+ when Values::Nameserver then "nameserver #{value}"
83
+ when Values::Wildcard then "wildcard host name #{value}"
84
+ when Values::Host then "host #{value}"
85
+ when Values::IP then "IP address #{value}"
86
+ when Values::IPRange then "IP range #{value}"
87
+ when Values::OpenPort then "open #{value.protocol.upcase} port #{value}"
88
+ when Values::Cert then "SSL/TLS certificate #{value.subject}"
89
+ when Values::Website then "website #{value}"
90
+ when Values::URL then "URL #{value}"
91
+ when Values::EmailAddress then "email address #{value}"
91
92
  else
92
93
  raise(NotImplementedError,"value class #{value.class} not supported")
93
94
  end
@@ -96,7 +97,7 @@ module Ronin
96
97
  #
97
98
  # Prints a newly discovered value.
98
99
  #
99
- # @param [Values::Value] value
100
+ # @param [Value] value
100
101
  # The value to print.
101
102
  #
102
103
  # @param [Value, nil] parent
@@ -72,6 +72,8 @@ module Ronin
72
72
 
73
73
  # The default workers configuration.
74
74
  DEFAULT = Set[
75
+ # NOTE: disabled due to rate limiting issues
76
+ # 'api/crt_sh',
75
77
  'dns/lookup',
76
78
  'dns/mailservers',
77
79
  'dns/nameservers',
@@ -84,8 +86,6 @@ module Ronin
84
86
  'net/service_id',
85
87
  'ssl/cert_grab',
86
88
  'ssl/cert_enum',
87
- # NOTE: disabled due to rate limiting issues
88
- # 'ssl/cert_sh',
89
89
  'web/dir_enum',
90
90
  'web/email_addresses',
91
91
  'web/spider'