cms_scanner 0.0.39.4 → 0.0.40

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 58b52cb634c4d75bf219bc8d20c80e5fee5c2c50
4
- data.tar.gz: e52cef2bc43b496dcecd1c62a0aa9c553491d5c2
3
+ metadata.gz: 9c4b37ccad3760d463de8eaebf2bd9dd3c11df74
4
+ data.tar.gz: e532f0a510747d99cebe122f00ffc209c90e4861
5
5
  SHA512:
6
- metadata.gz: 5ff2b8e58f3f41adc33d35b99966c27cd065eb1685f9c9dc2ff25fd9f8106d395b3d0dc2a9c268bf97caa14854b5ce84613ea647081c104012c9d3faaf188242
7
- data.tar.gz: 6185217fb45afbd258990731cc9b25ee3d91de3ceb6f130ba47ab93aec3d41518adc17f00175d950bfc2f6407b508147f5d0055dc7c5d5e850623d28949ca0d3
6
+ metadata.gz: 5fbb20fc97d62e99224db5142a05c35ab2092e41394759b87d1724a6acf4c832252de936f56f3f5da643e07ec4c3fd15a16fbeacbd3a6dd634995b8424654403
7
+ data.tar.gz: e92192374822ccecbee941488b0ec5cda5a92061f6b6fd6a9a9fe3c358d602d3de427e8d3ab602e26280bb0e599f094a82c468906b0f723b69ea85978c40b413
@@ -48,7 +48,8 @@ module CMSScanner
48
48
  OptPositiveInteger.new(['--request-timeout SECONDS', 'The request timeout in seconds'],
49
49
  default: 60),
50
50
  OptPositiveInteger.new(['--connect-timeout SECONDS', 'The connection timeout in seconds'],
51
- default: 30)
51
+ default: 30),
52
+ OptBoolean.new(['--disable-tls-checks', 'Disables SSL/TLS certificate verification'])
52
53
  ] + cli_browser_proxy_options + cli_browser_cookies_options + cli_browser_cache_options
53
54
  end
54
55
 
@@ -18,6 +18,7 @@ module CMSScanner
18
18
  url = target.homepage_res.headers['X-Pingback']
19
19
 
20
20
  return unless target.in_scope?(url)
21
+
21
22
  potential_urls << url
22
23
 
23
24
  NS::XMLRPC.new(url, confidence: 30, found_by: 'Headers (Passive Detection)')
@@ -29,6 +30,7 @@ module CMSScanner
29
30
  url = tag.attribute('href').to_s
30
31
 
31
32
  next unless target.in_scope?(url)
33
+
32
34
  potential_urls << url
33
35
 
34
36
  return NS::XMLRPC.new(url, confidence: 30,
data/app/models.rb CHANGED
@@ -4,3 +4,4 @@ require_relative 'models/fantastico_fileslist'
4
4
  require_relative 'models/headers'
5
5
  require_relative 'models/xml_rpc'
6
6
  require_relative 'models/version'
7
+ require_relative 'models/user'
@@ -5,6 +5,7 @@ module CMSScanner
5
5
  def entries
6
6
  res = NS::Browser.get(url)
7
7
  return [] unless res&.headers
8
+
8
9
  res.headers
9
10
  end
10
11
 
@@ -9,6 +9,7 @@ module CMSScanner
9
9
 
10
10
  entries.each do |entry|
11
11
  next unless entry =~ /\A(?:dis)?allow:\s*(.+)\z/i
12
+
12
13
  match = Regexp.last_match(1)
13
14
  next if match == '/'
14
15
 
@@ -0,0 +1,31 @@
1
+ module CMSScanner
2
+ # User
3
+ class User
4
+ include Finders::Finding
5
+
6
+ attr_accessor :password
7
+ attr_reader :id, :username
8
+
9
+ # @param [ String ] username
10
+ # @param [ Hash ] opts
11
+ # @option opts [ Integer ] :id
12
+ # @option opts [ String ] :password
13
+ def initialize(username, opts = {})
14
+ @username = username
15
+ @password = opts[:password]
16
+ @id = opts[:id]
17
+
18
+ parse_finding_options(opts)
19
+ end
20
+
21
+ def ==(other)
22
+ return false unless self.class == other.class
23
+
24
+ username == other.username
25
+ end
26
+
27
+ def to_s
28
+ username
29
+ end
30
+ end
31
+ end
@@ -1,35 +1,69 @@
1
1
  module CMSScanner
2
2
  # XML RPC
3
3
  class XMLRPC < InterestingFinding
4
- # @param [ String ] method
5
- # @param [ Array ] params
6
- # @param [ Hash ] request_params
7
- #
8
- # @return [ Typhoeus::Response ]
9
- def call(method, params = [], request_params = {})
10
- NS::Browser.post(url, request_params.merge(body: request_body(method, params)))
4
+ # @return [ Browser ]
5
+ def browser
6
+ @browser ||= NS::Browser.instance
11
7
  end
12
8
 
13
- # Might be better to use Nokogiri to create the XML body ?
14
- #
15
- # @param [ String ] method
16
- # @param [ Array ] params
17
- #
18
- # @return [ String ] The body of the XML RPC request
19
- def request_body(method, params = [])
20
- p_body = ''
9
+ # @return [ Array<String> ]
10
+ def available_methods
11
+ return @available_methods if @available_methods
21
12
 
22
- params.each { |p| p_body << "<param><value><string>#{p}</string></value></param>" }
13
+ @available_methods = []
14
+
15
+ res = method_call('system.listMethods').run
16
+ doc = Nokogiri::XML.parse(res.body)
17
+
18
+ doc.search('methodResponse params param value array data value string').each do |s|
19
+ @available_methods << s.text
20
+ end
21
+
22
+ @available_methods
23
+ end
23
24
 
24
- body = '<?xml version="1.0"?><methodCall>'
25
- body << "<methodName>#{method}</methodName>"
26
- body << "<params>#{p_body}</params>" unless p_body.length.zero?
27
- body << '</methodCall>'
25
+ # @return [ Boolean ] Whether or not the XMLRPC is enabled
26
+ def enabled?
27
+ !available_methods.empty?
28
28
  end
29
29
 
30
- # Use the system.listMethods to get the list of available methods ?
31
- # def entries
30
+ # @param [ String ] method_name
31
+ # @param [ Array ] method_params
32
+ # @param [ Hash ] request_params
32
33
  #
33
- # end
34
+ # @return [ Typhoeus::Request ]
35
+ def method_call(method_name, method_params = [], request_params = {})
36
+ browser.forge_request(
37
+ url,
38
+ request_params.merge(
39
+ method: :post,
40
+ body: ::XMLRPC::Create.new.methodCall(method_name, *method_params)
41
+ )
42
+ )
43
+ end
44
+
45
+ # @param [ Array<Array> ] methods_and_params
46
+ # @param [ Hash ] request_params
47
+ #
48
+ # Example of methods_and_params:
49
+ # [
50
+ # [method1, param1, param2],
51
+ # [method2, param1],
52
+ # [method3]
53
+ # ]
54
+ #
55
+ # @return [ Typhoeus::Request ]
56
+ def multi_call(methods_and_params = [], request_params = {})
57
+ browser.forge_request(
58
+ url,
59
+ request_params.merge(
60
+ method: :post,
61
+ body: ::XMLRPC::Create.new.methodCall(
62
+ 'system.multicall',
63
+ methods_and_params.collect { |m| { methodName: m[0], params: m[1..-1] } }
64
+ )
65
+ )
66
+ )
67
+ end
34
68
  end
35
69
  end
data/cms_scanner.gemspec CHANGED
@@ -32,23 +32,24 @@ Gem::Specification.new do |s|
32
32
  s.require_path = 'lib'
33
33
 
34
34
  s.add_dependency 'nokogiri', '~> 1.8.0'
35
- s.add_dependency 'opt_parse_validator', '~> 0.0.16.1'
35
+ s.add_dependency 'opt_parse_validator', '~> 0.0.16.2'
36
36
  s.add_dependency 'public_suffix', '~> 3.0.0'
37
- s.add_dependency 'ruby-progressbar', '~> 1.9.0'
37
+ s.add_dependency 'ruby-progressbar', '~> 1.10.0'
38
38
  s.add_dependency 'typhoeus', '~> 1.3.0'
39
- s.add_dependency 'yajl-ruby', '~> 1.3.0' # Better JSON parser regarding memory usage
39
+ s.add_dependency 'xmlrpc', '~> 0.3'
40
+ s.add_dependency 'yajl-ruby', '~> 1.4.1' # Better JSON parser regarding memory usage
40
41
 
41
42
  # Already required by opt_parse_validator
42
43
  # so version restriction loosen to avoid potential future conflicts
43
- s.add_dependency 'activesupport', '~> 5.1'
44
+ s.add_dependency 'activesupport', '~> 5.2'
44
45
  s.add_dependency 'addressable', '~> 2.5'
45
46
 
46
47
  s.add_development_dependency 'bundler', '~> 1.6'
47
48
  s.add_development_dependency 'coveralls', '~> 0.8.0'
48
- s.add_development_dependency 'rake', '~> 12.0'
49
- s.add_development_dependency 'rspec', '~> 3.7.0'
49
+ s.add_development_dependency 'rake', '~> 12.3'
50
+ s.add_development_dependency 'rspec', '~> 3.8.0'
50
51
  s.add_development_dependency 'rspec-its', '~> 1.2.0'
51
- s.add_development_dependency 'rubocop', '~> 0.57.2'
52
- s.add_development_dependency 'simplecov', '~> 0.14.0' # Can't update to 0.15 as it breaks coveralls dep
53
- s.add_development_dependency 'webmock', '~> 3.3.0'
52
+ s.add_development_dependency 'rubocop', '~> 0.59.1'
53
+ s.add_development_dependency 'simplecov', '~> 0.16.1'
54
+ s.add_development_dependency 'webmock', '~> 3.4.2'
54
55
  end
data/lib/cms_scanner.rb CHANGED
@@ -5,7 +5,6 @@ require 'yajl/json_gem'
5
5
  require 'public_suffix'
6
6
  require 'addressable/uri'
7
7
  require 'ruby-progressbar'
8
- require 'ruby-progressbar/outputs/null'
9
8
  require 'opt_parse_validator'
10
9
  require 'active_support/concern'
11
10
  require 'active_support/inflector'
@@ -14,11 +13,13 @@ require 'erb'
14
13
  require 'uri'
15
14
  require 'fileutils'
16
15
  require 'pathname'
16
+ require 'xmlrpc/client'
17
17
  # Monkey Patches
18
- require 'cms_scanner/typhoeus/response'
19
- require 'cms_scanner/typhoeus/hydra'
20
- require 'cms_scanner/public_suffix/domain'
21
- require 'cms_scanner/numeric'
18
+ require 'cms_scanner/typhoeus/response' # Adds a Response#html using Nokogiri to parse the body
19
+ require 'cms_scanner/typhoeus/hydra' # https://github.com/typhoeus/typhoeus/issues/439
20
+ require 'cms_scanner/public_suffix/domain' # Adds a Domain#match method and logic, used in scope stuff
21
+ require 'cms_scanner/numeric' # Adds a Numeric#bytes_to_human
22
+ require 'cms_scanner/progressbar_null_output'
22
23
  # Custom Libs
23
24
  require 'cms_scanner/helper'
24
25
  require 'cms_scanner/exit_code'
@@ -46,13 +46,17 @@ module CMSScanner
46
46
  # @return [ Hash ]
47
47
  def default_request_params
48
48
  params = {
49
- # Disable SSL-Certificate checks, see http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html
50
- ssl_verifypeer: false, ssl_verifyhost: 0,
51
49
  headers: { 'User-Agent' => user_agent }.merge(headers || {}),
52
50
  accept_encoding: 'gzip, deflate',
53
51
  method: :get
54
52
  }
55
53
 
54
+ if disable_tls_checks
55
+ # See http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html
56
+ params[:ssl_verifypeer] = false
57
+ params[:ssl_verifyhost] = 0
58
+ end
59
+
56
60
  typhoeus_to_browser_opts.each do |typhoeus_opt, browser_opt|
57
61
  attr_value = public_send(browser_opt)
58
62
  params[typhoeus_opt] = attr_value unless attr_value.nil?
@@ -6,6 +6,7 @@ module CMSScanner
6
6
  cookie_jar
7
7
  cookie_string
8
8
  connect_timeout
9
+ disable_tls_checks
9
10
  headers
10
11
  http_auth
11
12
  max_threads
@@ -62,6 +63,7 @@ module CMSScanner
62
63
 
63
64
  File.open(user_agents_list).each do |line|
64
65
  next if line == "\n" || line[0, 1] == '#'
66
+
65
67
  @user_agents << line.chomp
66
68
  end
67
69
 
@@ -18,6 +18,7 @@ module CMSScanner
18
18
  symbols = %i[passive aggressive]
19
19
 
20
20
  return symbols if mode.nil? || mode == :mixed
21
+
21
22
  symbols.include?(mode) ? [*mode] : []
22
23
  end
23
24
 
@@ -1,6 +1,7 @@
1
1
  require 'cms_scanner/finders/finder/smart_url_checker'
2
2
  require 'cms_scanner/finders/finder/enumerator'
3
3
  require 'cms_scanner/finders/finder/fingerprinter'
4
+ require 'cms_scanner/finders/finder/breadth_first_dictionary_attack'
4
5
 
5
6
  module CMSScanner
6
7
  module Finders
@@ -32,9 +33,9 @@ module CMSScanner
32
33
  # @return [ ProgressBar::Base ]
33
34
  def create_progress_bar(opts = {})
34
35
  bar_opts = { format: '%t %a <%B> (%c / %C) %P%% %e' }
35
- bar_opts[:output] = ProgressBar::Outputs::Null unless opts[:show_progression]
36
+ bar_opts[:output] = ProgressBarNullOutput unless opts[:show_progression]
36
37
 
37
- @progress_bar = ProgressBar.create(bar_opts.merge(opts))
38
+ @progress_bar = ::ProgressBar.create(bar_opts.merge(opts))
38
39
  end
39
40
 
40
41
  # @return [ Browser ]
@@ -0,0 +1,102 @@
1
+ module CMSScanner
2
+ module Finders
3
+ class Finder
4
+ # Module to provide an easy way to perform password attacks
5
+ module BreadthFirstDictionaryAttack
6
+ # @param [ Array<CMSScanner::User> ] users
7
+ # @param [ Array<String> ] passwords
8
+ # @param [ Hash ] opts
9
+ # @option opts [ Boolean ] :show_progression
10
+ #
11
+ # @yield [ CMSScanner::User ] When a valid combination is found
12
+ #
13
+ # TODO: Make rubocop happy about metrics etc
14
+ #
15
+ # rubocop:disable all
16
+ def attack(users, passwords, opts = {})
17
+ create_progress_bar(total: users.size * passwords.size, show_progression: opts[:show_progression])
18
+ queue_count = 0
19
+
20
+ passwords.each_with_index do |password, password_index|
21
+ remaining_users = users.select { |u| u.password.nil? }
22
+
23
+ break if remaining_users.empty?
24
+
25
+ remaining_users.each do |user|
26
+ request = login_request(user.username, password)
27
+
28
+ request.on_complete do |res|
29
+ progress_bar.title = "Trying #{user.username} / #{password}"
30
+ progress_bar.increment
31
+
32
+ if valid_credentials?(res)
33
+ user.password = password
34
+
35
+ yield user
36
+
37
+ offset = progress_bar.total - progress_bar.progress < hydra.max_concurrency ? 2 : 1
38
+
39
+ progress_bar.total -= passwords.size - password_index - offset
40
+ elsif errored_response?(res)
41
+ output_error(res)
42
+ end
43
+ end
44
+
45
+ hydra.queue(request)
46
+ queue_count += 1
47
+
48
+ if queue_count >= hydra.max_concurrency
49
+ hydra.run
50
+ queue_count = 0
51
+ end
52
+ end
53
+ end
54
+
55
+ hydra.run
56
+ progress_bar.stop
57
+ end
58
+ # rubocop:enable all
59
+
60
+ # @param [ String ] username
61
+ # param [ String ] password
62
+ #
63
+ # @return [ Typhoeus::Request ]
64
+ def login_request(username, password)
65
+ # To Implement in the finder related to the attack
66
+ end
67
+
68
+ # @param [ Typhoeus::Response ] response
69
+ #
70
+ # @return [ Boolean ] Whether or not credentials related to the request are valid
71
+ def valid_credentials?(response)
72
+ # To Implement in the finder related to the attack
73
+ end
74
+
75
+ # @param [ Typhoeus::Response ] response
76
+ #
77
+ # @return [ Boolean ] Whether or not something wrong happened
78
+ # other than wrong credentials
79
+ def errored_response?(response)
80
+ # To Implement in the finder related to the attack
81
+ end
82
+
83
+ protected
84
+
85
+ # @param [ Typhoeus::Response ] response
86
+ def output_error(response)
87
+ error = if response.timed_out?
88
+ 'Request timed out.'
89
+ elsif response.code.zero?
90
+ "No response from remote server. WAF/IPS? (#{response.return_message})"
91
+ elsif response.code.to_s =~ /^50/
92
+ 'Server error, try reducing the number of threads.'
93
+ else
94
+ "Unknown response received Code: #{response.code}\nBody: #{response.body}"
95
+ end
96
+
97
+ progress_bar.log("Error: #{error}")
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -111,6 +111,7 @@ module CMSScanner
111
111
  tpl = tpl.delete('@')
112
112
  else
113
113
  raise 'The controller_name can not be nil' unless controller_name
114
+
114
115
  tpl = "#{controller_name}/#{tpl}"
115
116
  end
116
117
 
@@ -0,0 +1,21 @@
1
+ require 'ruby-progressbar/outputs/null'
2
+
3
+ module CMSScanner
4
+ # Adds the feature to log message sent to #log
5
+ # So they can be retrieved at some point, like after a password attack with a JSON output
6
+ # which won't display the progressbar but still call #log for errors etc
7
+ class ProgressBarNullOutput < ::ProgressBar::Outputs::Null
8
+ # @retutn [ Array<String> ]
9
+ def logs
10
+ @logs ||= []
11
+ end
12
+
13
+ # Override of parent method
14
+ # @return [ Array<String> ] return the logs when no string provided
15
+ def log(string = nil)
16
+ return logs if string.nil?
17
+
18
+ logs << string
19
+ end
20
+ end
21
+ end
@@ -80,36 +80,33 @@ module CMSScanner
80
80
 
81
81
  # @param [ Typhoeus::Response, String ] page
82
82
  # @param [ String ] xpath
83
- # @param [ Array<String> ] attributes
84
83
  #
85
84
  # @yield [ String, Nokogiri::XML::Element ] The url and its associated tag
86
85
  #
87
86
  # @return [ Array<String> ] The absolute URLs detected in the response's body from the HTML tags
88
- def urls_from_page(page = nil, xpath = '//link|//script|//style|//img|//a', attributes = %w[href src])
87
+ def urls_from_page(page = nil, xpath = '//@href|//@src|//@data-src')
89
88
  page = NS::Browser.get(url(page)) unless page.is_a?(Typhoeus::Response)
90
89
  found = []
91
90
 
92
- page.html.xpath(xpath).each do |tag|
93
- attributes.each do |attribute|
94
- attr_value = tag[attribute]
91
+ page.html.xpath(xpath).each do |node|
92
+ attr_value = node.text.to_s
95
93
 
96
- next unless attr_value && !attr_value.empty?
94
+ next unless attr_value && !attr_value.empty?
97
95
 
98
- tag_uri = begin
99
- uri.join(attr_value.strip)
100
- rescue StandardError
101
- # Skip potential malformed URLs etc.
102
- next
103
- end
96
+ node_uri = begin
97
+ uri.join(attr_value.strip)
98
+ rescue StandardError
99
+ # Skip potential malformed URLs etc.
100
+ next
101
+ end
104
102
 
105
- tag_uri_string = tag_uri.to_s
103
+ node_uri_string = node_uri.to_s
106
104
 
107
- next unless tag_uri.host
105
+ next unless node_uri.host
108
106
 
109
- yield tag_uri_string, tag if block_given? && !found.include?(tag_uri_string)
107
+ yield node_uri_string, node.parent if block_given? && !found.include?(node_uri_string)
110
108
 
111
- found << tag_uri_string
112
- end
109
+ found << node_uri_string
113
110
  end
114
111
 
115
112
  found.uniq
@@ -38,7 +38,7 @@ module CMSScanner
38
38
  def homepage_or_404?(page)
39
39
  md5sum = self.class.page_hash(page)
40
40
 
41
- md5sum == homepage_hash || md5sum == error_404_hash
41
+ [homepage_hash, error_404_hash].include?(md5sum)
42
42
  end
43
43
  end
44
44
  end
@@ -17,15 +17,14 @@ module CMSScanner
17
17
 
18
18
  # @param [ Typhoeus::Response ] res
19
19
  # @param [ String ] xpath
20
- # @param [ Array<String> ] attributes
21
20
  #
22
21
  # @yield [ String, Nokogiri::XML::Element ] The in scope url and its associated tag
23
22
  #
24
23
  # @return [ Array<String> ] The in scope absolute URLs detected in the response's body
25
- def in_scope_urls(res, xpath = '//link|//script|//style|//img|//a', attributes = %w[href src])
24
+ def in_scope_urls(res, xpath = '//@href|//@src|//@data-src')
26
25
  found = []
27
26
 
28
- urls_from_page(res, xpath, attributes) do |url, tag|
27
+ urls_from_page(res, xpath) do |url, tag|
29
28
  next unless in_scope?(url)
30
29
 
31
30
  yield url, tag if block_given?
@@ -61,6 +61,7 @@ module CMSScanner
61
61
  entry = node.text.to_s
62
62
 
63
63
  next if entry =~ ignore
64
+
64
65
  found << entry
65
66
  end
66
67
 
@@ -1,9 +1,14 @@
1
1
  module Typhoeus
2
2
  # Custom Response class
3
3
  class Response
4
- # @return [ Nokogiri::HTML ] The response's body parsed by Nokogiri
4
+ # @return [ Nokogiri::HTML ] The response's body parsed by Nokogiri::HTML
5
5
  def html
6
6
  @html ||= Nokogiri::HTML(body.encode('UTF-8', invalid: :replace, undef: :replace))
7
7
  end
8
+
9
+ # @return [ Nokogiri::XML ] The response's body parsed by Nokogiri::XML
10
+ def xml
11
+ @xml ||= Nokogiri::XML(body.encode('UTF-8', invalid: :replace, undef: :replace))
12
+ end
8
13
  end
9
14
  end
@@ -1,4 +1,4 @@
1
1
  # Version
2
2
  module CMSScanner
3
- VERSION = '0.0.39.4'.freeze
3
+ VERSION = '0.0.40'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cms_scanner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.39.4
4
+ version: 0.0.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - WPScanTeam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-20 00:00:00.000000000 Z
11
+ date: 2018-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.16.1
33
+ version: 0.0.16.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.16.1
40
+ version: 0.0.16.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: public_suffix
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.9.0
61
+ version: 1.10.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.9.0
68
+ version: 1.10.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: typhoeus
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,34 +80,48 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.3.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: xmlrpc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.3'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.3'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: yajl-ruby
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 1.3.0
103
+ version: 1.4.1
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 1.3.0
110
+ version: 1.4.1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: activesupport
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '5.1'
117
+ version: '5.2'
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '5.1'
124
+ version: '5.2'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: addressable
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -156,28 +170,28 @@ dependencies:
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: '12.0'
173
+ version: '12.3'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
178
  - - "~>"
165
179
  - !ruby/object:Gem::Version
166
- version: '12.0'
180
+ version: '12.3'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: rspec
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: 3.7.0
187
+ version: 3.8.0
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: 3.7.0
194
+ version: 3.8.0
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: rspec-its
183
197
  requirement: !ruby/object:Gem::Requirement
@@ -198,42 +212,42 @@ dependencies:
198
212
  requirements:
199
213
  - - "~>"
200
214
  - !ruby/object:Gem::Version
201
- version: 0.57.2
215
+ version: 0.59.1
202
216
  type: :development
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
- version: 0.57.2
222
+ version: 0.59.1
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: simplecov
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
227
  - - "~>"
214
228
  - !ruby/object:Gem::Version
215
- version: 0.14.0
229
+ version: 0.16.1
216
230
  type: :development
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
234
  - - "~>"
221
235
  - !ruby/object:Gem::Version
222
- version: 0.14.0
236
+ version: 0.16.1
223
237
  - !ruby/object:Gem::Dependency
224
238
  name: webmock
225
239
  requirement: !ruby/object:Gem::Requirement
226
240
  requirements:
227
241
  - - "~>"
228
242
  - !ruby/object:Gem::Version
229
- version: 3.3.0
243
+ version: 3.4.2
230
244
  type: :development
231
245
  prerelease: false
232
246
  version_requirements: !ruby/object:Gem::Requirement
233
247
  requirements:
234
248
  - - "~>"
235
249
  - !ruby/object:Gem::Version
236
- version: 3.3.0
250
+ version: 3.4.2
237
251
  description: Framework to provide an easy way to implement CMS Scanners
238
252
  email:
239
253
  - team@wpscan.org
@@ -265,6 +279,7 @@ files:
265
279
  - app/models/headers.rb
266
280
  - app/models/interesting_finding.rb
267
281
  - app/models/robots_txt.rb
282
+ - app/models/user.rb
268
283
  - app/models/version.rb
269
284
  - app/models/xml_rpc.rb
270
285
  - app/user_agents.txt
@@ -317,6 +332,7 @@ files:
317
332
  - lib/cms_scanner/finders.rb
318
333
  - lib/cms_scanner/finders/base_finders.rb
319
334
  - lib/cms_scanner/finders/finder.rb
335
+ - lib/cms_scanner/finders/finder/breadth_first_dictionary_attack.rb
320
336
  - lib/cms_scanner/finders/finder/enumerator.rb
321
337
  - lib/cms_scanner/finders/finder/fingerprinter.rb
322
338
  - lib/cms_scanner/finders/finder/smart_url_checker.rb
@@ -333,6 +349,7 @@ files:
333
349
  - lib/cms_scanner/formatter/buffer.rb
334
350
  - lib/cms_scanner/helper.rb
335
351
  - lib/cms_scanner/numeric.rb
352
+ - lib/cms_scanner/progressbar_null_output.rb
336
353
  - lib/cms_scanner/public_suffix/domain.rb
337
354
  - lib/cms_scanner/references.rb
338
355
  - lib/cms_scanner/target.rb