wmap 2.7.6 → 2.7.7

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
  SHA256:
3
- metadata.gz: f1f2c900ee2ac330d411f3f6496868ea519dd322b236cd00be0b5f3d1d8d43db
4
- data.tar.gz: 054a534426e0b9b99730ac6252a9b0e2424866df914d02f6f7f1bdb925588bc1
3
+ metadata.gz: 559cac84dd38902d968cc9e7327e77115ae3f946020caa21b7743ceb5777a96f
4
+ data.tar.gz: a4dcc0eafc10d7497c47c1f9955774b880ae5cdafa5ed0c6904ef5362087bd98
5
5
  SHA512:
6
- metadata.gz: c591b085614ec050ff8637750dfff57c3238ccf42c2fce9cab985ccd0f3e4761ed085632a9db7f4af87be39e2921b33d330c890c1af87213a134bdd37f43553d
7
- data.tar.gz: 414720066fee25c30b41beb9c7529f7bfffda513e01e1bf4445cfefcd9ecbf2c421aa64db931a4d489845d664705ededb2474c3240750ad12cd2423b21078987
6
+ metadata.gz: 0b430ed1da47cefd8cb8a7bedddd75ed2e7b1dafbfe94cdb2185ad2eb7e26d69a1429e79a9ece6b3cc68d6d964161f092e1143a00c0c64e241e930304d9e5a65
7
+ data.tar.gz: fe4d50b292849e51c202f47083c0837228d11934eb0d71c5a6262da24467480ce26994f5db91bdae5cf3b52dc0e6ef4fef698396575e820779c7420c731d0d87
data/lib/wmap.rb CHANGED
@@ -8,6 +8,7 @@
8
8
  require 'wmap/utils/domain_root'
9
9
  require 'wmap/utils/url_magic'
10
10
  require 'wmap/utils/logger'
11
+ require 'wmap/utils/wp_detect'
11
12
  require 'wmap/utils/utils'
12
13
  require 'wmap/cidr_tracker'
13
14
  require 'wmap/domain_tracker'
@@ -7,16 +7,14 @@
7
7
  #++
8
8
  require "parallel"
9
9
  #require "singleton"
10
- require "open-uri"
11
- require "open_uri_redirections"
12
- require "nokogiri"
13
- require "css_parser"
10
+
14
11
 
15
12
  module Wmap
16
13
  class SiteTracker
17
14
 
18
15
  class WpTracker < Wmap::SiteTracker
19
16
  include Wmap::Utils
17
+ include Wmap::Utils::WpDetect
20
18
  #include Singleton
21
19
 
22
20
  attr_accessor :http_timeout, :max_parallel, :verbose, :sites_wp, :data_dir
@@ -152,27 +150,6 @@ class WpTracker < Wmap::SiteTracker
152
150
  end
153
151
  alias_method :adds, :bulk_add
154
152
 
155
- # logic to determin if it's a wordpress site
156
- def is_wp?(url)
157
- site=url_2_site(url)
158
- if wp_readme?(site)
159
- found=true
160
- elsif wp_css?(site)
161
- found=true
162
- elsif wp_meta?(site)
163
- found=true
164
- elsif wp_login?(site)
165
- found=true
166
- elsif wp_rpc?(site)
167
- found=true
168
- else
169
- found=false
170
- end
171
- return found
172
- rescue => ee
173
- puts "Exception on method #{__method__}: #{ee}: #{url}" if @verbose
174
- end
175
-
176
153
  # Refresh one site entry then update the instance variable (cache)
177
154
  def refresh (target,use_cache=false)
178
155
  return add(target,use_cache)
@@ -209,207 +186,6 @@ class WpTracker < Wmap::SiteTracker
209
186
  # return Hash.new
210
187
  end
211
188
 
212
- # Wordpress detection checkpoint - readme.html
213
- def wp_readme?(url)
214
- site = url_2_site(url)
215
- readme_url=site + "readme.html"
216
- k=Wmap::UrlChecker.new
217
- if k.response_code(readme_url) == 200
218
- k=nil
219
- doc=open_page(readme_url)
220
- title=doc.css('title')
221
- if title.to_s =~ /wordpress/i
222
- return true
223
- else
224
- return false
225
- end
226
- else
227
- k=nil
228
- return false
229
- end
230
- rescue => ee
231
- puts "Exception on method #{__method__} for site #{url}: #{ee}" if @verbose
232
- return false
233
- end
234
-
235
- # Wordpress detection checkpoint - install.css
236
- def wp_css?(url)
237
- site = url_2_site(url)
238
- css_url = site + "wp-admin/css/install.css"
239
- k=Wmap::UrlChecker.new
240
- if k.response_code(css_url) == 200
241
- k=nil
242
- parser = CssParser::Parser.new
243
- parser.load_uri!(css_url)
244
- rule = parser.find_by_selector('#logo a')
245
- if rule.length >0
246
- if rule[0] =~ /wordpress/i
247
- return true
248
- end
249
- end
250
- else
251
- k=nil
252
- return false
253
- end
254
- return false
255
- rescue => ee
256
- puts "Exception on method #{__method__} for site #{url}: #{ee}" if @verbose
257
- return false
258
- end
259
-
260
- # Wordpress detection checkpoint - meta generator
261
- def wp_meta?(url)
262
- site=url_2_site(url)
263
- k=Wmap::UrlChecker.new
264
- if k.response_code(site) == 200
265
- k=nil
266
- doc=open_page(site)
267
- meta=doc.css('meta')
268
- if meta.to_s =~ /wordpress/i
269
- return true
270
- else
271
- return false
272
- end
273
- end
274
- return false
275
- rescue => ee
276
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
277
- return false
278
- end
279
-
280
- # Wordpress detection checkpoint - wp-login
281
- def wp_login?(url)
282
- site=url_2_site(url)
283
- login_url=site + "wp-login.php"
284
- k=Wmap::UrlChecker.new
285
- if k.response_code(login_url) == 200
286
- k=nil
287
- doc=open_page(login_url)
288
- links=doc.css('link')
289
- if links.to_s =~ /login.min.css/i
290
- return true
291
- else
292
- return false
293
- end
294
- end
295
- return false
296
- rescue => ee
297
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
298
- return false
299
- end
300
-
301
- # Wordpress detection checkpoint - xml-rpc
302
- def wp_rpc?(url)
303
- site=url_2_site(url)
304
- rpc_url=site + "xmlrpc.php"
305
- k=Wmap::UrlChecker.new
306
- #puts "res code", k.response_code(rpc_url)
307
- if k.response_code(rpc_url) == 405 # method not allowed
308
- k=nil
309
- return true
310
- end
311
- return false
312
- rescue => ee
313
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
314
- return false
315
- end
316
-
317
- # Extract the WordPress version
318
- def wp_ver(url)
319
- if !wp_ver_readme(url).nil?
320
- puts "WordPress version found by wp_ver_readme method. " if @verbose
321
- return wp_ver_readme(url)
322
- elsif !wp_ver_login(url,"login.min.css").nil?
323
- puts "WordPress version found by login.min.css file. " if @verbose
324
- return wp_ver_login(url,"login.min.css")
325
- elsif !wp_ver_login(url,"buttons.min.css").nil?
326
- puts "WordPress version found by buttons.min.css file. " if @verbose
327
- return wp_ver_login(url,"buttons.min.css")
328
- elsif !wp_ver_login(url,"wp-admin.min.css").nil?
329
- puts "WordPress version found by wp-admin.min.css file. " if @verbose
330
- return wp_ver_login(url,"wp-admin.min.css")
331
- elsif !wp_ver_meta(url).nil?
332
- puts "WordPress version found by wp_ver_meta method. " if @verbose
333
- return wp_ver_meta(url)
334
- else
335
- return nil
336
- end
337
- rescue => ee
338
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
339
- return nil
340
- end
341
-
342
- # Identify wordpress version through the login page
343
- def wp_ver_login(url,pattern)
344
- puts "Check for #{pattern}" if @verbose
345
- site=url_2_site(url)
346
- login_url=site + "wp-login.php"
347
- k=Wmap::UrlChecker.new
348
- #puts "Res code: #{k.response_code(login_url)}" if @verbose
349
- if k.response_code(login_url) == 200
350
- doc=open_page(login_url)
351
- #puts doc.inspect
352
- links=doc.css('link')
353
- #puts links.inspect if @verbose
354
- links.each do |tag|
355
- if tag.to_s.include?(pattern)
356
- puts tag.to_s if @verbose
357
- k=nil
358
- return tag.to_s.scan(/[\d+\.]+\d+/).first
359
- end
360
- end
361
- end
362
- k=nil
363
- return nil
364
- rescue => ee
365
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
366
- return nil
367
- end
368
-
369
- # Identify wordpress version through the meta link
370
- def wp_ver_meta(url)
371
- site=url_2_site(url)
372
- k=Wmap::UrlChecker.new
373
- if k.response_code(site) == 200
374
- doc=open_page(site)
375
- #puts doc.inspect
376
- meta=doc.css('meta')
377
- #puts meta.inspect
378
- meta.each do |tag|
379
- if tag['content'].to_s =~ /wordpress/i
380
- #puts tag.to_s
381
- k=nil
382
- return tag['content'].to_s.scan(/[\d+\.]+\d+/).first
383
- end
384
- end
385
- end
386
- k=nil
387
- return nil
388
- rescue => ee
389
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
390
- return nil
391
- end
392
-
393
- # Wordpress version detection via - readme.html
394
- def wp_ver_readme(url)
395
- site=url_2_site(url)
396
- readme_url=site + "readme.html"
397
- k=Wmap::UrlChecker.new
398
- puts "Res code: #{k.response_code(readme_url)}" if @verbose
399
- if k.response_code(readme_url) == 200
400
- k=nil
401
- doc=open_page(readme_url)
402
- puts doc if @verbose
403
- logo=doc.css('h1#logo')[0]
404
- puts logo.inspect if @verbose
405
- return logo.to_s.scan(/[\d+\.]+\d+/).first
406
- end
407
- k=nil
408
- return nil
409
- rescue => ee
410
- puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
411
- return nil
412
- end
413
189
 
414
190
  end
415
191
  end
@@ -263,7 +263,7 @@ module Wmap
263
263
  return absolute_url
264
264
  rescue => ee
265
265
  puts "Exception on method #{__method__}: #{ee}" if @verbose
266
- return nil
266
+ return nil
267
267
  end
268
268
 
269
269
  # Normalize the URL to a consistent manner in order to determine if a link has been visited or cached before
@@ -292,7 +292,6 @@ module Wmap
292
292
  return url
293
293
  end
294
294
 
295
-
296
295
  # Test the URL and return the response code
297
296
  def response_code (url)
298
297
  puts "Check the http response code on the url: #{url}" if @verbose
@@ -344,6 +343,38 @@ module Wmap
344
343
  return code
345
344
  end
346
345
 
346
+ # Test the URL and return the response headers
347
+ def response_headers (url)
348
+ puts "Check the http response headers on the url: #{url}" if @verbose
349
+ raise "Invalid url: #{url}" unless is_url?(url)
350
+ headers = Hash.new
351
+ url=url.strip.downcase
352
+ timeo = Max_http_timeout/1000.0
353
+ uri = URI.parse(url)
354
+ http = Net::HTTP.new(uri.host, uri.port)
355
+ http.open_timeout = timeo
356
+ http.read_timeout = timeo
357
+ if (url =~ /https\:/i)
358
+ http.use_ssl = true
359
+ #http.ssl_version = :SSLv3
360
+ # Bypass the remote web server cert validation test
361
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
362
+ end
363
+ request = Net::HTTP::Get.new(uri.request_uri)
364
+ response = http.request(request)
365
+ puts "Server response the following: #{response}" if @verbose
366
+ response.each_header do |key,val|
367
+ puts "#{key} => #{val}" if @verbose
368
+ headers.merge!({key => val})
369
+ end
370
+ puts "Response headers on #{url}: #{headers}" if @verbose
371
+ return headers
372
+ rescue => ee
373
+ puts "Exception on method #{__method__}: #{ee}" if @verbose
374
+ return nil
375
+ end
376
+
377
+
347
378
  # Given an URL, open the page, then return the DOM text from a normal user perspective
348
379
  def open_page(url)
349
380
  args = {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :safe, read_timeout: Max_http_timeout/1000}
@@ -0,0 +1,354 @@
1
+ #--
2
+ # Wmap
3
+ #
4
+ # A pure Ruby library for Internet web application discovery and tracking.
5
+ #
6
+ # Copyright (c) 2012-2015 Yang Li <yang.li@owasp.org>
7
+ #++
8
+
9
+ # Utilities for wp_tracker class only; must use with other Utils modules.
10
+ module Wmap
11
+ module Utils
12
+ module WpDetect
13
+ extend self
14
+
15
+ # Main method to detect if it's a wordpress site
16
+ def is_wp?(url)
17
+ site=url_2_site(url)
18
+ if wp_readme?(site)
19
+ return true
20
+ elsif wp_css?(site)
21
+ return true
22
+ elsif wp_meta?(site)
23
+ return true
24
+ elsif wp_login?(site)
25
+ return true
26
+ elsif wp_rpc?(site)
27
+ return true
28
+ elsif wp_gen?(site)
29
+ return true
30
+ elsif wp_load_styles?(site)
31
+ return true
32
+ else
33
+ return false
34
+ end
35
+ rescue => ee
36
+ puts "Exception on method #{__method__}: #{ee}: #{url}" if @verbose
37
+ end
38
+
39
+ # Main method to extract the WordPress version
40
+ def wp_ver(url)
41
+ if !wp_ver_readme(url).nil?
42
+ puts "WordPress version found by wp_ver_readme method. " if @verbose
43
+ return wp_ver_readme(url)
44
+ elsif !wp_ver_login(url,"login.min.css").nil?
45
+ puts "WordPress version found by login.min.css file. " if @verbose
46
+ return wp_ver_login(url,"login.min.css")
47
+ elsif !wp_ver_login(url,"buttons.min.css").nil?
48
+ puts "WordPress version found by buttons.min.css file. " if @verbose
49
+ return wp_ver_login(url,"buttons.min.css")
50
+ elsif !wp_ver_login(url,"wp-admin.min.css").nil?
51
+ puts "WordPress version found by wp-admin.min.css file. " if @verbose
52
+ return wp_ver_login(url,"wp-admin.min.css")
53
+ elsif !wp_ver_meta(url).nil?
54
+ puts "WordPress version found by wp_ver_meta method. " if @verbose
55
+ return wp_ver_meta(url)
56
+ elsif !wp_ver_generator(url).nil?
57
+ puts "WordPress version found by wp_ver_generator method. " if @verbose
58
+ return wp_ver_generator(url)
59
+ elsif !wp_ver_load_styles(url).nil?
60
+ puts "WordPress version found by wp_ver_load_styles method. " if @verbose
61
+ return wp_ver_load_styles(url)
62
+ else
63
+ return nil
64
+ end
65
+ rescue => ee
66
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
67
+ return nil
68
+ end
69
+
70
+ # Wordpress detection checkpoint - readme.html
71
+ def wp_readme?(url)
72
+ site = url_2_site(url)
73
+ readme_url=site + "readme.html"
74
+ k=Wmap::UrlChecker.new
75
+ if k.response_code(readme_url) == 200
76
+ k=nil
77
+ doc=open_page(readme_url)
78
+ title=doc.css('title')
79
+ if title.to_s =~ /wordpress/i
80
+ return true
81
+ else
82
+ return false
83
+ end
84
+ else
85
+ k=nil
86
+ return false
87
+ end
88
+ rescue => ee
89
+ puts "Exception on method #{__method__} for site #{url}: #{ee}" if @verbose
90
+ return false
91
+ end
92
+
93
+ # Wordpress detection checkpoint - install.css
94
+ def wp_css?(url)
95
+ site = url_2_site(url)
96
+ css_url = site + "wp-admin/css/install.css"
97
+ k=Wmap::UrlChecker.new
98
+ if k.response_code(css_url) == 200
99
+ k=nil
100
+ parser = CssParser::Parser.new
101
+ parser.load_uri!(css_url)
102
+ rule = parser.find_by_selector('#logo a')
103
+ if rule.length >0
104
+ if rule[0] =~ /wordpress/i
105
+ return true
106
+ end
107
+ end
108
+ else
109
+ k=nil
110
+ return false
111
+ end
112
+ return false
113
+ rescue => ee
114
+ puts "Exception on method #{__method__} for site #{url}: #{ee}" if @verbose
115
+ return false
116
+ end
117
+
118
+ # Wordpress detection checkpoint - WP meta tag
119
+ def wp_meta?(url)
120
+ site=url_2_site(url)
121
+ k=Wmap::UrlChecker.new
122
+ if k.response_code(site) == 200
123
+ k=nil
124
+ doc=open_page(site)
125
+ meta=doc.css('meta')
126
+ if meta.to_s =~ /wordpress/i
127
+ return true
128
+ else
129
+ return false
130
+ end
131
+ end
132
+ return false
133
+ rescue => ee
134
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
135
+ return false
136
+ end
137
+
138
+ # Wordpress detection checkpoint - WP generator tag
139
+ def wp_gen?(url)
140
+ puts "#{__method__} check for #{url}" if @verbose
141
+ site = url_2_site(url)
142
+ gen_url_1 = site + "feed/"
143
+ gen_url_2 = site + "comments/feed"
144
+ k=Wmap::UrlChecker.new
145
+ if k.response_code(gen_url_1) == 200
146
+ doc=open_page(gen_url_1)
147
+ elsif k.response_code(gen_url_2) == 200
148
+ doc=open_page(gen_url_2)
149
+ else
150
+ k=nil
151
+ return false
152
+ end
153
+ #puts doc.inspect
154
+ gens=doc.css('generator')
155
+ if gens.nil?
156
+ k=nil
157
+ return false
158
+ end
159
+ gens.each do |gen|
160
+ if gen.text.to_s =~ /wordpress/i
161
+ k=doc=nil
162
+ return true
163
+ end
164
+ end
165
+ k=doc=nil
166
+ return false
167
+ rescue => ee
168
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
169
+ return false
170
+ end
171
+
172
+ # Wordpress detection checkpoint - wp-login
173
+ def wp_login?(url)
174
+ site=url_2_site(url)
175
+ login_url=site + "wp-login.php"
176
+ k=Wmap::UrlChecker.new
177
+ if k.response_code(login_url) == 200
178
+ k=nil
179
+ doc=open_page(login_url)
180
+ links=doc.css('link')
181
+ if links.to_s =~ /login.min.css/i
182
+ return true
183
+ else
184
+ return false
185
+ end
186
+ end
187
+ return false
188
+ rescue => ee
189
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
190
+ return false
191
+ end
192
+
193
+ # Wordpress detection checkpoint - xml-rpc
194
+ def wp_rpc?(url)
195
+ site=url_2_site(url)
196
+ rpc_url=site + "xmlrpc.php"
197
+ k=Wmap::UrlChecker.new
198
+ #puts "res code", k.response_code(rpc_url)
199
+ if k.response_code(rpc_url) == 405 # method not allowed
200
+ k=nil
201
+ return true
202
+ end
203
+ return false
204
+ rescue => ee
205
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
206
+ return false
207
+ end
208
+
209
+ # Wordpress detection checkpoint - /wp-admin/load-styles.php
210
+ def wp_load_styles?(url)
211
+ site = url_2_site(url)
212
+ load_styles_url=site + "wp-admin/load-styles.php"
213
+ k=Wmap::UrlChecker.new
214
+ if k.response_code(load_styles_url) == 200 && k.response_headers(load_styles_url).keys.include?("etag")
215
+ k=nil
216
+ return true
217
+ else
218
+ k=nil
219
+ return false
220
+ end
221
+ rescue => ee
222
+ puts "Exception on method #{__method__} for site #{url}: #{ee}" if @verbose
223
+ return false
224
+ end
225
+
226
+ # Identify wordpress version through the login page
227
+ def wp_ver_login(url,pattern)
228
+ puts "Check for #{pattern}" if @verbose
229
+ site=url_2_site(url)
230
+ login_url=site + "wp-login.php"
231
+ k=Wmap::UrlChecker.new
232
+ #puts "Res code: #{k.response_code(login_url)}" if @verbose
233
+ if k.response_code(login_url) == 200
234
+ doc=open_page(login_url)
235
+ #puts doc.inspect
236
+ links=doc.css('link')
237
+ #puts links.inspect if @verbose
238
+ links.each do |tag|
239
+ if tag.to_s.include?(pattern)
240
+ puts tag.to_s if @verbose
241
+ k=nil
242
+ return tag.to_s.scan(/[\d+\.]+\d+/).first
243
+ end
244
+ end
245
+ end
246
+ k=nil
247
+ return nil
248
+ rescue => ee
249
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
250
+ return nil
251
+ end
252
+
253
+ # Identify wordpress version through the meta link
254
+ def wp_ver_meta(url)
255
+ site=url_2_site(url)
256
+ k=Wmap::UrlChecker.new
257
+ if k.response_code(site) == 200
258
+ doc=open_page(site)
259
+ #puts doc.inspect
260
+ meta=doc.css('meta')
261
+ #puts meta.inspect
262
+ meta.each do |tag|
263
+ if tag['content'].to_s =~ /wordpress/i
264
+ #puts tag.to_s
265
+ k=nil
266
+ return tag['content'].to_s.scan(/[\d+\.]+\d+/).first
267
+ end
268
+ end
269
+ end
270
+ k=nil
271
+ return nil
272
+ rescue => ee
273
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
274
+ return nil
275
+ end
276
+
277
+ # Identify wordpress version through the generator tag: <generator>https://wordpress.org/?v=4.9.8</generator>
278
+ def wp_ver_generator(url)
279
+ puts "#{__method__} check for #{url}" if @verbose
280
+ site = url_2_site(url)
281
+ gen_url_1 = site + "feed/"
282
+ gen_url_2 = site + "comments/feed"
283
+ k=Wmap::UrlChecker.new
284
+ if k.response_code(gen_url_1) == 200
285
+ doc=open_page(gen_url_1)
286
+ elsif k.response_code(gen_url_2) == 200
287
+ doc=open_page(gen_url_2)
288
+ else
289
+ k=nil
290
+ return nil
291
+ end
292
+ #puts doc.inspect
293
+ gens=doc.css('generator')
294
+ if gens.nil?
295
+ k=nil
296
+ return nil
297
+ end
298
+ gens.each do |gen|
299
+ if gen.text.to_s =~ /wordpress/i
300
+ k=nil
301
+ return gen.text.to_s.scan(/[\d+\.]+\d+/).first
302
+ end
303
+ end
304
+ k=doc=nil
305
+ return nil
306
+ rescue => ee
307
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
308
+ return nil
309
+ end
310
+
311
+ # Wordpress version detection via - readme.html
312
+ def wp_ver_readme(url)
313
+ site=url_2_site(url)
314
+ readme_url=site + "readme.html"
315
+ k=Wmap::UrlChecker.new
316
+ puts "Res code: #{k.response_code(readme_url)}" if @verbose
317
+ if k.response_code(readme_url) == 200
318
+ k=nil
319
+ doc=open_page(readme_url)
320
+ puts doc if @verbose
321
+ logo=doc.css('h1#logo')[0]
322
+ puts logo.inspect if @verbose
323
+ return logo.to_s.scan(/[\d+\.]+\d+/).first
324
+ end
325
+ k=nil
326
+ return nil
327
+ rescue => ee
328
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
329
+ return nil
330
+ end
331
+
332
+ # Wordpress version detection via - /wp-admin/load-styles.php
333
+ def wp_ver_load_styles(url)
334
+ site=url_2_site(url)
335
+ load_styles_url = site + "wp-admin/load-styles.php"
336
+ k=Wmap::UrlChecker.new
337
+ if k.response_code(load_styles_url) == 200
338
+ headers = k.response_headers(load_styles_url)
339
+ if headers.keys.include?("etag")
340
+ k=nil
341
+ return headers["etag"]
342
+ end
343
+ end
344
+ k=nil
345
+ return nil
346
+ rescue => ee
347
+ puts "Exception on method #{__method__} for url #{url}: #{ee}" if @verbose
348
+ return nil
349
+ end
350
+
351
+
352
+ end
353
+ end
354
+ end
data/version.txt CHANGED
@@ -3,8 +3,8 @@
3
3
  ###############################################################################
4
4
  package = wmap
5
5
  # wmap version 2.0 == web_discovery version 1.5.3
6
- version = 2.7.6
7
- date = 2020-03-20
6
+ version = 2.7.7
7
+ date = 2020-03-24
8
8
 
9
9
  author = Sam (Yang) Li
10
10
  email = yang.li@owasp.org
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.6
4
+ version: 2.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam (Yang) Li
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-20 00:00:00.000000000 Z
11
+ date: 2020-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dnsruby
@@ -303,6 +303,7 @@ files:
303
303
  - lib/wmap/utils/logger.rb
304
304
  - lib/wmap/utils/url_magic.rb
305
305
  - lib/wmap/utils/utils.rb
306
+ - lib/wmap/utils/wp_detect.rb
306
307
  - lib/wmap/whois.rb
307
308
  - settings/discovery_ports
308
309
  - settings/google_keywords.txt