wpscan 3.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.
- checksums.yaml +7 -0
- data/Gemfile.lock +139 -0
- data/LICENSE +74 -0
- data/README.md +146 -0
- data/app/app.rb +3 -0
- data/app/controllers.rb +6 -0
- data/app/controllers/brute_force.rb +126 -0
- data/app/controllers/core.rb +104 -0
- data/app/controllers/custom_directories.rb +23 -0
- data/app/controllers/enumeration.rb +53 -0
- data/app/controllers/enumeration/cli_options.rb +126 -0
- data/app/controllers/enumeration/enum_methods.rb +157 -0
- data/app/controllers/main_theme.rb +27 -0
- data/app/controllers/wp_version.rb +30 -0
- data/app/finders.rb +13 -0
- data/app/finders/config_backups.rb +17 -0
- data/app/finders/config_backups/known_filenames.rb +46 -0
- data/app/finders/interesting_findings.rb +33 -0
- data/app/finders/interesting_findings/backup_db.rb +25 -0
- data/app/finders/interesting_findings/debug_log.rb +20 -0
- data/app/finders/interesting_findings/duplicator_installer_log.rb +23 -0
- data/app/finders/interesting_findings/full_path_disclosure.rb +23 -0
- data/app/finders/interesting_findings/mu_plugins.rb +48 -0
- data/app/finders/interesting_findings/multisite.rb +29 -0
- data/app/finders/interesting_findings/readme.rb +26 -0
- data/app/finders/interesting_findings/registration.rb +31 -0
- data/app/finders/interesting_findings/tmm_db_migrate.rb +24 -0
- data/app/finders/interesting_findings/upload_directory_listing.rb +24 -0
- data/app/finders/interesting_findings/upload_sql_dump.rb +28 -0
- data/app/finders/main_theme.rb +22 -0
- data/app/finders/main_theme/css_style.rb +43 -0
- data/app/finders/main_theme/urls_in_homepage.rb +25 -0
- data/app/finders/main_theme/woo_framework_meta_generator.rb +22 -0
- data/app/finders/medias.rb +17 -0
- data/app/finders/medias/attachment_brute_forcing.rb +44 -0
- data/app/finders/plugin_version.rb +44 -0
- data/app/finders/plugin_version/layer_slider/translation_file.rb +40 -0
- data/app/finders/plugin_version/readme.rb +79 -0
- data/app/finders/plugin_version/revslider/release_log.rb +35 -0
- data/app/finders/plugin_version/sitepress_multilingual_cms/meta_generator.rb +27 -0
- data/app/finders/plugin_version/sitepress_multilingual_cms/version_parameter.rb +31 -0
- data/app/finders/plugin_version/w3_total_cache/headers.rb +28 -0
- data/app/finders/plugins.rb +24 -0
- data/app/finders/plugins/comments.rb +31 -0
- data/app/finders/plugins/headers.rb +36 -0
- data/app/finders/plugins/known_locations.rb +48 -0
- data/app/finders/plugins/urls_in_homepage.rb +29 -0
- data/app/finders/theme_version.rb +41 -0
- data/app/finders/theme_version/style.rb +43 -0
- data/app/finders/theme_version/woo_framework_meta_generator.rb +19 -0
- data/app/finders/themes.rb +20 -0
- data/app/finders/themes/known_locations.rb +48 -0
- data/app/finders/themes/urls_in_homepage.rb +23 -0
- data/app/finders/timthumb_version.rb +17 -0
- data/app/finders/timthumb_version/bad_request.rb +21 -0
- data/app/finders/timthumbs.rb +17 -0
- data/app/finders/timthumbs/known_locations.rb +56 -0
- data/app/finders/users.rb +24 -0
- data/app/finders/users/author_id_brute_forcing.rb +111 -0
- data/app/finders/users/author_posts.rb +61 -0
- data/app/finders/users/login_error_messages.rb +50 -0
- data/app/finders/users/wp_json_api.rb +31 -0
- data/app/finders/wp_items.rb +1 -0
- data/app/finders/wp_items/urls_in_homepage.rb +68 -0
- data/app/finders/wp_version.rb +34 -0
- data/app/finders/wp_version/atom_generator.rb +40 -0
- data/app/finders/wp_version/meta_generator.rb +27 -0
- data/app/finders/wp_version/opml_generator.rb +23 -0
- data/app/finders/wp_version/rdf_generator.rb +38 -0
- data/app/finders/wp_version/readme.rb +28 -0
- data/app/finders/wp_version/rss_generator.rb +43 -0
- data/app/finders/wp_version/sitemap_generator.rb +23 -0
- data/app/finders/wp_version/stylesheets.rb +55 -0
- data/app/finders/wp_version/unique_fingerprinting.rb +64 -0
- data/app/models.rb +10 -0
- data/app/models/config_backup.rb +5 -0
- data/app/models/interesting_finding.rb +6 -0
- data/app/models/media.rb +5 -0
- data/app/models/plugin.rb +25 -0
- data/app/models/theme.rb +99 -0
- data/app/models/timthumb.rb +74 -0
- data/app/models/user.rb +31 -0
- data/app/models/wp_item.rb +142 -0
- data/app/models/wp_version.rb +49 -0
- data/app/models/xml_rpc.rb +19 -0
- data/app/views/cli/brute_force/error.erb +1 -0
- data/app/views/cli/brute_force/found.erb +2 -0
- data/app/views/cli/brute_force/users.erb +9 -0
- data/app/views/cli/core/banner.erb +14 -0
- data/app/views/cli/core/db_update_finished.erb +8 -0
- data/app/views/cli/core/db_update_started.erb +1 -0
- data/app/views/cli/core/not_fully_configured.erb +1 -0
- data/app/views/cli/enumeration/config_backups.erb +11 -0
- data/app/views/cli/enumeration/medias.erb +11 -0
- data/app/views/cli/enumeration/plugins.erb +35 -0
- data/app/views/cli/enumeration/themes.erb +11 -0
- data/app/views/cli/enumeration/timthumbs.erb +18 -0
- data/app/views/cli/enumeration/users.erb +11 -0
- data/app/views/cli/finding.erb +32 -0
- data/app/views/cli/info.erb +1 -0
- data/app/views/cli/main_theme/theme.erb +6 -0
- data/app/views/cli/notice.erb +1 -0
- data/app/views/cli/theme.erb +64 -0
- data/app/views/cli/usage.erb +3 -0
- data/app/views/cli/vulnerability.erb +14 -0
- data/app/views/cli/wp_version/version.erb +6 -0
- data/app/views/json/brute_force/users.erb +10 -0
- data/app/views/json/core/banner.erb +12 -0
- data/app/views/json/core/db_update_finished.erb +2 -0
- data/app/views/json/core/db_update_started.erb +1 -0
- data/app/views/json/core/not_fully_configured.erb +1 -0
- data/app/views/json/enumeration/config_backups.erb +10 -0
- data/app/views/json/enumeration/medias.erb +10 -0
- data/app/views/json/enumeration/plugins.erb +25 -0
- data/app/views/json/enumeration/themes.erb +10 -0
- data/app/views/json/enumeration/timthumbs.erb +19 -0
- data/app/views/json/enumeration/users.erb +11 -0
- data/app/views/json/finding.erb +26 -0
- data/app/views/json/main_theme/theme.erb +7 -0
- data/app/views/json/theme.erb +38 -0
- data/app/views/json/wp_version/version.erb +8 -0
- data/bin/wpscan +15 -0
- data/coverage/assets/0.10.0/application.css +799 -0
- data/coverage/assets/0.10.0/application.js +1707 -0
- data/coverage/assets/0.10.0/colorbox/border.png +0 -0
- data/coverage/assets/0.10.0/colorbox/controls.png +0 -0
- data/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
- data/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.10.0/favicon_green.png +0 -0
- data/coverage/assets/0.10.0/favicon_red.png +0 -0
- data/coverage/assets/0.10.0/favicon_yellow.png +0 -0
- data/coverage/assets/0.10.0/loading.gif +0 -0
- data/coverage/assets/0.10.0/magnify.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/index.html +27510 -0
- data/lib/wpscan.rb +44 -0
- data/lib/wpscan/browser.rb +16 -0
- data/lib/wpscan/controller.rb +8 -0
- data/lib/wpscan/controllers.rb +8 -0
- data/lib/wpscan/db.rb +28 -0
- data/lib/wpscan/db/dynamic_finders.rb +63 -0
- data/lib/wpscan/db/plugin.rb +11 -0
- data/lib/wpscan/db/plugins.rb +11 -0
- data/lib/wpscan/db/schema.rb +39 -0
- data/lib/wpscan/db/theme.rb +11 -0
- data/lib/wpscan/db/themes.rb +11 -0
- data/lib/wpscan/db/updater.rb +148 -0
- data/lib/wpscan/db/wp_item.rb +18 -0
- data/lib/wpscan/db/wp_items.rb +21 -0
- data/lib/wpscan/db/wp_version.rb +11 -0
- data/lib/wpscan/errors/http.rb +34 -0
- data/lib/wpscan/errors/update.rb +8 -0
- data/lib/wpscan/errors/wordpress.rb +22 -0
- data/lib/wpscan/finders.rb +14 -0
- data/lib/wpscan/finders/finder/plugin_version/comments.rb +25 -0
- data/lib/wpscan/finders/finder/wp_version/smart_url_checker.rb +23 -0
- data/lib/wpscan/helper.rb +6 -0
- data/lib/wpscan/references.rb +31 -0
- data/lib/wpscan/target.rb +81 -0
- data/lib/wpscan/target/platform/wordpress.rb +74 -0
- data/lib/wpscan/target/platform/wordpress/custom_directories.rb +93 -0
- data/lib/wpscan/version.rb +4 -0
- data/lib/wpscan/vulnerability.rb +25 -0
- data/lib/wpscan/vulnerable.rb +10 -0
- data/wpscan-v3.sublime-project +8 -0
- data/wpscan-v3.sublime-workspace +895 -0
- data/wpscan.gemspec +55 -0
- metadata +419 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module WPScan
|
|
2
|
+
# Timthumb
|
|
3
|
+
class Timthumb < InterestingFinding
|
|
4
|
+
include Vulnerable
|
|
5
|
+
|
|
6
|
+
# Opts used to detect the version
|
|
7
|
+
attr_reader :detection_opts
|
|
8
|
+
|
|
9
|
+
# @param [ String ] url
|
|
10
|
+
# @param [ Hash ] opts
|
|
11
|
+
# @option opts [ String ] :detection_mode
|
|
12
|
+
def initialize(url, opts = {})
|
|
13
|
+
super(url, opts)
|
|
14
|
+
|
|
15
|
+
@detection_opts = { mode: opts[:mode] }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @param [ Hash ] opts
|
|
19
|
+
#
|
|
20
|
+
# @return [ WPScan::Version, false ]
|
|
21
|
+
def version(opts = {})
|
|
22
|
+
if @version.nil?
|
|
23
|
+
@version = Finders::TimthumbVersion::Base.find(self, detection_opts.merge(opts))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
@version
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @return [ Array<Vulnerability> ]
|
|
30
|
+
def vulnerabilities
|
|
31
|
+
vulns = []
|
|
32
|
+
|
|
33
|
+
vulns << rce_webshot_vuln if false == version || version > '1.35' && version < '2.8.14' && webshot_enabled?
|
|
34
|
+
vulns << rce_132_vuln if false == version || version < '1.33'
|
|
35
|
+
|
|
36
|
+
vulns
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [ Vulnerability ] The RCE in the <= 1.32
|
|
40
|
+
def rce_132_vuln
|
|
41
|
+
Vulnerability.new(
|
|
42
|
+
'Timthumb <= 1.32 Remote Code Execution',
|
|
43
|
+
{ exploitdb: ['17602'] },
|
|
44
|
+
'RCE',
|
|
45
|
+
'1.33'
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @return [ Vulnerability ] The RCE due to the WebShot in the > 1.35 (or >= 2.0) and <= 2.8.13
|
|
50
|
+
def rce_webshot_vuln
|
|
51
|
+
Vulnerability.new(
|
|
52
|
+
'Timthumb <= 2.8.13 WebShot Remote Code Execution',
|
|
53
|
+
{
|
|
54
|
+
url: ['http://seclists.org/fulldisclosure/2014/Jun/117', 'https://github.com/wpscanteam/wpscan/issues/519'],
|
|
55
|
+
cve: '2014-4663'
|
|
56
|
+
},
|
|
57
|
+
'RCE',
|
|
58
|
+
'2.8.14'
|
|
59
|
+
)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @return [ Boolean ]
|
|
63
|
+
def webshot_enabled?
|
|
64
|
+
res = Browser.get(url, params: { webshot: 1, src: "http://#{default_allowed_domains.sample}" })
|
|
65
|
+
|
|
66
|
+
res.body =~ /WEBSHOT_ENABLED == true/ ? false : true
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @return [ Array<String> ] The default allowed domains (between the 2.0 and 2.8.13)
|
|
70
|
+
def default_allowed_domains
|
|
71
|
+
%w(flickr.com picasa.com img.youtube.com upload.wikimedia.org)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
data/app/models/user.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module WPScan
|
|
2
|
+
# WordPress 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
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
module WPScan
|
|
2
|
+
# WpItem (superclass of Plugin & Theme)
|
|
3
|
+
class WpItem
|
|
4
|
+
include Vulnerable
|
|
5
|
+
include Finders::Finding
|
|
6
|
+
include CMSScanner::Target::Platform::PHP
|
|
7
|
+
include CMSScanner::Target::Server::Generic
|
|
8
|
+
|
|
9
|
+
READMES = %w(readme.txt README.txt Readme.txt ReadMe.txt README.TXT readme.TXT).freeze
|
|
10
|
+
CHANGELOGS = %w(changelog.txt Changelog.txt ChangeLog.txt CHANGELOG.txt).freeze
|
|
11
|
+
|
|
12
|
+
attr_reader :uri, :name, :detection_opts, :target, :db_data
|
|
13
|
+
|
|
14
|
+
# @param [ String ] name The plugin/theme name
|
|
15
|
+
# @param [ Target ] target The targeted blog
|
|
16
|
+
# @param [ Hash ] opts
|
|
17
|
+
# @option opts [ String ] :detection_mode
|
|
18
|
+
# @option opts [ Boolean ] :version_all Wether or not to
|
|
19
|
+
# @option opts [ String ] :url The URL of the item
|
|
20
|
+
def initialize(name, target, opts = {})
|
|
21
|
+
@name = URI.decode(name)
|
|
22
|
+
@target = target
|
|
23
|
+
@uri = Addressable::URI.parse(opts[:url]) if opts[:url]
|
|
24
|
+
|
|
25
|
+
# Options used to detect the version
|
|
26
|
+
@detection_opts = { mode: opts[:mode], confidence_threshold: opts[:version_all] ? 0 : 100 }
|
|
27
|
+
|
|
28
|
+
parse_finding_options(opts)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [ Array<Vulnerabily> ]
|
|
32
|
+
def vulnerabilities
|
|
33
|
+
return @vulnerabilities if @vulnerabilities
|
|
34
|
+
|
|
35
|
+
@vulnerabilities = []
|
|
36
|
+
|
|
37
|
+
[*db_data['vulnerabilities']].each do |json_vuln|
|
|
38
|
+
vulnerability = Vulnerability.load_from_json(json_vuln)
|
|
39
|
+
@vulnerabilities << vulnerability if vulnerable_to?(vulnerability)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@vulnerabilities
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Checks if the wp_item is vulnerable to a specific vulnerability
|
|
46
|
+
#
|
|
47
|
+
# @param [ Vulnerability ] vuln Vulnerability to check the item against
|
|
48
|
+
#
|
|
49
|
+
# @return [ Boolean ]
|
|
50
|
+
def vulnerable_to?(vuln)
|
|
51
|
+
return true unless version && vuln && vuln.fixed_in && !vuln.fixed_in.empty?
|
|
52
|
+
|
|
53
|
+
version < vuln.fixed_in ? true : false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [ String ]
|
|
57
|
+
def latest_version
|
|
58
|
+
@latest_version ||= db_data['latest_version']
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Not used anywhere ATM
|
|
62
|
+
# @return [ Boolean ]
|
|
63
|
+
def popular?
|
|
64
|
+
@popular ||= db_data['popular']
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# URI.encode is preferered over Addressable::URI.encode as it will encode
|
|
68
|
+
# leading # character:
|
|
69
|
+
# URI.encode('#t#') => %23t%23
|
|
70
|
+
# Addressable::URI.encode('#t#') => #t%23
|
|
71
|
+
#
|
|
72
|
+
# @param [ String ] path Optional path to merge with the uri
|
|
73
|
+
#
|
|
74
|
+
# @return [ String ]
|
|
75
|
+
def url(path = nil)
|
|
76
|
+
return unless @uri
|
|
77
|
+
return @uri.to_s unless path
|
|
78
|
+
|
|
79
|
+
@uri.join(URI.encode(path)).to_s
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# @return [ Boolean ]
|
|
83
|
+
def ==(other)
|
|
84
|
+
return false unless self.class == other.class
|
|
85
|
+
|
|
86
|
+
name == other.name
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def to_s
|
|
90
|
+
name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @return [ Symbol ] The Class name associated to the item name
|
|
94
|
+
def classify_name
|
|
95
|
+
name.to_s.tr('-', '_').camelize.to_s.to_sym
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# @return [ String ] The readme url if found
|
|
99
|
+
def readme_url
|
|
100
|
+
return if detection_opts[:mode] == :passive
|
|
101
|
+
|
|
102
|
+
if @readme_url.nil?
|
|
103
|
+
READMES.each do |path|
|
|
104
|
+
return @readme_url = url(path) if Browser.get(url(path)).code == 200
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
@readme_url
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# @return [ String, false ] The changelog urr if found
|
|
112
|
+
def changelog_url
|
|
113
|
+
return if detection_opts[:mode] == :passive
|
|
114
|
+
|
|
115
|
+
if @changelog_url.nil?
|
|
116
|
+
CHANGELOGS.each do |path|
|
|
117
|
+
return @changelog_url = url(path) if Browser.get(url(path)).code == 200
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
@changelog_url
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @param [ String ] path
|
|
125
|
+
# @param [ Hash ] params The request params
|
|
126
|
+
#
|
|
127
|
+
# @return [ Boolean ]
|
|
128
|
+
def directory_listing?(path = nil, params = {})
|
|
129
|
+
return if detection_opts[:mode] == :passive
|
|
130
|
+
super(path, params)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# @param [ String ] path
|
|
134
|
+
# @param [ Hash ] params The request params
|
|
135
|
+
#
|
|
136
|
+
# @return [ Boolean ]
|
|
137
|
+
def error_log?(path = 'error_log', params = {})
|
|
138
|
+
return if detection_opts[:mode] == :passive
|
|
139
|
+
super(path, params)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module WPScan
|
|
2
|
+
# WP Version
|
|
3
|
+
class WpVersion < CMSScanner::Version
|
|
4
|
+
include Vulnerable
|
|
5
|
+
attr_reader :db_data
|
|
6
|
+
|
|
7
|
+
def initialize(number, opts = {})
|
|
8
|
+
raise InvalidWordPressVersion unless WpVersion.valid?(number.to_s)
|
|
9
|
+
|
|
10
|
+
super(number, opts)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# @param [ String ] number
|
|
14
|
+
#
|
|
15
|
+
# @return [ Boolean ] true if the number is a valid WP version, false otherwise
|
|
16
|
+
def self.valid?(number)
|
|
17
|
+
all.include?(number)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @return [ Array<String> ] All the version numbers
|
|
21
|
+
def self.all
|
|
22
|
+
return @all_numbers if @all_numbers
|
|
23
|
+
|
|
24
|
+
@all_numbers = []
|
|
25
|
+
|
|
26
|
+
DB::Version.all.each { |v| @all_numbers << v.number }
|
|
27
|
+
|
|
28
|
+
@all_numbers
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [ JSON ]
|
|
32
|
+
def db_data
|
|
33
|
+
DB::Version.db_data(number)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @return [ Array<Vulnerability> ]
|
|
37
|
+
def vulnerabilities
|
|
38
|
+
return @vulnerabilities if @vulnerabilities
|
|
39
|
+
|
|
40
|
+
@vulnerabilities = []
|
|
41
|
+
|
|
42
|
+
[*db_data['vulnerabilities']].each do |json_vuln|
|
|
43
|
+
@vulnerabilities << Vulnerability.load_from_json(json_vuln)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
@vulnerabilities
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module WPScan
|
|
2
|
+
# Override of the CMSScanner::XMLRPC to include the references
|
|
3
|
+
class XMLRPC < CMSScanner::XMLRPC
|
|
4
|
+
include References # To be able to use the :wpvulndb reference if needed
|
|
5
|
+
|
|
6
|
+
# @return [ Hash ]
|
|
7
|
+
def references
|
|
8
|
+
{
|
|
9
|
+
url: ['http://codex.wordpress.org/XML-RPC_Pingback_API'],
|
|
10
|
+
metasploit: [
|
|
11
|
+
'auxiliary/scanner/http/wordpress_ghost_scanner',
|
|
12
|
+
'auxiliary/dos/http/wordpress_xmlrpc_dos',
|
|
13
|
+
'auxiliary/scanner/http/wordpress_xmlrpc_login',
|
|
14
|
+
'auxiliary/scanner/http/wordpress_pingback_access'
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= red('ERROR:') %> <%= @msg %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
_______________________________________________________________
|
|
2
|
+
__ _______ _____
|
|
3
|
+
\ \ / / __ \ / ____|
|
|
4
|
+
\ \ /\ / /| |__) | (___ ___ __ _ _ __
|
|
5
|
+
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
|
|
6
|
+
\ /\ / | | ____) | (__| (_| | | | |
|
|
7
|
+
\/ \/ |_| |_____/ \___|\__,_|_| |_|
|
|
8
|
+
|
|
9
|
+
WordPress Security Scanner by the WPScan Team
|
|
10
|
+
Version <%= WPScan::VERSION %>
|
|
11
|
+
Sponsored by Sucuri - https://sucuri.net
|
|
12
|
+
@_WPScan_, @ethicalhack3r, @erwan_lr, pvdl, @_FireFart_
|
|
13
|
+
_______________________________________________________________
|
|
14
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= notice_icon %> Updating the Database ...
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= critical_icon %> The Website is not fully configured and currently in install mode. Create a new admin user at <%= @url %>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
<% if @config_backups.empty? -%>
|
|
3
|
+
<%= notice_icon %> No Backups Found.
|
|
4
|
+
<% else -%>
|
|
5
|
+
<%= notice_icon %> Backup(s) Identified:
|
|
6
|
+
<% @config_backups.each do |config_backup| -%>
|
|
7
|
+
|
|
8
|
+
<%= info_icon %> <%= config_backup %>
|
|
9
|
+
<%= render('@finding', item: config_backup) -%>
|
|
10
|
+
<% end -%>
|
|
11
|
+
<% end %>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
|
|
2
|
+
<% if @plugins.empty? -%>
|
|
3
|
+
<%= notice_icon %> No plugins Found.
|
|
4
|
+
<% else -%>
|
|
5
|
+
<%= notice_icon %> Plugin(s) Identified:
|
|
6
|
+
<% @plugins.each do |plugin| -%>
|
|
7
|
+
|
|
8
|
+
<%= info_icon %> <%= plugin %>
|
|
9
|
+
| Location: <%= plugin.url %>
|
|
10
|
+
<% if plugin.latest_version -%>
|
|
11
|
+
| Latest Version: <%= plugin.latest_version %>
|
|
12
|
+
<% end -%>
|
|
13
|
+
<% if plugin.readme_url -%>
|
|
14
|
+
| Readme: <%= plugin.readme_url %>
|
|
15
|
+
<% end -%>
|
|
16
|
+
<% if plugin.changelog_url -%>
|
|
17
|
+
| Changelog: <%= plugin.changelog_url %>
|
|
18
|
+
<% end -%>
|
|
19
|
+
<% if plugin.directory_listing? -%>
|
|
20
|
+
| <%= critical_icon %> Directory listing is enabled
|
|
21
|
+
<% end -%>
|
|
22
|
+
<% if plugin.error_log? -%>
|
|
23
|
+
| <%= critical_icon %> An error log file has been found: <%= plugin.url('error_log') %>
|
|
24
|
+
<% end -%>
|
|
25
|
+
|
|
|
26
|
+
<%= render('@finding', item: plugin) -%>
|
|
27
|
+
|
|
|
28
|
+
<% if plugin.version -%>
|
|
29
|
+
| Version: <%= plugin.version %> (<%= plugin.version.confidence %>% confidence)
|
|
30
|
+
<%= render('@finding', item: plugin.version) -%>
|
|
31
|
+
<% else -%>
|
|
32
|
+
| The version could not be determined.
|
|
33
|
+
<% end -%>
|
|
34
|
+
<% end -%>
|
|
35
|
+
<% end %>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
<% if @themes.empty? -%>
|
|
3
|
+
<%= notice_icon %> No themes Found.
|
|
4
|
+
<% else -%>
|
|
5
|
+
<%= notice_icon %> Theme(s) Identified:
|
|
6
|
+
<% @themes.each do |theme| -%>
|
|
7
|
+
|
|
8
|
+
<%= info_icon %> <%= theme %>
|
|
9
|
+
<%= render('@theme', theme: theme, show_parents: false) -%>
|
|
10
|
+
<% end -%>
|
|
11
|
+
<% end %>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
|
|
2
|
+
<% if @timthumbs.empty? -%>
|
|
3
|
+
<%= notice_icon %> No Timthumbs Found.
|
|
4
|
+
<% else -%>
|
|
5
|
+
<%= notice_icon %> Timthumb(s) Identified:
|
|
6
|
+
<% @timthumbs.each do |timthumb| -%>
|
|
7
|
+
|
|
8
|
+
<%= info_icon %> <%= timthumb %>
|
|
9
|
+
<%= render('@finding', item: timthumb) -%>
|
|
10
|
+
|
|
|
11
|
+
<% if timthumb.version -%>
|
|
12
|
+
| Version: <%= timthumb.version %>
|
|
13
|
+
<%= render('@finding', item: timthumb.version) -%>
|
|
14
|
+
<% else -%>
|
|
15
|
+
| The version could not be determined.
|
|
16
|
+
<% end -%>
|
|
17
|
+
<% end -%>
|
|
18
|
+
<% end %>
|