cms_scanner 0.0.37.4 → 0.0.37.5

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: e04805ab5723d3ae5e801aa89a44ba26ace6d5ae
4
- data.tar.gz: 3ac81f2e34eb15b2e84425dcb0d4ca4660f4943e
3
+ metadata.gz: 47d1a0b7f0276e308175ef18ae1b81b82adce2ab
4
+ data.tar.gz: a4ea66a54e4ff800caf8f00347fe57074a2ae0eb
5
5
  SHA512:
6
- metadata.gz: 9ebcc6de35ad7dae9fe5493934b9af944fd97585ce82d34a5fe542c19475990797f5f78cdd6168b0140f11ac1848df005df598be14b387fd8290ede6b2b2871b
7
- data.tar.gz: 8a23c4cdd05345e60f629858b5988490fb60c52e9f448a6349c94b4d7e9ef754c1560139e70a1286e01ffc1f7484e7e440a4f416b2169ec25f4d8534bbc864d2
6
+ metadata.gz: 1462e16abe07489a5a018b7e3190838c24053ac1a2ce77346d865e179c7eb273b6d2e0360f9721a62a143f9cc579ecd3499bfbec4fd7ba68ffc52c6158cb362e
7
+ data.tar.gz: 052528fc8276c8d4396e7a833164047cf67978d7c10d794b1e7f12fc91faf9053dbbba4cf4aa9d26a5431d9e32b2ea47be91d7f9b78d775e9758ab7acac0c8b0
data/README.md CHANGED
@@ -9,6 +9,12 @@ The goal of this gem is to provide a quick and easy way to create a CMS/WebSite
9
9
 
10
10
  ## /!\ This gem is currently Experimental /!\
11
11
 
12
+ ## A basic implementation example is available in the example folder.
13
+
14
+ To start to play with it, copy all its files and folders into a new git repository and run ```bundle install && rake install`` inside it.
15
+ It will create a ```cmsscan``` command that you can run against a target, ie ```cmsscan --url https://www.google.com```
16
+
17
+
12
18
  Install Dependencies: ```bundle install```
13
19
 
14
20
  ## Contributing
@@ -27,16 +27,17 @@ Gem::Specification.new do |s|
27
27
  |\.travis.yml
28
28
  )$}x
29
29
  end
30
+
30
31
  s.test_files = []
31
32
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
32
33
  s.require_path = 'lib'
33
34
 
34
35
  s.add_dependency 'typhoeus', '~> 1.1.0'
35
36
  s.add_dependency 'nokogiri', '~> 1.6.8.1'
36
- s.add_dependency 'yajl-ruby', '~> 1.2.1' # Better JSON parser regarding memory usage
37
- s.add_dependency 'addressable', '~> 2.4.0'
37
+ s.add_dependency 'yajl-ruby', '~> 1.3.0' # Better JSON parser regarding memory usage
38
+ s.add_dependency 'addressable', '~> 2.5.0'
38
39
  s.add_dependency 'activesupport', '~> 5.0.0.1'
39
- s.add_dependency 'public_suffix', '~> 1.5'
40
+ s.add_dependency 'public_suffix', '~> 2.0.3' # Need to look at changes in the v2
40
41
  s.add_dependency 'ruby-progressbar', '~> 1.8.1'
41
42
  s.add_dependency 'opt_parse_validator', '~> 0.0.13.3'
42
43
 
@@ -44,7 +45,7 @@ Gem::Specification.new do |s|
44
45
  s.add_development_dependency 'rspec', '~> 3.5.0'
45
46
  s.add_development_dependency 'rspec-its', '~> 1.2.0'
46
47
  s.add_development_dependency 'bundler', '~> 1.6'
47
- s.add_development_dependency 'rubocop', '~> 0.43.0'
48
- s.add_development_dependency 'webmock', '~> 1.22'
48
+ s.add_development_dependency 'rubocop', '~> 0.45.0'
49
+ s.add_development_dependency 'webmock', '~> 1.22.0'
49
50
  s.add_development_dependency 'simplecov', '~> 0.12.0'
50
51
  end
@@ -0,0 +1,13 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ pkg
7
+ rdoc
8
+ Gemfile.lock
9
+
10
+ # YARD artifacts
11
+ .yardoc
12
+ _yardoc
13
+ doc/
@@ -0,0 +1,2 @@
1
+ --color
2
+ --fail-fast
@@ -0,0 +1,20 @@
1
+ AllCops:
2
+ Exclude:
3
+ - '*.gemspec'
4
+ - 'vendor/**/*'
5
+ LineLength:
6
+ Max: 120
7
+ ClassVars:
8
+ Enabled: false
9
+ Style/RescueModifier:
10
+ Enabled: false
11
+ Style/SignalException:
12
+ EnforcedStyle: semantic
13
+ MethodLength:
14
+ Max: 17
15
+ Metrics/AbcSize:
16
+ Max: 25
17
+ Metrics/CyclomaticComplexity:
18
+ Max: 10
19
+ Metrics/PerceivedComplexity:
20
+ Max: 9
@@ -0,0 +1,25 @@
1
+ # Not setup yet
2
+ language: ruby
3
+ sudo: false
4
+ cache: bundler
5
+ rvm:
6
+ - 2.1.0
7
+ - 2.1.1
8
+ - 2.1.2
9
+ - 2.1.3
10
+ - 2.1.4
11
+ - 2.1.5
12
+ - 2.1.6
13
+ - 2.2.0
14
+ - 2.2.1
15
+ - 2.2.2
16
+ - 2.2.3
17
+ - ruby-head
18
+ before_install:
19
+ - "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
20
+ matrix:
21
+ allow_failures:
22
+ - rvm: ruby-head
23
+ script:
24
+ - bundle exec rspec
25
+ - bundle exec rubocop
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :test do
5
+ gem 'coveralls', '~> 0.8.0', require: false
6
+ end
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+
5
+ RuboCop::RakeTask.new
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ # Run rubocop & rspec before the build
9
+ task build: [:rubocop, :spec]
@@ -0,0 +1 @@
1
+ require_relative 'controllers'
@@ -0,0 +1 @@
1
+ require_relative 'controllers/example'
@@ -0,0 +1,36 @@
1
+ module CMSScan
2
+ module Controller
3
+ # Example Controller
4
+ class Example < CMSScanner::Controller::Core
5
+ # @return [ Array<OptParseValidator::Opt> ]
6
+ def cli_options
7
+ [
8
+ OptString.new(['--dummy VALUE', 'Dummy CLI Option'])
9
+ ]
10
+ end
11
+
12
+ def before_scan
13
+ # Anything to do before ?
14
+ end
15
+
16
+ def run
17
+ # Let's check and display whether or not the word 'scan' is present in the homepage of the target
18
+
19
+ is_present = target.homepage_res.body =~ /scan/ ? true : false
20
+
21
+ output('scan_word', is_present: is_present)
22
+ end
23
+
24
+ # Alternative way of doing it
25
+ def run2
26
+ @is_present = Browser.get(target.homepage_url).body =~ /scan/ ? true : false
27
+
28
+ output('scan_word')
29
+ end
30
+
31
+ def after_scan
32
+ # Anything after ?
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+
2
+ CMS Scanner Example <%= CMSScan::VERSION %>
3
+
@@ -0,0 +1,5 @@
1
+ <% if @is_present -%>
2
+ <%= warning_icon %> The word 'scan' is present in the homepage
3
+ <% else -%>
4
+ <%= notice_icon %> The word 'scan' was not detected in the homepage
5
+ <% end %>
@@ -0,0 +1,3 @@
1
+ "banner": {
2
+ "version": <%= CMSScan::VERSION.to_json %>
3
+ },
@@ -0,0 +1 @@
1
+ "scan_word_present": <%= @is_present.to_json %>,
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cmsscan'
4
+
5
+ CMSScan::Scan.new do |s|
6
+ s.controllers << CMSScan::Controller::Example.new
7
+
8
+ s.run
9
+ end
@@ -0,0 +1,52 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'cmsscan/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'cmsscan'
9
+ s.version = CMSScan::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.required_ruby_version = '>= 2.1.0'
12
+ s.authors = ['WPScanTeam']
13
+ s.date = Time.now.utc.strftime('%Y-%m-%d')
14
+ s.email = ['team@wpscan.org']
15
+ s.summary = 'CMSScan Gem Example'
16
+ s.description = 'CMSScanner Implementation Example'
17
+ s.homepage = 'https://github.com/wpscanteam/CMSScanner'
18
+ s.license = 'MIT'
19
+
20
+ s.files = `git ls-files -z`.split("\x0").reject do |file|
21
+ file =~ %r{^(?:
22
+ spec\/.*
23
+ |Gemfile
24
+ |Rakefile
25
+ |\.rspec
26
+ |\.gitignore
27
+ |\.rubocop.yml
28
+ |\.travis.yml
29
+ )$}x
30
+ end
31
+
32
+ s.test_files = []
33
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
34
+ s.require_path = 'lib'
35
+
36
+ s.add_dependency 'yajl-ruby', '~> 1.3.0' # Better JSON parser regarding memory usage
37
+ s.add_dependency 'cms_scanner', '~> 0.0.37.5'
38
+ s.add_dependency 'activesupport', '~> 5.0.0.1' # Not sure if needed there as already needed in the CMSScanner
39
+ # DB dependencies
40
+ s.add_dependency 'dm-core', '~> 1.2.0'
41
+ s.add_dependency 'dm-migrations', '~> 1.2.0'
42
+ s.add_dependency 'dm-constraints', '~> 1.2.0'
43
+ s.add_dependency 'dm-sqlite-adapter', '~> 1.2.0'
44
+
45
+ s.add_development_dependency 'rake', '~> 11.3.0'
46
+ s.add_development_dependency 'rspec', '~> 3.5.0'
47
+ s.add_development_dependency 'rspec-its', '~> 1.2.0'
48
+ s.add_development_dependency 'bundler', '~> 1.6'
49
+ s.add_development_dependency 'rubocop', '~> 0.45.0'
50
+ s.add_development_dependency 'webmock', '~> 1.22.0'
51
+ s.add_development_dependency 'simplecov', '~> 0.12.0'
52
+ end
@@ -0,0 +1,35 @@
1
+ # Gems
2
+ require 'cms_scanner'
3
+ require 'yajl/json_gem'
4
+ require 'addressable/uri'
5
+ require 'active_support/all'
6
+ # Standard Lib
7
+ require 'uri'
8
+ require 'time'
9
+ require 'readline'
10
+ require 'securerandom'
11
+ # Custom Libs
12
+ require 'cmsscan/target'
13
+ require 'cmsscan/version'
14
+ require 'cmsscan/controller'
15
+
16
+ Encoding.default_external = Encoding::UTF_8
17
+
18
+ # CMSScan
19
+ module CMSScan
20
+ include CMSScanner
21
+
22
+ APP_DIR = Pathname.new(__FILE__).dirname.join('..', 'app').expand_path
23
+ # Not needed in this example
24
+ # DB_DIR = File.join(Dir.home, '.cmsscan', 'db')
25
+
26
+ # Override, otherwise it would be returned as 'cms_scan'
27
+ # doesn't really matter in this example.
28
+ #
29
+ # @return [ String ]
30
+ def self.app_name
31
+ 'cmsscan'
32
+ end
33
+ end
34
+
35
+ require "#{CMSScan::APP_DIR}/app"
@@ -0,0 +1,8 @@
1
+ module CMSScan
2
+ # Needed to load at least the Core controller
3
+ # Otherwise, the following error will be raised:
4
+ # `initialize': uninitialized constant CMSScan::Controller::Core (NameError)
5
+ module Controller
6
+ include CMSScanner::Controller
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module CMSScan
2
+ # Custom Target Class
3
+ class Target < CMSScanner::Target
4
+ # Put your own methods there
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ # Version
2
+ module CMSScan
3
+ VERSION = '1.0'.freeze
4
+ end
@@ -40,6 +40,8 @@ module CMSScanner
40
40
 
41
41
  each(&:before_scan)
42
42
  each(&:run)
43
+ # Reverse is used here as the app/controllers/core#after_scan finishes the output
44
+ # and must be the last one to be executed
43
45
  reverse_each(&:after_scan)
44
46
  end
45
47
  end
@@ -131,7 +131,7 @@ module CMSScanner
131
131
  @views_directories ||= [
132
132
  APP_DIR, NS::APP_DIR,
133
133
  File.join(Dir.home, ".#{NS.app_name}"), File.join(Dir.pwd, ".#{NS.app_name}")
134
- ].uniq.reduce([]) { |a, e| a << Pathname.new(e).join('views').to_s }
134
+ ].uniq.reduce([]) { |acc, elem| acc << Pathname.new(elem).join('views').to_s }
135
135
  end
136
136
  end
137
137
  end
@@ -3,7 +3,7 @@ class Numeric
3
3
  # @return [ String ] A human readable string of the value
4
4
  def bytes_to_human
5
5
  units = %w(B KB MB GB TB)
6
- e = (Math.log(abs) / Math.log(1024)).floor
6
+ e = abs.zero? ? abs : (Math.log(abs) / Math.log(1024)).floor
7
7
  s = format('%.3f', (abs.to_f / 1024**e))
8
8
 
9
9
  s.sub(/\.?0*$/, ' ' + units[e])
@@ -38,7 +38,7 @@ module CMSScanner
38
38
 
39
39
  # @return [ Array<String> ]
40
40
  def cve_urls
41
- cves.reduce([]) { |a, e| a << cve_url(e) }
41
+ cves.reduce([]) { |acc, elem| acc << cve_url(elem) }
42
42
  end
43
43
 
44
44
  # @return [ String ] The URL to the CVE
@@ -53,7 +53,7 @@ module CMSScanner
53
53
 
54
54
  # @return [ Array<String> ]
55
55
  def secunia_urls
56
- secunia_ids.reduce([]) { |a, e| a << secunia_url(e) }
56
+ secunia_ids.reduce([]) { |acc, elem| acc << secunia_url(elem) }
57
57
  end
58
58
 
59
59
  # @return [ String ] The URL to the Secunia advisory
@@ -68,7 +68,7 @@ module CMSScanner
68
68
 
69
69
  # @return [ Array<String> ]
70
70
  def osvdb_urls
71
- osvdb_ids.reduce([]) { |a, e| a << osvdb_url(e) }
71
+ osvdb_ids.reduce([]) { |acc, elem| acc << osvdb_url(elem) }
72
72
  end
73
73
 
74
74
  # @return [ String ] The URL to the ExploitDB advisory
@@ -83,7 +83,7 @@ module CMSScanner
83
83
 
84
84
  # @return [ Array<String> ]
85
85
  def exploitdb_urls
86
- exploitdb_ids.reduce([]) { |a, e| a << exploitdb_url(e) }
86
+ exploitdb_ids.reduce([]) { |acc, elem| acc << exploitdb_url(elem) }
87
87
  end
88
88
 
89
89
  # @return [ String ]
@@ -103,7 +103,7 @@ module CMSScanner
103
103
 
104
104
  # @return [ Array<String> ]
105
105
  def msf_urls
106
- msf_modules.reduce([]) { |a, e| a << msf_url(e) }
106
+ msf_modules.reduce([]) { |acc, elem| acc << msf_url(elem) }
107
107
  end
108
108
 
109
109
  # @return [ String ] The URL to the metasploit module page
@@ -118,7 +118,7 @@ module CMSScanner
118
118
 
119
119
  # @return [ Array<String> ]
120
120
  def packetstorm_urls
121
- packetstorm_ids.reduce([]) { |a, e| a << packetstorm_url(e) }
121
+ packetstorm_ids.reduce([]) { |acc, elem| acc << packetstorm_url(elem) }
122
122
  end
123
123
 
124
124
  # @return [ String ]
@@ -133,7 +133,7 @@ module CMSScanner
133
133
 
134
134
  # @return [ Array<String> ]
135
135
  def securityfocus_urls
136
- securityfocus_ids.reduce([]) { |a, e| a << securityfocus_url(e) }
136
+ securityfocus_ids.reduce([]) { |acc, elem| acc << securityfocus_url(elem) }
137
137
  end
138
138
 
139
139
  # @return [ String ]
@@ -1,4 +1,4 @@
1
1
  # Version
2
2
  module CMSScanner
3
- VERSION = '0.0.37.4'.freeze
3
+ VERSION = '0.0.37.5'.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.37.4
4
+ version: 0.0.37.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - WPScanTeam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-05 00:00:00.000000000 Z
11
+ date: 2016-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.2.1
47
+ version: 1.3.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.2.1
54
+ version: 1.3.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: addressable
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.4.0
61
+ version: 2.5.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: 2.4.0
68
+ version: 2.5.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activesupport
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.5'
89
+ version: 2.0.3
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.5'
96
+ version: 2.0.3
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: ruby-progressbar
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -184,28 +184,28 @@ dependencies:
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: 0.43.0
187
+ version: 0.45.0
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: 0.43.0
194
+ version: 0.45.0
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: webmock
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: '1.22'
201
+ version: 1.22.0
202
202
  type: :development
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: '1.22'
208
+ version: 1.22.0
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: simplecov
211
211
  requirement: !ruby/object:Gem::Requirement
@@ -266,6 +266,25 @@ files:
266
266
  - app/views/json/interesting_findings/findings.erb
267
267
  - app/views/json/scan_aborted.erb
268
268
  - cms_scanner.gemspec
269
+ - example/.gitignore
270
+ - example/.rspec
271
+ - example/.rubocop.yml
272
+ - example/.travis.yml
273
+ - example/Gemfile
274
+ - example/Rakefile
275
+ - example/app/app.rb
276
+ - example/app/controllers.rb
277
+ - example/app/controllers/example.rb
278
+ - example/app/views/cli/core/banner.erb
279
+ - example/app/views/cli/example/scan_word.erb
280
+ - example/app/views/json/core/banner.erb
281
+ - example/app/views/json/example/scan_word.erb
282
+ - example/bin/cmsscan
283
+ - example/cmsscan.gemspec
284
+ - example/lib/cmsscan.rb
285
+ - example/lib/cmsscan/controller.rb
286
+ - example/lib/cmsscan/target.rb
287
+ - example/lib/cmsscan/version.rb
269
288
  - lib/cms_scanner.rb
270
289
  - lib/cms_scanner/browser.rb
271
290
  - lib/cms_scanner/browser/actions.rb