dradis-wpscan 3.18.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.
@@ -0,0 +1,27 @@
1
+ # WPScan add-on for Dradis
2
+
3
+ [![Build Status](https://secure.travis-ci.org/dradis/dradis-wpscan.png?branch=master)](http://travis-ci.org/dradis/dradis-wpscan) [![Code Climate](https://codeclimate.com/github/dradis/dradis-wpscan.png)](https://codeclimate.com/github/dradis/dradis-wpscan.png)
4
+
5
+ Upload [WPScan](https://wpscan.org/) security scanner JSON output into Dradis.
6
+
7
+ The add-on requires [Dradis CE](https://dradisframework.com/ce/) > 3.0, or [Dradis Pro](https://dradisframework.com/pro/).
8
+
9
+
10
+ ## More information
11
+
12
+ See the Dradis Framework's [README.md](https://github.com/dradis/dradisframework/blob/master/README.md)
13
+
14
+
15
+ ## Contributing
16
+
17
+ See the Dradis Framework's [CONTRIBUTING.md](https://github.com/dradis/dradisframework/blob/master/CONTRIBUTING.md)
18
+
19
+
20
+ ## License
21
+
22
+ Dradis Framework and all its components are released under [GNU General Public License version 2.0](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.
23
+
24
+
25
+ ## Feature requests and bugs
26
+
27
+ Please use the [Dradis Framework issue tracker](https://github.com/dradis/dradis-ce/issues) for add-on improvements and bug reports.
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,34 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'dradis/plugins/wpscan/version'
3
+ version = Dradis::Plugins::Wpscan::VERSION::STRING
4
+
5
+ # Describe your gem and declare its dependencies:
6
+ Gem::Specification.new do |spec|
7
+ spec.platform = Gem::Platform::RUBY
8
+ spec.name = 'dradis-wpscan'
9
+ spec.version = version
10
+ spec.summary = 'WPScan add-on for the Dradis Framework.'
11
+ spec.description = 'This add-on allows you to upload and parse output produced from the WPScan WordPress security scanner into Dradis.'
12
+
13
+ spec.license = 'GPL-2'
14
+
15
+ spec.authors = ['Christian Mehlmauer', 'Daniel Martin', 'Erwan', 'Ryan Dewhurst']
16
+ spec.email = ['etd@nomejortu.com']
17
+ spec.homepage = 'http://dradisframework.org'
18
+
19
+ spec.files = `git ls-files`.split($\)
20
+ spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+
23
+ # By not including Rails as a dependency, we can use the gem with different
24
+ # versions of Rails (a sure recipe for disaster, I'm sure), which is needed
25
+ # until we bump Dradis Pro to 4.1.
26
+ # s.add_dependency 'rails', '~> 4.1.1'
27
+ spec.add_dependency 'dradis-plugins', '~> 3.6'
28
+ spec.add_dependency 'multi_json'
29
+
30
+ spec.add_development_dependency 'bundler'
31
+ spec.add_development_dependency 'rake', '~> 12.3.3'
32
+ spec.add_development_dependency 'rspec-rails'
33
+ spec.add_development_dependency 'combustion', '~> 0.5.2'
34
+ end
@@ -0,0 +1,7 @@
1
+ # Hook to the framework base clases
2
+ require 'dradis-plugins'
3
+
4
+ # Load this add-on's engine
5
+ require 'dradis/plugins/wpscan'
6
+
7
+ require 'multi_json'
@@ -0,0 +1,11 @@
1
+ module Dradis
2
+ module Plugins
3
+ module Wpscan
4
+ end
5
+ end
6
+ end
7
+
8
+ require 'dradis/plugins/wpscan/engine'
9
+ require 'dradis/plugins/wpscan/field_processor'
10
+ require 'dradis/plugins/wpscan/importer'
11
+ require 'dradis/plugins/wpscan/version'
@@ -0,0 +1,13 @@
1
+ module Dradis
2
+ module Plugins
3
+ module Wpscan
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Dradis::Plugins::Wpscan
6
+
7
+ include ::Dradis::Plugins::Base
8
+ description 'Processes WPScan JSON output'
9
+ provides :upload
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ module Dradis
2
+ module Plugins
3
+ module Wpscan
4
+ class FieldProcessor < Dradis::Plugins::Upload::FieldProcessor
5
+ # No need to implement anything here
6
+ # def post_initialize(args={})
7
+ # end
8
+
9
+ def value(args={})
10
+ field = args[:field]
11
+
12
+ # fields in the template are of the form <foo>.<field>, where <foo>
13
+ # is common across all fields for a given template (and meaningless).
14
+ type, name, attribute = field.split('.')
15
+
16
+ @data.key?(name) ? @data[name] : 'n/a'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Dradis
2
+ module Plugins
3
+ module Wpscan
4
+ # Returns the version of the currently loaded Dradis as a <tt>Gem::Version</tt>
5
+ def self.gem_version
6
+ Gem::Version.new VERSION::STRING
7
+ end
8
+
9
+ module VERSION
10
+ MAJOR = 3
11
+ MINOR = 18
12
+ TINY = 0
13
+ PRE = nil
14
+
15
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,193 @@
1
+ module Dradis::Plugins::Wpscan
2
+ class Importer < Dradis::Plugins::Upload::Importer
3
+ # The framework will call this function if the user selects this plugin from
4
+ # the dropdown list and uploads a file.
5
+ # @returns true if the operation was successful, false otherwise
6
+ def import(params={})
7
+
8
+ file_content = File.read( params[:file] )
9
+
10
+ # Parse the uploaded file into a Ruby Hash
11
+ logger.info { "Parsing WPScan output from #{ params[:file] }..." }
12
+ data = MultiJson.decode(file_content)
13
+ logger.info { 'Done.' }
14
+
15
+ # Do a sanity check to confirm the user uploaded the right file
16
+ # format.
17
+ if data['target_url'].nil?
18
+ error = "ERROR: No 'target_url' field present in the provided " \
19
+ "JSON data. Are you sure you uploaded a WPScan JSON output file?"
20
+ logger.fatal { error }
21
+ content_service.create_note text: error
22
+ return false
23
+ end
24
+
25
+ # Initial data normalisation
26
+ data = parse_json( data )
27
+
28
+ # Create a node based on the target_url
29
+ node = create_node( data )
30
+
31
+ # Parse vulnerability data and make more human readable.
32
+ # NOTE: You need an API token for the WPVulnDB vulnerability data.
33
+ parse_known_vulnerabilities( data, node )
34
+
35
+
36
+ # Add bespoke/config vulnerabilities to Dradis
37
+ #
38
+ # TODO: Can we add severity to issues?
39
+ #
40
+ # Note: No API key needed.
41
+ parse_config_vulnerabilities( data, node )
42
+ end
43
+
44
+ def parse_json( data )
45
+ # Parse scan info data and make more human readable.
46
+ data['wpscan_version'] = data.dig('banner', 'version')
47
+ data['start_time'] = DateTime.strptime(data['start_time'].to_s,'%s')
48
+ data['elapsed'] = "#{data["elapsed"]} seconds"
49
+ data['wordpress_version'] = data.dig('version', 'number') if data['version']
50
+ data['plugins_string'] = data['plugins'].keys.join("\n") if data['plugins']
51
+ data['themes_string'] = data['themes'].keys.join("\n") if data['themes']
52
+ data['users'] = data['users'].keys.join("\n") if data['users']
53
+
54
+ data
55
+ end
56
+
57
+ def create_node( data )
58
+ node = content_service.create_node(label: data['target_url'], type: :host)
59
+
60
+ # Define Node properties
61
+ if node.respond_to?(:properties)
62
+ node.set_property(:start_url, data['target_url'])
63
+ #node.set_property(:start_time, data['start_time'])
64
+ node.set_property(:scan_time, data['elapsed'])
65
+ end
66
+
67
+ scan_info = template_service.process_template(template: 'scan_info', data: data)
68
+ content_service.create_note text: scan_info, node: node
69
+
70
+ node
71
+ end
72
+
73
+
74
+ def parse_known_vulnerabilities( data, node )
75
+ vulnerabilities = []
76
+
77
+ # WordPress Vulnerabilities
78
+ if data['version'] && data['version']['status'] == 'insecure'
79
+ data['version']['vulnerabilities'].each do |vulnerability_data|
80
+ vulnerabilities << parse_vulnerability( vulnerability_data )
81
+ end
82
+ end
83
+
84
+ # Plugin Vulnerabilities
85
+ if data['plugins']
86
+ data['plugins'].each do |key, plugin|
87
+ if plugin['vulnerabilities']
88
+ plugin['vulnerabilities'].each do |vulnerability_data|
89
+ vulnerabilities << parse_vulnerability( vulnerability_data )
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ # Theme Vulnerabilities
96
+ if data['themes']
97
+ data['themes'].each do |key, theme|
98
+ if theme['vulnerabilities']
99
+ theme['vulnerabilities'].each do |vulnerability_data|
100
+ vulnerabilities << parse_vulnerability( vulnerability_data )
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ # Add vulnerabilities from WPVulnDB to Dradis
107
+ vulnerabilities.each do |vulnerability|
108
+ logger.info { "Adding vulnerability: #{vulnerability['title']}" }
109
+
110
+ vulnerability_template = template_service.process_template(template: 'vulnerability', data: vulnerability)
111
+ issue = content_service.create_issue(text: vulnerability_template, id: vulnerability['wpvulndb_id'], node: node)
112
+
113
+ if vulnerability['evidence']
114
+ evidence_content = template_service.process_template(template: 'evidence', data: vulnerability)
115
+ content_service.create_evidence(issue: issue, node: node, content: vulnerability['evidence'])
116
+ end
117
+ end
118
+ end
119
+
120
+ def parse_config_vulnerabilities( data, node )
121
+ vulnerabilities = []
122
+
123
+ if data['config_backups']
124
+ data['config_backups'].each do |url, value|
125
+ vulnerability = {}
126
+ vulnerability['title'] = 'WordPress Configuration Backup Found'
127
+ vulnerability['evidence'] = url
128
+
129
+ vulnerabilities << vulnerability
130
+ end
131
+ end
132
+
133
+ if data['db_exports']
134
+ data['db_exports'].each do |url, value|
135
+ vulnerability = {}
136
+ vulnerability['title'] = 'Database Backup File Found'
137
+ vulnerability['evidence'] = url
138
+
139
+ vulnerabilities << vulnerability
140
+ end
141
+ end
142
+
143
+ if data['timthumbs']
144
+ data['timthumbs'].each do |url, value|
145
+ unless value['vulnerabilities'].empty?
146
+ vulnerability = {}
147
+ vulnerability['title'] = "Timthumb RCE File Found"
148
+ vulnerability['evidence'] = url
149
+
150
+ vulnerabilities << vulnerability
151
+ end
152
+ end
153
+ end
154
+
155
+ if data['password_attack']
156
+ data['password_attack'].each do |user|
157
+ vulnerability = {}
158
+ vulnerability['title'] = "WordPres Weak User Password Found"
159
+ vulnerability['evidence'] = "#{user[0]}:#{user[1]['password']}"
160
+
161
+ vulnerabilities << vulnerability
162
+ end
163
+ end
164
+
165
+ # Add WordPress configuration vulnerabilities to Dradis
166
+ vulnerabilities.each do |vulnerability|
167
+ logger.info { "Adding vulnerability: #{vulnerability['title']}" }
168
+
169
+ vulnerability_template = template_service.process_template(template: 'vulnerability', data: vulnerability)
170
+ issue = content_service.create_issue(text: vulnerability_template, id: "wpscan_#{rand(999999)}")
171
+
172
+ if vulnerability['evidence']
173
+ evidence_content = template_service.process_template(template: 'evidence', data: vulnerability)
174
+ content_service.create_evidence(issue: issue, node: node, content: vulnerability['evidence'])
175
+ end
176
+ end
177
+ end
178
+
179
+ def parse_vulnerability( vulnerability_data )
180
+ wpvulndb_url = 'https://wpvulndb.com/vulnerabilities/'
181
+
182
+ vulnerability = {}
183
+ vulnerability['title'] = vulnerability_data['title']
184
+ vulnerability['fixed_in'] = vulnerability_data['fixed_in'] if vulnerability_data['fixed_in']
185
+ vulnerability['cve'] = 'CVE-' + vulnerability_data['references']['cve'][0] if vulnerability_data['references']['cve']
186
+ vulnerability['url'] = vulnerability_data['references']['url'].join("\n") if vulnerability_data['references']['url']
187
+ vulnerability['wpvulndb_url'] = wpvulndb_url + vulnerability_data['references']['wpvulndb'][0]
188
+ vulnerability['wpvulndb_id'] = vulnerability_data['references']['wpvulndb'][0]
189
+
190
+ vulnerability
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'gem_version'
2
+
3
+ module Dradis
4
+ module Plugins
5
+ module Wpscan
6
+ # Returns the version of the currently loaded WPScan as a
7
+ # <tt>Gem::Version</tt>.
8
+ def self.version
9
+ gem_version
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ class WpscanTasks < Thor
2
+ include Rails.application.config.dradis.thor_helper_module
3
+
4
+ namespace "dradis:plugins:wpscan"
5
+
6
+ desc "upload FILE", "upload WPScan results in JSON format"
7
+ long_desc "This plugin expects a JSON file generated by WPScan using: -f "\
8
+ "json -o results.json"
9
+ def upload(file_path)
10
+ require 'config/environment'
11
+
12
+ unless File.exists?(file_path)
13
+ $stderr.puts "** the file [#{file_path}] does not exist"
14
+ exit(-1)
15
+ end
16
+
17
+ detect_and_set_project_scope
18
+
19
+ importer = Dradis::Plugins::Wpscan::Importer.new(task_options)
20
+ importer.import(file: file_path)
21
+ end
22
+
23
+ end
@@ -0,0 +1,323 @@
1
+ {
2
+ "banner": {
3
+ "description": "WordPress Security Scanner by the WPScan Team",
4
+ "version": "3.7.5",
5
+ "authors": [
6
+ "@_WPScan_",
7
+ "@ethicalhack3r",
8
+ "@erwan_lr",
9
+ "@_FireFart_"
10
+ ],
11
+ "sponsor": "WPScan.io - Online WordPress Vulnerability Scanner"
12
+ },
13
+ "start_time": 1573482044,
14
+ "start_memory": 50507776,
15
+ "target_url": "http://www.lagardelanguages.com/",
16
+ "effective_url": "http://www.lagardelanguages.com/",
17
+ "interesting_findings": [
18
+ {
19
+ "url": "http://www.lagardelanguages.com/",
20
+ "to_s": "http://www.lagardelanguages.com/",
21
+ "type": "headers",
22
+ "found_by": "Headers (Passive Detection)",
23
+ "confidence": 100,
24
+ "confirmed_by": {
25
+
26
+ },
27
+ "references": {
28
+
29
+ },
30
+ "interesting_entries": [
31
+ "Server: nginx"
32
+ ]
33
+ },
34
+ {
35
+ "url": "http://www.lagardelanguages.com/robots.txt",
36
+ "to_s": "http://www.lagardelanguages.com/robots.txt",
37
+ "type": "robots_txt",
38
+ "found_by": "Robots Txt (Aggressive Detection)",
39
+ "confidence": 100,
40
+ "confirmed_by": {
41
+
42
+ },
43
+ "references": {
44
+
45
+ },
46
+ "interesting_entries": [
47
+ "/wp-admin/",
48
+ "/wp-admin/admin-ajax.php"
49
+ ]
50
+ },
51
+ {
52
+ "url": "http://www.lagardelanguages.com/xmlrpc.php",
53
+ "to_s": "http://www.lagardelanguages.com/xmlrpc.php",
54
+ "type": "xmlrpc",
55
+ "found_by": "Headers (Passive Detection)",
56
+ "confidence": 100,
57
+ "confirmed_by": {
58
+ "Link Tag (Passive Detection)": {
59
+ "confidence": 30
60
+ },
61
+ "Direct Access (Aggressive Detection)": {
62
+ "confidence": 100
63
+ }
64
+ },
65
+ "references": {
66
+ "url": [
67
+ "http://codex.wordpress.org/XML-RPC_Pingback_API"
68
+ ],
69
+ "metasploit": [
70
+ "auxiliary/scanner/http/wordpress_ghost_scanner",
71
+ "auxiliary/dos/http/wordpress_xmlrpc_dos",
72
+ "auxiliary/scanner/http/wordpress_xmlrpc_login",
73
+ "auxiliary/scanner/http/wordpress_pingback_access"
74
+ ]
75
+ },
76
+ "interesting_entries": [
77
+
78
+ ]
79
+ },
80
+ {
81
+ "url": "http://www.lagardelanguages.com/readme.html",
82
+ "to_s": "http://www.lagardelanguages.com/readme.html",
83
+ "type": "readme",
84
+ "found_by": "Direct Access (Aggressive Detection)",
85
+ "confidence": 100,
86
+ "confirmed_by": {
87
+
88
+ },
89
+ "references": {
90
+
91
+ },
92
+ "interesting_entries": [
93
+
94
+ ]
95
+ },
96
+ {
97
+ "url": "http://www.lagardelanguages.com/wp-cron.php",
98
+ "to_s": "http://www.lagardelanguages.com/wp-cron.php",
99
+ "type": "wp_cron",
100
+ "found_by": "Direct Access (Aggressive Detection)",
101
+ "confidence": 60,
102
+ "confirmed_by": {
103
+
104
+ },
105
+ "references": {
106
+ "url": [
107
+ "https://www.iplocation.net/defend-wordpress-from-ddos",
108
+ "https://github.com/wpscanteam/wpscan/issues/1299"
109
+ ]
110
+ },
111
+ "interesting_entries": [
112
+
113
+ ]
114
+ }
115
+ ],
116
+ "version": {
117
+ "number": "5.1.3",
118
+ "release_date": "2019-10-14",
119
+ "status": "latest",
120
+ "found_by": "Rss Generator (Passive Detection)",
121
+ "confidence": 100,
122
+ "interesting_entries": [
123
+ "http://www.lagardelanguages.com/feed/, <generator>https://wordpress.org/?v=5.1.3</generator>",
124
+ "http://www.lagardelanguages.com/comments/feed/, <generator>https://wordpress.org/?v=5.1.3</generator>",
125
+ "http://www.lagardelanguages.com/sample-page/feed/, <generator>https://wordpress.org/?v=5.1.3</generator>"
126
+ ],
127
+ "confirmed_by": {
128
+
129
+ },
130
+ "vulnerabilities": [
131
+
132
+ ]
133
+ },
134
+ "main_theme": {
135
+ "slug": "liquorice",
136
+ "location": "http://www.lagardelanguages.com/wp-content/themes/liquorice/",
137
+ "latest_version": "2.3",
138
+ "last_updated": "2013-05-30T00:00:00.000Z",
139
+ "outdated": false,
140
+ "readme_url": "http://www.lagardelanguages.com/wp-content/themes/liquorice/readme.txt",
141
+ "directory_listing": false,
142
+ "error_log_url": null,
143
+ "style_url": "http://www.lagardelanguages.com/wp-content/themes/liquorice/style.css",
144
+ "style_name": "Liquorice",
145
+ "style_uri": "http://www.nudgedesign.ca/wordpress-themes/liquorice",
146
+ "description": "A simple and clean vintage looking theme for you to build on using Google's font API Lobster font. Custom background feature enabled.",
147
+ "author": "Nudge Design",
148
+ "author_uri": "http://www.nudgedesign.ca",
149
+ "template": null,
150
+ "license": "GNU General Public License v2.0",
151
+ "license_uri": "http://www.gnu.org/licenses/gpl-2.0.html",
152
+ "tags": "custom-background, two-columns, fixed-width, right-sidebar, light, brown, orange, blue",
153
+ "text_domain": null,
154
+ "found_by": "Css Style In Homepage (Passive Detection)",
155
+ "confidence": 100,
156
+ "interesting_entries": [
157
+
158
+ ],
159
+ "confirmed_by": {
160
+ "Css Style In 404 Page (Passive Detection)": {
161
+ "confidence": 70,
162
+ "interesting_entries": [
163
+
164
+ ]
165
+ }
166
+ },
167
+ "vulnerabilities": [
168
+
169
+ ],
170
+ "version": {
171
+ "number": "2.3",
172
+ "confidence": 80,
173
+ "found_by": "Style (Passive Detection)",
174
+ "interesting_entries": [
175
+ "http://www.lagardelanguages.com/wp-content/themes/liquorice/style.css, Match: 'Version: 2.3'"
176
+ ],
177
+ "confirmed_by": {
178
+
179
+ }
180
+ },
181
+ "parents": [
182
+
183
+ ]
184
+ },
185
+ "plugins": {
186
+ "all-in-one-seo-pack": {
187
+ "slug": "all-in-one-seo-pack",
188
+ "location": "http://www.lagardelanguages.com/wp-content/plugins/all-in-one-seo-pack/",
189
+ "latest_version": "3.2.10",
190
+ "last_updated": "2019-10-17T15:07:00.000Z",
191
+ "outdated": true,
192
+ "readme_url": null,
193
+ "directory_listing": null,
194
+ "error_log_url": null,
195
+ "found_by": "Comment (Passive Detection)",
196
+ "confidence": 30,
197
+ "interesting_entries": [
198
+
199
+ ],
200
+ "confirmed_by": {
201
+
202
+ },
203
+ "vulnerabilities": [
204
+
205
+ ],
206
+ "version": {
207
+ "number": "3.1",
208
+ "confidence": 100,
209
+ "found_by": "Comment (Passive Detection)",
210
+ "interesting_entries": [
211
+ "http://www.lagardelanguages.com/, Match: 'All in One SEO Pack 3.1 by'"
212
+ ],
213
+ "confirmed_by": {
214
+ "Readme - Stable Tag (Aggressive Detection)": {
215
+ "confidence": 80,
216
+ "interesting_entries": [
217
+ "http://www.lagardelanguages.com/wp-content/plugins/all-in-one-seo-pack/readme.txt"
218
+ ]
219
+ }
220
+ }
221
+ }
222
+ },
223
+ "qtranslate": {
224
+ "slug": "qtranslate",
225
+ "location": "http://www.lagardelanguages.com/wp-content/plugins/qtranslate/",
226
+ "latest_version": null,
227
+ "last_updated": null,
228
+ "outdated": false,
229
+ "readme_url": null,
230
+ "directory_listing": null,
231
+ "error_log_url": null,
232
+ "found_by": "Urls In Homepage (Passive Detection)",
233
+ "confidence": 100,
234
+ "interesting_entries": [
235
+
236
+ ],
237
+ "confirmed_by": {
238
+ "Urls In 404 Page (Passive Detection)": {
239
+ "confidence": 80,
240
+ "interesting_entries": [
241
+
242
+ ]
243
+ }
244
+ },
245
+ "vulnerabilities": [
246
+
247
+ ],
248
+ "version": null
249
+ }
250
+ },
251
+ "config_backups": {
252
+ "http://www.lagardelanguages.com/wp-config.txt": {
253
+ "found_by": "Direct Access (Aggressive Detection)",
254
+ "confidence": 100,
255
+ "interesting_entries": [
256
+
257
+ ],
258
+ "confirmed_by": {
259
+
260
+ }
261
+ }
262
+ },
263
+ "users": {
264
+ "marie": {
265
+ "id": null,
266
+ "found_by": "Rss Generator (Passive Detection)",
267
+ "confidence": 100,
268
+ "interesting_entries": [
269
+
270
+ ],
271
+ "confirmed_by": {
272
+ "Wp Json Api (Aggressive Detection)": {
273
+ "confidence": 100,
274
+ "interesting_entries": [
275
+ "http://www.lagardelanguages.com/wp-json/wp/v2/users/?per_page=100&page=1"
276
+ ]
277
+ },
278
+ "Oembed API - Author URL (Aggressive Detection)": {
279
+ "confidence": 90,
280
+ "interesting_entries": [
281
+ "http://www.lagardelanguages.com/wp-json/oembed/1.0/embed?url=http://www.lagardelanguages.com/&format=json"
282
+ ]
283
+ },
284
+ "Rss Generator (Aggressive Detection)": {
285
+ "confidence": 50,
286
+ "interesting_entries": [
287
+
288
+ ]
289
+ },
290
+ "Author Id Brute Forcing - Author Pattern (Aggressive Detection)": {
291
+ "confidence": 100,
292
+ "interesting_entries": [
293
+
294
+ ]
295
+ },
296
+ "Login Error Messages (Aggressive Detection)": {
297
+ "confidence": 100,
298
+ "interesting_entries": [
299
+
300
+ ]
301
+ }
302
+ }
303
+ }
304
+ },
305
+ "password_attack": {
306
+ "marie": {
307
+ "password": "polluxtip"
308
+ }
309
+ },
310
+ "vuln_api": {
311
+ "error": "No WPVulnDB API Token given, as a result vulnerability data has not been output.\nYou can get a free API token with 50 daily requests by registering at https://wpvulndb.com/users/sign_up."
312
+ },
313
+ "stop_time": 1573482053,
314
+ "elapsed": 8,
315
+ "requests_done": 47,
316
+ "cached_requests": 52,
317
+ "data_sent": 19085,
318
+ "data_sent_humanised": "18.638 KB",
319
+ "data_received": 42204,
320
+ "data_received_humanised": "41.215 KB",
321
+ "used_memory": 200556544,
322
+ "used_memory_humanised": "191.266 MB"
323
+ }