diff --git a/lib/wpscan/wpscan_stats.rb b/lib/wpstools/plugins/stats/stats_plugin.rb similarity index 61% rename from lib/wpscan/wpscan_stats.rb rename to lib/wpstools/plugins/stats/stats_plugin.rb index 898eb115..278642fd 100644 --- a/lib/wpscan/wpscan_stats.rb +++ b/lib/wpstools/plugins/stats/stats_plugin.rb @@ -17,37 +17,61 @@ # along with this program. If not, see . #++ -class WpscanStats +require_files_from_directory(WPSCAN_LIB_DIR, '**/*.rb') - def self.vuln_plugin_count(file=PLUGINS_VULNS_FILE) +class StatsPlugin < Plugin + + def initialize + super(author: 'WPScanTeam - Christian Mehlmauer') + + register_options( + ['--stats', '--s', 'Show WpScan Database statistics'] + ) + end + + def run(options = {}) + if options[:stats] + puts "Wpscan Databse Statistics:" + puts "--------------------------" + puts "[#] Total vulnerable plugins: #{vuln_plugin_count}" + puts "[#] Total vulnerable themes: #{vuln_theme_count}" + puts "[#] Total plugin vulnerabilities: #{plugin_vulns_count}" + puts "[#] Total theme vulnerabilities: #{theme_vulns_count}" + puts "[#] Total plugins to enumerate: #{total_plugins}" + puts "[#] Total themes to enumerate: #{total_themes}" + puts + end + end + + def vuln_plugin_count(file=PLUGINS_VULNS_FILE) xml = Nokogiri::XML(File.open(file)) do |config| config.noblanks end xml.xpath("count(//plugin)").to_i end - def self.vuln_theme_count(file=THEMES_VULNS_FILE) + def vuln_theme_count(file=THEMES_VULNS_FILE) xml = Nokogiri::XML(File.open(file)) do |config| config.noblanks end xml.xpath("count(//theme)").to_i end - def self.plugin_vulns_count(file=PLUGINS_VULNS_FILE) + def plugin_vulns_count(file=PLUGINS_VULNS_FILE) xml = Nokogiri::XML(File.open(file)) do |config| config.noblanks end xml.xpath("count(//vulnerability)").to_i end - def self.theme_vulns_count(file=THEMES_VULNS_FILE) + def theme_vulns_count(file=THEMES_VULNS_FILE) xml = Nokogiri::XML(File.open(file)) do |config| config.noblanks end xml.xpath("count(//vulnerability)").to_i end - def self.total_plugins(file=PLUGINS_FULL_FILE, xml=PLUGINS_VULNS_FILE) + def total_plugins(file=PLUGINS_FULL_FILE, xml=PLUGINS_VULNS_FILE) options = {} options[:only_vulnerable_ones] = false options[:file] = file @@ -57,7 +81,7 @@ class WpscanStats WpEnumerator.generate_items(options).count end - def self.total_themes(file=THEMES_FULL_FILE, xml=THEMES_VULNS_FILE) + def total_themes(file=THEMES_FULL_FILE, xml=THEMES_VULNS_FILE) options = {} options[:only_vulnerable_ones] = false options[:file] = file diff --git a/spec/lib/wpscan/wpscan_stats_spec.rb b/spec/lib/wpstools/plugins/stats/stats_plugin_spec.rb similarity index 64% rename from spec/lib/wpscan/wpscan_stats_spec.rb rename to spec/lib/wpstools/plugins/stats/stats_plugin_spec.rb index a66e774d..691d90af 100644 --- a/spec/lib/wpscan/wpscan_stats_spec.rb +++ b/spec/lib/wpstools/plugins/stats/stats_plugin_spec.rb @@ -17,46 +17,54 @@ # along with this program. If not, see . #++ -require File.expand_path(File.dirname(__FILE__) + '/wpscan_helper') +require File.expand_path(File.dirname(__FILE__) + '/../../wpstools_helper') + +describe 'StatsPlugin' do + before :each do + @stats = StatsPlugin.new() + end -describe 'WpscanStats' do describe '#vuln_plugin_count' do it 'should return the correct number' do xml = "#{SPEC_FIXTURES_WPSCAN_WP_PLUGIN_DIR}/vulnerabilities/plugin_vulns.xml" - WpscanStats.vuln_plugin_count(xml).should == 2 + @stats.vuln_plugin_count(xml).should == 2 end end describe '#vuln_theme_count' do it 'should return the correct number' do xml = "#{SPEC_FIXTURES_WPSCAN_WP_THEME_DIR}/vulnerabilities/theme_vulns.xml" - WpscanStats.vuln_theme_count(xml).should == 2 + @stats.vuln_theme_count(xml).should == 2 end end describe '#plugin_vulns_count' do it 'should return the correct number' do xml = "#{SPEC_FIXTURES_WPSCAN_WP_PLUGIN_DIR}/vulnerabilities/plugin_vulns.xml" - WpscanStats.plugin_vulns_count(xml).should == 3 + @stats.plugin_vulns_count(xml).should == 3 end end describe '#theme_vulns_count' do it 'should return the correct number' do xml = "#{SPEC_FIXTURES_WPSCAN_WP_THEME_DIR}/vulnerabilities/theme_vulns.xml" - WpscanStats.theme_vulns_count(xml).should == 3 + @stats.theme_vulns_count(xml).should == 3 end end describe '#total_plugins' do - xml = "#{SPEC_FIXTURES_WPSCAN_WP_PLUGIN_DIR}/vulnerabilities/plugin_vulns.xml" - file = "#{SPEC_FIXTURES_WPSCAN_WP_PLUGIN_DIR}/plugins.txt" - WpscanStats.total_plugins(file, xml).should == 4 + it 'should return the correct numer' do + xml = "#{SPEC_FIXTURES_WPSCAN_WP_PLUGIN_DIR}/vulnerabilities/plugin_vulns.xml" + file = "#{SPEC_FIXTURES_WPSCAN_WP_PLUGIN_DIR}/plugins.txt" + @stats.total_plugins(file, xml).should == 4 + end end describe '#total_themes' do - xml = "#{SPEC_FIXTURES_WPSCAN_WP_THEME_DIR}/vulnerabilities/theme_vulns.xml" - file = "#{SPEC_FIXTURES_WPSCAN_WP_THEME_DIR}/themes.txt" - WpscanStats.total_themes(file, xml).should == 5 + it 'should return the correct numer' do + xml = "#{SPEC_FIXTURES_WPSCAN_WP_THEME_DIR}/vulnerabilities/theme_vulns.xml" + file = "#{SPEC_FIXTURES_WPSCAN_WP_THEME_DIR}/themes.txt" + @stats.total_themes(file, xml).should == 5 + end end end \ No newline at end of file diff --git a/wpscan.rb b/wpscan.rb index 7560c330..c4245719 100755 --- a/wpscan.rb +++ b/wpscan.rb @@ -55,15 +55,6 @@ end File.delete(LOG_FILE) if File.exist?(LOG_FILE) and !File.symlink?(LOG_FILE) banner() -# Stats -puts "Wpscan Database Statistics:" -puts "\tTotal vulnerable plugins: #{WpscanStats.vuln_plugin_count}" -puts "\tTotal vulnerable themes: #{WpscanStats.vuln_theme_count}" -puts "\tTotal plugin vulnerabilities: #{WpscanStats.plugin_vulns_count}" -puts "\tTotal theme vulnerabilities: #{WpscanStats.theme_vulns_count}" -puts "\tTotal plugins to enumerate: #{WpscanStats.total_plugins}" -puts "\tTotal themes to enumerate: #{WpscanStats.total_themes}" -puts begin wpscan_options = WpscanOptions.load_from_arguments diff --git a/wpstools.rb b/wpstools.rb index 014d63e2..594f14bd 100755 --- a/wpstools.rb +++ b/wpstools.rb @@ -33,7 +33,8 @@ begin plugins = Plugins.new(option_parser) plugins.register( CheckerPlugin.new, - ListGeneratorPlugin.new + ListGeneratorPlugin.new, + StatsPlugin.new ) options = option_parser.results