Compare commits

...

901 Commits
2.2 ... 2.9

Author SHA1 Message Date
ethicalhack3r
361c96d746 Version 2.9 release 2015-10-15 13:01:53 +02:00
erwanlr
e7dbf9278d Fixes #873 - mu-plugins detection 2015-10-13 13:17:22 +01:00
erwanlr
6564fddb27 Adds a reminder about updating the terminal-table version 2015-10-13 13:12:12 +01:00
erwanlr
d382874e86 Fixes incorrect detection of the FDP data 2015-10-12 12:57:20 +01:00
erwanlr
91b30bee9f Updates Typhoeus dependency 2015-10-09 19:03:37 +02:00
erwanlr
7804aad776 Removes useless stuff & update the --throttle options text 2015-10-07 22:09:23 +01:00
erwanlr
b7552ac8aa Tried to throttle things 2015-10-07 19:03:52 +01:00
erwanlr
a76c94cccf Let's try Travis container-based infra & caching 2015-09-18 16:13:37 +02:00
Christian Mehlmauer
c0ae5c7cad Merge pull request #864 from wpscanteam/apiv2
new dependency
2015-09-11 21:09:51 +02:00
Christian Mehlmauer
cc55b39b83 new dependency 2015-09-11 15:31:29 +02:00
ethicalhack3r
d8a6884ab6 Only show 'up to date' string when version found 2015-09-09 15:46:44 +02:00
Ryan Dewhurst
5ce3581386 Merge pull request #862 from wpscanteam/apiv2
Apiv2
2015-09-08 21:00:03 +02:00
ethicalhack3r
2208f2a8c0 Implement lesser? method #862 2015-09-08 17:54:32 +02:00
ethicalhack3r
a4a14c7e63 Better version output #862 2015-09-08 17:24:10 +02:00
erwanlr
aa464b476c Fixes a bug where -e vp was displaying non vulnerable plugins - Ref #853 2015-09-06 15:25:29 +01:00
erwanlr
3c92712a6e Uses yajl as JSON parser to reduce memory used 2015-09-06 14:29:41 +01:00
erwanlr
fd0c47f5d7 Adds the latest_version, last_updated and popular? attributes - Ref #853 2015-09-06 14:26:36 +01:00
erwanlr
c03a44d225 Removes useless code 2015-09-06 13:32:13 +01:00
ethicalhack3r
d31d45ba71 Remove unneede newline 2015-09-05 14:10:08 +02:00
ethicalhack3r
db528b27f4 Implement Erwan's feedback #853 2015-09-05 13:49:03 +02:00
ethicalhack3r
e6d29f6f18 New json structure implemented #853 2015-09-03 22:04:44 +02:00
Christian Mehlmauer
e4d6b988ef forgot spec file, #858
Signed-off-by: Christian Mehlmauer <firefart@gmail.com>
2015-08-22 21:52:55 +02:00
Christian Mehlmauer
ec68291bf0 fix #858 2015-08-22 21:50:31 +02:00
ethicalhack3r
3a6a451db1 Update to Ruby 2.2.3 2015-08-21 09:41:06 +02:00
Christian Mehlmauer
7ec095d708 fix duplicate robots.txt entries 2015-08-18 15:55:10 +02:00
ethicalhack3r
57f6206aee Implement Erwan's feedbaxk #853 2015-08-14 21:51:55 +02:00
ethicalhack3r
390f10e83f Remove ArchAssault, 'had to close its doors' 2015-08-14 19:26:52 +02:00
ethicalhack3r
8727935cb2 Fix specs #853 2015-08-14 16:33:57 +02:00
ethicalhack3r
d0e868f556 Enable rspec fail-fast #853 2015-08-14 16:04:26 +02:00
ethicalhack3r
01c357e146 Fix specs #853 2015-08-14 16:03:21 +02:00
ethicalhack3r
a0fed4a9d0 Clean up last commit #853 2015-08-14 00:22:48 +02:00
ethicalhack3r
c4aed0ec89 Initial attempt at implementing apiv2 #853 2015-08-14 00:19:22 +02:00
erwanlr
cc737090a2 Fixes incorrect detection of the username 2015-08-13 10:27:33 +01:00
erwanlr
1652c09e95 Merge pull request #850 from mikicaivosevic/master
Re-factorises a statement
2015-08-12 14:53:43 +01:00
erwanlr
2538b88579 Adds the Accept-Encoding header when updating the DBs - Fixes #852 2015-08-12 14:50:14 +01:00
Mikica Ivosevic
8c2eb63840 update wp_target.rb
Refactor if else statement - wp_content_dir (credits: ethicalhack3r)
2015-07-28 12:41:09 +02:00
erwanlr
36df5ee6e4 Comments debug statement 2015-07-23 14:15:46 +01:00
erwanlr
9720b4edf1 Escapes brackets etc potentially present in Dir.pwd When using Dir.glob - Fixes #840 2015-07-23 14:15:04 +01:00
Christian Mehlmauer
13d35b7607 update email 2015-07-08 14:29:18 +02:00
Christian Mehlmauer
13c2c51cfd update email adress 2015-07-08 13:45:47 +02:00
ethicalhack3r
f43175b0c3 Use older terminal-table gem #841 2015-07-02 10:48:34 +02:00
erwanlr
1508aba8b2 Uses terminal-table 1.5.1 - Fixes #839 2015-06-28 13:54:25 +01:00
erwanlr
5414ab05e5 Restraints terminal-table version - Ref #839 2015-06-27 09:23:26 +01:00
erwanlr
bd5d2db634 Fixes #836 2015-06-26 09:24:17 +01:00
erwanlr
3259dd29d8 Merge pull request #833 from stefancastille/master
Adds a --vhost option (Virtualhost support)
2015-06-26 09:14:39 +01:00
stefancastille
6e56013a95 Update browser.rb 2015-06-25 16:18:04 +02:00
stefancastille
252f762209 Update wp_target.rb 2015-06-25 16:17:03 +02:00
stefancastille
15c0448cf1 Update wpscan_options.rb 2015-06-25 16:13:04 +02:00
erwanlr
4c800bacaa Fixes #835 2015-06-24 11:46:06 +01:00
ethicalhack3r
5902a483b4 Ready for release version 2.8 #834 2015-06-22 18:56:37 +02:00
Christian Mehlmauer
ca73e4b93e fix some code styling issues 2015-06-21 11:05:25 +02:00
Christian Mehlmauer
ace64d88ce Merge branch 'master' of github.com:wpscanteam/wpscan 2015-06-21 11:03:55 +02:00
Christian Mehlmauer
4cc9f7c8b5 merge 2015-06-21 11:03:51 +02:00
Christian Mehlmauer
f4f1390b67 fix some code styling issues 2015-06-21 10:59:57 +02:00
erwanlr
14115761f9 Uses the URI.join to determine the redirection URL - Fix #829 2015-06-18 20:48:43 +01:00
Peter
ac3409e376 Update CHANGELOG 2015-06-18 21:07:12 +02:00
stefancastille
86a73229c0 Update wp_target.rb 2015-06-17 08:46:14 +02:00
stefancastille
cc41b96e88 Update wpscan_options.rb 2015-06-17 08:44:50 +02:00
stefancastille
e16c5584d1 Update wpscan_options.rb 2015-06-17 08:44:04 +02:00
stefancastille
94bab3f550 Update wpscan_options.rb
Add support for virtual hosts
2015-06-17 08:42:59 +02:00
stefancastille
9d04b23fb2 Update browser.rb
add support for virtual hosts
2015-06-16 17:23:25 +02:00
Ryan Dewhurst
2657e5050f Merge pull request #830 from mrnfrancesco/fix-issue-815
Fix issue 815
2015-06-04 09:46:26 +02:00
ethicalhack3r
3d6e5b2b9e Continue if user chooses not to update + db exists 2015-06-03 16:42:23 +02:00
ethicalhack3r
bdd6b9727d Dont update if user chooses default + no DBs exist 2015-06-03 16:40:04 +02:00
Francesco Marano
6c8172c7cf Removed Time.parse('2000-01-01') expedient 2015-06-03 16:03:01 +02:00
Francesco Marano
ae5bae9899 Capitalised 'Last db update' in 'Last DB update' 2015-06-03 15:52:33 +02:00
Francesco Marano
b6bf306042 Removed unnecessary 'return' and '()' 2015-06-03 15:43:58 +02:00
Francesco Marano
9c5196dfec Added last db update to --version option (see #815) 2015-06-03 15:33:14 +02:00
Francesco Marano
3d7b8592ea Defined function to get last db update and removed redundant code 2015-06-03 15:32:34 +02:00
Christian Mehlmauer
e03f7691f2 switch to mitre 2015-05-24 09:02:26 +02:00
Christian Mehlmauer
7a54ac62d6 output path 2015-05-21 23:16:33 +02:00
Christian Mehlmauer
8db06d37d2 check if method exist 2015-05-16 08:21:32 +02:00
Christian Mehlmauer
5ee5e76544 new link types 2015-05-15 22:34:24 +02:00
Christian Mehlmauer
090cd999cb fix rspec 2015-05-12 22:36:07 +02:00
Christian Mehlmauer
50b75354e0 #796, do not swallow exit code 2015-05-12 21:51:15 +02:00
Christian Mehlmauer
c7b6b25851 removed debug output 2015-05-12 21:29:21 +02:00
Christian Mehlmauer
b931df654d fix #796 2015-05-12 21:28:12 +02:00
erwanlr
b5d5c4177d Removes potential spaces in robots.txt entries - Ref #819 2015-05-08 09:50:51 +01:00
Christian Mehlmauer
b22550ea55 fix #814 2015-05-01 22:15:58 +02:00
Christian Mehlmauer
04d50ebea5 more logic 2015-05-01 13:14:23 +02:00
Christian Mehlmauer
202180909c warn the user to update his DB files 2015-05-01 11:29:03 +02:00
erwanlr
0d806e6d74 Ignores potential non version chars in theme version detection - Fixes #816 2015-05-01 09:56:18 +01:00
erwanlr
54f31ebe7f Merge branch 'master' of github.com:wpscanteam/wpscan 2015-05-01 09:50:45 +01:00
erwanlr
227a39d2fa Updates the theme detection pattern - Ref #816 2015-05-01 09:50:20 +01:00
Christian Mehlmauer
99d8faa38b switch from gnutls to openssl 2015-04-30 23:45:10 +02:00
Christian Mehlmauer
9a7afe1549 option to hide banner 2015-04-30 21:39:03 +02:00
erwanlr
e6751e0d89 Remove potential new line at the end of .sha512 files during the update 2015-04-25 15:27:13 +01:00
ethicalhack3r
371f1df830 Remove www subdomain from wpvulndb.com link 2015-04-24 10:12:15 +02:00
Peter
8e1ba352ee Singular and plural sentences 2015-04-21 20:33:32 +02:00
ethicalhack3r
7ebfe42eb2 Install bundler gem README 2015-04-17 16:25:17 +02:00
ethicalhack3r
df514d3b9f Update to Ruby 2.2.2 2015-04-16 18:52:25 +02:00
erwanlr
acae16e7ee Adds the missing spec file - Ref #804 2015-04-15 18:38:57 +01:00
erwanlr
deb8508ea5 Updates the Theme detection pattern - Fixes #804 2015-04-15 18:37:23 +01:00
erwanlr
a4bbf41086 Forces UTF-8 encoding when enumerating usernames - Fixes #801 2015-04-11 12:26:15 +01:00
erwanlr
4fbc535b0c Increases default connect-timeout to 10s - Fixes #803 2015-04-10 16:58:21 +01:00
Ryan Dewhurst
36f6f98ce7 Merge pull request #802 from wpscanteam/remove_wpstoools
Remove wpstools #793
2015-04-10 14:29:57 +02:00
ethicalhack3r
21cc7d604c Remove wpstools #793 2015-04-10 13:43:11 +02:00
erwanlr
44207161e6 Also check for potential timed out requests when updating - Ref #797 2015-04-03 17:48:59 +01:00
erwanlr
dc20ef0754 Increases the timeout values - Ref #797 2015-04-03 17:10:07 +01:00
erwanlr
413ee7a6d3 Adds the HttpError exception - Fixes #792 2015-04-03 16:22:28 +01:00
Christian Mehlmauer
5b94714ca7 remove GHOST warning, fixes #795 2015-04-03 17:00:17 +02:00
Christian Mehlmauer
3675fe1ed7 whitespace 2015-04-03 16:45:41 +02:00
erwanlr
e074a03c40 Fixes Indentation 2015-04-03 12:29:27 +01:00
erwanlr
a7860f72a2 Merge pull request #798 from surfer190/master
Add db checksum to verbose logging during update
2015-04-03 12:25:16 +01:00
surfer190
4b587593ee Add db checksum to verbose logging during update 2015-04-03 10:27:26 +02:00
Christian Mehlmauer
0aa8a97070 additional output 2015-04-02 07:17:58 +02:00
Christian Mehlmauer
3c16f84853 even more output 2015-04-02 00:34:44 +02:00
Christian Mehlmauer
346898e549 more output 2015-04-02 00:21:53 +02:00
erwanlr
bcef4b2de7 Fixes #791 - Rogue character causing the scan of non-wordpress site to crash 2015-04-01 13:09:10 +01:00
erwanlr
e42bf7fd7c Consider the target down after 30 requests timed out requests instead of 10 - Fixes 790 2015-04-01 09:25:17 +01:00
Christian Mehlmauer
48cd0602d8 do not build gh-pages branch 2015-03-30 22:00:39 +02:00
Christian Mehlmauer
814e837ae5 No rdoc and no ri for gems 2015-03-30 21:58:28 +02:00
erwanlr
a58b34eba8 Updates request timeout values to realistic ones (and in seconds) 2015-03-30 16:08:49 +01:00
ethicalhack3r
7d790f8f79 Add blackarch to readme. Fix #789 2015-03-30 16:44:27 +02:00
ethicalhack3r
7cf06f4989 Updated data file #784 2015-03-16 18:35:57 +01:00
ethicalhack3r
61381b7168 Update changelog, change version number #784 2015-03-16 10:49:54 +01:00
Christian Mehlmauer
df598c5900 fix for custom content dir 2015-03-14 16:03:48 +01:00
ethicalhack3r
aed74e029a Update Ruby to 2.2.1 2015-03-03 15:09:32 +01:00
erwanlr
6e01e1b9da Merge pull request #774 from berotti3/berotti3-wpscan
Updates the Username detection pattern
2015-02-21 12:56:06 +00:00
berotti3
42f278aafe Available take username for wordpress 3.0 or lower. 2015-02-21 15:48:28 +09:00
Christian Mehlmauer
884f64addb move version detection to seperate function and change line endings 2015-02-18 18:37:47 +01:00
erwanlr
0c9cf4ddd5 Changes the GHOST warning message to a notice one - Fixes #771 2015-02-13 16:54:02 +01:00
erwanlr
f6dfe0e8dd Avoid iterating over all the vuln items once the right one has been found 2015-02-12 18:57:16 +01:00
ethicalhack3r
9f4ca1add7 Update databases from wpvulnsb.com 2015-02-06 00:21:13 +01:00
ethicalhack3r
1f6edc5852 Add link to ghost msf module #763 2015-02-02 15:36:27 +01:00
ethicalhack3r
a74017f595 Fix #764 2015-01-30 16:18:28 +01:00
Ryan Dewhurst
89bc7609ea Merge pull request #762 from Pablohn26/patch-1
Add patch dependency to fedora installation
2015-01-30 15:45:20 +01:00
ethicalhack3r
2c93c8ef6d Update Ruby version in RVM docs 2015-01-30 15:32:03 +01:00
erwanlr
bfe370fa50 Adds a line about GHOST when XMLRPC is enabled, Fixes #763 2015-01-30 12:02:59 +01:00
Pablo Hinojosa
3b4850e1ba Add patch dependency to fedora installation 2015-01-28 18:52:02 +01:00
erwanlr
b2d1c25b8e Uses inline if 2015-01-26 18:19:49 +01:00
erwanlr
093598ac99 Fixes #760 2015-01-26 18:16:50 +01:00
erwanlr
585d22be46 Adds security-protection plugin detection - Fixes #747 2015-01-25 15:16:11 +01:00
erwanlr
9361cf4b00 Adds a global requests counter - Fixes #746 2015-01-22 21:08:09 +01:00
erwanlr
298e9130dd Fixes #754 2015-01-22 19:48:01 +01:00
Christian Mehlmauer
41ae47f065 sync license 2015-01-21 21:53:54 +01:00
ethicalhack3r
41f7fe1554 Markdown formatting 2015-01-21 17:57:06 +01:00
ethicalhack3r
965be1c0f3 New license 2015-01-21 17:52:34 +01:00
Ryan Dewhurst
fa8ac37e8b New LICENSE 2015-01-21 17:50:02 +01:00
Christian Mehlmauer
d7975b6192 version detection 2015-01-20 15:14:32 +01:00
Christian Mehlmauer
0a0fe55427 improve regex and more samples 2015-01-20 00:35:46 +01:00
Christian Mehlmauer
8e08a20178 missing ? 2015-01-20 00:06:34 +01:00
Christian Mehlmauer
9dd44808ec detect even more 2015-01-20 00:04:49 +01:00
Christian Mehlmauer
507cf1d511 fix regex 2015-01-19 23:41:51 +01:00
Christian Mehlmauer
53f3ce8b1f advanced version detection 2015-01-19 23:38:26 +01:00
erwanlr
2d39e5b1fa Ensures timeouts given to Typhoeus are Integers - Fixes #753 2015-01-18 20:14:41 +01:00
ethicalhack3r
60716dcf81 Update CREDITS 2015-01-11 12:06:51 +01:00
Christian Mehlmauer
82141c2535 refine version detection regex 2015-01-08 23:42:15 +01:00
Christian Mehlmauer
3d6de3fe75 refine version detection regex 2015-01-08 23:34:19 +01:00
erwanlr
03ab396353 Ensures that the version detected by stylesheets is present more than once. Ref #478 2015-01-08 23:26:36 +01:00
erwanlr
6221601376 Fixes a typo 2015-01-08 22:53:14 +01:00
erwanlr
71fdef45c9 Adds passive WP version detection from stylesheets. Fix #478 - Ref #750 2015-01-08 20:45:15 +01:00
ethicalhack3r
147a9e4968 Recommend random-agent on 403 2015-01-08 15:07:02 +01:00
ethicalhack3r
8f7b56da32 Fix typo 2015-01-08 14:15:34 +01:00
ethicalhack3r
4ef2452083 Update Typhoeus to 0.7.0 2015-01-08 14:14:07 +01:00
erwanlr
70cfa03ee8 Adds Addressable to the Gemfile 2015-01-07 10:35:26 +01:00
erwanlr
5bd3d4fd96 Merge pull request #749 from dctabuyz/master
wp_must_use_plugins.rb fix page hash calculation & encode IDN
2015-01-07 10:33:36 +01:00
dctabuyz
c0fe02efb9 Merge pull request #2 from dctabuyz/useActualRubyVersion
use actual ruby interpreter
2015-01-07 14:03:54 +05:00
dctabuyz
b0f4843526 Merge pull request #1 from dctabuyz/encodeIDN
IDN support: encode non-ascii domain names
2015-01-07 14:03:50 +05:00
dctabuyz
a9e161268c IDN support: encode non-ascii domain names 2015-01-07 12:55:26 +05:00
dctabuyz
cbad8857bd use actual ruby interpreter 2015-01-07 12:34:27 +05:00
dctabuyz
5adefda286 Digest::MD5.hexdigest replaced by WebSite.page_hash 2015-01-06 23:05:57 +03:00
dctabuyz
265bfcd7c8 calculate page hash only if response code is valid 2015-01-06 19:11:57 +03:00
dctabuyz
b81a4987d9 fix page hash calculation 2015-01-06 19:10:22 +03:00
ethicalhack3r
6b9c9eb0ed Build icon pointing to CMSScanner 2015-01-02 18:57:14 +01:00
ethicalhack3r
4f82d618dc Ruby 2.2.0 changes #748 2015-01-02 18:19:07 +01:00
ethicalhack3r
b7f7bdb9ac Fix specs #748 2015-01-02 18:17:45 +01:00
ethicalhack3r
c5136fd330 Update copyright date range 2015-01-02 17:00:13 +01:00
Peter
e7e0e886fc Better readable sentence 2015-01-02 13:09:11 +01:00
erwanlr
42e8ab1680 Updates the version pattern to allow letters in the format - Ref #745 2015-01-01 20:13:33 +01:00
erwanlr
ab7b7de60a Detects version in a release date format - Fixes #745 2015-01-01 19:45:10 +01:00
erwanlr
21221d48d0 Bumps the version 2014-12-19 17:26:11 +01:00
Peter
1f1a190c84 Update changelog 2014-12-19 13:25:59 +01:00
ethicalhack3r
82d79c4662 Add statistics to changelog #740 2014-12-19 12:57:55 +01:00
ethicalhack3r
08771a6d5d Update data file #740 2014-12-19 12:53:42 +01:00
ethicalhack3r
e01d18f224 Add RS as special thanks #736 2014-12-19 12:20:47 +01:00
ethicalhack3r
8496650542 Remove references to pyfiscan 2014-12-19 12:19:20 +01:00
Peter
399245cd0f Prepare changelog for next release 2014-12-19 12:04:40 +01:00
ethicalhack3r
adfa5dddcf Remove unneeded code 2014-12-15 16:01:24 +01:00
ethicalhack3r
85971e0e91 Refactor #703 #336 2014-12-15 16:00:30 +01:00
ethicalhack3r
3a3376ec41 Disable logging by default. Implement log option. #703 #336 2014-12-15 15:39:14 +01:00
Christian Mehlmauer
d988b6ccbf fix all the rspecs 2014-12-15 13:12:19 +01:00
Christian Mehlmauer
6654f446a4 try to fix #741 2014-12-15 12:37:46 +01:00
erwanlr
88808db9a5 Fixes the progressbar being overriden by next brute forcing attempts 2014-12-10 22:05:35 +01:00
erwanlr
dfad0fd6bd Implements Firefart solution to avoid mandatory blank newline at the end of the wordlist 2014-12-10 21:56:45 +01:00
erwanlr
3fe49a24c7 Updates the readmes to reflect the new --usernames option 2014-12-10 18:17:04 +01:00
erwanlr
ac609445fb Adds a statement about mendatory newlines at the end of list - Ref #739 2014-12-10 18:11:12 +01:00
erwanlr
0223f74a53 Adds the --usernames option - Fixes #739 2014-12-10 17:59:07 +01:00
erwanlr
607a5b3fda Adds the --usernames option - Fixes #739 2014-12-10 17:58:51 +01:00
erwanlr
e3ac331a71 Removes the theme version check from the readme, unrealistic scenario - Ref #737 2014-12-10 17:01:14 +01:00
erwanlr
e09b4cc76d Adds some readme files to check for plugin versions - Fixes #737 2014-12-10 16:55:00 +01:00
erwanlr
c24ed707ef Improves plugin/theme version detection by looking at the "Version: "- Fixes #732 2014-12-05 18:11:49 +01:00
Christian Mehlmauer
a8c55ddee3 remove malware folder 2014-12-03 23:51:01 +01:00
Christian Mehlmauer
e080835224 updated zip 2014-12-03 23:45:33 +01:00
Christian Mehlmauer
2fe675abce remove malwares 2014-12-03 23:37:31 +01:00
ethicalhack3r
d230221999 Prevent parent theme infinite loop 2014-12-02 16:40:18 +01:00
ethicalhack3r
91a01265e5 Add response code to proxy error output 2014-12-01 11:00:19 +01:00
ethicalhack3r
77286301a7 Add protocol to sucuri url in banner 2014-11-27 21:33:54 +01:00
ethicalhack3r
7c39827c16 Add Sucuri sponsor to banner 2014-11-27 21:30:17 +01:00
Ryan Dewhurst
8f789994eb Merge pull request #729 from fgeek/rmobsoletecode
Remove obsolete code
2014-11-26 13:54:07 +01:00
Henri Salo
79cb9c8142 Remove obsolete code. If use cases are found from active installations these functions can be taken into use with proper unit tests. 2014-11-26 01:18:12 +02:00
erwanlr
de1d047c08 Adds the --version in the help - Fixes #716 2014-11-25 17:44:01 +01:00
erwanlr
8252cb486b Fixes #728 2014-11-25 17:36:11 +01:00
erwanlr
fb8ad72335 WpItems detection: Perform the passive check and filter only vulnerable results at the end if required, fixes #727 2014-11-21 16:49:04 +01:00
Christian Mehlmauer
bc4f0c002b added check for valid credentials 2014-11-19 10:50:04 +01:00
ethicalhack3r
0a53c52645 Add new updating info to docs #715 #691 2014-11-14 11:52:06 +01:00
ethicalhack3r
7941a8accb Update to Ruby 2.1.5 and travis 2014-11-13 17:02:21 +01:00
ethicalhack3r
5389923b34 Expand on readme.html finding output #717 2014-11-01 20:44:30 +01:00
ethicalhack3r
9c1149cb25 Update to Ruby 2.1.4 2014-10-27 14:42:03 +01:00
erwanlr
c5130de805 Merge pull request #711 from Soullivaneuh/db-updater-binary
Fix UTF-8 encode on security db file download
2014-10-20 15:19:57 +01:00
Sullivan SENECHAL
020633503b Fix UTF-8 encode on security db file download 2014-10-20 14:00:58 +02:00
Peter
74b9776801 Give warning if default username 'admin' is still used 2014-10-19 12:28:59 +02:00
ethicalhack3r
5a605d686c License amendment to make it more clear about value added usage 2014-10-13 10:09:04 +02:00
Christian Mehlmauer
4ba9bdf605 Fix #705 2014-10-03 23:07:15 +02:00
Christian Mehlmauer
3f647348c3 Update README.md 2014-10-01 22:02:00 +02:00
erwanlr
de4f90dd72 Adds v2.5.1 2014-09-29 13:49:06 +02:00
ethicalhack3r
4a7b4754f0 Fix wpvulndb url #700 2014-09-29 12:51:48 +02:00
ethicalhack3r
fe05534a95 Update wpstools docs #697 2014-09-27 16:55:11 +02:00
ethicalhack3r
c7c7e75b32 Fix for #698 2014-09-27 16:43:44 +02:00
Christian Mehlmauer
efc6aed388 Ruby 2.1.3 2014-09-27 00:27:19 +02:00
Peter
197521d5b1 Added wpvulndb.com URL 2014-09-26 15:01:44 +02:00
Peter
23420f62df Some files changed for version release 2.5 2014-09-26 11:15:59 +02:00
ethicalhack3r
33149caede Update url 2014-09-26 10:20:38 +02:00
ethicalhack3r
67bec7136b Merge branch 'vdb_intergration'
Conflicts:
	lib/common/models/vulnerability.rb
	spec/lib/common/models/vulnerability_spec.rb
	spec/lib/common/models/wp_item_spec.rb
	spec/lib/common/models/wp_plugin_spec.rb
	spec/lib/common/models/wp_theme_spec.rb
	spec/lib/common/models/wp_version_spec.rb
2014-09-26 10:15:36 +02:00
erwanlr
57a12114dc Updates the data.zip 2014-09-25 17:32:25 +01:00
erwanlr
e32abea46b Adds latest DB files 2014-09-25 13:21:07 +02:00
erwanlr
b12b271a61 Update ruby-progressbar version dependency - Ref #495 2014-09-24 16:20:03 +02:00
Peter
f337cccc68 Update CHANGELOG.md (prepared for release) 2014-09-24 15:22:28 +02:00
Christian Mehlmauer
7f9e178f75 changed some colors 2014-09-22 23:34:42 +02:00
ethicalhack3r
b19696090f Fix for #694 2014-09-21 22:02:30 +02:00
ethicalhack3r
d7488bd402 Fix bug in output 2014-09-21 21:05:49 +02:00
ethicalhack3r
604299a1ac Update VDB url 2014-09-20 10:09:35 +02:00
ethicalhack3r
6800d51347 Undo changes, seem to work with new json ref arrays 2014-09-20 09:32:13 +02:00
ethicalhack3r
7cecd249a8 Update json parsing to reflect new reference arrays 2014-09-20 09:28:48 +02:00
erwanlr
a214ea9341 Adds pathname require statement - Fix #693 2014-09-19 12:33:12 +02:00
ethicalhack3r
884a19b13d Link to new vdb in references output 2014-09-18 10:24:55 +02:00
ethicalhack3r
771f4ae766 Update docs to reflect new updating logic 2014-09-18 09:49:17 +02:00
Peter
9273398c0e Shorter if statement 2014-09-18 00:07:13 +02:00
Peter
a5ed6ad134 Fix if statement 2014-09-17 23:47:54 +02:00
Peter
1bbf575e91 Small code clean 2014-09-17 22:36:39 +02:00
Peter
49582fd841 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-09-17 18:51:52 +02:00
Peter
bdaf12c1fa Exit program after --update 2014-09-17 18:50:29 +02:00
Peter
ef27c98056 Little output change and coloring 2014-09-17 18:39:58 +02:00
erwanlr
722f3ce384 Adds config file to check - Ref #689 2014-09-17 18:03:25 +02:00
erwanlr
9d084a7b2f Merges the db-update branch 2014-09-17 16:12:12 +02:00
erwanlr
c31a06e255 Removes the source code updaters 2014-09-17 16:01:41 +02:00
erwanlr
ea36c79c26 Adds a missing verbose output 2014-09-13 14:00:59 +02:00
erwanlr
cbe33caeef Removes the ListGenerator plugin from WPStools 2014-09-13 13:57:45 +02:00
erwanlr
8b44354fec Fixes travis failure 2014-09-12 20:47:47 +02:00
erwanlr
619302cd11 Adds the empty data dir 2014-09-12 19:20:44 +02:00
erwanlr
3e94ca11df DB Update: fixes a bug due to .chomp, Adds verbose output 2014-09-12 19:18:56 +02:00
erwanlr
f818778e0a Removes all files from data/ 2014-09-12 18:46:30 +02:00
Peter
280a91f139 Update CHANGELOG 2014-09-12 16:10:16 +02:00
erwanlr
82367a81c9 Deletes the json spec (files to test not longer in the repo) 2014-09-12 12:50:46 +02:00
erwanlr
93b1234d0f Removes useless code 2014-09-12 12:47:55 +02:00
erwanlr
571bc5cf90 Removes the exit used for testing 2014-09-12 12:43:51 +02:00
erwanlr
91de353307 Adds the db update system 2014-09-12 12:43:06 +02:00
Christian Mehlmauer
7ec394a8f2 update data files 2014-09-11 21:03:17 +02:00
Christian Mehlmauer
451c6c07ca new generate method, fix #657 2014-09-11 21:03:16 +02:00
erwanlr
a6b0548426 Potenial fix for 'marshal data too short' error - Ref #685 2014-09-11 20:04:24 +02:00
erwanlr
f89463c4d8 Adds specs for relative URI in Location headers - Ref #686 2014-09-11 19:40:47 +02:00
erwanlr
3be63d85f2 Merge pull request #687 from Soullivaneuh/magic-slash
Re-build redirection url if relative URI
2014-09-11 17:53:06 +01:00
Sullivan SENECHAL
d271b63aa4 Re-build redirection url if begin with slash '/' 2014-09-11 15:35:00 +02:00
erwanlr
fb46fd7101 Removes the vuln.xsd 2014-09-10 17:31:44 +02:00
erwanlr
64513bb9d1 Adds db files 2014-09-10 17:27:06 +02:00
erwanlr
ef56f82de9 Deleting db file 2014-09-10 17:20:15 +02:00
erwanlr
f775379f42 Simulating db update before release 2014-09-10 17:19:35 +02:00
erwanlr
1b377dd674 Testing db stuff 2014-09-10 17:08:12 +02:00
erwanlr
99837127a6 Testing the ignore of db files 2014-09-10 16:57:02 +02:00
erwanlr
f2d205e576 Adds DB update system 2014-09-10 16:31:04 +02:00
ethicalhack3r
bf5bde0e36 Slight changes 2014-09-10 16:27:08 +02:00
ethicalhack3r
18314adce2 Update license #435 2014-09-10 16:23:26 +02:00
erwanlr
d1a7a0ee1f Db Update draft 2014-09-10 12:52:52 +02:00
Christian Mehlmauer
eb73025338 directory listing 2014-09-05 18:27:06 +02:00
Christian Mehlmauer
66cd3e08a0 Detect directory listing in upload folder 2014-09-05 18:25:46 +02:00
Peter
aa8e525681 Prepare CHANGELOG, added stats 2014-09-04 21:47:04 +02:00
erwanlr
7a36f89124 Adds WP 4.0 fingerprints 2014-09-04 20:13:02 +02:00
erwanlr
3e56acab64 Merge pull request #679 from jeffmcjunkin/master
Update README - fix typo in Ubuntu 14.04 instructions
2014-09-02 20:13:38 +01:00
jeffmcjunkin
012670b349 Update README - fix typo in Ubuntu 14.04 instructions
"sudo apt-get install" line had "build-essentials" instead of "build-essential"
2014-09-02 12:05:16 -07:00
erwanlr
44cb13644a Typo, sort of ... 2014-09-02 20:43:37 +02:00
erwanlr
bd8e6db092 Don't try to play with the comments in passive detection, just ignore them 2014-09-02 20:42:17 +02:00
erwanlr
96ae8ade5d Fixes the remove_conditional_comments function 2014-09-02 18:34:01 +02:00
erwanlr
04b1cee71e Factorises a crappy spec - Kudos to @hlissner for this one ;) 2014-09-02 17:12:56 +02:00
Peter
bd07cf859f Prepare CHANGELOG for the new WPScan release 2014-09-02 10:22:54 +02:00
Christian Mehlmauer
e937906647 Be more verbose when no version can be detected 2014-09-01 20:00:59 +02:00
erwanlr
03618f38b5 Improves the Plugins & Themes passive detection, fixes #674 2014-09-01 18:28:09 +02:00
Christian Mehlmauer
94fdddb056 Merge branch 'master' of github.com:wpscanteam/wpscan 2014-08-30 12:18:55 +02:00
Christian Mehlmauer
12dfc60f75 Added detection for Yoast Wordpress SEO plugin 2014-08-30 12:18:31 +02:00
erwanlr
a383d12061 Ensures to give a string to Typhoeus 2014-08-29 20:41:17 +02:00
Christian Mehlmauer
3131c6cb5d fix #673 2014-08-29 07:27:29 +02:00
erwanlr
5f53297f58 Also ensure to not process empty Location headers 2014-08-15 23:00:42 +02:00
erwanlr
cebd808674 Ensures a nil location is not processed when enumerating usernames 2014-08-15 22:54:17 +02:00
erwanlr
30a07f037e Fixes #661 - Don't hash directories named like a file 2014-08-14 17:42:08 +02:00
Peter
4ef1387781 Small change in output (coloring) 2014-08-10 13:19:58 +02:00
ethicalhack3r
1578ce2ebd Fix for infinite loop in wpstools #653 2014-08-07 23:05:46 +02:00
Christian Mehlmauer
391fd6c960 Fix Travis 2014-08-07 22:18:22 +02:00
Christian Mehlmauer
ef7ac1d77b Fix #626 2014-08-07 22:01:23 +02:00
Christian Mehlmauer
ca2610d74f Add exception so ruby wpscan.rb http://domain.com is detected 2014-08-07 21:38:37 +02:00
erwanlr
8d8aa52b9b Adds WP 3.9.2, 3.8.4 & 3.7.4 fingerprints - Ref #652 2014-08-06 21:31:00 +02:00
Ryan Dewhurst
84ec0c3964 Merge pull request #647 from wpvulndb/master
Pull Request from WPVULNDB
2014-08-01 14:29:58 +02:00
wpvulndb
f55736599e Commit from WPVULNDB 2014-08-01 14:23:02 +02:00
wpvulndb
b890235a82 Commit from WPVULNDB 2014-08-01 14:23:00 +02:00
wpvulndb
2cc3bc5759 Commit from WPVULNDB 2014-08-01 14:22:54 +02:00
ethicalhack3r
ca100ef7e9 Merge branch 'json_data'
Conflicts:
	data/plugin_vulns.xml
	data/theme_vulns.xml
2014-08-01 13:34:34 +02:00
ethicalhack3r
721cad75a2 Add file 2014-08-01 13:27:40 +02:00
erwanlr
c3110a4ab7 Merge pull request #643 from fgeek/2012-6652
Address CVE-2012-6652. Closes #623
2014-07-31 20:30:28 +01:00
Henri Salo
452aabf89b Address CVE-2012-6652. Closes #623 2014-07-31 22:17:23 +03:00
Peter
adcd6734ef Added Paid Membership Pro Vuln. Fix #627 2014-07-31 20:11:37 +02:00
Peter
a68c1f1cf7 Added Novana Vuln. Fix #630 2014-07-31 20:05:19 +02:00
Peter
712eaf9f1e Corrected a typo 2014-07-31 19:52:09 +02:00
Peter
7e119fa2ac Added Uploadify Vuln. Fix #634 2014-07-31 19:30:54 +02:00
ethicalhack3r
ac90ad0129 Dont use fail 2014-07-31 15:39:48 +02:00
ethicalhack3r
6b61e273a0 Use fail 2014-07-31 15:38:02 +02:00
ethicalhack3r
aab8e85f9d Implement FireFart's feedback 2014-07-31 15:31:07 +02:00
ethicalhack3r
3959892c20 Fix wpstools check-vuln-ref-urls 2014-07-31 15:26:13 +02:00
ethicalhack3r
420ad6cd37 Fix rspecs for new json 2014-07-31 14:08:49 +02:00
Peter
664bff544e git push origin masterMerge branch 'fgeek-vulndb4' 2014-07-31 13:28:23 +02:00
Peter
6716de6635 Fix merge conflict 2014-07-31 13:27:30 +02:00
Peter
4f50fbdfe4 Added new CVE's. Fix #572 2014-07-31 13:16:51 +02:00
Henri Salo
009abb3fd5 References. Added old starbox-voting FPD vulnerability. 2014-07-31 14:08:20 +03:00
Peter
191b4402e1 Added new CVE's. Update #572 2014-07-31 12:39:12 +02:00
Peter
13bc347897 Added new CVE's. Update #572 2014-07-31 12:13:27 +02:00
ethicalhack3r
187e2f1330 Correct wp_vulns file 2014-07-31 12:07:33 +02:00
ethicalhack3r
8d2ec115f5 Changed vuln data references to url 2014-07-31 11:56:14 +02:00
Peter
921596f6f8 Added WP-e-Commerce Vulns. Fix #640 2014-07-31 11:43:42 +02:00
Peter
a00987efc8 Added Email-Newsletter Vuln. Fix #632 2014-07-31 11:29:33 +02:00
Peter
b1a35d9df8 Added Uploader Vuln. Update #633 2014-07-31 11:21:22 +02:00
ethicalhack3r
08dfa4cab2 Implemented Erwan's feedback 2014-07-31 11:14:22 +02:00
erwanlr
63ca695b51 Merge pull request #629 from fgeek/vulndb2
Fixed error in plugin name.
2014-07-31 08:30:02 +01:00
erwanlr
55310247c2 Merge pull request #636 from fgeek/vulndb3
Added references.
2014-07-31 08:29:33 +01:00
Henri Salo
456334af75 Added references. 2014-07-31 09:16:27 +03:00
Henri Salo
38ce047d9e Fixed error in plugin name. 2014-07-31 08:35:21 +03:00
ethicalhack3r
14be7dead5 Work on json database file parsing, still needs some work. 2014-07-30 18:34:42 +02:00
erwanlr
ab2e368c6f Fixes #625 - Only parse styles when needed 2014-07-30 15:36:00 +01:00
Peter
0e7ca594ed Added CVE-2014-4938. Update #572 2014-07-30 16:30:12 +02:00
Peter
f742287496 Added CVE-2014-4937 and CVE-2014-4938. Update #572 2014-07-30 16:18:31 +02:00
Peter
cb37919e76 Added Simple Slider Vuln. Fix #614 2014-07-30 16:02:09 +02:00
Peter
933fc26b66 Merge pull request #624 from fgeek/GeoPlaces
geoplaces4 also uses name GeoPlaces4beta
2014-07-30 15:51:23 +02:00
Henri Salo
8ea94175ac geoplaces4 also uses name GeoPlaces4beta 2014-07-30 16:36:41 +03:00
erwanlr
013fb12c00 Improves the version comparison 2014-07-30 12:13:23 +01:00
erwanlr
1e6b5a1e4d Improves the version comparison 2014-07-30 12:11:04 +01:00
erwanlr
aed20db328 Merge pull request #621 from fgeek/vulndb
haiku-minimalist-audio-player osvdb reference
2014-07-30 12:02:49 +01:00
Henri Salo
332684f4e2 haiku-minimalist-audio-player osvdb reference 2014-07-30 13:47:01 +03:00
erwanlr
12d275c26b Updates bulletproof-securty vulns 2014-07-30 10:56:30 +01:00
ethicalhack3r
9b1312c7d9 Incorrect DB 2014-07-29 23:15:56 +02:00
Christian Mehlmauer
874b069357 Added metasploit module 2014-07-29 20:40:45 +02:00
erwanlr
03a917c326 Merge pull request #616 from fgeek/CVE-2012-6651
CVE-2012-6651/vitamin
2014-07-29 08:23:04 +01:00
erwanlr
6a5560a0b1 Merge pull request #617 from fgeek/media-library-categories
media-library-categories OSVDB ID correction
2014-07-29 08:22:36 +01:00
Henri Salo
6b0bbdc605 media-library-categories OSVDB ID correction 2014-07-29 08:11:43 +03:00
Henri Salo
4c0608d47d CVE-2012-6651/vitamin 2014-07-29 08:06:56 +03:00
Christian Mehlmauer
2e1aede8b4 Added metasploit module 2014-07-28 22:44:46 +02:00
Peter
2c3e968710 Added CVE-2014-4942. Update #572 2014-07-28 20:54:00 +02:00
Peter
ecf45803e0 Added Magazine Basic Theme vuln. Fix #597 2014-07-28 20:27:42 +02:00
Peter
2e4ede4251 Change WPtouch. Fix #587 2014-07-28 10:46:51 +02:00
Peter
4f52649f28 Change portable-phpmyadmin. Fix #583 2014-07-27 21:37:00 +02:00
Peter
11e58ff88d Added OSVDB 71966. Fix #607 2014-07-27 20:55:38 +02:00
erwanlr
a7c097a5a9 Merge pull request #612 from fgeek/pluginvulns2
CVE-2013-0721/wp-php-widget. Closes #599
2014-07-27 17:34:06 +01:00
erwanlr
8c53686697 Merge pull request #611 from fgeek/pluginvulns
mp3-jplayer vulnerability, references
2014-07-27 17:31:59 +01:00
Henri Salo
6754f1467a CVE-2013-0721/wp-php-widget. Closes #599 2014-07-27 19:25:11 +03:00
Henri Salo
fb98b3cc9a mp3-jplayer vulnerability, references 2014-07-27 19:18:25 +03:00
erwanlr
729f6fd308 Merge pull request #610 from fgeek/vulndb2
Adds detection for wp-imagezoom download.php file upload php code execution vulnerability
2014-07-27 13:56:56 +01:00
erwanlr
e2b0711271 Merge pull request #609 from fgeek/vulndb
Added references. Also closes #608.
2014-07-27 13:50:52 +01:00
Henri Salo
eb8cffb1a8 Adds detection for wp-imagezoom download.php file upload php code execution vulnerability 2014-07-27 15:48:45 +03:00
Henri Salo
d7e534ca74 Added references. Also closes #608. 2014-07-27 15:34:22 +03:00
erwanlr
347e261748 Merge pull request #605 from fgeek/user-photo
CVE-2013-1916/user-photo
2014-07-27 10:49:21 +01:00
Henri Salo
7deb9c4fbf CVE-2013-1916/user-photo 2014-07-27 12:42:27 +03:00
erwanlr
c1ab5ad929 Merge pull request #604 from fgeek/vulndb
Added references
2014-07-26 23:40:05 +01:00
Henri Salo
2686c37aa1 Added references 2014-07-27 01:29:00 +03:00
erwanlr
45edb9973d Merge pull request #602 from fgeek/dbdata2
Added references
2014-07-26 21:04:03 +01:00
Henri Salo
2bd4ce08c4 Added references 2014-07-26 22:30:36 +03:00
erwanlr
460d1ac86c Merge pull request #601 from fgeek/dbdata
Added references for plugin vulns
2014-07-26 20:28:29 +01:00
erwanlr
9df8da0b6f Merge pull request #596 from fgeek/theme-famous
famous OSVDB item
2014-07-26 20:22:36 +01:00
erwanlr
baaf85f567 Merge pull request #595 from fgeek/readme-change
Fixed typo, added note about pyfiscan as it is made for that reason.
2014-07-26 20:22:20 +01:00
erwanlr
6ffe817e86 Merge pull request #593 from fgeek/2013-7102
CVE-2013-7102/optimizepress fixed in version
2014-07-26 20:21:49 +01:00
erwanlr
edbdbdac56 Merge pull request #592 from fgeek/classipress
CVE-2011-5257/classipress
2014-07-26 20:21:21 +01:00
erwanlr
11c3c6d20e Merge pull request #591 from fgeek/buddypress
CVE-2012-2109/buddypress
2014-07-26 20:21:10 +01:00
erwanlr
81019b9fc8 Merge pull request #589 from fgeek/changes
Added references
2014-07-26 20:20:55 +01:00
erwanlr
4514123279 Merge pull request #582 from fgeek/CVE-2011-4562
CVE-2011-3981/allwebmenus-wordpress-menu-plugin, CVE-2011-4562/redirection
2014-07-26 20:20:38 +01:00
Henri Salo
0fc4a448aa New references 2014-07-26 22:19:24 +03:00
Henri Salo
bde51cc946 famous OSVDB item 2014-07-26 21:27:20 +03:00
Henri Salo
4f7e29163f Fixed typo, added note about pyfiscan as it is made for that reason. 2014-07-26 21:23:53 +03:00
Henri Salo
7837d1f6e8 CVE2013-7102/optimizepress fixed in version 2014-07-26 21:14:31 +03:00
Henri Salo
99bb300559 CVE-2011-5257/classipress 2014-07-26 21:09:12 +03:00
Henri Salo
f1108ef7d1 CVE-2012-2109/buddypress 2014-07-26 20:56:38 +03:00
Henri Salo
bd6cfec71c Added references. 2014-07-26 20:43:18 +03:00
Henri Salo
ef3ed86096 CVE-2011-4562/redirection 2014-07-26 18:26:28 +03:00
Henri Salo
097898b120 CVE-2011-3981/allwebmenus-wordpress-menu-plugin 2014-07-26 17:05:06 +03:00
Ryan Dewhurst
6fbf2643a1 Merge pull request #577 from fgeek/wysija-newsletters
CVE-2014-4725
2014-07-24 23:29:58 +02:00
Ryan Dewhurst
a1989c105e Merge pull request #576 from fgeek/readme
Added make to Debian installation guide, which is needed in minimal installation.
2014-07-24 23:29:00 +02:00
Henri Salo
97426e6d7d CVE-2014-4725 2014-07-24 13:12:09 +03:00
Henri Salo
b2e1b65ae5 Added make to Debian installation, which is needed in minimal installation. 2014-07-24 12:57:13 +03:00
Peter
06c8d34451 Added CVE-2014-4944. Update #572 2014-07-22 12:36:00 +02:00
erwanlr
ecba81ea5b Fixes #575 - Typo in a package name 2014-07-20 19:42:04 +02:00
Christian Mehlmauer
26e0066c82 Only output if different from style_url 2014-07-16 18:38:39 +02:00
Christian Mehlmauer
6ebb9b6f66 Fixed false positive theme detection 2014-07-16 18:25:35 +02:00
Christian Mehlmauer
102e30c29a Added metasploit module for WPTouch 2014-07-15 23:36:41 +02:00
ethicalhack3r
a8a716e0bd Change metasploit url to updated one 2014-07-15 14:35:56 +02:00
ethicalhack3r
9e23aaa5c0 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-07-15 13:21:55 +02:00
ethicalhack3r
9b059c3985 Add wptouch vuln 2014-07-15 13:21:30 +02:00
Peter
2d3c7e65d2 Added CVE's. Update #567 2014-07-15 00:03:10 +02:00
Peter
9e7d3462ab Added CVE's. Update #567 2014-07-14 07:28:32 +02:00
Peter
aececf980b Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-07-11 18:22:42 +02:00
Peter
e5f3b4bf1d Added some missing Theme names 2014-07-11 18:20:30 +02:00
ethicalhack3r
9b629bb1c4 Backticks to 4 spaces 2014-07-11 17:07:33 +02:00
ethicalhack3r
9e39a57231 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-07-11 17:03:24 +02:00
ethicalhack3r
47e9608aa2 Update links in MD 2014-07-11 17:02:29 +02:00
erwanlr
2f012caa3e Removes the remaining bacticks 2014-07-11 17:01:21 +02:00
ethicalhack3r
e835fc3ac0 MD test 2014-07-11 16:59:50 +02:00
ethicalhack3r
5240e9ce98 MD test 2014-07-11 16:57:59 +02:00
ethicalhack3r
b8ab2c839f MD test 2014-07-11 16:56:59 +02:00
ethicalhack3r
1ee81b90bf Change bacticks to 4 spaces in MD 2014-07-11 16:52:54 +02:00
ethicalhack3r
1354f2debb Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-07-11 16:50:31 +02:00
ethicalhack3r
7373ea24d8 Markdown test 2014-07-11 16:50:17 +02:00
erwanlr
7fc03461ba MD Test 2014-07-11 16:49:47 +02:00
ethicalhack3r
a5e45e2d79 Markdown test 2014-07-11 16:43:00 +02:00
ethicalhack3r
42cf2ac19b Markdown test 2014-07-11 16:42:10 +02:00
ethicalhack3r
6098d064a7 Markdown test 2014-07-11 16:41:16 +02:00
ethicalhack3r
cd79f576b7 Change markdown back 2014-07-11 16:39:18 +02:00
ethicalhack3r
4039a4a820 Quick markdown test 2014-07-11 16:38:17 +02:00
ethicalhack3r
919085d829 Use absolute URL for repo page 2014-07-11 16:26:02 +02:00
ethicalhack3r
88f27b39c4 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-07-11 16:25:24 +02:00
ethicalhack3r
b1f38a51fe Use local WPScan logo 2014-07-11 16:25:06 +02:00
Peter
ef0253ee9e Added CVE's. Update #554 2014-07-11 16:20:46 +02:00
ethicalhack3r
3cf33af0e2 Add build-essentials requirement to Ubuntu > 14.04 2014-07-11 15:24:14 +02:00
Ryan Dewhurst
3eaa060aac Merge pull request #565 from fgeek/readme
Updated installation instr. for GNU/Linux Debian.
2014-07-11 12:01:32 +02:00
Henri Salo
cf4efee340 Updated installation instr. for GNU/Linux Debian. 2014-07-11 10:04:08 +03:00
Peter
0b04a96e15 Added CVE's. Update #554 2014-07-10 19:50:34 +02:00
Peter
c1d928c503 Added CVE's. Fix #564 2014-07-10 18:20:22 +02:00
Christian Mehlmauer
479b21a722 Replace all occurences 2014-07-10 00:30:33 +02:00
Christian Mehlmauer
ceeaeaf487 better username extraction 2014-07-10 00:24:20 +02:00
Peter
d5179b742b Added CVE's. Update #554 2014-07-09 22:09:55 +02:00
Peter
b38055c497 Added CVE-2014-4560, CVE-2014-4563. Update #554 2014-07-09 09:45:40 +02:00
Peter
ff1e9e63d6 Added CVE-2014-4603. Fix #550 2014-07-09 09:27:17 +02:00
Peter
a1a4293851 Added CVE-2014-4588. Fix #521 2014-07-09 09:17:51 +02:00
Peter
f39cc8ee53 Update vuln db 2014-07-07 21:02:06 +02:00
Peter
9fc5b90f25 Update vuln db 2014-07-06 23:19:55 +02:00
erwanlr
e7c9c884e9 Adds the NextGen Arbitrary File Upload vuln 2014-07-06 22:16:49 +02:00
Christian Mehlmauer
0469128917 They released another fix 2014-07-06 10:58:16 +02:00
erwanlr
656e38eae7 Updates the timthumbs list 2014-07-05 21:24:09 +02:00
Christian Mehlmauer
95721350da Added metasploit exploit 2014-07-03 21:47:41 +02:00
erwanlr
98d9e87356 Changes VersionCompare#is_newer_or_same? by lesser_or_equal? 2014-07-03 12:33:27 +02:00
erwanlr
a69cb4f4c2 Fixes #515 - theme-my-login LFI added 2014-07-03 10:05:33 +02:00
erwanlr
f42ea74e26 Adds the Parallax timthumb file location. Ref #506 2014-07-02 13:03:05 +02:00
erwanlr
d9b86f9922 Fix Timthumb RCE detection for version 2.0 (which was excluded) 2014-07-02 12:17:14 +02:00
erwanlr
605e9cfe6d Changes the vulnerable version of timthumb to 1.33 instead of 1.34 2014-07-01 22:10:01 +02:00
erwanlr
dd53c7b200 Fix #506 - Timthumbs WebShot RCE detection 2014-07-01 21:44:39 +02:00
ethicalhack3r
f9b10dc9db Added wysija-newsletters plugin file upload found by Sucuri 2014-07-01 18:04:09 +02:00
erwanlr
daef491d3e Changes the email in the Readme 2014-06-30 20:59:26 +02:00
erwanlr
95fde17d97 Updates the recommended ruby version 2014-06-30 20:57:06 +02:00
erwanlr
2c6cbb7799 Fix #509 - Stored XSS & CSRF in simple-share-buttons-adder 2014-06-30 20:51:33 +02:00
erwanlr
3498d4317a Fix #513 - login-rebuilder CSRF 2014-06-30 20:45:30 +02:00
erwanlr
611ef49d03 Merge pull request #511 from fgeek/pluginvulns
CVE-2014-4030 assigned
2014-06-28 10:08:53 +01:00
Henri Salo
fd2212db7b CVE-2014-4030 assigned 2014-06-27 18:37:25 +03:00
Christian Mehlmauer
4d8b8ba64c Changed text
in single sites it seems to be user registration, and
blog registration on multusite installations
2014-06-27 13:17:55 +02:00
Christian Mehlmauer
32fe70a354 Output registration URL 2014-06-27 00:15:55 +02:00
Christian Mehlmauer
e2652df546 Added fixed_in 2014-06-26 23:50:49 +02:00
ethicalhack3r
d1427d5f99 Add url to featured-comments plugin 2014-06-26 22:04:53 +02:00
Peter
ef814f3602 Added CVE-2012-6649. Fix #508 2014-06-26 15:21:24 +02:00
Peter
00acc8289e Added CVE-2012-6649. Fix #508 2014-06-26 15:20:05 +02:00
Peter
341f980974 Added CVE-2012-6649. Fix #509 2014-06-26 14:44:53 +02:00
Peter
1b7ea5bed3 Update vuln db 2014-06-26 08:35:02 +02:00
Peter
ee1c92ffa0 Small change vuln db 2014-06-25 15:08:59 +02:00
Peter
0114a50f61 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-06-25 11:51:56 +02:00
Peter
c7c9e105ef Update vuln db 2014-06-25 11:50:20 +02:00
ethicalhack3r
3e31e71116 Added old disqus sqli bug. Poss fake... 2014-06-25 11:28:17 +02:00
ethicalhack3r
e74b1d2210 Add new disqus RCE vuln 2014-06-25 11:25:41 +02:00
Ryan Dewhurst
1ca2f28187 Merge pull request #507 from fgeek/pluginvulns
CVEs for old issues
2014-06-25 09:39:55 +02:00
Henri Salo
9fc75b651e CVE for OSVDB item 85134 2014-06-25 10:02:48 +03:00
Henri Salo
934a6acdd2 CVE for OSVDB item 107297 2014-06-25 09:54:56 +03:00
Peter
88adc5676f Update vuln db 2014-06-24 22:11:53 +02:00
Peter
f27483ea7b Merge pull request #505 from fgeek/readmechanges
Changed copyright year. Small change to prerequirements.
2014-06-24 15:00:46 +02:00
Henri Salo
6a11c620cf Changed copyright year. Small change to prerequirements. 2014-06-24 12:15:57 +03:00
Peter
7281f15051 Add wp-football vulnerabilities in db 2014-06-24 10:58:01 +02:00
Peter
b1196fb09b Small change to correct XML tag 2014-06-19 20:38:24 +02:00
Peter
27fb875c0d Small change to correct XML tag 2014-06-19 20:36:22 +02:00
Peter
3cdeac5dfb Fix #503. Update CREDITS 2014-06-19 12:49:31 +02:00
Peter
e1c47ce5c3 Fix #490. Add a disclaimer file. 2014-06-19 09:51:23 +02:00
Peter
d9523cb1bc Update vuln db 2014-06-17 22:17:08 +02:00
Peter
bd2403388e Added CVE-2014-3921. Fix #497 2014-06-17 21:38:41 +02:00
Christian Mehlmauer
7511208b8b Update README 2014-06-17 16:56:36 +02:00
Christian Mehlmauer
4586d44c1f Update README.md 2014-06-17 16:55:43 +02:00
Peter
717e5b07d1 Added CVE-2014-3961. Fix #498 2014-06-17 13:19:56 +02:00
ethicalhack3r
2c6082f454 Tell Travis to ignore Ruby 1.9.2 errors 2014-06-17 12:12:05 +02:00
Christian Mehlmauer
586239292b Try to fix Travis 2014-06-17 10:59:02 +02:00
Christian Mehlmauer
7bd1c87bf6 Update README 2014-06-17 07:12:26 +02:00
Christian Mehlmauer
6eded4cdc2 Update README.md 2014-06-17 07:12:18 +02:00
Christian Mehlmauer
5e693f2274 Update README.md 2014-06-17 07:12:01 +02:00
Christian Mehlmauer
b0e3aeed6c Update README 2014-06-17 07:08:41 +02:00
Peter
dd9ef38636 Removed useless line in Vuln db 2014-06-16 09:52:43 +02:00
Peter
32df782470 Added CVE-2013-3937. Fix #499 2014-06-16 07:46:07 +02:00
Peter
1d9162930c Added CVE-2013-3257. Fix #500 2014-06-15 09:31:46 +02:00
Peter
152d02bcbe Added CVE-2013-3258. Fix #501 2014-06-15 09:23:35 +02:00
ethicalhack3r
2cc4dc724b Made title of some vulns smaller 2014-06-11 23:22:17 +02:00
Peter
1ee14f4c69 Update vuln db 2014-06-10 08:47:25 +02:00
Christian Mehlmauer
7748019a76 Update pre-commit-hook.rb 2014-06-07 00:28:37 +02:00
Peter
8241a1d8a3 Update README. Fixes: #496, #482 and #477 2014-06-06 09:36:33 +02:00
Peter
83e3373561 Update vuln db 2014-06-04 09:08:41 +02:00
erwanlr
c8c126d444 Rspec 3.0 support 2014-06-02 22:06:49 +02:00
erwanlr
c12b1d0670 Pre-transpec 2014-06-02 22:02:44 +02:00
Peter
5caf4f45a9 Fix #494. All in one SEO pack vulnerability 2014-06-02 20:25:58 +02:00
Christian Mehlmauer
8f51ff2910 Merge branch 'master' of github.com:wpscanteam/wpscan 2014-05-31 15:59:26 +02:00
Christian Mehlmauer
6b8436f825 Replace some '/' by File.join 2014-05-31 15:59:05 +02:00
erwanlr
c4b146b36b Fixes #489 - Adds bib2html CVE 2014-05-29 14:53:42 +02:00
erwanlr
098b14884d Fixes #491 - DZS Video Gallery Content Spoofing & XSS 2014-05-29 14:46:54 +02:00
Peter
47d8818028 Update vuln db 2014-05-28 11:18:58 +02:00
erwanlr
e3bc50a163 Fixes #487 2014-05-27 14:55:42 +02:00
Christian Mehlmauer
34ba6a86c9 set ruby version and gemset for rvm users 2014-05-27 09:45:16 +02:00
Peter
2369ef53ac Update vuln db 2014-05-25 22:02:52 +02:00
erwanlr
8d3907ff65 Fixes the location of the robots.txt check 2014-05-22 17:45:10 +02:00
erwanlr
2760eaca85 Adds ruby 2.1.2 to Travis 2014-05-22 17:41:01 +02:00
erwanlr
af0319cc66 Adds a --cookie option. Ref #485 2014-05-22 17:34:09 +02:00
Peter
e050539747 Update vuln db 2014-05-22 09:20:08 +02:00
erwanlr
451756c764 Merge pull request #484 from fgeek/master
Address CVE-2014-3210
2014-05-21 19:22:50 +02:00
Henri Salo
afa40df7ad Address CVE-2014-3210 2014-05-21 20:03:26 +03:00
Henri Salo
fb2b606d26 Address CVE-2014-3210 2014-05-21 20:02:55 +03:00
Peter
e0ebd47730 Update vuln db 2014-05-18 00:31:25 +02:00
Peter
e97f4e8020 Fix for Jetpack plugin false positive. Fix: #481 2014-05-15 08:05:12 +02:00
erwanlr
79f07b7350 Properly removes the colour sequence from log. Fixes #480 2014-05-14 18:33:23 +02:00
Peter
c1c8829536 Update vuln db 2014-05-13 22:42:28 +02:00
Peter
ef20371562 Timthumb in MoneyTheme
See also: http://packetstormsecurity.com/files/123819/
2014-05-12 20:34:31 +02:00
ethicalhack3r
c08f275cf7 Updated Gemfile 2014-05-12 16:57:34 +02:00
ethicalhack3r
6f995fe350 Updated ruby-progressbar to 1.5.0 2014-05-12 16:23:08 +02:00
Peter
68aec92d3a Update vuln db 2014-05-11 00:04:37 +02:00
erwanlr
dda328210c Bumps the version 2014-05-10 16:10:57 +02:00
erwanlr
c3f4f232e3 Updates the plugin & theme lists 2014-05-10 16:09:54 +02:00
erwanlr
302f1da066 Ensures a clean abort of Hydra, Ref #461 2014-05-10 10:23:24 +02:00
erwanlr
a6e65d33dd Updates ruby-progressbar constraint 2014-05-10 10:02:14 +02:00
Christian Mehlmauer
7b0cb29466 XML check rspecs
Example output:
  1) XML content each plugin vuln needs a type node
     Failure/Error: @result.should have(0).items, "Items:\n#{@result.join("\n")}"
       Items:
       ReFlex Gallery 1.4 - reflex-gallery.php Direct Request Path Disclosure
       Gallery Plugin 3.8.3 - gallery-plugin.php filename_1 Parameter Arbitrary File Access
       EZPZ One Click Backup <= 12.03.10 - OS Command Injection
       BulletProof Security - Security Log Script Insertion Vulnerability
       Portable phpMyAdmin - /pma/phpinfo.php Direct Request System Information Disclosure
       HMS Testimonials 2.0.10 - CSRF
       HMS Testimonials 2.0.10 - XSS
       platinum_seo_pack.php - s Parameter Reflected XSS
       Email Newsletter 8.0 - 'option' Parameter Information Disclosure Vulnerability
2014-05-09 17:58:04 +02:00
ethicalhack3r
a3eedb14f4 Added missing type nodes 2014-05-09 15:38:30 +02:00
ethicalhack3r
74d73a1d17 Added missing type node 2014-05-09 15:29:18 +02:00
ethicalhack3r
92e7e8516c Added missing type node 2014-05-09 15:25:26 +02:00
ethicalhack3r
61ac0b7d20 Added missing type node 2014-05-09 15:22:30 +02:00
ethicalhack3r
8b4ea7fd7c Added missing type 2014-05-09 15:15:47 +02:00
ethicalhack3r
90846cf770 Added missing type to vuln 2014-05-09 15:05:01 +02:00
ethicalhack3r
a9e33ea282 Added missing type 2014-05-09 14:58:57 +02:00
ethicalhack3r
eea006e787 Added missing type node 2014-05-09 14:53:27 +02:00
Peter
9e58098e5c Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-05-09 08:32:08 +02:00
Peter
ff49f574d4 Merge branch 'droope-patch-1' 2014-05-09 08:30:18 +02:00
Peter
599d816a88 Solve Git Merge conflict 2014-05-09 08:13:33 +02:00
Pedro Worcel
4b0dd04114 Update plugin_vulns.xml
add <vulnerability> tag
2014-05-09 10:49:55 +12:00
erwanlr
36a0fbf181 Adds 3.9.1 fingerprints 2014-05-08 21:20:36 +02:00
erwanlr
3cfd8f40da Removes the Travis failure allowed for ruby-2.1.0 2014-05-08 15:06:27 +02:00
Christian Mehlmauer
23173c4bf4 Merge pull request #476 from droope/patch-2
Update plugin_vulns.xml
2014-05-08 09:21:10 +02:00
Pedro Worcel
722c31ccd9 Update plugin_vulns.xml
Hi there,

adding http://packetstormsecurity.com/files/126521/wpphotogallery-xsrf.txt to the list, security researcher was a bad boy and didn't specify version or anything.

Ta,
Pedro
2014-05-08 17:40:15 +12:00
Pedro Worcel
7623a01272 Update plugin_vulns.xml
Added code exec + others in iMember360is. I assume the name of the plugin is "infusion4wp" due to the fact that you can download a zip file from here http://docs.imember360.com/welcome/ which has that as the zip root folder.
2014-05-08 17:23:22 +12:00
Peter
1b90fdce73 Update vuln db 2014-05-06 09:14:29 +02:00
Peter
ce57db9526 Fixed vulnerabilities in statistics 2014-05-05 18:42:36 +02:00
Peter
8b9e47cd11 Update vuln db 2014-05-05 00:24:37 +02:00
Peter
a87a261b80 Markup the command help 2014-05-02 15:31:09 +02:00
Peter
989d561679 Small updates for the --no-color argument switch 2014-05-02 15:04:59 +02:00
Peter
b349990b19 Added a --no-color argument switch 2014-05-02 14:43:16 +02:00
Peter
2104b49cee Output: Give 'Fixed in' an informational tag' 2014-05-02 13:42:10 +02:00
Peter
77606efb77 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-05-01 12:09:04 +02:00
Peter
6164ad2ab1 Fix #472. WPScan stops after redirection if not WordPress website 2014-05-01 12:08:03 +02:00
erwanlr
a60d58dcb0 Merge pull request #473 from fgeek/master
CVE-2014-3114
2014-05-01 11:47:02 +02:00
Henri Salo
4e45d17ad2 CVE-2014-3114 2014-05-01 12:13:43 +03:00
erwanlr
c8e614d064 Allows ruby-2.1.0 to fail until a solution is found 2014-04-30 23:22:09 +02:00
Peter
544beeb078 Update vuln db 2014-04-30 22:25:00 +02:00
erwanlr
a00f0d8367 Fixes #464 - Readmes updated to reflect recent changes about the config file & batch mode 2014-04-30 16:59:17 +02:00
Peter
ea57290792 Added ArchAssault distro - WPScan comes pre-installed with this distro 2014-04-27 16:56:01 +02:00
Peter
603a4afaf3 Merge pull request #470 from wpscanteam/layout-423
New improved Layout (see #423)
2014-04-27 16:02:54 +02:00
Peter
19e2772729 Update wpscan.rb 2014-04-27 15:49:15 +02:00
Peter
82ebb82a5f Small change in code 2014-04-27 15:40:12 +02:00
Peter
516ae6b68c Fix git merge problem 2014-04-27 15:32:10 +02:00
Peter
59225a4b9c Update vuln db 2014-04-25 15:43:55 +02:00
Peter
1da9d36ecc Update vuln db 2014-04-22 21:11:15 +02:00
Peter
0787e5c738 Update vuln db - #467 2014-04-22 13:04:51 +02:00
erwanlr
8a661088bb Bumping 2.4 2014-04-17 15:00:03 +02:00
erwanlr
91659a32af Ful Plugin List regenerated 2014-04-17 13:22:46 +02:00
Peter
5f8cd7e5c4 Update CHANGELOG for release 2.4 - Only release date needs to be changed 2014-04-17 12:49:35 +02:00
Peter
bc3f62a766 Update CHANGELOG for release 2.4 - Statistics to be done 2014-04-17 12:03:26 +02:00
erwanlr
92faedb4a5 Theme lists updated 2014-04-17 10:12:27 +02:00
erwanlr
6f7008dd91 WP 3.9 fingerprints 2014-04-16 22:52:17 +02:00
erwanlr
447589541f Fixes #458 - Follow the location when hashing a page 2014-04-16 15:55:34 +02:00
erwanlr
45f5f50262 Fixes #456 - stop-user-enumeration detection & script for bypass 2014-04-16 15:09:41 +02:00
erwanlr
f77a27ecc3 Merge branch 'follow-redirect-with-batch' 2014-04-15 22:58:39 +02:00
Peter
09de2eb194 Update vuln db 2014-04-15 22:53:24 +02:00
erwanlr
7747a5665b Ref #454 - --follow-redirection now works along with the --batch option 2014-04-15 22:48:22 +02:00
erwanlr
aa617b5106 typo 2014-04-15 17:02:45 +02:00
erwanlr
8038e2e01a Ref #455 - Fails with a message if the target returns a 403 during the wordpress check 2014-04-15 17:02:22 +02:00
erwanlr
212b068a8d Adds the referer to request 2014-04-15 16:24:19 +02:00
Peter
2bcea0b566 Update vuln db 2014-04-15 09:19:22 +02:00
Peter
512d4f2fb9 Update for issue #448 - Plupload Unspecified XSS 2014-04-14 23:48:27 +02:00
erwanlr
b524546e9c WP 3.8.3 & 3.7.3 fingerprints 2014-04-14 22:32:38 +02:00
ethicalhack3r
f91e287207 Fix typo 2014-04-14 19:52:19 +02:00
ethicalhack3r
0fcf0a6a88 Fix typo and string appending 2014-04-14 19:49:54 +02:00
ethicalhack3r
f9f3d74a3b Add MWR CVE-2014-0166 link 2014-04-14 19:29:45 +02:00
Peter
2bfd0f2cc0 Update vuln db 2014-04-14 14:22:33 +02:00
Peter
cdeb2eebe5 Update vuln db 2014-04-14 14:19:43 +02:00
ethicalhack3r
5134516afc Theme name not in correct format 2014-04-14 12:50:48 +02:00
Peter
e14b5d99eb Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-04-14 12:39:06 +02:00
Peter
a0375f52cf Update Jetpack vuln. See issue #452 2014-04-14 12:37:22 +02:00
ethicalhack3r
69dbcf3947 Plugin name did not adhere to usual format, updated. 2014-04-14 12:36:44 +02:00
Peter
79387730bc Update vuln db 2014-04-13 22:34:53 +02:00
ethicalhack3r
3e6b019044 Fix CVE value 2014-04-11 20:35:03 +02:00
Peter
1886b90be7 Update vuln db 2014-04-11 18:42:03 +02:00
erwanlr
85421f9b4b Fix #454 --batch option added 2014-04-11 16:45:44 +02:00
ethicalhack3r
3749ef8433 Added some plugin vulns reported by dxw 2014-04-11 15:46:29 +02:00
Christian Mehlmauer
dfb3e98fec Fixes Issue #453
-) Fixed options
-) Fixed "unrecognized method 'verbose' for nil:NilClass when supplying an unknown option
2014-04-10 01:14:38 +02:00
Peter
a40442c8a9 Removed 'Total WordPress Sites in the World' counter from stats 2014-04-11 10:27:24 +02:00
Peter
a7396d6bee Update vuln db 2014-04-11 10:19:04 +02:00
erwanlr
507c4c67ff Ref #451 - Do not rely only on files in wp-content for fingerprinting 2014-04-11 00:05:31 +02:00
erwanlr
cbdc04e929 Ref #451 - Do not rely only on files in wp-content for fingerprinting 2014-04-11 00:04:17 +02:00
ethicalhack3r
a6582a1da3 Jetpack plugin critical update vuln added #452 2014-04-10 23:06:12 +02:00
Peter
3d8f3df8f1 Update CVE-2014-0165 and CVE-2014-0166 (Ref #448) 2014-04-10 08:40:48 +02:00
ethicalhack3r
7b8dbdedb5 Amend new SQLi vuln title 2014-04-09 23:25:53 +02:00
ethicalhack3r
53b13eacaa Added CVE-2014-0165 #448 2014-04-09 23:03:22 +02:00
ethicalhack3r
fcc76d99ef Wrong CVE format 2014-04-09 16:36:18 +02:00
ethicalhack3r
9a2141025a Added WP 3.8.1 vulns. See #448 2014-04-09 16:30:20 +02:00
erwanlr
bfe3285375 WP 3.8.2 & 3.7.2 Fingerprints added (Ref #448) 2014-04-08 21:24:10 +02:00
Peter
5cf9c6e073 Update vuln db - changed some titles 2014-04-08 09:28:24 +02:00
Peter
5e00d77e69 Merge pull request #447 from droope/arb-fileupload-add
add more templates which are vulnerable to 1337day.com/exploit/22090
2014-04-08 09:13:18 +02:00
Peter
a4dfb05d0c Update vuln db 2014-04-08 09:04:52 +02:00
Pedro Worcel (Security-Assessment.com)
97a798e357 add more templates which are vulnerable to 1337day.com/exploit/22090 2014-04-08 11:40:38 +12:00
Ryan Dewhurst
47aafe88f8 Merge pull request #444 from droope/patch-2
Wordpress Templatic Themes CSRF
2014-04-07 09:23:22 +02:00
Ryan Dewhurst
bc356ab8e5 Merge pull request #443 from droope/patch-1
wordpress plugin "wp-business-intelligence" RCE
2014-04-07 09:22:20 +02:00
Your Name
dd5cdfd848 fix indentation 2014-04-07 12:19:22 +12:00
Pedro Worcel
de2cb08a6b Wordpress Templatic Themes CSRF
Add http://1337day.com/exploit/22091

Couldn't verify myself because themes are paid, but files seem to exist and are possibly vulnerable.
2014-04-07 12:07:13 +12:00
Pedro Worcel
9a2550ad48 wordpress plugin "wp-business-intelligence" RCE
Hi there,

Found this exploit, adding.
2014-04-07 11:21:00 +12:00
erwanlr
2f6e4c0736 typo 2014-04-06 14:51:57 +02:00
erwanlr
a9c5cbf11f Only output error trace if verbose if enabled 2014-04-05 13:44:20 +02:00
erwanlr
facd0d398a Fix #439 - Detect if the target goes down during the scan 2014-04-05 13:12:57 +02:00
erwanlr
1b2fc5d403 Merge pull request #441 from fgeek/master
Added CVE for OSVDB item 104402.
2014-04-05 11:50:30 +02:00
Henri Salo
9d290aa533 Added CVE for OSVDB item 104402. 2014-04-05 12:34:52 +03:00
erwanlr
9046291128 Fix #440 - Old wpscan repo links removed 2014-04-05 11:21:21 +02:00
Peter
59131b6b51 Update vuln db 2014-04-03 09:29:40 +02:00
erwanlr
3725a23c49 Fix #438 - New choice added when a redirection is detected 2014-04-02 19:43:17 +02:00
erwanlr
812c42c89a Site5 Themes Email Spoofing vuln updated 2014-04-02 18:06:32 +02:00
Peter
285d7d3265 Update vuln db 2014-04-01 15:16:04 +02:00
erwanlr
134789602b Ruby 2.1.1 added to Travis 2014-03-31 21:01:21 +02:00
Peter
55f49b5f78 Update vuln db 2014-03-31 20:55:06 +02:00
ethicalhack3r
cd8067285f Couple more 404s fixed 2014-03-31 12:50:22 +02:00
Peter
10c09e9375 Update vuln db 2014-03-30 15:40:36 +02:00
erwanlr
bb70c0733a Merge pull request #436 from fgeek/master
Added CVEs
2014-03-30 11:22:41 +02:00
Henri Salo
3dad2b31bb Added CVE for OSVDB 89924 2014-03-30 11:33:51 +03:00
Henri Salo
7844acd70f Added CVE for OSVDB 90406 2014-03-30 11:29:53 +03:00
Peter
f01b0b3404 Update vuln db 2014-03-29 21:53:03 +01:00
erwanlr
10fee6e144 allow-php-in-posts-and-pages SQLi vuln updated 2014-03-29 17:27:11 +01:00
erwanlr
c4c8a8b703 Memory improvements during wp-items enumerations 2014-03-29 12:16:23 +01:00
ethicalhack3r
7053a1e42a Fixed broken link checker, fixed some broken links 2014-03-28 19:06:29 +01:00
ethicalhack3r
fd3c4261de Added wp-html-sitemap and gd-star-rating plugin vulns 2014-03-28 18:32:57 +01:00
erwanlr
d21e475d12 Captcha plugin v2.12-3.8.1 captcha bypass vuln added 2014-03-27 22:49:33 +01:00
erwanlr
48bdf0b2a9 Ref #427 - Note added about version numbering changed 2014-03-27 18:09:50 +01:00
Christian Mehlmauer
ac1c652854 new plugin has a new folder name. missed that 2014-03-26 01:01:22 +01:00
erwanlr
3b286de9db Fix #434 CVEs added 2014-03-27 15:22:22 +01:00
Christian Mehlmauer
cbcb696cfd added leaflet-maps-marker vulnerabilities (sorry there are no details on the last one it was a pentest at work) 2014-03-26 00:54:37 +01:00
Peter
13320ea8cc Update vuln db 2014-03-26 21:34:43 +01:00
erwanlr
bdf45f6a0b Themes & Plugins list updated 2014-03-25 15:18:48 +01:00
Peter
667b1e9f99 Update vuln db 2014-03-24 23:17:23 +01:00
FireFart
e52e82fb78 formatting 2014-03-22 18:12:47 +01:00
FireFart
78cb3f8ee2 Merge remote-tracking branch 'origin/master' into layout-423 2014-03-22 18:01:22 +01:00
FireFart
a0f476fb24 switch over to nist
Closes #301
2014-03-22 17:30:03 +01:00
Christian Mehlmauer
13c32bfe53 Merge pull request #417 from wpscanteam/useragent
Issue #415 - Useragent
2014-03-23 16:25:02 +01:00
FireFart
a54da059ef Closes #431 2014-03-22 16:29:53 +01:00
FireFart
76fe0def4f rspec 2014-03-22 16:23:20 +01:00
FireFart
9a25b747ae Merge branch 'useragent' of github.com:wpscanteam/wpscan into useragent 2014-03-22 16:09:02 +01:00
FireFart
aeefd3e873 rspecs 2014-03-22 16:08:21 +01:00
FireFart
f9efdcb654 config file 2014-03-22 16:08:21 +01:00
FireFart
be672cbcba Added more CLI options 2014-03-22 16:08:21 +01:00
FireFart
c4ca7e471a Add random-agent 2014-03-22 16:08:21 +01:00
FireFart
bbce082ec2 Issue #415 2014-03-22 16:08:21 +01:00
FireFart
781214a2f0 rspecs 2014-03-22 16:05:10 +01:00
FireFart
7942eaf64b config file 2014-03-22 14:47:31 +01:00
erwanlr
36cd3c0c42 No newline at the end of .yml 2014-03-21 10:16:31 +01:00
erwanlr
620bccb102 Forcing Travis notify the team 2014-03-21 10:13:44 +01:00
erwanlr
3ca79bebc7 Proper fix for #429 2014-03-21 09:50:57 +01:00
erwanlr
a1add0cfdb Hotfix for #429 2014-03-21 09:32:38 +01:00
erwanlr
dc22ad1ca1 Hotfix for #429 2014-03-21 09:32:08 +01:00
Peter
010df5a081 Update vuln db 2014-03-21 07:58:24 +01:00
Peter
71e8b22849 Update vuln db 2014-03-20 09:49:57 +01:00
Peter
17dcc7ec80 Undo even more, wrong branch 2014-03-16 23:16:40 +01:00
Peter
138c17d4a3 Update vuln db 2014-03-16 23:08:16 +01:00
Peter
565eed99ef Undo last commit, wrong branch 2014-03-16 22:58:42 +01:00
Peter
1f13c47a46 Update vuln db 2014-03-16 22:30:37 +01:00
Peter
ec5d12c940 Changed layout and coloring 2014-03-08 22:47:43 +01:00
Peter
bac19b2486 Fix #425 2014-03-08 21:04:48 +01:00
Peter
5fbfa1453c Layout changes with new colors 2014-03-07 23:16:50 +01:00
Peter
dab2001dcc Equal output layout for interaction questions 2014-03-07 16:08:19 +01:00
Peter
5bff9eb4d8 Update vuln db 2014-03-07 09:33:47 +01:00
Peter
e2102bdefa Fix #424 2014-03-07 09:07:17 +01:00
Peter
2a3e06610f Update Fix #388 2014-03-06 20:29:20 +01:00
erwanlr
d186240cfc Fix #421 - wp-syntax vuln corrected 2014-03-05 14:22:39 +01:00
Peter
0f0d4f06bb Update vuln db 2014-03-05 08:21:03 +01:00
ethicalhack3r
249af325c9 Added thecotton theme and google analytics mu plugin vulns. #419 #418 2014-03-03 23:27:05 +01:00
ethicalhack3r
a7532f2154 Fix for fuplicate entry in plugin xml file. Fixes 1c0a00e9b2. 2014-03-03 11:36:21 +01:00
Peter
1c0a00e9b2 Update vuln db 2014-03-03 09:39:16 +01:00
FireFart
b1b8066fe5 Added more CLI options 2014-03-01 14:09:05 +01:00
FireFart
25c2f3adad Add random-agent 2014-03-01 09:01:52 +01:00
FireFart
68e47d70fd Issue #415 2014-02-28 21:49:01 +01:00
Peter van der Laan
af3b3f4ee5 Update vuln db 2014-02-28 13:35:46 +01:00
erwanlr
1b63d514ac reverting last commit 2014-02-27 14:38:40 +01:00
erwanlr
c6453a6e10 Useless code removed 2014-02-27 11:15:17 +01:00
Peter
3f3f5fdaa0 Update #388. Added flash-player-widget plugin 2014-02-27 09:58:33 +01:00
erwanlr
2f72721ee2 Fingerprinting Dev script removed, see https://github.com/erwanlr/Fingerprinter 2014-02-26 15:59:50 +01:00
erwanlr
92d99c6d64 Fix #380 - Redirects in WP 3.6-3.0 2014-02-26 13:05:25 +01:00
erwanlr
f3b26b1101 Fix #414 - Duplicate plugin vulns 2014-02-26 12:48:31 +01:00
erwanlr
4f0a5bcf15 Fix #411 - Old WP Core CVEs added 2014-02-26 12:30:21 +01:00
erwanlr
ffb1a8ad84 Fix #409 media-file-renamer XSS 2014-02-26 11:52:09 +01:00
Peter
70c07cf731 Update vuln db 2014-02-25 20:06:35 +01:00
erwanlr
b2d946794b Fix #413 - Check the version of the Timthumbs files found 2014-02-24 18:17:22 +01:00
Peter
90617c5433 Update WP Forum Server vulnerabilities - fix error 2014-02-24 09:57:16 +01:00
Peter
278dc34b44 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-02-24 09:44:08 +01:00
Peter
dcd5d7b534 Update WP Forum Server vulnerabilities 2014-02-24 09:41:03 +01:00
Peter
2d48465e1d Merge pull request #412 from nashe/patch-2
Fix 412. aryo-activity-log vulnerability
2014-02-24 08:45:16 +01:00
nashe
6bda493f6e Update plugin_vulns.xml
Adding the full path disclosure in "aryo-activity-log" plugin; it was fixed 3 days ago.
2014-02-23 22:52:02 +01:00
Peter van der Laan
5459b8bb7a Update vuln db 2014-02-20 20:00:25 +01:00
Peter
e410939bde Update vuln db 2014-02-19 10:22:48 +01:00
ethicalhack3r
047de2d747 Added Directory traversal in NextGEN Gallery 2.0.0 2014-02-18 22:14:09 +01:00
Peter
997f4d35c2 Update vuln db 2014-02-15 22:00:02 +01:00
erwanlr
ca547f1239 Right Theme name (Kiddo) + associated Secunia ID 2014-02-15 00:53:20 +01:00
Peter
c9665773e2 Merge branch 'master' of https://github.com/wpscanteam/wpscan 2014-02-14 11:31:55 +01:00
Peter
eeeea6b735 Update vuln db 2014-02-14 11:29:29 +01:00
erwanlr
bbd6a2b5d5 Typo in a theme name (Kiddo -> Kidoo) + RCE -> UPLOAD 2014-02-13 21:22:42 +01:00
Peter
d33db2a0fe Update vuln db 2014-02-12 11:34:41 +01:00
Peter
1f2588d677 Update vuln db 2014-02-12 10:16:02 +01:00
Peter
f30bad5c5a Change: v2.3 2014-02-11 13:06:48 +01:00
erwanlr
5a5bf77b1c Plugins & Themes updated 2014-02-11 10:41:47 +01:00
Peter
22c6597005 CHANGELOG ready for launching v2.3 2014-02-11 09:20:07 +01:00
Peter
9761d70f23 Update vuln db 2014-02-10 13:29:47 +01:00
erwanlr
518135006c Fix #406 CVEs added 2014-02-08 16:17:32 +01:00
Peter
9327eb7e75 Update vuln db 2014-02-06 19:34:33 +01:00
Peter
13080ade9e Update vuln db 2014-02-06 18:43:26 +01:00
erwanlr
9c3947a7b1 Fix #404 - Brute forcing issue over https 2014-02-05 21:52:55 +01:00
Peter
f33cbcaa53 Update vuln db 2014-02-05 09:32:51 +01:00
Peter van der Laan
2c8fe7971f Update vuln db 2014-02-04 21:06:26 +01:00
Peter
85e10330cb Removed 'fake' WordPress vuln 2014-02-04 07:51:56 +01:00
erwanlr
a02fd4b6f6 Ruby 2.1.0 added to Travis 2014-02-03 23:54:34 +01:00
Peter
9395119749 Update vuln db 2014-02-03 13:55:18 +01:00
erwanlr
2c0bbe9082 Updated the version of WebMock required 2014-02-02 15:13:26 +01:00
Peter van der Laan
b1535864aa Update vuln db 2014-02-02 11:52:50 +01:00
Peter van der Laan
fd880da057 Update vuln db 2014-02-02 11:32:43 +01:00
Peter van der Laan
6c62b06e46 Update vuln db 2014-02-02 09:24:21 +01:00
erwanlr
b44869ec49 Ref #400 cve for nokia-mapsplaces XSS 2014-01-31 16:01:57 +01:00
Peter
b3a6251b04 Update vuln db 2014-01-30 12:34:35 +01:00
Peter
80667bc38f Update vuln db 2014-01-30 11:01:40 +01:00
Peter
cff35ea845 Update vuln db 2014-01-28 09:22:01 +01:00
Peter
cb93397ae4 Update vuln db 2014-01-27 19:21:10 +01:00
Peter
c805a8d624 Update plugin_vulns.xml 2014-01-27 13:18:16 +01:00
Peter
3f775c081c Update plugin_vulns.xml 2014-01-27 12:36:55 +01:00
Peter
864b892da0 Update plugin_vulns.xml 2014-01-27 12:19:24 +01:00
erwanlr
f7773d2113 Fix #398 Removed a fake vuln in WP Super Cache 2014-01-27 09:44:21 +01:00
Peter
cf471d0f36 Update plugin_vulns.xml 2014-01-26 13:37:49 +01:00
Peter
d14791679c Update plugin_vulns.xml 2014-01-24 22:34:40 +01:00
erwanlr
f358d34e54 Better fingerprints 2014-01-24 11:37:58 +01:00
erwanlr
7ba3a7dd2f Fix #397 WP 3.8.1 Fingerprint 2014-01-24 00:30:35 +01:00
Peter
196af51e2c Update plugin_vulns.xml 2014-01-23 11:21:30 +01:00
Peter
cbe959da66 Update plugin_vulns.xml 2014-01-22 09:53:14 +01:00
erwanlr
9512fd4cca Fix #396 - easy-media-gallery vuln updated 2014-01-20 19:26:54 +01:00
Peter
e2b6853c46 Update plugin_vulns.xml 2014-01-18 19:56:59 +01:00
erwanlr
2578bfd0ff Fix #395 CVEs added 2014-01-18 14:45:26 +01:00
Peter
277fff5f2c Update plugin_vulns.xml 2014-01-13 21:20:13 +01:00
Peter
4c72e9d206 Update plugin_vulns.xml 2014-01-13 09:16:48 +01:00
Peter
7a44a303e5 Update plugin_vulns.xml 2014-01-13 09:10:02 +01:00
Peter
e3796045eb Update plugin_vulns.xml 2014-01-12 23:22:53 +01:00
Peter
85ad8d8b9f Better string concatenation in code 2014-01-09 21:53:01 +01:00
Peter
f737c92988 Removed duplicate vuln 2014-01-09 21:02:52 +01:00
Peter
5d05ecaee3 Update plugin_vulns.xml 2014-01-09 20:33:41 +01:00
ethicalhack3r
8cc83a8df9 Added fixed_in tag. 2014-01-09 17:33:18 +01:00
ethicalhack3r
43b0f1bea9 Wrong OSVDB ID. 2014-01-09 17:21:47 +01:00
ethicalhack3r
a12ee4a61e Added OSVDB 38577. Found in more versions, also updated OSVDB entry. 2014-01-09 17:19:00 +01:00
Peter
d595a45f2b Output cosmetics 2014-01-09 10:58:09 +01:00
Peter
76a6d59837 Output cosmetics 2014-01-09 10:24:40 +01:00
Peter
bfe9bf2d5b Update wpscan.rb 2014-01-08 23:58:35 +01:00
Peter
59cac169e7 Update output.rb 2014-01-08 23:39:33 +01:00
Peter
c24ee89b16 Some modifications in the output of an item 2014-01-08 23:34:35 +01:00
Peter
a73c2d7292 Update plugin_vulns.xml 2014-01-08 21:48:03 +01:00
Peter
97671b3592 Small fix 2014-01-08 21:29:12 +01:00
Peter
dd38586ead Update plugin_vulns.xml 2014-01-08 20:57:52 +01:00
Peter
e11de68203 Update plugin_vulns.xml 2014-01-08 14:36:08 +01:00
Peter
97ce286ff2 Update plugin_vulns.xml 2014-01-08 13:09:57 +01:00
Peter
99e4e5a219 Added database modification dates in status report 2014-01-07 14:00:08 +01:00
Peter
316b9aa68a Removed allready included libs in stats_plugin 2014-01-06 15:37:19 +01:00
Peter
7318d6615f Remove Backtrack Linux. Not maintained anymore. 2014-01-06 12:46:34 +01:00
Peter
6782b108b0 Remove Backtrack Linux. Not maintained anymore. 2014-01-06 12:44:09 +01:00
Peter
494af0ad23 Update CHANGELOG.md 2014-01-06 12:35:22 +01:00
Peter
55cff03747 Added 'Total WordPress Sites in the World' statistics 2014-01-06 11:42:21 +01:00
erwanlr
599cc7c3af Fix #393 sudo added to the bundle install cmd for Mac OSX 2014-01-06 10:04:58 +00:00
erwanlr
bfa7a7a6dc Plugins & Themes updated 2014-01-06 10:04:24 +00:00
Peter
b243a5404b Update plugin_vulns.xml 2014-01-06 09:39:59 +01:00
Peter
2e40a7377a Corrected spelling mistake 2014-01-05 22:46:22 +01:00
Peter
62e86a0474 Update plugin_vulns.xml 2014-01-04 21:24:33 +01:00
Peter
8c1ee9cf21 Update wp_vulns.xml 2014-01-04 15:32:45 +01:00
Peter
3afda882de Update plugin_vulns.xml 2014-01-04 15:22:32 +01:00
Peter
69fd90ed3a Update plugin_vulns.xml 2014-01-03 15:52:57 +01:00
erwanlr
554530dd60 rspec-mocks version constraint released 2014-01-03 12:30:12 +00:00
Peter
2472e5546f Update plugin_vulns.xml 2014-01-02 12:02:05 +01:00
erwanlr
a7ee4c09f5 Merge pull request #391 from fgeek/master
CVE ID for OptimizePress theme file upload vulnerability
2014-01-02 02:50:47 -08:00
Henri Salo
7effac73b9 CVE ID for OptimizePress theme file upload vulnerability 2014-01-02 12:14:02 +02:00
Peter
125924d125 Update plugin_vulns.xml 2013-12-31 15:53:59 +01:00
Peter
00aaac866f Update plugin_vulns.xml 2013-12-31 15:45:12 +01:00
Peter
170299c13c Update theme_vulns.xml 2013-12-31 15:39:11 +01:00
Peter
ac6f56dbf4 Update for fix #388. 2013-12-31 14:57:18 +01:00
Peter
09c494c6c5 Update plugin_vulns.xml 2013-12-31 10:51:48 +01:00
Peter
fdd685d20c Update plugin_vulns.xml 2013-12-31 10:00:41 +01:00
Peter
fcff22981b Update plugin_vulns.xml 2013-12-30 23:34:34 +01:00
Peter
7f82a41e66 Update theme_vulns.xml 2013-12-30 18:33:12 +01:00
Peter
17d12b41db Update plugin_vulns.xml 2013-12-30 17:38:46 +01:00
Peter
2f7d68f7f1 Update theme_vulns.xml 2013-12-30 16:30:17 +01:00
erwanlr
dc1c65b418 Tabs replaced by spaces !
The presence of tabs can be checked with 'rubocop --only Tab --format
files'
2013-12-30 11:50:43 +00:00
Peter
23de013c86 Fix for #388. Dewplayer vulnerability.
Needs some more investigation. There are more vulnerabilities for this flash media player.
2013-12-30 10:59:57 +01:00
Peter
a922b00716 Update wp_vulns.xml 2013-12-30 00:42:00 +01:00
Peter
babe21a3dc Update plugin_vulns.xml 2013-12-30 00:18:33 +01:00
Peter
59ef0b05a1 Update plugin_vulns.xml 2013-12-30 00:10:08 +01:00
Peter
3da7ed76c5 Merge pull request #389 from fgeek/master
Added CVE-2013-6010 as reference.
2013-12-29 14:51:53 -08:00
Henri Salo
bbf0cd7578 Added CVE-2013-6010 as reference. 2013-12-30 00:39:51 +02:00
Peter
25be97e65c Update plugin_vulns.xml 2013-12-29 22:26:22 +01:00
FireFart
175bb9206e no whitespaces at beginning or end of a string 2013-11-30 20:18:40 +01:00
Peter
68605ad409 Update plugin_vulns.xml 2013-12-29 09:55:35 +01:00
Peter
4500687d47 Removed duplicate vulnerability 2013-12-29 09:17:59 +01:00
Peter
fc38e6f270 Update plugin_vulns.xml 2013-12-28 22:38:58 +01:00
Peter
f1936fea6b Update plugin_vulns.xml 2013-12-28 21:49:57 +01:00
erwanlr
24bdcf66ed Fixes duplicate vulns 2013-12-27 18:13:44 +01:00
erwanlr
8688523ced Fix #385, Fix #386, Fix #387 2013-12-27 18:10:47 +01:00
erwanlr
856944e463 Added Valums Uploader Shell Upload in 3 premium themes 2013-12-27 09:40:18 +00:00
erwanlr
84f6894bc4 Fix #383, fake TwentyTen File Upload vuln removed 2013-12-24 20:42:05 +01:00
erwanlr
9bf33f89a9 Complete fingerprint script & hash search added 2013-12-24 11:20:14 +00:00
erwanlr
c0fa7c42cd Fix #379 Blooog Theme XSS CVE & references 2013-12-22 15:07:55 +01:00
Peter
3281a85ae9 Update wp_vulns.xml
Including: First WordPress 3.8 related vulnerability
2013-12-21 21:55:24 +01:00
Peter
0db965a95f Disabled fake reported vulnerability. OSVDB: 88298
Info: see commit 40f96dd
2013-12-19 08:51:18 +01:00
Peter
0732ea1162 Update plugin_vulns.xml 2013-12-18 14:19:11 +01:00
Peter
c88497afba Update plugin_vulns.xml 2013-12-18 14:10:04 +01:00
Peter
d4892c19b4 Update plugin_vulns.xml 2013-12-18 14:00:03 +01:00
Peter
3ed25b069d Update plugin_vulns.xml 2013-12-18 11:14:58 +01:00
Peter
e51b1f7643 Disabled fake reported vulnerability. OSVDB: 100878
Info: see commit 40f96dd2bd
2013-12-18 08:57:45 +01:00
Peter
7d07b27d4f Update theme_vulns.xml 2013-12-14 22:12:32 +01:00
erwanlr
57fdc90623 Fix #378 WP 3.8 Fingerprint 2013-12-13 21:01:56 +00:00
Peter
72bec2ef49 WP 3.8 Fingerprinting 2013-12-13 08:57:09 +01:00
Peter
58a3805788 Update plugin_vulns.xml 2013-12-12 22:44:51 +01:00
Peter
40f96dd2bd Update plugin_vulns.xml 2013-12-12 13:30:32 +01:00
Christian Mehlmauer
fca13d453e Merge pull request #376 from wpscanteam/parent_theme
Detect parent theme
2013-12-11 00:27:41 -08:00
Peter
32e590f398 Update wp_vulns.xml 2013-12-11 07:50:04 +01:00
erwanlr
301b44dcae Commenting the fake page-flip-image-gallery File Upload vuln 2013-12-11 00:24:16 +01:00
Peter
e45e91b0bf Update plugin_vulns.xml 2013-12-09 19:29:15 +01:00
Christian Mehlmauer
fe31dbca26 fix pre-commit hook 2013-12-08 08:36:26 +01:00
Christian Mehlmauer
51fa754ec5 bugfix 2013-12-08 01:39:28 +01:00
Christian Mehlmauer
2ce10af051 rspecs 2013-12-08 01:28:19 +01:00
Christian Mehlmauer
c107422353 verbose output 2013-12-08 00:52:07 +01:00
Christian Mehlmauer
1e1fdee5a7 fix rspecs 2013-12-07 22:37:07 +01:00
Christian Mehlmauer
fffcd61cc4 Detect and output parent theme 2013-12-07 22:04:51 +01:00
Christian Mehlmauer
2fd11cba15 Output theme info 2013-12-07 20:51:30 +01:00
Peter
f1ec85aef5 Update plugin_vulns.xml 2013-12-07 20:12:09 +01:00
erwanlr
4c4b363035 podPress XSS Fixed in 8.8.10.17 2013-12-06 13:34:58 +00:00
Peter
8555e0c7e7 Update theme_vulns.xml 2013-12-05 13:47:29 +01:00
Peter
c07f7390ec Update plugin_vulns.xml 2013-12-05 10:13:55 +01:00
Peter
34f6e15271 WordPress 3.6 Multiple Function Path Disclosure Vulnerability 2013-12-05 09:29:27 +01:00
erwanlr
135f0677e4 haiku-minimalist-audio-player XSS fixed in v1.1.0 2013-12-04 19:03:35 +01:00
erwanlr
63ad255f2b disqus-comment-system XSS Fixed in v2.69 2013-12-04 18:59:06 +01:00
erwanlr
16ac8ea196 wp-recaptcha XSS fixed in 3.1.4 2013-12-04 18:55:30 +01:00
erwanlr
0e00773238 Newsletter SQLi fixed in v3.0.9
See http://plugins.trac.wordpress.org/changeset?reponame=&new=663445%40newsletter%2Ftrunk%2Fdo%2Fview.php&old=627016%40newsletter%2Ftrunk%2Fdo%2Fview.php
2013-12-04 18:51:36 +01:00
Christian Mehlmauer
cf1f676268 Added metasploit plugin for OptimizePress 2013-12-03 13:18:33 +01:00
ethicalhack3r
d2f304b047 Fixed null exploitdb tag. 2013-12-02 10:42:43 +01:00
Peter
0a9bb138c5 Update plugin_vulns.xml 2013-12-02 09:59:21 +01:00
erwanlr
6236391c86 Added OptimizePress Premium Theme File Upload Vuln 2013-11-30 21:27:56 +01:00
Peter
78257cb1c0 Update plugin_vulns.xml 2013-11-29 12:34:25 +01:00
Peter
c4cb75668c Update wp_vulns.xml 2013-11-28 11:03:33 +01:00
Peter
9880bcacd6 Update theme_vulns.xml 2013-11-27 20:56:41 +01:00
Peter
52aedd0a31 Update theme_vulns.xml 2013-11-27 20:28:06 +01:00
Peter
c7ce741857 Update theme_vulns.xml 2013-11-25 12:49:52 +01:00
Peter
bcbf012406 Update plugin_vulns.xml 2013-11-25 12:38:30 +01:00
Peter
ec75b4418b Update plugin_vulns.xml 2013-11-22 11:56:47 +01:00
Peter
716b84f507 rspec change due to separator in Item 2013-11-19 20:28:19 +01:00
Peter
e95b3a59ef Add separator between Name and Version in Item 2013-11-19 19:53:41 +01:00
Peter van der Laan
9dc179b2cd Update plugin_vulns.xml 2013-11-19 09:43:47 +01:00
ethicalhack3r
efe1b01936 Indentatio 2013-11-18 23:48:54 +01:00
ethicalhack3r
cd26b0c5a9 Some more files/folders to ignore spelling in. 2013-11-18 23:43:49 +01:00
Peter van der Laan
b075f71f11 Update theme_vulns.xml 2013-11-18 21:54:40 +01:00
ethicalhack3r
44145ef265 Oh. The irony. 2013-11-18 16:59:04 +01:00
ethicalhack3r
82ef21b821 Ignore log file. 2013-11-18 16:49:04 +01:00
ethicalhack3r
5655d7456c Would help if I commited the file... 2013-11-18 16:46:23 +01:00
ethicalhack3r
a7992102af Spelling mistake. 2013-11-18 16:45:03 +01:00
ethicalhack3r
ee2cd412ce New spell checker! 2013-11-18 16:44:23 +01:00
erwanlr
1c34f48c39 Fix #228, #327 Infinite loop when self-redirect 2013-11-18 11:20:15 +00:00
erwanlr
0c2937936b Fix #370 Added CVE for the Tweet Blender XSS 2013-11-18 10:01:33 +00:00
Peter van der Laan
b0c3f6c82a Update theme_vulns.xml 2013-11-18 10:19:05 +01:00
Peter van der Laan
e047525be9 Update plugin_vulns.xml 2013-11-17 15:19:17 +01:00
Peter van der Laan
7f1ad590f6 Update plugin_vulns.xml 2013-11-17 14:53:44 +01:00
Peter van der Laan
fbf2d827c2 Update theme_vulns.xml 2013-11-16 19:33:46 +01:00
Peter van der Laan
72619df02c Update plugin_vulns.xml 2013-11-15 10:44:09 +01:00
Peter van der Laan
c58d8992cf Update plugin_vulns.xml 2013-11-15 10:37:28 +01:00
ethicalhack3r
c98177ea20 Create unique cache dir to prevent race conditions. Issue #344. 2013-11-15 00:24:20 +01:00
ethicalhack3r
766409e581 Added pvd to docs. 2013-11-14 23:32:10 +01:00
FireFart
c076d61cc9 Merge branch 'master' of github.com:wpscanteam/wpscan 2013-11-13 18:02:13 +01:00
Peter van der Laan
92e265ecc9 Update plugin_vulns.xml 2013-11-14 20:59:14 +01:00
FireFart
e223df64cf added blog post 2013-11-13 17:58:10 +01:00
FireFart
629ebf5ff2 fixed Theme version detection 2013-11-13 15:37:36 +01:00
Peter van der Laan
0019eb70b5 Add a "Work in progress" URL in the CHANGELOG 2013-11-14 14:07:05 +01:00
erwanlr
e5f1be0b30 Fix #201 Incorrect Paramter Parsing when no url was supplied 2013-11-14 12:01:45 +00:00
erwanlr
dd74934638 "Exiting!" sentence removed 2013-11-14 11:58:49 +00:00
Peter van der Laan
8d4973a9cc Update wp_vulns.xml 2013-11-14 11:57:22 +01:00
Peter van der Laan
a49c091cd5 Update plugin_vulns.xml 2013-11-14 11:16:38 +01:00
Peter van der Laan
7d0268a4ce Update plugin_vulns.xml 2013-11-14 11:08:37 +01:00
Peter van der Laan
44e53e7225 Update theme_vulns.xml 2013-11-14 09:31:53 +01:00
Peter van der Laan
1a1689da1f Update theme_vulns.xml 2013-11-14 09:21:14 +01:00
Peter van der Laan
a28802e84e Update wp_vulns.xml 2013-11-13 23:04:52 +01:00
Peter van der Laan
2798e71a52 Merge pull request #368 from pvdl/vulns
Update WordPress Vulnerabilities
2013-11-13 13:27:02 -08:00
ethicalhack3r
e3647092b0 Small typo in comment 2013-11-13 12:57:13 +01:00
ethicalhack3r
117cc13ed7 Fixed typo 2013-11-13 12:56:07 +01:00
Peter van der Laan
2d39a04575 Update plugin_vulns.xml 2013-11-13 11:47:37 +01:00
erwanlr
d3e9457532 Merge pull request #366 from pvdl/vulns
Changes statistics due to v2.2
2013-11-13 01:31:18 -08:00
Peter van der Laan
afc737b9bd Changed statistics due to v2.2 2013-11-13 08:17:45 +01:00
Peter van der Laan
32e597f6a4 Merge pull request #1 from wpscanteam/master
Update from master
2013-11-12 23:12:20 -08:00
219 changed files with 8127 additions and 68525 deletions

2
.gitignore vendored
View File

@@ -11,3 +11,5 @@ log.txt
.yardoc .yardoc
debug.log debug.log
wordlist.txt wordlist.txt
rspec_results.html
data/

1
.ruby-gemset Normal file
View File

@@ -0,0 +1 @@
wpscan

1
.ruby-version Normal file
View File

@@ -0,0 +1 @@
2.2.3

View File

@@ -1,6 +1,30 @@
language: ruby language: ruby
sudo: false
cache: bundler
rvm: rvm:
- "1.9.2" - 1.9.2
- "1.9.3" - 1.9.3
- "2.0.0" - 2.0.0
script: bundle exec rspec --format documentation - 2.1.0
- 2.1.1
- 2.1.2
- 2.1.3
- 2.1.4
- 2.1.5
- 2.2.0
- 2.2.1
- 2.2.2
- 2.2.3
before_install:
- "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
script: bundle exec rspec
notifications:
email:
- team@wpscan.org
matrix:
allow_failures:
- rvm: 1.9.2
# do not build gh-pages branch
branches:
except:
- gh-pages

View File

@@ -1,9 +1,372 @@
# Changelog # Changelog
## Master
[Work in progress](https://github.com/wpscanteam/wpscan/compare/2.9...master)
## Version 2.9
Released: 2015-10-15
New
* GZIP Encoding in updater
* Adds --throttle option to throttle requests
* Uses new API and local database file structure
* Adds last updated and latest version to plugins and themes
Removed
* ArchAssault from README
* APIv1 local databases
General core
* Update to Ruby 2.2.3
* Use yajl-ruby as JSON parser
* New dependancy for Ubuntu 14.04 (libgmp-dev)
* Use Travis container based infra and caching
Fixed issues
* Fix #835 - Readme requests to wp root dir
* Fix #836 - Critical icon output twice when the site is not running WP
* Fix #839 - Terminal-table dependency is broken
* Fix #841 - error: undefined method `cells' for #<Array:0x000000029cc2f8>
* Fix #852 - GZIP Encoding in updater
* Fix #853 - APIv2 integration
* Fix #858 - Detection FP
* Fix #873 - false positive "site has Must Use Plugins"
WPScan Database Statistics:
* Total vulnerable versions: 132
* Total vulnerable plugins: 1170
* Total vulnerable themes: 368
* Total version vulnerabilities: 1476
* Total plugin vulnerabilities: 1913
* Total theme vulnerabilities: 450
## Version 2.8
Released: 2015-06-22
New
* Warn the user to update his DB files
* Added last db update to --version option (see #815)
* Add db checksum to verbose logging during update
* Option to hide banner
* Continue if user chooses not to update + db exists
* Don't update if user chooses default + no DBs exist
* Updates request timeout values to realistic ones (and in seconds)
Removed
* Removed `Time.parse('2000-01-01')` expedient
* Removed unnecessary 'return' and '()'
* Removed debug output
* Removed wpstools
General core
* Update to Ruby 2.2.2
* Switch to mitre
* Install bundler gem README
* Switch from gnutls to openssl
Fixed issues
* Fix #789 - Add blackarch to readme
* Fix #790 - Consider the target down after 30 requests timed out requests instead of 10
* Fix #791 - Rogue character causing the scan of non-wordpress site to crash
* Fix #792 - Adds the HttpError exception
* Fix #795 - Remove GHOST warning
* Fix #796 - Do not swallow exit code
* Fix #797 - Increases the timeout values
* Fix #801 - Forces UTF-8 encoding when enumerating usernames
* Fix #803 - Increases default connect-timeout to 10s
* Fix #804 - Updates the Theme detection pattern
* Fix #816 - Ignores potential non version chars in theme version detection
* Fix #819 - Removes potential spaces in robots.txt entries
WPScan Database Statistics:
* Total vulnerable versions: 98
* Total vulnerable plugins: 1076
* Total vulnerable themes: 361
* Total version vulnerabilities: 1104
* Total plugin vulnerabilities: 1763
* Total theme vulnerabilities: 443
## Version 2.7
Released: 2015-03-16
New
* Detects version in release date format
* Copyrights updated
* WP version detection from stylesheets
* New license
* Global HTTP request counter
* Add security-protection plugin detection
* Add GHOST warning if XMLRPC enabled
* Update databases from wpvulndb.com
* Enumerate usernames from WP <= 3.0 (thanks berotti3)
Removed
* README.txt
General core
* Update to Ruby 2.2.1
* Update to Ruby 2.2.0
* Add addressable gem
* Update Typhoeus gem to 0.7.0
* IDN support: encode non-ascii domain names (thanks dctabuyz)
* Improve page hash calculation (thanks dctabuyz)
* Version detection regex improved
Fixed issues
* Fix #745 - Plugin version pattern in readme.txt file not detected
* Fix #746 - Add a global counter for all active requests to server.
* Fix #747 - Add 'security-protection' plugin to wp_login_protection module
* Fix #753 - undefined method `round' for "10":String for request or connect timeouts
* Fix #760 - typhoeus issue (infinite loop)
WPScan Database Statistics:
* Total vulnerable versions: 89
* Total vulnerable plugins: 953
* Total vulnerable themes: 329
* Total version vulnerabilities: 1070
* Total plugin vulnerabilities: 1451
* Total theme vulnerabilities: 378
## Version 2.6
Released: 2014-12-19
New
* Updates the readmes to reflect the new --usernames option
* Improves plugin/theme version detection by looking at the "Version:"
* Solution to avoid mandatory blank newline at the end of the wordlist
* Add check for valid credentials
* Add Sucuri sponsor to banner
* Add protocol to sucuri url in banner
* Add response code to proxy error output
* Add a statement about mendatory newlines at the end of list
* Give warning if default username 'admin' is still used
* License amendment to make it more clear about value added usage
Removed
* remove malwares
* remove malware folder
* Removes the theme version check from the readme, unrealistic scenario
General core
* Update to Ruby 2.1.5 and travis
* Prevent parent theme infinite loop
* Fixes the progressbar being overriden by next brute forcing attempts
Fixed issues
* Fix UTF-8 encode on security db file download
* Fix #703 - Disable logging by default. Implement log option.
* Fix #705 - Installation instructions for Ubuntu < 14.04 apparently incomplete
* Fix #717 - Expand on readme.html finding output
* Fix #716 - Adds the --version in the help
* Fix #715 - Add new updating info to docs
* Fix #727 - WpItems detection: Perform the passive check and filter only vulnerable results at the end if required
* Fix #737 - Adds some readme files to check for plugin versions
* Fix #739 - Adds the --usernames option
WPScan Database Statistics:
* Total vulnerable versions: 88
* Total vulnerable plugins: 901
* Total vulnerable themes: 313
* Total version vulnerabilities: 1050
* Total plugin vulnerabilities: 1355
* Total theme vulnerabilities: 349
## Version 2.5.1
Released: 2014-09-29
Fixes reference URL to WPVDB
## Version 2.5
Released: 2014-09-26 (@ BruCON 2014)
New
* Exit program after --update
* Detect directory listing in upload folder
* Be more verbose when no version can be detected
* Added detection for Yoast Wordpress SEO plugin
* Also ensure to not process empty Location headers
* Ensures a nil location is not processed when enumerating usernames
* Fix #626 - Detect 'Must_Use_Plugins'
* better username extraction
* Add a --cookie option. Ref #485
* Add a --no-color option
* Output: Give 'Fixed in' an informational tag
* Added ArchAssault distro - WPScan comes pre-installed with this distro
* Layout changes with new colors
Removed
* Removes the source code updaters
* Removes the ListGenerator plugin from WPStools
* Removes all files from data/
General core
* Update docs to reflect new updating logic
* Little output change and coloring
* Adds a missing verbose output
* Re-build redirection url if begin with slash '/'
* Fixes the remove_conditional_comments function
* Ensures to give a string to Typhoeus
* Fix wpstools check-vuln-ref-urls
* Fix rspecs for new json
* Only output if different from style_url
* Add exception so 'ruby wpscan.rb http://domain.com' is detected
* Added make to Debian installation, which is needed in minimal installation.
* Add build-essentials requirement to Ubuntu > 14.04
* Updated installation instr. for GNU/Linux Debian.
* Changes VersionCompare#is_newer_or_same? by lesser_or_equal?
* Fixes the location of the robots.txt check
* Updates the recommended ruby version
* Rspec 3.0 support
* Adds ruby 2.1.2 to Travis
* Updated ruby-progressbar to 1.5.0
WordPress Fingerprints
* Adds WP 4.0 fingerprints
* Adds WP 3.9.2, 3.8.4 & 3.7.4 fingerprints - Ref #652
* Adds 3.9.1 fingerprints
Fixed issues
* Fix #689 - Adds config file to check
* Fix #694 - Output Arrays
* Fix #693 - Adds pathname require statement
* Fix #657 - generate method
* Fix #685 - Potenial fix for 'marshal data too short' error
* Fix #686 - Adds specs for relative URI in Location headers
* Fix #435 - Update license
* Fix #674 - Improves the Plugins & Themes passive detection
* Fix #673 - Problem with the output
* Fix #661 - Don't hash directories named like a file
* Fix #653 - Fix for infinite loop in wpstools
* Fix #625 - Only parse styles when needed
* Fix #481 - Fix for Jetpack plugin false positive
* Fix #480 - Properly removes the colour sequence from log
* Fix #472 - WPScan stops after redirection if not WordPress website
* Fix #464 - Readmes updated to reflect recent changes about the config file & batch mode
Vulnerabilities
* geoplaces4 also uses name GeoPlaces4beta
* Added metasploit module's
* Added some timthumb detections
WPScan Database Statistics:
* Total vulnerable versions: 87
* Total vulnerable plugins: 854
* Total vulnerable themes: 303
* Total version vulnerabilities: 752
* Total plugin vulnerabilities: 1351
* Total theme vulnerabilities: 345
## Version 2.4
Released: 2014-04-17
New
* '--batch' switch option added - Fix #454
* Add random-agent
* Added more CLI options
* Switch over to nist - Fix #301
* New choice added when a redirection is detected - Fix #438
Removed
* Removed 'Total WordPress Sites in the World' counter from stats
* Old wpscan repo links removed - Fix #440
* Fingerprinting Dev script removed
* Useless code removed
General core
* Rspecs update
* Forcing Travis notify the team
* Ruby 2.1.1 added to Travis
* Equal output layout for interaction questions
* Only output error trace if verbose if enabled
* Memory improvements during wp-items enumerations
* Fixed broken link checker, fixed some broken links
* Couple more 404s fixed
* Themes & Plugins list updated
WordPress Fingerprints
* WP 3.8.2 & 3.7.2 Fingerprints added - Fix #448
* WP 3.8.3 & 3.7.3 fingerprints
* WP 3.9 fingerprints
Fixed issues
* Fix #380 - Redirects in WP 3.6-3.0
* Fix #413 - Check the version of the Timthumbs files found
* Fix #429 - Error WpScan Cache Browser
* Fix #431 - Version number comparison between '2.3.3' and '0.42b'
* Fix #439 - Detect if the target goes down during the scan
* Fix #451 - Do not rely only on files in wp-content for fingerprinting
* Fix #453 - Documentation or inplemention of option parameters
* Fix #455 - Fails with a message if the target returns a 403 during the wordpress check
Vulnerabilities
* Update WordPress Vulnerabilities
* Fixed some duplicate vulnerabilities
WPScan Database Statistics:
* Total vulnerable versions: 79; 1 is new
* Total vulnerable plugins: 748; 55 are new
* Total vulnerable themes: 292; 41 are new
* Total version vulnerabilities: 617; 326 are new
* Total plugin vulnerabilities: 1162; 146 are new
* Total theme vulnerabilities: 330; 47 are new
## Version 2.3
Released: 2014-02-11
New
* Brute forcing over https!
* Detect and output parent theme!
* Complete fingerprint script & hash search
* New spell checker!
* Added database modification dates in status report
* Added 'Total WordPress Sites in the World' statistics
* Added separator between Name and Version in Item
* Added a "Work in progress" URL in the CHANGELOG
Removed
* Removed "Exiting!" sentence
* Removed Backtrack Linux. Not maintained anymore.
General core
* Ruby 2.1.0 added to Travis
* Updated the version of WebMock required
* Better string concatenation in code (improves speed)
* Some modifications in the output of an item
* Output cosmetics
* rspec-mocks version constraint released
* Tabs replaced by spaces
* Rspecs update
* Indent code cleanup
* Themes & Plugins lists regenerated
Vulnerabilities
* Update WordPress Vulnerabilities
* Disabled some fake reported vulnerabilities
* Fixed some duplicate vulnerabilities
WPScan Database Statistics:
* Total vulnerable versions: 78; 2 are new
* Total vulnerable plugins: 693; 83 are new
* Total vulnerable themes: 251; 55 are new
* Total version vulnerabilities: 291 17 are new
* Total plugin vulnerabilities: 1016; 236 are new
* Total theme vulnerabilities: 283; 79 are new
WordPress Fingerprints
* Better fingerprints
* WP 3.8.1 Fingerprinting
* WP 3.8 Fingerprinting
Fixed issues
* Fix #404 - Brute forcing issue over https
* Fix #398 - Removed a fake vuln in WP Super Cache
* Fix #393 - sudo added to the bundle install cmd for Mac OSX
* Fix #228, #327 - Infinite loop when self-redirect
* Fix #201 - Incorrect Paramter Parsing when no url was supplied
## Version 2.2 ## Version 2.2
Released: 2013-11-12 Released: 2013-11-12
Added New
* Output the vulnerability fix if available * Output the vulnerability fix if available
* Added 'WordPress Version Vulnerability' statistics * Added 'WordPress Version Vulnerability' statistics
* Added Kali Linux on the list of pre-installed Linux distributions * Added Kali Linux on the list of pre-installed Linux distributions
@@ -82,13 +445,13 @@ Vulnerabilities
* Update timthumb due to Secunia #54801 * Update timthumb due to Secunia #54801
* Added WP vuln: 3.4 - 3.5.1 wp-admin/users.php FPD * Added WP vuln: 3.4 - 3.5.1 wp-admin/users.php FPD
WPScan Databse Statistics: WPScan Database Statistics:
* Total vulnerable versions: 76, 4 are new * Total vulnerable versions: 76; 4 are new
* Total vulnerable plugins: 606, 197 are new * Total vulnerable plugins: 610; 201 are new
* Total vulnerable themes: 194, 45 are new * Total vulnerable themes: 196; 47 are new
* Total version vulnerabilities: 274, 53 are new * Total version vulnerabilities: 274; 53 are new
* Total plugin vulnerabilities: 764, 270 are new * Total plugin vulnerabilities: 780; 286 are new
* Total theme vulnerabilities: 198, 46 are new * Total theme vulnerabilities: 204; 52 are new
Add WP Fingerprints Add WP Fingerprints
* WP 3.7.1 Fingerprinting * WP 3.7.1 Fingerprinting

11
CREDITS
View File

@@ -1,20 +1,21 @@
**CREDITS** **CREDITS**
This file is to give credit to WPScan's contributors. If you feel your name should be in here, email ryandewhurst at gmail. This file is used to state the individual WPScan Team members (core developers) and give credit to WPScan's other contributors. If you feel your name should be in here email team@wpscan.org.
*WPScan Team* *WPScan Team*
Erwan.LR - @erwan_lr - (Project Developer) Erwan.LR - @erwan_lr - (Project Developer)
Christian Mehlmauer - @_FireFart_ - (Project Developer) Christian Mehlmauer - @_FireFart_ - (Project Developer)
Gianluca Brindisi - @gbrindisi (Project Developer) Peter van der Laan - pvdl - (Project Developer)
Ryan Dewhurst - @ethicalhack3r (Project Lead) Ryan Dewhurst - @ethicalhack3r (Project Lead)
*Other Contributors* *Other Contributors*
Henri Salo AKA fgeek - Reported lots of vulnerabilities
Alip AKA Undead - alip.aswalid at gmail.com Alip AKA Undead - alip.aswalid at gmail.com
michee08 - Reported and gave potential solutions to bugs. michee08 - Reported and gave potential solutions to bugs
Callum Pember - Implemented proxy support - callumpember at gmail.com Callum Pember - Implemented proxy support - callumpember at gmail.com
g0tmi1k - Additional timthumb checks + bug reports. g0tmi1k - Additional timthumb checks + bug reports
Melvin Lammerts - Reported a couple of fake vulnerabilities - melvin at 12k.nl Melvin Lammerts - Reported a couple of fake vulnerabilities - melvin at 12k.nl
Paolo Perego - @thesp0nge - Basic authentication Paolo Perego - @thesp0nge - Basic authentication
Peter van der Laan - The Vuln Hunter and Code Cleaner Gianluca Brindisi - @gbrindisi - Ex Project Developer

2
DISCLAIMER.txt Normal file
View File

@@ -0,0 +1,2 @@
WPScan is not responsible for misuse or for any damage that you may cause!
You agree that you use this software at your own risk.

24
Gemfile
View File

@@ -1,15 +1,17 @@
source "https://rubygems.org" source 'https://rubygems.org'
# Seg fault in Typhoeus 0.6.3 (and ethon > 0.5.11) with rspec gem 'typhoeus', '~>0.8.0'
gem "typhoeus", ">=0.6.3" gem 'nokogiri'
gem "nokogiri" gem 'addressable'
gem "json" gem 'yajl-ruby' # Better JSON parser regarding memory usage
gem "terminal-table" # TODO: update the below when terminal-table 1.5.3+ is released.
gem "ruby-progressbar", ">=1.2.0" # (and delete the Terminal module in lib/common/hacks.rb)
gem 'terminal-table', '~>1.4.5'
gem 'ruby-progressbar', '>=1.6.0'
group :test do group :test do
gem "webmock", ">=1.9.3" gem 'webmock', '>=1.17.2'
gem "simplecov" gem 'simplecov'
gem "rspec", :require => "spec" gem 'rspec', '>=3.3.0'
gem "rspec-mocks", "<=2.14.2" # 2.14.3 just messed around :/ gem 'rspec-its'
end end

79
LICENSE
View File

@@ -1,15 +1,70 @@
WPScan - WordPress Security Scanner WPScan Public Source License
Copyright (C) 2012-2013
This program is free software: you can redistribute it and/or modify The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2015 WPScan Team.
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below.
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License 1. Definitions
along with this program. If not, see <http://www.gnu.org/licenses/>.
1.1 “License” means this document.
1.2 “Contributor” means each individual or legal entity that creates, contributes to the creation of, or owns WPScan.
1.3 “WPScan Team” means WPScans core developers, an updated list of whom can be found within the CREDITS file.
2. Commercialization
A commercial use is one intended for commercial advantage or monetary compensation.
Example cases of commercialization are:
- Using WPScan to provide commercial managed/Software-as-a-Service services.
- Distributing WPScan as a commercial product or as part of one.
- Using WPScan as a value added service/product.
Example cases which do not require a commercial license, and thus fall under the terms set out below, include (but are not limited to):
- Penetration testers (or penetration testing organizations) using WPScan as part of their assessment toolkit.
- Penetration Testing Linux Distributions including but not limited to Kali Linux, SamuraiWTF, BackBox Linux.
- Using WPScan to test your own systems.
- Any non-commercial use of WPScan.
If you need to purchase a commercial license or are unsure whether you need to purchase a commercial license contact us - team@wpscan.org.
We may grant commercial licenses at no monetary cost at our own discretion if the commercial usage is deemed by the WPScan Team to significantly benefit WPScan.
Free-use Terms and Conditions;
3. Redistribution
Redistribution is permitted under the following conditions:
- Unmodified License is provided with WPScan.
- Unmodified Copyright notices are provided with WPScan.
- Does not conflict with the commercialization clause.
4. Copying
Copying is permitted so long as it does not conflict with the Redistribution clause.
5. Modification
Modification is permitted so long as it does not conflict with the Redistribution clause.
6. Contributions
Any Contributions assume the Contributor grants the WPScan Team the unlimited, non-exclusive right to reuse, modify and relicense the Contributor's content.
7. Support
WPScan is provided under an AS-IS basis and without any support, updates or maintenance. Support, updates and maintenance may be given according to the sole discretion of the WPScan Team.
8. Disclaimer of Warranty
WPScan is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the WPScan is free of defects, merchantable, fit for a particular purpose or non-infringing.
9. Limitation of Liability
To the extent permitted under Law, WPScan is provided under an AS-IS basis. The WPScan Team shall never, and without any limit, be liable for any damage, cost, expense or any other payment incurred as a result of WPScan's actions, failure, bugs and/or any other interaction between WPScan and end-equipment, computers, other software or any 3rd party, end-equipment, computer or services.
10. Disclaimer
Running WPScan against websites without prior mutual consent may be illegal in your country. The WPScan Team accept no liability and are not responsible for any misuse or damage caused by WPScan.

239
README
View File

@@ -1,239 +0,0 @@
__________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
__________________________________________________
==LICENSE==
WPScan - WordPress Security Scanner
Copyright (C) 2011-2013 The WPScan Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
ryandewhurst at gmail
==INSTALL==
WPScan comes pre-installed on the following Linux distributions:
* BackBox Linux
* BackTrack Linux
* Pentoo
* SamuraiWTF
Prerequisites:
* Windows not supported
* Ruby >= 1.9.2 - Recommended: 1.9.3
* Curl >= 7.21 - Recommended: latest - FYI the 7.29 has a segfault
* RubyGems - Recommended: latest
* Git
-> Installing on Debian/Ubuntu:
sudo apt-get install libcurl4-gnutls-dev libopenssl-ruby libxml2 libxml2-dev libxslt1-dev ruby-dev
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
-> Installing on Fedora:
sudo yum install gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel libcurl-devel
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
-> Installing on Archlinux:
pacman -Syu ruby
pacman -Syu libyaml
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
gem install typhoeus
gem install nokogiri
-> Installing on Mac OS X:
Apple Xcode, Command Line Tools and the libffi are needed (to be able to install the FFI gem), See http://stackoverflow.com/questions/17775115/cant-setup-ruby-environment-installing-fii-gem-error
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
==KNOWN ISSUES==
- Typhoeus segmentation fault:
Update cURL to version => 7.21 (may have to install from source)
See http://code.google.com/p/wpscan/issues/detail?id=81
- Proxy not working:
Update cURL to version => 7.21.7 (may have to install from source).
Installation from sources :
- Grab the sources from http://curl.haxx.se/download.html
- Decompress the archive
- Open the folder with the extracted files
- Run ./configure
- Run make
- Run sudo make install
- Run sudo ldconfig
- cannot load such file -- readline:
Run sudo aptitude install libreadline5-dev libncurses5-dev
Then, open the directory of the readline gem (you have to locate it)
cd ~/.rvm/src/ruby-1.9.2-p180/ext/readline
ruby extconf.rb
make
make install
See http://vvv.tobiassjosten.net/ruby-on-rails/fixing-readline-for-the-ruby-on-rails-console/ for more details
- no such file to load -- rubygems
Run update-alternatives --config ruby
And select your ruby version
See https://github.com/wpscanteam/wpscan/issues/148
==WPSCAN ARGUMENTS==
--update Update to the latest revision
--url | -u <target url> The WordPress URL/domain to scan.
--force | -f Forces WPScan to not check if the remote site is running WordPress.
--enumerate | -e [option(s)] Enumeration.
option :
u usernames from id 1 to 10
u[10-20] usernames from id 10 to 20 (you must write [] chars)
p plugins
vp only vulnerable plugins
ap all plugins (can take a long time)
tt timthumbs
t themes
vp only vulnerable themes
at all themes (can take a long time)
Multiple values are allowed : '-e tt,p' will enumerate timthumbs and plugins
If no option is supplied, the default is 'vt,tt,u,vp'
--exclude-content-based '<regexp or string>' Used with the enumeration option, will exclude all occurrences based on the regexp or string supplied
You do not need to provide the regexp delimiters, but you must write the quotes (simple or double)
--config-file | -c <config file> Use the specified config file
--follow-redirection If the target url has a redirection, it will be followed without asking if you wanted to do so or not
--wp-content-dir <wp content dir> WPScan try to find the content directory (ie wp-content) by scanning the index page, however you can specified it. Subdirectories are allowed
--wp-plugins-dir <wp plugins dir> Same thing than --wp-content-dir but for the plugins directory. If not supplied, WPScan will use wp-content-dir/plugins. Subdirectories are allowed
--proxy <[protocol://]host:port> Supply a proxy (will override the one from conf/browser.conf.json).
HTTP, SOCKS4 SOCKS4A and SOCKS5 are supported. If no protocol is given (format host:port), HTTP will be used
--proxy-auth <username:password> Supply the proxy login credentials (will override the one from conf/browser.conf.json).
--basic-auth <username:password> Set the HTTP Basic authentication
--wordlist | -w <wordlist> Supply a wordlist for the password bruter and do the brute.
--threads | -t <number of threads> The number of threads to use when multi-threading requests. (will override the value from conf/browser.conf.json)
--username | -U <username> Only brute force the supplied username.
--help | -h This help screen.
--verbose | -v Verbose output.
==WPSCAN EXAMPLES==
Do 'non-intrusive' checks...
ruby wpscan.rb --url www.example.com
Do wordlist password brute force on enumerated users using 50 threads...
ruby wpscan.rb --url www.example.com --wordlist darkc0de.lst --threads 50
Do wordlist password brute force on the 'admin' username only...
ruby wpscan.rb --url www.example.com --wordlist darkc0de.lst --username admin
Enumerate installed plugins...
ruby wpscan.rb --url www.example.com --enumerate p
Run all enumeration tools...
ruby wpscan.rb --url www.example.com --enumerate
Use custom content directory...
ruby wpscan.rb -u www.example.com --wp-content-dir custom-content
Update WPScan...
ruby wpscan.rb --update
Debug output...
ruby wpscan.rb --url www.example.com --debug-output 2>debug.log
==WPSTOOLS ARGUMENTS==
--help | -h This help screen.
--Verbose | -v Verbose output.
--update | -u Update to the latest revision.
--generate_plugin_list [number of pages] Generate a new data/plugins.txt file. (supply number of *pages* to parse, default : 150)
--gpl Alias for --generate_plugin_list
--check-local-vulnerable-files | --clvf <local directory> Perform a recursive scan in the <local directory> to find vulnerable files or shells
==WPSTOOLS EXAMPLES==
- Generate a new 'most popular' plugin list, up to 150 pages ...
ruby wpstools.rb --generate_plugin_list 150
- Locally scan a wordpress installation for vulnerable files or shells :
ruby wpstools.rb --check-local-vulnerable-files /var/www/wordpress/
===PROJECT HOME===
www.wpscan.org
===REPOSITORY===
https://github.com/wpscanteam/wpscan
===ISSUES===
https://github.com/wpscanteam/wpscan/issues
===DEVELOPER DOCUMENTATION===
http://rdoc.info/github/wpscanteam/wpscan/frames
===SPONSOR===
WPScan is sponsored by the RandomStorm Open Source Initiative.
Visit RandomStorm at http://www.randomstorm.com

268
README.md
View File

@@ -1,104 +1,181 @@
![alt text](http://dvwa.co.uk/images/wpscan_logo_407x80.png "WPScan - WordPress Security Scanner") ![alt text](https://raw.githubusercontent.com/wpscanteam/wpscan/gh-pages/wpscan_logo_407x80.png "WPScan - WordPress Security Scanner")
[![Build Status](https://travis-ci.org/wpscanteam/wpscan.png?branch=master)](https://travis-ci.org/wpscanteam/wpscan)
[![Build Status](https://travis-ci.org/wpscanteam/wpscan.svg?branch=master)](https://travis-ci.org/wpscanteam/wpscan)
[![Code Climate](https://img.shields.io/codeclimate/github/wpscanteam/wpscan.svg)](https://codeclimate.com/github/wpscanteam/wpscan)
[![Dependency Status](https://img.shields.io/gemnasium/wpscanteam/wpscan.svg)](https://gemnasium.com/wpscanteam/wpscan)
#### LICENSE #### LICENSE
WPScan - WordPress Security Scanner #### WPScan Public Source License
Copyright (C), 2011-2013 The WPScan Team
This program is free software: you can redistribute it and/or modify The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2015 WPScan Team.
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below.
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License ##### 1. Definitions
along with this program. If not, see <http://www.gnu.org/licenses/>.
ryandewhurst at gmail 1.1 "License" means this document.
1.2 "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns WPScan.
1.3 "WPScan Team" means WPScans core developers, an updated list of whom can be found within the CREDITS file.
##### 2. Commercialization
A commercial use is one intended for commercial advantage or monetary compensation.
Example cases of commercialization are:
- Using WPScan to provide commercial managed/Software-as-a-Service services.
- Distributing WPScan as a commercial product or as part of one.
- Using WPScan as a value added service/product.
Example cases which do not require a commercial license, and thus fall under the terms set out below, include (but are not limited to):
- Penetration testers (or penetration testing organizations) using WPScan as part of their assessment toolkit.
- Penetration Testing Linux Distributions including but not limited to Kali Linux, SamuraiWTF, BackBox Linux.
- Using WPScan to test your own systems.
- Any non-commercial use of WPScan.
If you need to purchase a commercial license or are unsure whether you need to purchase a commercial license contact us - team@wpscan.org.
We may grant commercial licenses at no monetary cost at our own discretion if the commercial usage is deemed by the WPScan Team to significantly benefit WPScan.
Free-use Terms and Conditions;
##### 3. Redistribution
Redistribution is permitted under the following conditions:
- Unmodified License is provided with WPScan.
- Unmodified Copyright notices are provided with WPScan.
- Does not conflict with the commercialization clause.
##### 4. Copying
Copying is permitted so long as it does not conflict with the Redistribution clause.
##### 5. Modification
Modification is permitted so long as it does not conflict with the Redistribution clause.
##### 6. Contributions
Any Contributions assume the Contributor grants the WPScan Team the unlimited, non-exclusive right to reuse, modify and relicense the Contributor's content.
##### 7. Support
WPScan is provided under an AS-IS basis and without any support, updates or maintenance. Support, updates and maintenance may be given according to the sole discretion of the WPScan Team.
##### 8. Disclaimer of Warranty
WPScan is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the WPScan is free of defects, merchantable, fit for a particular purpose or non-infringing.
##### 9. Limitation of Liability
To the extent permitted under Law, WPScan is provided under an AS-IS basis. The WPScan Team shall never, and without any limit, be liable for any damage, cost, expense or any other payment incurred as a result of WPScan's actions, failure, bugs and/or any other interaction between WPScan and end-equipment, computers, other software or any 3rd party, end-equipment, computer or services.
##### 10. Disclaimer
Running WPScan against websites without prior mutual consent may be illegal in your country. The WPScan Team accept no liability and are not responsible for any misuse or damage caused by WPScan.
#### INSTALL #### INSTALL
WPScan comes pre-installed on the following Linux distributions: WPScan comes pre-installed on the following Linux distributions:
- [BackBox Linux](http://www.backbox.org/) - [BackBox Linux](http://www.backbox.org/)
- [BackTrack Linux](http://www.backtrack-linux.org/)
- [Kali Linux](http://www.kali.org/) - [Kali Linux](http://www.kali.org/)
- [Pentoo](http://www.pentoo.ch/) - [Pentoo](http://www.pentoo.ch/)
- [SamuraiWTF](http://samurai.inguardians.com/) - [SamuraiWTF](http://samurai.inguardians.com/)
- [BlackArch](http://blackarch.org/)
Prerequisites: Prerequisites:
- Windows not supported - Ruby >= 1.9.2 - Recommended: 2.2.3
- Ruby >= 1.9.2 - Recommended: 1.9.3
- Curl >= 7.21 - Recommended: latest - FYI the 7.29 has a segfault - Curl >= 7.21 - Recommended: latest - FYI the 7.29 has a segfault
- RubyGems - Recommended: latest - RubyGems - Recommended: latest
- Git - Git
*Installing on Debian/Ubuntu:* Windows is not supported.
If installed from Github update the code base with ```git pull```. The databases are updated with ```wpscan.rb --update```.
```sudo apt-get install libcurl4-gnutls-dev libopenssl-ruby libxml2 libxml2-dev libxslt1-dev ruby-dev``` ####Installing on Ubuntu:
```git clone https://github.com/wpscanteam/wpscan.git``` Before Ubuntu 14.04:
```cd wpscan``` sudo apt-get install libcurl4-openssl-dev libopenssl-ruby libxml2 libxml2-dev libxslt1-dev ruby-dev
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
```sudo gem install bundler && bundle install --without test``` From Ubuntu 14.04:
*Installing on Fedora:* sudo apt-get install libcurl4-openssl-dev libxml2 libxml2-dev libxslt1-dev ruby-dev build-essential libgmp-dev
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
```sudo yum install gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel libcurl-devel``` ####Installing on Debian:
```git clone https://github.com/wpscanteam/wpscan.git``` sudo apt-get install git ruby ruby-dev libcurl4-openssl-dev make
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler
bundle install --without test --path vendor/bundle
```cd wpscan``` ####Installing on Fedora:
```sudo gem install bundler && bundle install --without test``` sudo yum install gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel libcurl-devel patch
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
*Installing on Archlinux:* ####Installing on Archlinux:
```pacman -Syu ruby``` pacman -Syu ruby
pacman -Syu libyaml
git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && bundle install --without test
gem install typhoeus
gem install nokogiri
```pacman -Syu libyaml``` ####Installing on Mac OSX:
```git clone https://github.com/wpscanteam/wpscan.git``` Apple Xcode, Command Line Tools and the libffi are needed (to be able to install the FFI gem), See [http://stackoverflow.com/questions/17775115/cant-setup-ruby-environment-installing-fii-gem-error](http://stackoverflow.com/questions/17775115/cant-setup-ruby-environment-installing-fii-gem-error)
```cd wpscan``` git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
sudo gem install bundler && sudo bundle install --without test
```sudo gem install bundler && bundle install --without test``` ####Installing with RVM:
```gem install typhoeus``` cd ~
curl -sSL https://get.rvm.io | bash -s stable
```gem install nokogiri``` source ~/.rvm/scripts/rvm
echo "source ~/.rvm/scripts/rvm" >> ~/.bashrc
*Installing on Mac OSX:* rvm install 2.2.3
rvm use 2.2.3 --default
Apple Xcode, Command Line Tools and the libffi are needed (to be able to install the FFI gem), See http://stackoverflow.com/questions/17775115/cant-setup-ruby-environment-installing-fii-gem-error echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler
```git clone https://github.com/wpscanteam/wpscan.git``` git clone https://github.com/wpscanteam/wpscan.git
cd wpscan
```cd wpscan``` gem install bundler
bundle install --without test
```sudo gem install bundler && bundle install --without test```
#### KNOWN ISSUES #### KNOWN ISSUES
- Typhoeus segmentation fault - Typhoeus segmentation fault
Update cURL to version => 7.21 (may have to install from source) Update cURL to version => 7.21 (may have to install from source)
See http://code.google.com/p/wpscan/issues/detail?id=81
- Proxy not working - Proxy not working
Update cURL to version => 7.21.7 (may have to install from source). Update cURL to version => 7.21.7 (may have to install from source).
Installation from sources : Installation from sources :
```
Grab the sources from http://curl.haxx.se/download.html Grab the sources from http://curl.haxx.se/download.html
Decompress the archive Decompress the archive
Open the folder with the extracted files Open the folder with the extracted files
@@ -106,21 +183,21 @@ Apple Xcode, Command Line Tools and the libffi are needed (to be able to install
Run make Run make
Run sudo make install Run sudo make install
Run sudo ldconfig Run sudo ldconfig
```
- cannot load such file -- readline: - cannot load such file -- readline:
```sudo aptitude install libreadline5-dev libncurses5-dev``` sudo aptitude install libreadline5-dev libncurses5-dev
Then, open the directory of the readline gem (you have to locate it) Then, open the directory of the readline gem (you have to locate it)
```
cd ~/.rvm/src/ruby-1.9.2-p180/ext/readline cd ~/.rvm/src/ruby-1.9.2-p180/ext/readline
ruby extconf.rb ruby extconf.rb
make make
make install make install
```
See http://vvv.tobiassjosten.net/ruby-on-rails/fixing-readline-for-the-ruby-on-rails-console/ for more details
See [http://vvv.tobiassjosten.net/ruby-on-rails/fixing-readline-for-the-ruby-on-rails-console/](http://vvv.tobiassjosten.net/ruby-on-rails/fixing-readline-for-the-ruby-on-rails-console/) for more details
- no such file to load -- rubygems - no such file to load -- rubygems
@@ -128,11 +205,11 @@ Apple Xcode, Command Line Tools and the libffi are needed (to be able to install
And select your ruby version And select your ruby version
See https://github.com/wpscanteam/wpscan/issues/148 See [https://github.com/wpscanteam/wpscan/issues/148](https://github.com/wpscanteam/wpscan/issues/148)
#### WPSCAN ARGUMENTS #### WPSCAN ARGUMENTS
--update Update to the latest revision --update Update the databases.
--url | -u <target url> The WordPress URL/domain to scan. --url | -u <target url> The WordPress URL/domain to scan.
@@ -149,13 +226,17 @@ Apple Xcode, Command Line Tools and the libffi are needed (to be able to install
t themes t themes
vt only vulnerable themes vt only vulnerable themes
at all themes (can take a long time) at all themes (can take a long time)
Multiple values are allowed : '-e tt,p' will enumerate timthumbs and plugins Multiple values are allowed : "-e tt,p" will enumerate timthumbs and plugins
If no option is supplied, the default is 'vt,tt,u,vp' If no option is supplied, the default is "vt,tt,u,vp"
--exclude-content-based '<regexp or string>' Used with the enumeration option, will exclude all occurrences based on the regexp or string supplied --exclude-content-based "<regexp or string>" Used with the enumeration option, will exclude all occurrences based on the regexp or string supplied
You do not need to provide the regexp delimiters, but you must write the quotes (simple or double) You do not need to provide the regexp delimiters, but you must write the quotes (simple or double)
--config-file | -c <config file> Use the specified config file --config-file | -c <config file> Use the specified config file, see the example.conf.json
--user-agent | -a <User-Agent> Use the specified User-Agent
--random-agent | -r Use a random User-Agent
--follow-redirection If the target url has a redirection, it will be followed without asking if you wanted to do so or not --follow-redirection If the target url has a redirection, it will be followed without asking if you wanted to do so or not
@@ -163,23 +244,39 @@ Apple Xcode, Command Line Tools and the libffi are needed (to be able to install
--wp-plugins-dir <wp plugins dir> Same thing than --wp-content-dir but for the plugins directory. If not supplied, WPScan will use wp-content-dir/plugins. Subdirectories are allowed --wp-plugins-dir <wp plugins dir> Same thing than --wp-content-dir but for the plugins directory. If not supplied, WPScan will use wp-content-dir/plugins. Subdirectories are allowed
--proxy <[protocol://]host:port> Supply a proxy (will override the one from conf/browser.conf.json). --proxy <[protocol://]host:port> Supply a proxy (will override the one from conf/browser.conf.json).
HTTP, SOCKS4 SOCKS4A and SOCKS5 are supported. If no protocol is given (format host:port), HTTP will be used HTTP, SOCKS4 SOCKS4A and SOCKS5 are supported. If no protocol is given (format host:port), HTTP will be used
--proxy-auth <username:password> Supply the proxy login credentials (will override the one from conf/browser.conf.json). --proxy-auth <username:password> Supply the proxy login credentials.
--basic-auth <username:password> Set the HTTP Basic authentication --basic-auth <username:password> Set the HTTP Basic authentication.
--wordlist | -w <wordlist> Supply a wordlist for the password bruter and do the brute. --wordlist | -w <wordlist> Supply a wordlist for the password brute forcer.
--threads | -t <number of threads> The number of threads to use when multi-threading requests. (will override the value from conf/browser.conf.json) --threads | -t <number of threads> The number of threads to use when multi-threading requests.
--username | -U <username> Only brute force the supplied username. --username | -U <username> Only brute force the supplied username.
--usernames <path-to-file> Only brute force the usernames from the file.
--cache-ttl <cache-ttl> Typhoeus cache TTL.
--request-timeout <request-timeout> Request Timeout.
--connect-timeout <connect-timeout> Connect Timeout.
--max-threads <max-threads> Maximum Threads.
--help | -h This help screen. --help | -h This help screen.
--verbose | -v Verbose output. --verbose | -v Verbose output.
--batch Never ask for user input, use the default behavior.
--no-color Do not use colors in the output.
--log Save STDOUT to log.txt
#### WPSCAN EXAMPLES #### WPSCAN EXAMPLES
Do 'non-intrusive' checks... Do 'non-intrusive' checks...
@@ -206,7 +303,7 @@ Use custom content directory...
```ruby wpscan.rb -u www.example.com --wp-content-dir custom-content``` ```ruby wpscan.rb -u www.example.com --wp-content-dir custom-content```
Update WPScan... Update WPScan's databases...
```ruby wpscan.rb --update``` ```ruby wpscan.rb --update```
@@ -214,41 +311,26 @@ Debug output...
```ruby wpscan.rb --url www.example.com --debug-output 2>debug.log``` ```ruby wpscan.rb --url www.example.com --debug-output 2>debug.log```
#### WPSTOOLS ARGUMENTS
--help | -h This help screen.
--Verbose | -v Verbose output.
--update | -u Update to the latest revision.
--generate_plugin_list [number of pages] Generate a new data/plugins.txt file. (supply number of *pages* to parse, default : 150)
--gpl Alias for --generate_plugin_list
--check-local-vulnerable-files | --clvf <local directory> Perform a recursive scan in the <local directory> to find vulnerable files or shells
#### WPSTOOLS EXAMPLES
Generate a new 'most popular' plugin list, up to 150 pages...
```ruby wpstools.rb --generate_plugin_list 150```
Locally scan a wordpress installation for vulnerable files or shells :
```ruby wpstools.rb --check-local-vulnerable-files /var/www/wordpress/```
#### PROJECT HOME #### PROJECT HOME
www.wpscan.org [http://www.wpscan.org](http://www.wpscan.org)
#### VULNERABILITY DATABASE
[https://wpvulndb.com](https://wpvulndb.com)
#### GIT REPOSITORY #### GIT REPOSITORY
https://github.com/wpscanteam/wpscan [https://github.com/wpscanteam/wpscan](https://github.com/wpscanteam/wpscan)
#### ISSUES #### ISSUES
https://github.com/wpscanteam/wpscan/issues [https://github.com/wpscanteam/wpscan/issues](https://github.com/wpscanteam/wpscan/issues)
#### DEVELOPER DOCUMENTATION #### DEVELOPER DOCUMENTATION
http://rdoc.info/github/wpscanteam/wpscan/frames [http://rdoc.info/github/wpscanteam/wpscan/frames](http://rdoc.info/github/wpscanteam/wpscan/frames)
#### SPONSOR #### SPECIAL THANKS
WPScan is sponsored by the [RandomStorm](http://www.randomstorm.com) Open Source Initiative. [RandomStorm](https://www.randomstorm.com)

View File

@@ -1,65 +0,0 @@
{
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0",
/* Modes :
static : will use the defined user_agent for each request
semi-static : will randomly choose a user agent into available_user_agents before each scan
random : each request will choose a random user agent in available_user_agents
*/
"user_agent_mode": "static",
/* Uncomment the "proxy" line to use the proxy
SOCKS proxies (4, 4A, 5) are supported, ie : "proxy": "socks5://127.0.0.1:9000"
If you do not specify the protocol, http will be used
*/
//"proxy": "127.0.0.1:3128",
//"proxy_auth": "username:password",
"cache_ttl": 600, // 10 minutes, at this time the cache is cleaned before each scan. If this value is set to 0, the cache will be disabled
"request_timeout": 2000, // 2s
"connect_timeout": 1000, // 1s
"max_threads": 20,
// Some user_agents can be found there http://techpatterns.com/downloads/firefox/useragentswitcher.xml (thx to Gianluca Brindisi)
"available_user_agents":
[
// Windows
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0)",
"Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5",
// MAC
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10",
// Linux
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24",
"Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Gecko Firefox/11.0",
"Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0",
"Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00",
"Mozilla/5.0 (X11; U; Linux x86_64; us; rv:1.9.1.19) Gecko/20110430 shadowfox/7.0 (like Firefox/7.0"
]
}

BIN
data.zip Normal file

Binary file not shown.

2
data/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Only he following extensions are scanned : js, php, swf, html, htm
If you want to add one, modify the variable file_extension_to_scan, line 191 in wpstools.rb
-->
<hashes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="local_vulnerable_files.xsd">
<hash sha1="17c372678aafb3bc1a7b37320b5cc1d8af433527">
<title>XSS in swfupload.swf</title>
<file>swfupload.swf</file>
<reference>http://brindi.si/g/blog/vulnerable-swf-bundled-in-wordpress-plugins.html</reference>
</hash>
<hash sha1="775dc1089829ef07838406def28a4d8bfef69d66">
<title>Arbitrary File Upload Vulnerability</title>
<file>php.php</file>
<reference>http://packetstormsecurity.com/files/119241/wpvalums-shell.txt</reference>
</hash>
<!-- This one a is the same as above, but the postSize verification has been removed -->
<hash sha1="5e8f0d5a917d2937318a9bafd0529135bd473e70">
<title>Arbitrary File Upload Vulnerability</title>
<file>php.php</file>
<reference>http://packetstormsecurity.com/files/119218/wpreflexgallery-shell.txt</reference>
</hash>
<hash sha1="3f9ad05b05b65ee2b6efa1373f708293dd2005c7">
<title>Arbitrary File Upload Vulnerability</title>
<file>uploadify.php</file>
<reference>http://packetstormsecurity.com/files/119219/wpuploader104-shell.txt</reference>
</hash>
<hash sha1="ac638cc38f011b74a8d9a4e7d3d60358e472166c">
<title>Inline phpinfo()</title>
<file>phpinfo.php</file>
<reference>http://php.net/manual/en/function.phpinfo.php</reference>
</hash>
<hash sha1="012ee25cceff745e681fbb3697a06f3712f55554">
<title>phpinfo()</title>
<file>phpinfo.php</file>
<reference>http://php.net/manual/en/function.phpinfo.php</reference>
</hash>
</hashes>

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="uritype">
<xs:restriction base="xs:anyURI">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sha1type">
<xs:restriction base="stringtype">
<xs:pattern value="[0-9a-f]{40}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="hashtype">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="title" type="stringtype"/>
<xs:element name="file" type="stringtype"/>
<xs:element name="reference" type="uritype"/>
</xs:sequence>
<xs:attribute type="sha1type" name="sha1" use="required"/>
</xs:complexType>
<xs:element name="hashes">
<xs:complexType>
<xs:sequence>
<xs:element name="hash" type="hashtype" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -1,3 +0,0 @@
http://.*\.rr\.nu
http://www\.thesea\.org/media\.php

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,300 +0,0 @@
2013-black-and-white
academica
accessible-zen
adamos
adelle
admired
adventure
adventure-journal
aldehyde
alexandria
alhena-lite
analytical-lite
andrina-lite
annotum-base
ascetica
aspen
atahualpa
atheros
attitude
attorney
autofocus
beach
birdsite
birdtips
biznez-lite
bizstudio-lite
bizway
black-rider
blackbird
blain
blankslate
blogbox
blogolife
bold-headline
boldr-lite
book-lite
boot-store
bota
bouquet
bresponzive
bueno
business-lite
busiprof
buzz
careta
carton
catch-box
catch-everest
catch-evolution
cazuela
celebrate
celestial-lite
central
chaostheory
cherry-blossom
childishly-simple
church
clean-black
clean-retina
coller
colorway
contango
coraline
corpo
custom-community
customizr
cyberchimps
cycnus
d5-business-line
d5-design
d5-socialia
dailypost
decode
delicate
delighted
designfolio
destro
deux-milles-douze
discover
dms
duena
dusk-to-dawn
duster
dw-minion
easel
eclipse
elegantwhite
emphaino
encounters-lite
engrave-lite
epic
esplanade
espressionista
esquire
estate
evolve
expound
fashionistas
fine
firmasite
fluxipress
focus
forever
frisco-for-buddypress
frontier
fruitful
futuristica
gamepress
golden-eagle-lite
graphene
greenpage
gridiculous
gridster-lite
hannari
hatch
hazen
heatmap-adaptive
hero
hiero
highwind
hostmarks
houston
hro
hybrid
iconic-one
icy
ifeature
imag-mag
impressio-lite
impulse
infoway
innovative
intuition
irex-lite
iribbon
kabbo
klasik
koenda
lamya
landscape
leaf
litesta
lobster
local-business
lugada
luminescence-lite
magazine
magazine-basic
magazine-style
magazino
manchester
mantra
marla
max-magazine
melany
mh-magazine-lite
minimatica
minimize
mixfolio
modern-estate
mon-cahier
montezuma
multipurpose
my-depressive
my-world-with-grass-and-dew
mystique
narga
neuro
newp
next-saturday
omega
openstrap
opulus-sombre
origami
origin
oxygen
p2
p2-categories
pagelines
parabola
parament
path
phonix
photographic
photolistic
photologger
pilcrow
pilot-fish
pinbin
pinboard
pink-touch-2
pitch
platform
point
portfolio-press
pr-news
prana
preference-lite
quark
r2d2
raindrops
raptor
raven
response
responsive
restaurateur
retro
road-fighter
ryu
sampression-lite
sensitive
serene
shprink-one
silverclean-lite
simple-and-clean
simple-catch
simpleo
simplicity-lite
simplify
sixteen
sliding-door
small-business
snaps
snapshot
snowblind
socially-awkward
spartan
spasalon
spine
spun
squirrel
startupwp
steira
strapvert
striker
suevafree
suffusion
suits
sukelius-magazine
sundance
sunny-blue-sky
sunspot
supernova
surfarama
sweet-tech
swift-basic
tampa
target
teal
terrifico
tesla
the-bootstrap
thematic
themia-lite
theron-lite
timeturner
tiny-forge
tonic
toolbox
travel-blogger
travelify
tribbiani
twentyeleven
twentyten
twentythirteen
twentytwelve
unique
untitled
uptown
vantage
viper
virtue
visitpress
visual
vortex
voyage
ward
weaver-ii
wordpost
wp-creativix
wp-flatthirteen
wp-knowledge-base
wp-opulus
xin-magazine
yoko
zalive
zbench
zeebizzcard
zeebusiness
zeedynamic
zeeflow
zeefocus
zeemagazine
zeeminty
zeenews
zeenoble
zeestyle
zeesynergie
zeetasty
zenon-lite

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,106 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger" />
</xs:simpleType>
<xs:simpleType name="uritype">
<xs:restriction base="xs:anyURI">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="cvetype">
<xs:restriction base="xs:token">
<xs:pattern value="[0-9]{4}-[0-9]{4,}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="typetype">
<xs:restriction base="stringtype">
<xs:enumeration value="SQLI"/>
<xs:enumeration value="MULTI"/>
<xs:enumeration value="REDIRECT"/>
<xs:enumeration value="RCE"/>
<xs:enumeration value="RFI"/>
<xs:enumeration value="LFI"/>
<xs:enumeration value="UPLOAD"/>
<xs:enumeration value="UNKNOWN"/>
<xs:enumeration value="XSS"/>
<xs:enumeration value="CSRF"/>
<xs:enumeration value="SSRF"/>
<xs:enumeration value="AUTHBYPASS"/>
<xs:enumeration value="FPD"/>
<xs:enumeration value="XXE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="itemtype">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="vulnerability" type="vulntype" />
</xs:sequence>
<xs:attribute type="stringtype" name="name" use="required"/>
</xs:complexType>
<xs:complexType name="wordpresstype">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="vulnerability" type="vulntype"/>
</xs:sequence>
<xs:attribute type="stringtype" name="version" use="required"/>
</xs:complexType>
<xs:complexType name="vulntype">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:choice>
<xs:element name="title" type="stringtype"/>
<xs:element name="type" type="typetype"/>
<xs:element name="fixed_in" type="stringtype"/>
<xs:element name="references" type="referencetype"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="referencetype">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:choice>
<xs:element name="url" type="uritype" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="cve" type="cvetype" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="secunia" type="inttype" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="osvdb" type="inttype" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="metasploit" type="stringtype" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="exploitdb" type="inttype" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:element name="vulnerabilities">
<xs:complexType>
<xs:choice>
<xs:element name="plugin" type="itemtype" maxOccurs="unbounded" minOccurs="0"/>
<xs:element name="theme" type="itemtype" maxOccurs="unbounded" minOccurs="0"/>
<xs:element name="wordpress" type="wordpresstype" maxOccurs="unbounded" minOccurs="0"/>
</xs:choice>
</xs:complexType>
<xs:unique name="uniquePlugin">
<xs:selector xpath="plugin"/>
<xs:field xpath="@name"/>
</xs:unique>
<xs:unique name="uniqueTheme">
<xs:selector xpath="theme"/>
<xs:field xpath="@name"/>
</xs:unique>
<xs:unique name="uniqueWordpress">
<xs:selector xpath="wordpress"/>
<xs:field xpath="@version"/>
</xs:unique>
</xs:element>
</xs:schema>

View File

@@ -1,223 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file contains identification data to identify WordPress versions.
http://wordpress.org/download/release-archive/
Position is important, DO NOT change anything unless you know what you are doing :p
-->
<wp-versions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="wp_versions.xsd">
<file src="wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js">
<hash md5="5d01c0e812cdcd6356b78ee0cb4e5426">
<version>3.7.1</version>
</hash>
</file>
<file src="wp-includes/js/jquery/jquery.form.js">
<hash md5="e5afd8e41d2ec22c19932b068cd90a71">
<version>3.7</version>
</hash>
</file>
<file src="wp-admin/js/common.js">
<hash md5="03eaffeef39119f0523a49c7f9767f3b">
<version>3.6.1</version>
</hash>
<hash md5="4516252d47a73630280869994d510180">
<version>3.3</version>
</hash>
</file>
<file src="wp-includes/js/jquery/jquery.js">
<hash md5="9dcde2d5e8aeda556a0c52239fa2f44c">
<version>3.6</version>
</hash>
</file>
<file src="wp-includes/js/tinymce/tiny_mce.js">
<hash md5="eddb5fda74d41dbdac018167536d8d53">
<version>3.5.2</version>
</hash>
<hash md5="6e79ab6d786c5c95920064add33ee599">
<version>3.5.1</version>
</hash>
<hash md5="55cd8e5ceca9c1763b1401164d70df50">
<version>3.5</version>
</hash>
</file>
<file src="wp-includes/js/wp-lists.js">
<hash md5="46e1341cd4ea49f31046f7d7962adc7f">
<version>3.4.2</version>
</hash>
</file>
<file src="wp-includes/js/customize-preview.js">
<hash md5="617d9fd858e117c7d1d087be168b5643">
<version>3.4.1</version>
</hash>
<hash md5="da36bc2dfcb13350c799b62de68dfa4b">
<version>3.4</version>
</hash>
<hash md5="a8a259fc5197a78ffe62d6be38dc52f8">
<version>3.4-beta4</version>
</hash>
</file>
<file src="wp-includes/js/plupload/plupload.js">
<hash md5="85199c05db63fcb5880de4af8be7b571">
<version>3.3.2</version>
</hash>
</file>
<file src="$wp-content$/themes/twentyeleven/style.css">
<!-- same md5 for 3.3.2 -->
<hash md5="030d3bac906ba69e9fbc99c5bac54a8e">
<version>3.3.1</version>
</hash>
</file>
<file src="wp-admin/js/wp-fullscreen.js">
<hash md5="5675f7793f171b6424bf72f9d7bf4d9a">
<version>3.2.1</version>
</hash>
<hash md5="7b423e0b7c9221092737ad5271d09863">
<version>3.2</version>
</hash>
</file>
<file src="wp-includes/css/admin-bar.css">
<hash md5="181250fab3a7e2549a7e7fa21c2e6079">
<version>3.1</version>
</hash>
</file>
<file src="$wp-content$/themes/twentyten/style.css">
<hash md5="6211e2ac1463bf99e98f28ab63e47c54">
<version>3.0</version>
</hash>
</file>
<file src="$wp-plugins$/akismet/readme.txt">
<hash md5="4d5e52da417aa0101054bd41e6243389">
<version>2.8.6</version>
</hash>
<hash md5="58e086dea9d24ed074fe84ba87386c69">
<version>2.8.5</version>
</hash>
<hash md5="48c52025b5f28731e9a0c864c189c2e7">
<version>2.8.2</version>
</hash>
</file>
<file src="wp-includes/js/wp-ajax-response.js">
<hash md5="0289d1c13821599764774d55516ab81a">
<version>2.7.1</version>
</hash>
</file>
<file src="wp-includes/js/thickbox/thickbox.css">
<hash md5="9c2bd2be0893adbe02a0f864526734c2">
<version>2.7</version>
</hash>
</file>
<file src="wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js">
<hash md5="5b140ddf0f08034402ae78b31d8a1a28">
<version>2.6</version>
</hash>
</file>
<file src="wp-includes/js/tinymce/themes/advanced/js/image.js">
<hash md5="088245408531c58bb52cc092294cc384">
<version>2.5.1</version>
</hash>
</file>
<file src="wp-includes/js/tinymce/themes/advanced/js/link.js">
<hash md5="19c6f3118728c38eb7779aab4847d2d9">
<version>2.5</version>
</hash>
</file>
<file src="wp-includes/js/wp-ajax.js">
<hash md5="c5dbce0c3232c477033e0ce486c62755">
<version>2.2</version>
</hash>
</file>
<file src="$wp-content$/themes/default/style.css">
<hash md5="e44545f529a54de88209ce588676231c">
<version>2.0.1</version>
</hash>
<hash md5="f786f66d3a40846aa22dcdfeb44fa562">
<version>2.0</version>
</hash>
</file>
<file src="wp-layout.css">
<hash md5="7140e06c00ed03d2bb3dad7672557510">
<version>1.2.1</version>
</hash>
<hash md5="1bcc9253506c067eb130c9fc4f211a2f">
<version>1.2-delta</version>
</hash>
</file>
<file src="layout2b.css">
<hash md5="baec6b6ccbf71d8dced9f1bf67c751e1">
<version>0.71-gold</version>
</hash>
</file>
</wp-versions>

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="filetype">
<xs:sequence>
<xs:element name="hash" type="hashtype" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
<xs:attribute type="stringtype" name="src" use="required"/>
</xs:complexType>
<xs:simpleType name="md5type">
<xs:restriction base="stringtype">
<xs:pattern value="[0-9a-f]{32}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="hashtype">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="version" type="stringtype"/>
</xs:sequence>
<xs:attribute type="md5type" name="md5" use="required"/>
</xs:complexType>
<xs:element name="wp-versions">
<xs:complexType>
<xs:sequence>
<xs:element name="file" type="filetype" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

File diff suppressed because it is too large Load Diff

41
dev/pre-commit-hook.rb Executable file
View File

@@ -0,0 +1,41 @@
#!/usr/bin/env ruby
# from the top level dir:
# ln -sf ../../dev/pre-commit-hook.rb .git/hooks/pre-commit
require 'pty'
html_path = 'rspec_results.html'
begin
PTY.spawn( "rspec spec --format h > #{html_path}" ) do |stdin, stdout, pid|
begin
stdin.each { |line| print line }
rescue Errno::EIO => e
puts "Error: #{e.to.s}"
return 1
end
end
rescue PTY::ChildExited
puts 'Child process exit!'
end
# find out if there were any errors
html = open(html_path).read
examples = html.match(/(\d+) examples/)[0].to_i rescue 0
errors = html.match(/(\d+) errors/)[0].to_i rescue 0
if errors == 0
errors = html.match(/(\d+) failure/)[0].to_i rescue 0
end
pending = html.match(/(\d+) pending/)[0].to_i rescue 0
if errors.zero?
puts "0 failed! #{examples} run, #{pending} pending"
sleep 1
exit 0
else
puts "\aCOMMIT FAILED!!"
puts "View your rspec results at #{File.expand_path(html_path)}"
puts
puts "#{errors} failed! #{examples} run, #{pending} pending"
exit 1
end

18
example.conf.json Normal file
View File

@@ -0,0 +1,18 @@
{
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0",
/* Uncomment the "proxy" line to use the proxy
SOCKS proxies (4, 4A, 5) are supported, ie : "proxy": "socks5://127.0.0.1:9000"
If you do not specify the protocol, http will be used
*/
//"proxy": "127.0.0.1:3128",
//"proxy_auth": "username:password",
"cache_ttl": 600, // 10 minutes, at this time the cache is cleaned before each scan. If this value is set to 0, the cache will be disabled
"request_timeout": 60, // 1min
"connect_timeout": 10, // 10s
"max_threads": 20
}

View File

@@ -9,30 +9,36 @@ class Browser
include Browser::Options include Browser::Options
OPTIONS = [ OPTIONS = [
:available_user_agents,
:basic_auth, :basic_auth,
:cache_ttl, :cache_ttl,
:max_threads, :max_threads,
:user_agent, :user_agent,
:user_agent_mode,
:proxy, :proxy,
:proxy_auth, :proxy_auth,
:request_timeout, :request_timeout,
:connect_timeout :connect_timeout,
:cookie,
:throttle
] ]
@@instance = nil @@instance = nil
attr_reader :hydra, :config_file, :cache_dir attr_reader :hydra, :cache_dir
attr_accessor :referer, :cookie, :vhost
# @param [ Hash ] options # @param [ Hash ] options
# #
# @return [ Browser ] # @return [ Browser ]
def initialize(options = {}) def initialize(options = {})
@config_file = options[:config_file] || CONF_DIR + '/browser.conf.json' @cache_dir = options[:cache_dir] || CACHE_DIR + '/browser'
@cache_dir = options[:cache_dir] || CACHE_DIR + '/browser'
load_config # sets browser defaults
browser_defaults
# load config file
conf = options[:config_file]
load_config(conf) if conf
# overrides defaults with user supplied values (overwrite values from config)
override_config(options) override_config(options)
unless @hydra unless @hydra
@@ -61,6 +67,20 @@ class Browser
@@instance = nil @@instance = nil
end end
#
# sets browser default values
#
def browser_defaults
@max_threads = 20
# 10 minutes, at this time the cache is cleaned before each scan.
# If this value is set to 0, the cache will be disabled
@cache_ttl = 600
@request_timeout = 60 # 60s
@connect_timeout = 10 # 10s
@user_agent = "WPScan v#{WPSCAN_VERSION} (http://wpscan.org)"
@throttle = 0
end
# #
# If an option was set but is not in the new config_file # If an option was set but is not in the new config_file
# it's value is kept # it's value is kept
@@ -69,17 +89,14 @@ class Browser
# #
# @return [ void ] # @return [ void ]
def load_config(config_file = nil) def load_config(config_file = nil)
@config_file = config_file || @config_file if File.symlink?(config_file)
if File.symlink?(@config_file)
raise '[ERROR] Config file is a symlink.' raise '[ERROR] Config file is a symlink.'
else else
data = JSON.parse(File.read(@config_file)) data = JSON.parse(File.read(config_file))
end end
OPTIONS.each do |option| OPTIONS.each do |option|
option_name = option.to_s option_name = option.to_s
unless data[option_name].nil? unless data[option_name].nil?
self.send(:"#{option_name}=", data[option_name]) self.send(:"#{option_name}=", data[option_name])
end end
@@ -101,15 +118,12 @@ class Browser
params = Browser.append_params_header_field( params = Browser.append_params_header_field(
params, params,
'User-Agent', 'User-Agent',
self.user_agent @user_agent
) )
if @proxy if @proxy
params = params.merge(proxy: @proxy) params.merge!(proxy: @proxy)
params.merge!(proxyauth: @proxy_auth) if @proxy_auth
if @proxy_auth
params = params.merge(proxyauth: @proxy_auth)
end
end end
if @basic_auth if @basic_auth
@@ -120,18 +134,23 @@ class Browser
) )
end end
if @request_timeout if vhost
params = params.merge(timeout: @request_timeout) params = Browser.append_params_header_field(
params,
'Host',
vhost
)
end end
if @connect_timeout params.merge!(referer: referer)
params = params.merge(connecttimeout: @connect_timeout) params.merge!(timeout: @request_timeout) if @request_timeout
end params.merge!(connecttimeout: @connect_timeout) if @connect_timeout
# Used to enable the cache system if :cache_ttl > 0 # Used to enable the cache system if :cache_ttl > 0
unless params.has_key?(:cache_ttl) params.merge!(cache_ttl: @cache_ttl) unless params.key?(:cache_ttl)
params = params.merge(cache_ttl: @cache_ttl)
end # Prevent infinite self redirection
params.merge!(maxredirs: 3) unless params.key?(:maxredirs)
# Disable SSL-Certificate checks # Disable SSL-Certificate checks
params.merge!(ssl_verifypeer: false) params.merge!(ssl_verifypeer: false)
@@ -139,6 +158,7 @@ class Browser
params.merge!(cookiejar: @cache_dir + '/cookie-jar') params.merge!(cookiejar: @cache_dir + '/cookie-jar')
params.merge!(cookiefile: @cache_dir + '/cookie-jar') params.merge!(cookiefile: @cache_dir + '/cookie-jar')
params.merge!(cookie: @cookie) if @cookie
params params
end end
@@ -158,5 +178,4 @@ class Browser
end end
params params
end end
end end

View File

@@ -3,10 +3,8 @@
class Browser class Browser
module Options module Options
USER_AGENT_MODES = %w{ static semi-static random } attr_accessor :cache_ttl, :request_timeout, :connect_timeout
attr_reader :basic_auth, :proxy, :proxy_auth, :throttle
attr_accessor :available_user_agents, :cache_ttl, :request_timeout, :connect_timeout
attr_reader :basic_auth, :user_agent_mode, :proxy, :proxy_auth
attr_writer :user_agent attr_writer :user_agent
# Sets the Basic Authentification credentials # Sets the Basic Authentification credentials
@@ -41,42 +39,6 @@ class Browser
end end
end end
# Sets the user_agent_mode, which can be one of the following:
# static: The UA is defined by the user, and will be the same in each requests
# semi-static: The UA is randomly chosen at the first request, and will not change
# random: UA randomly chosen each request
#
# UA are from @available_user_agents
#
# @param [ String ] ua_mode
#
# @return [ void ]
def user_agent_mode=(ua_mode)
ua_mode ||= 'static'
if USER_AGENT_MODES.include?(ua_mode)
@user_agent_mode = ua_mode
# For semi-static user agent mode, the user agent has to
# be nil the first time (it will be set with the getter)
@user_agent = nil if ua_mode === 'semi-static'
else
raise "Unknow user agent mode : '#{ua_mode}'"
end
end
# @return [ String ] The user agent, according to the user_agent_mode
def user_agent
case @user_agent_mode
when 'semi-static'
unless @user_agent
@user_agent = @available_user_agents.sample
end
when 'random'
@user_agent = @available_user_agents.sample
end
@user_agent
end
# Sets the proxy # Sets the proxy
# Accepted format: # Accepted format:
# [protocol://]host:post # [protocol://]host:post
@@ -120,7 +82,7 @@ class Browser
# #
# @return [ void ] # @return [ void ]
def request_timeout=(timeout) def request_timeout=(timeout)
@request_timeout = timeout @request_timeout = timeout.to_i
end end
# Sets the connect timeout # Sets the connect timeout
@@ -128,7 +90,12 @@ class Browser
# #
# @return [ void ] # @return [ void ]
def connect_timeout=(timeout) def connect_timeout=(timeout)
@connect_timeout = timeout @connect_timeout = timeout.to_i
end
# @param [ String, Integer ] throttle
def throttle=(throttle)
@throttle = throttle.to_i.abs / 1000.0
end end
protected protected
@@ -148,6 +115,5 @@ class Browser
end end
end end
end end
end end
end end

View File

@@ -9,17 +9,19 @@
# #
require 'yaml' require 'yaml'
require 'fileutils'
class CacheFileStore class CacheFileStore
attr_reader :storage_path, :serializer attr_reader :storage_path, :cache_dir, :serializer
# The serializer must have the 2 methods .load and .dump # The serializer must have the 2 methods .load and .dump
# (Marshal and YAML have them) # (Marshal and YAML have them)
# YAML is Human Readable, contrary to Marshal which store in a binary format # YAML is Human Readable, contrary to Marshal which store in a binary format
# Marshal does not need any "require" # Marshal does not need any "require"
def initialize(storage_path, serializer = Marshal) def initialize(storage_path, serializer = Marshal)
@storage_path = File.expand_path(storage_path) @cache_dir = File.expand_path(storage_path)
@serializer = serializer @storage_path = File.expand_path(File.join(storage_path, storage_dir))
@serializer = serializer
# File.directory? for ruby <= 1.9 otherwise, # File.directory? for ruby <= 1.9 otherwise,
# it makes more sense to do Dir.exist? :/ # it makes more sense to do Dir.exist? :/
@@ -29,16 +31,22 @@ class CacheFileStore
end end
def clean def clean
Dir[File.join(@storage_path, '*')].each do |f| # clean old directories
File.delete(f) unless File.symlink?(f) Dir[File.join(@cache_dir, '*')].each do |f|
if File.directory?(f)
# delete directory if create time is older than 4 hours
FileUtils.rm_rf(f) if File.mtime(f) < (Time.now - (60*240))
else
File.delete(f) unless File.symlink?(f)
end
end end
end end
def read_entry(key) def read_entry(key)
entry_file_path = get_entry_file_path(key) begin
@serializer.load(File.read(get_entry_file_path(key)))
if File.exists?(entry_file_path) rescue
return @serializer.load(File.read(entry_file_path)) nil
end end
end end
@@ -58,4 +66,11 @@ class CacheFileStore
File::join(@storage_path, key) File::join(@storage_path, key)
end end
def storage_dir
time = Time.now
random = (0...8).map { (65 + rand(26)).chr }.join
Digest::MD5.hexdigest("#{time}#{random}")
end
end end

View File

@@ -3,9 +3,9 @@
class Vulnerabilities < Array class Vulnerabilities < Array
module Output module Output
def output def output(verbose = false)
self.each do |v| self.each do |v|
v.output v.output(verbose)
end end
end end

View File

@@ -14,7 +14,7 @@ class WpItems < Array
self.wp_target = wp_target self.wp_target = wp_target
end end
# @param [String,] argv # @param [String] args
# #
# @return [ void ] # @return [ void ]
def add(*args) def add(*args)
@@ -67,6 +67,7 @@ class WpItems < Array
end end
protected protected
# @return [ Class ] # @return [ Class ]
def item_class def item_class
Object.const_get(self.class.to_s.gsub(/.$/, '')) Object.const_get(self.class.to_s.gsub(/.$/, ''))

View File

@@ -17,15 +17,13 @@ class WpItems < Array
hydra = browser.hydra hydra = browser.hydra
targets = targets_items(wp_target, options) targets = targets_items(wp_target, options)
progress_bar = progress_bar(targets.size, options) progress_bar = progress_bar(targets.size, options)
queue_count = 0
exist_options = { exist_options = {
error_404_hash: wp_target.error_404_hash, error_404_hash: wp_target.error_404_hash,
homepage_hash: wp_target.homepage_hash, homepage_hash: wp_target.homepage_hash,
exclude_content: options[:exclude_content] ? %r{#{options[:exclude_content]}} : nil exclude_content: options[:exclude_content] ? %r{#{options[:exclude_content]}} : nil
} }
results = passive_detection(wp_target, options)
# If we only want the vulnerable ones, the passive detection is ignored
# Otherwise, a passive detection is performed, and results will be merged
results = options[:only_vulnerable] ? new : passive_detection(wp_target, options)
targets.each do |target_item| targets.each do |target_item|
request = browser.forge_request(target_item.url, request_params) request = browser.forge_request(target_item.url, request_params)
@@ -34,20 +32,27 @@ class WpItems < Array
progress_bar.progress += 1 if options[:show_progression] progress_bar.progress += 1 if options[:show_progression]
if target_item.exists?(exist_options, response) if target_item.exists?(exist_options, response)
if !results.include?(target_item) results << target_item unless results.include?(target_item)
if !options[:only_vulnerable] || options[:only_vulnerable] && target_item.vulnerable?
results << target_item
end
end
end end
end end
hydra.queue(request) hydra.queue(request)
queue_count += 1
if queue_count >= browser.max_threads
hydra.run
queue_count = 0
puts "Sent #{browser.max_threads} requests ..." if options[:verbose]
end
end end
# run the remaining requests
hydra.run hydra.run
results.select!(&:vulnerable?) if options[:type] == :vulnerable
results.sort! results.sort!
results # can't just return results.sort because the #sort returns an array, and we want a WpItems
results # can't just return results.sort as it would return an array, and we want a WpItems
end end
# @param [ Integer ] targets_size # @param [ Integer ] targets_size
@@ -71,13 +76,31 @@ class WpItems < Array
# #
# @return [ WpItems ] # @return [ WpItems ]
def passive_detection(wp_target, options = {}) def passive_detection(wp_target, options = {})
results = new(wp_target) results = new(wp_target)
body = Browser.get(wp_target.url).body
# improves speed # improves speed
body = remove_base64_images_from_html(body) body = remove_base64_images_from_html(Browser.get(wp_target.url).body)
names = body.scan(passive_detection_pattern(wp_target)) page = Nokogiri::HTML(body)
names = []
names.flatten.uniq.each { |name| results.add(name) } page.css('link,script,style').each do |tag|
%w(href src).each do |attribute|
attr_value = tag.attribute(attribute).to_s
next unless attr_value
names << Regexp.last_match[1] if attr_value.match(attribute_pattern(wp_target))
end
next unless tag.name == 'script' || tag.name == 'style'
code = tag.text.to_s
next if code.empty?
code.scan(code_pattern(wp_target)).flatten.uniq.each do |item_name|
names << item_name
end
end
names.uniq.each { |name| results.add(name) }
results.sort! results.sort!
results results
@@ -88,13 +111,29 @@ class WpItems < Array
# @param [ WpTarget ] wp_target # @param [ WpTarget ] wp_target
# #
# @return [ Regex ] # @return [ Regex ]
def passive_detection_pattern(wp_target) def item_pattern(wp_target)
type = self.to_s.gsub(/Wp/, '').downcase type = to_s.gsub(/Wp/, '').downcase
regex1 = %r{(?:[^=:\(]+)\s?(?:=|:|\()\s?(?:"|')[^"']+\\?/} wp_content_dir = wp_target.wp_content_dir
regex2 = %r{\\?/} wp_content_url = wp_target.uri.merge(wp_content_dir).to_s
regex3 = %r{\\?/([^/\\"']+)\\?(?:/|"|')}
/#{regex1}#{Regexp.escape(wp_target.wp_content_dir)}#{regex2}#{Regexp.escape(type)}#{regex3}/i url = /#{wp_content_url.gsub(%r{\A(?:http|https)}, 'https?').gsub('/', '\\\\\?\/')}/i
content_dir = %r{(?:#{url}|\\?\/\\?\/?#{wp_content_dir})}i
%r{#{content_dir}\\?/#{type}\\?/}
end
# @param [ WpTarget ] wp_target
#
# @return [ Regex ]
def attribute_pattern(wp_target)
/\A#{item_pattern(wp_target)}([^\/]+)/i
end
# @param [ WpTarget ] wp_target
#
# @return [ Regex ]
def code_pattern(wp_target)
/["'\(]#{item_pattern(wp_target)}([^\\\/\)"']+)/i
end end
# The default request parameters # The default request parameters
@@ -112,15 +151,7 @@ class WpItems < Array
item_class = self.item_class item_class = self.item_class
vulns_file = self.vulns_file vulns_file = self.vulns_file
targets = vulnerable_targets_items(wp_target, item_class, vulns_file) targets = target_items_from_type(wp_target, item_class, vulns_file, options[:type])
unless options[:only_vulnerable]
unless options[:file]
raise 'A file must be supplied'
end
targets += targets_items_from_file(options[:file], wp_target, item_class, vulns_file)
end
targets.uniq! { |t| t.name } targets.uniq! { |t| t.name }
targets.sort_by { rand } targets.sort_by { rand }
@@ -131,18 +162,30 @@ class WpItems < Array
# @param [ String ] vulns_file # @param [ String ] vulns_file
# #
# @return [ Array<WpItem> ] # @return [ Array<WpItem> ]
def vulnerable_targets_items(wp_target, item_class, vulns_file) def target_items_from_type(wp_target, item_class, vulns_file, type)
targets = [] targets = []
xml = xml(vulns_file) json = json(vulns_file)
xml.xpath(item_xpath).each do |node| case type
when :vulnerable
items = json.select { |item| !json[item]['vulnerabilities'].empty? }.keys
when :popular
items = json.select { |item| json[item]['popular'] == true }.keys
when :all
items = json.keys
else
raise "Unknown type #{type}"
end
items.each do |item|
targets << create_item( targets << create_item(
item_class, item_class,
node.attribute('name').text, item,
wp_target, wp_target,
vulns_file vulns_file
) )
end end
targets targets
end end
@@ -181,6 +224,7 @@ class WpItems < Array
) )
end end
end end
targets targets
end end
@@ -188,6 +232,5 @@ class WpItems < Array
def item_class def item_class
Object.const_get(self.to_s.gsub(/.$/, '')) Object.const_get(self.to_s.gsub(/.$/, ''))
end end
end end
end end

View File

@@ -3,8 +3,8 @@
class WpItems < Array class WpItems < Array
module Output module Output
def output def output(verbose = false)
self.each { |item| item.output } self.each { |item| item.output(verbose) }
end end
end end

View File

@@ -2,15 +2,9 @@
class WpPlugins < WpItems class WpPlugins < WpItems
module Detectable module Detectable
# @return [ String ] # @return [ String ]
def vulns_file def vulns_file
PLUGINS_VULNS_FILE PLUGINS_FILE
end
# @return [ String ]
def item_xpath
'//plugin'
end end
# @param [ WpTarget ] wp_target # @param [ WpTarget ] wp_target
@@ -68,6 +62,10 @@ class WpPlugins < WpItems
wp_plugins.add('all-in-one-seo-pack', version: $1) wp_plugins.add('all-in-one-seo-pack', version: $1)
end end
if body =~ /<!-- This site is optimized with the Yoast WordPress SEO plugin v([^\s]+) -/i
wp_plugins.add('wordpress-seo', version: $1)
end
wp_plugins wp_plugins
end end

View File

@@ -5,13 +5,7 @@ class WpThemes < WpItems
# @return [ String ] # @return [ String ]
def vulns_file def vulns_file
THEMES_VULNS_FILE THEMES_FILE
end end
# @return [ String ]
def item_xpath
'//theme'
end
end end
end end

View File

@@ -38,6 +38,7 @@ class WpUsers < WpItems
junk = get_equal_string_end(display_names) junk = get_equal_string_end(display_names)
unless junk.nil? or junk.empty? unless junk.nil? or junk.empty?
self.each do |u| self.each do |u|
u.display_name ||= ''
u.display_name = u.display_name.sub(/#{Regexp.escape(junk)}$/, '') u.display_name = u.display_name.sub(/#{Regexp.escape(junk)}$/, '')
end end
end end

View File

@@ -1,39 +1,34 @@
# encoding: UTF-8 # encoding: UTF-8
LIB_DIR = File.expand_path(File.dirname(__FILE__) + '/..') LIB_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..'))
ROOT_DIR = File.expand_path(LIB_DIR + '/..') # expand_path is used to get "wpscan/" instead of "wpscan/lib/../" ROOT_DIR = File.expand_path(File.join(LIB_DIR, '..')) # expand_path is used to get "wpscan/" instead of "wpscan/lib/../"
DATA_DIR = ROOT_DIR + '/data' DATA_DIR = File.join(ROOT_DIR, 'data')
CONF_DIR = ROOT_DIR + '/conf' CONF_DIR = File.join(ROOT_DIR, 'conf')
CACHE_DIR = ROOT_DIR + '/cache' CACHE_DIR = File.join(ROOT_DIR, 'cache')
WPSCAN_LIB_DIR = LIB_DIR + '/wpscan' WPSCAN_LIB_DIR = File.join(LIB_DIR, 'wpscan')
WPSTOOLS_LIB_DIR = LIB_DIR + '/wpstools' UPDATER_LIB_DIR = File.join(LIB_DIR, 'updater')
UPDATER_LIB_DIR = LIB_DIR + '/updater' COMMON_LIB_DIR = File.join(LIB_DIR, 'common')
COMMON_LIB_DIR = LIB_DIR + '/common' MODELS_LIB_DIR = File.join(COMMON_LIB_DIR, 'models')
MODELS_LIB_DIR = COMMON_LIB_DIR + '/models' COLLECTIONS_LIB_DIR = File.join(COMMON_LIB_DIR, 'collections')
COLLECTIONS_LIB_DIR = COMMON_LIB_DIR + '/collections'
LOG_FILE = ROOT_DIR + '/log.txt' LOG_FILE = File.join(ROOT_DIR, 'log.txt')
# Plugins directories # Plugins directories
COMMON_PLUGINS_DIR = COMMON_LIB_DIR + '/plugins' COMMON_PLUGINS_DIR = File.join(COMMON_LIB_DIR, 'plugins')
WPSCAN_PLUGINS_DIR = WPSCAN_LIB_DIR + '/plugins' # Not used ATM WPSCAN_PLUGINS_DIR = File.join(WPSCAN_LIB_DIR, 'plugins') # Not used ATM
WPSTOOLS_PLUGINS_DIR = WPSTOOLS_LIB_DIR + '/plugins'
# Data files # Data files
PLUGINS_FILE = DATA_DIR + '/plugins.txt' WORDPRESSES_FILE = File.join(DATA_DIR, 'wordpresses.json')
PLUGINS_FULL_FILE = DATA_DIR + '/plugins_full.txt' PLUGINS_FILE = File.join(DATA_DIR, 'plugins.json')
PLUGINS_VULNS_FILE = DATA_DIR + '/plugin_vulns.xml' THEMES_FILE = File.join(DATA_DIR, 'themes.json')
THEMES_FILE = DATA_DIR + '/themes.txt' WP_VERSIONS_FILE = File.join(DATA_DIR, 'wp_versions.xml')
THEMES_FULL_FILE = DATA_DIR + '/themes_full.txt' LOCAL_FILES_FILE = File.join(DATA_DIR, 'local_vulnerable_files.xml')
THEMES_VULNS_FILE = DATA_DIR + '/theme_vulns.xml' WP_VERSIONS_XSD = File.join(DATA_DIR, 'wp_versions.xsd')
WP_VULNS_FILE = DATA_DIR + '/wp_vulns.xml' LOCAL_FILES_XSD = File.join(DATA_DIR, 'local_vulnerable_files.xsd')
WP_VERSIONS_FILE = DATA_DIR + '/wp_versions.xml' USER_AGENTS_FILE = File.join(DATA_DIR, 'user-agents.txt')
LOCAL_FILES_FILE = DATA_DIR + '/local_vulnerable_files.xml' LAST_UPDATE_FILE = File.join(DATA_DIR, '.last_update')
VULNS_XSD = DATA_DIR + '/vuln.xsd'
WP_VERSIONS_XSD = DATA_DIR + '/wp_versions.xsd'
LOCAL_FILES_XSD = DATA_DIR + '/local_vulnerable_files.xsd'
WPSCAN_VERSION = '2.2' WPSCAN_VERSION = '2.9'
$LOAD_PATH.unshift(LIB_DIR) $LOAD_PATH.unshift(LIB_DIR)
$LOAD_PATH.unshift(WPSCAN_LIB_DIR) $LOAD_PATH.unshift(WPSCAN_LIB_DIR)
@@ -41,7 +36,7 @@ $LOAD_PATH.unshift(MODELS_LIB_DIR)
def kali_linux? def kali_linux?
begin begin
File.readlines("/etc/debian_version").grep(/^kali/i).any? File.readlines('/etc/debian_version').grep(/^kali/i).any?
rescue rescue
false false
end end
@@ -49,14 +44,18 @@ end
require 'environment' require 'environment'
def escape_glob(s)
s.gsub(/[\\\{\}\[\]\*\?]/) { |x| '\\' + x }
end
# TODO : add an exclude pattern ? # TODO : add an exclude pattern ?
def require_files_from_directory(absolute_dir_path, files_pattern = '*.rb') def require_files_from_directory(absolute_dir_path, files_pattern = '*.rb')
files = Dir[File.join(absolute_dir_path, files_pattern)] files = Dir[File.join(escape_glob(absolute_dir_path), files_pattern)]
# Files in the root dir are loaded first, then thoses in the subdirectories # Files in the root dir are loaded first, then those in the subdirectories
files.sort_by { |file| [file.count("/"), file] }.each do |f| files.sort_by { |file| [file.count('/'), file] }.each do |f|
f = File.expand_path(f) f = File.expand_path(f)
#puts "require #{f}" # Used for debug # puts "require #{f}" # Used for debug
require f require f
end end
end end
@@ -72,18 +71,72 @@ def add_trailing_slash(url)
url =~ /\/$/ ? url : "#{url}/" url =~ /\/$/ ? url : "#{url}/"
end end
# loading the updater def missing_db_file?
require_files_from_directory(UPDATER_LIB_DIR) DbUpdater::FILES.each do |db_file|
@updater = UpdaterFactory.get_updater(ROOT_DIR) return true unless File.exist?(File.join(DATA_DIR, db_file))
end
if @updater false
REVISION = @updater.local_revision_number()
else
REVISION = nil
end end
def version def last_update
REVISION ? "v#{WPSCAN_VERSION}r#{REVISION}" : "v#{WPSCAN_VERSION}" date = nil
if File.exists?(LAST_UPDATE_FILE)
content = File.read(LAST_UPDATE_FILE)
date = Time.parse(content) rescue nil
end
date
end
def update_required?
date = last_update
(true if date.nil?) or (date < 5.days.ago)
end
# Define colors
def colorize(text, color_code)
if $COLORSWITCH
"#{text}"
else
"\e[#{color_code}m#{text}\e[0m"
end
end
def bold(text)
colorize(text, 1)
end
def red(text)
colorize(text, 31)
end
def green(text)
colorize(text, 32)
end
def amber(text)
colorize(text, 33)
end
def blue(text)
colorize(text, 34)
end
def critical(text)
$exit_code += 1 if defined?($exit_code) # hack for undefined var via rspec
"#{red('[!]')} #{text}"
end
def warning(text)
$exit_code += 1 if defined?($exit_code) # hack for undefined var via rspec
"#{amber('[!]')} #{text}"
end
def info(text)
"#{green('[+]')} #{text}"
end
def notice(text)
"#{blue('[i]')} #{text}"
end end
# our 1337 banner # our 1337 banner
@@ -97,35 +150,30 @@ def banner
puts ' \\/ \\/ |_| |_____/ \\___|\\__,_|_| |_|' puts ' \\/ \\/ |_| |_____/ \\___|\\__,_|_| |_|'
puts puts
puts ' WordPress Security Scanner by the WPScan Team ' puts ' WordPress Security Scanner by the WPScan Team '
if REVISION puts " Version #{WPSCAN_VERSION}"
puts " Version #{version}" puts ' Sponsored by Sucuri - https://sucuri.net'
else puts ' @_WPScan_, @ethicalhack3r, @erwan_lr, pvdl, @_FireFart_'
puts " Version #{version}"
end
puts ' Sponsored by the RandomStorm Open Source Initiative'
puts ' @_WPScan_, @ethicalhack3r, @erwan_lr, @gbrindisi, @_FireFart_'
puts '_______________________________________________________________' puts '_______________________________________________________________'
puts puts
end end
def colorize(text, color_code)
"\e[#{color_code}m#{text}\e[0m"
end
def red(text)
colorize(text, 31)
end
def green(text)
colorize(text, 32)
end
def xml(file) def xml(file)
Nokogiri::XML(File.open(file)) do |config| Nokogiri::XML(File.open(file)) do |config|
config.noblanks config.noblanks
end end
end end
def json(file)
content = File.open(file).read
begin
JSON.parse(content)
rescue => e
puts "[ERROR] In JSON file parsing #{file} #{e}"
raise
end
end
def redefine_constant(constant, value) def redefine_constant(constant, value)
Object.send(:remove_const, constant) Object.send(:remove_const, constant)
Object.const_set(constant, value) Object.const_set(constant, value)
@@ -177,3 +225,35 @@ end
def count_file_lines(file) def count_file_lines(file)
`wc -l #{file.shellescape}`.split[0].to_i `wc -l #{file.shellescape}`.split[0].to_i
end end
# Truncates a string to a specific length and adds ... at the end
def truncate(input, size, trailing = '...')
size = size.to_i
trailing ||= ''
return input if input.nil? or size <= 0 or input.length <= size or
trailing.length >= input.length or size-trailing.length-1 >= input.length
return "#{input[0..size-trailing.length-1]}#{trailing}"
end
# Gets a random User-Agent
#
# @return [ String ] A random user-agent from data/user-agents.txt
def get_random_user_agent
user_agents = []
f = File.open(USER_AGENTS_FILE, 'r')
f.each_line do |line|
# ignore comments
next if line.empty? or line =~ /^\s*(#|\/\/)/
user_agents << line.strip
end
f.close
# return ransom user-agent
user_agents.sample
end
# Directory listing enabled on url?
#
# @return [ Boolean ]
def directory_listing_enabled?(url)
Browser.get(url.to_s).body[%r{<title>Index of}] ? true : false
end

119
lib/common/db_updater.rb Normal file
View File

@@ -0,0 +1,119 @@
# encoding: UTF-8
# DB Updater
class DbUpdater
FILES = %w(
local_vulnerable_files.xml local_vulnerable_files.xsd
timthumbs.txt user-agents.txt wp_versions.xml wp_versions.xsd
wordpresses.json plugins.json themes.json LICENSE
)
attr_reader :repo_directory
def initialize(repo_directory)
@repo_directory = repo_directory
fail "#{repo_directory} is not writable" unless \
Pathname.new(repo_directory).writable?
end
# @return [ Hash ] The params for Typhoeus::Request
def request_params
{
ssl_verifyhost: 2,
ssl_verifypeer: true,
accept_encoding: 'gzip, deflate'
}
end
# @return [ String ] The raw file URL associated with the given filename
def remote_file_url(filename)
"https://wpvulndb.com/data/#{filename}"
end
# @return [ String ] The checksum of the associated remote filename
def remote_file_checksum(filename)
url = "#{remote_file_url(filename)}.sha512"
res = Browser.get(url, request_params)
fail DownloadError, res if res.timed_out? || res.code != 200
res.body.chomp
end
def local_file_path(filename)
File.join(repo_directory, "#{filename}")
end
def local_file_checksum(filename)
Digest::SHA512.file(local_file_path(filename)).hexdigest
end
def backup_file_path(filename)
File.join(repo_directory, "#{filename}.back")
end
def create_backup(filename)
return unless File.exist?(local_file_path(filename))
FileUtils.cp(local_file_path(filename), backup_file_path(filename))
end
def restore_backup(filename)
return unless File.exist?(backup_file_path(filename))
FileUtils.cp(backup_file_path(filename), local_file_path(filename))
end
def delete_backup(filename)
FileUtils.rm(backup_file_path(filename))
end
# @return [ String ] The checksum of the downloaded file
def download(filename)
file_path = local_file_path(filename)
file_url = remote_file_url(filename)
res = Browser.get(file_url, request_params)
fail DownloadError, res if res.timed_out? || res.code != 200
File.open(file_path, 'wb') { |f| f.write(res.body) }
local_file_checksum(filename)
end
def update(verbose = false)
FILES.each do |filename|
begin
puts "[+] Checking #{filename}" if verbose
db_checksum = remote_file_checksum(filename)
# Checking if the file needs to be updated
if File.exist?(local_file_path(filename)) && db_checksum == local_file_checksum(filename)
puts ' [i] Already Up-To-Date' if verbose
next
end
puts ' [i] Needs to be updated' if verbose
create_backup(filename)
puts ' [i] Backup Created' if verbose
puts ' [i] Downloading new file' if verbose
dl_checksum = download(filename)
puts " [i] Downloaded File Checksum: #{dl_checksum}" if verbose
puts " [i] Database File Checksum : #{db_checksum}" if verbose
unless dl_checksum == db_checksum
fail "#{filename}: checksums do not match"
end
rescue => e
puts ' [i] Restoring Backup due to error' if verbose
restore_backup(filename)
raise e
ensure
if File.exist?(backup_file_path(filename))
puts ' [i] Deleting Backup' if verbose
delete_backup(filename)
end
end
end
# write last_update date to file
File.write(LAST_UPDATE_FILE, Time.now)
end
end

33
lib/common/errors.rb Normal file
View File

@@ -0,0 +1,33 @@
# HTTP Error
class HttpError < StandardError
attr_reader :response
# @param [ Typhoeus::Response ] response
def initialize(response)
@response = response
end
def failure_details
msg = response.effective_url
if response.code == 0 || response.timed_out?
msg += " (#{response.return_message})"
else
msg += " (status: #{response.code})"
end
msg
end
def message
"HTTP Error: #{failure_details}"
end
end
# Used in the Updater
class DownloadError < HttpError
def message
"Unable to get #{failure_details}"
end
end

View File

@@ -49,11 +49,11 @@ end
# Override for puts to enable logging # Override for puts to enable logging
def puts(o = '') def puts(o = '')
# remove color for logging if $log && o.respond_to?(:gsub)
if o.respond_to?(:gsub) temp = o.gsub(/\e\[\d+m/, '') # remove color for logging
temp = o.gsub(/\e\[\d+m(.*)?\e\[0m/, '\1')
File.open(LOG_FILE, 'a+') { |f| f.puts(temp) } File.open(LOG_FILE, 'a+') { |f| f.puts(temp) }
end end
super(o) super(o)
end end
@@ -78,7 +78,7 @@ module Terminal
class Style class Style
@@defaults = { @@defaults = {
:border_x => "-", :border_y => "|", :border_i => "+", :border_x => '-', :border_y => '|', :border_i => '+',
:padding_left => 1, :padding_right => 1, :padding_left => 1, :padding_right => 1,
:margin_left => '', :margin_left => '',
:width => nil, :alignment => nil :width => nil, :alignment => nil
@@ -102,7 +102,20 @@ class Numeric
def bytes_to_human def bytes_to_human
units = %w{B KB MB GB TB} units = %w{B KB MB GB TB}
e = (Math.log(self)/Math.log(1024)).floor e = (Math.log(self)/Math.log(1024)).floor
s = "%.3f" % (to_f / 1024**e) s = '%.3f' % (to_f / 1024**e)
s.sub(/\.?0*$/, ' ' + units[e]) s.sub(/\.?0*$/, ' ' + units[e])
end end
end end
# time calculations
class Fixnum
SECONDS_IN_DAY = 24 * 60 * 60
def days
self * SECONDS_IN_DAY
end
def ago
Time.now - self
end
end

View File

@@ -5,7 +5,7 @@ require 'vulnerability/urls'
class Vulnerability class Vulnerability
include Vulnerability::Output include Vulnerability::Output
include Vulnerability::Urls include Vulnerability::Urls
attr_accessor :title, :references, :type, :fixed_in attr_accessor :title, :references, :type, :fixed_in
@@ -35,27 +35,27 @@ class Vulnerability
end end
# :nocov: # :nocov:
# Create the Vulnerability from the xml_node # Create the Vulnerability from the json_item
# #
# @param [ Nokogiri::XML::Node ] xml_node # @param [ Hash ] json_item
# #
# @return [ Vulnerability ] # @return [ Vulnerability ]
def self.load_from_xml_node(xml_node) def self.load_from_json_item(json_item)
references = {} references = {}
refs = xml_node.search('references') references['id'] = [json_item['id']]
if refs
references[:url] = refs.search('url').map(&:text) %w(url cve secunia osvdb metasploit exploitdb).each do |key|
references[:cve] = refs.search('cve').map(&:text) if json_item['references'][key]
references[:secunia] = refs.search('secunia').map(&:text) json_item['references'][key] = [json_item['references'][key]] if json_item['references'][key].class != Array
references[:osvdb] = refs.search('osvdb').map(&:text) references[key] = json_item['references'][key]
references[:metasploit] = refs.search('metasploit').map(&:text) end
references[:exploitdb] = refs.search('exploitdb').map(&:text) end
end
new( new(
xml_node.search('title').text, json_item['title'],
xml_node.search('type').text, json_item['type'],
references, references,
xml_node.search('fixed_in').text, json_item['fixed_in']
) )
end end

View File

@@ -2,21 +2,22 @@
class Vulnerability class Vulnerability
module Output module Output
# output the vulnerability # output the vulnerability
def output def output(verbose = false)
puts ' |' puts
puts ' | ' + red("* Title: #{title}") puts critical("Title: #{title}")
references.each do |key, urls| references.each do |key, urls|
methodname = "url_#{key}" methodname = "url_#{key}"
urls.each do |u|
url = send(methodname, u) urls.each do |u|
puts ' | ' + red("* Reference: #{url}") if url next unless respond_to?(methodname)
end url = send(methodname, u)
end puts " Reference: #{url}" if url
if !fixed_in.empty? end
puts " | * Fixed in: #{fixed_in}"
end end
puts notice("Fixed in: #{fixed_in}") if fixed_in
end end
end end
end end

View File

@@ -1,33 +1,44 @@
# encoding: UTF-8 # encoding: UTF-8
class Vulnerability class Vulnerability
module Urls module Urls
# @return [ String ] The url to the metasploit module page # @return [ String ] The url to the metasploit module page
def url_metasploit(module_path) def url_metasploit(module_path)
# remove leading slash # remove leading slash
module_path = module_path.sub(/^\//, '') module_path = module_path.sub(/^\//, '')
"http://www.metasploit.com/modules/#{module_path}" "https://www.rapid7.com/db/modules/#{module_path}"
end end
def url_url(url) def url_url(url)
url url
end end
def url_cve(cve) def url_cve(id)
"http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-#{cve}" "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-#{id}"
end end
def url_osvdb(id) def url_osvdb(id)
"http://osvdb.org/#{id}" "http://osvdb.org/show/osvdb/#{id}"
end end
def url_secunia(id) def url_secunia(id)
"http://secunia.com/advisories/#{id}" "https://secunia.com/advisories/#{id}/"
end end
def url_exploitdb(id) def url_exploitdb(id)
"http://www.exploit-db.com/exploits/#{id}/" "https://www.exploit-db.com/exploits/#{id}/"
end end
end def url_id(id)
"https://wpvulndb.com/vulnerabilities/#{id}"
end
def url_packetstorm(id)
"http://packetstormsecurity.com/files/#{id}/"
end
def url_securityfocus(id)
"http://www.securityfocus.com/bid/#{id}/"
end
end
end end

View File

@@ -22,7 +22,7 @@ class WpItem
# @return [ Array ] # @return [ Array ]
# Make it private ? # Make it private ?
def allowed_options def allowed_options
[:name, :wp_content_dir, :wp_plugins_dir, :path, :version, :vulns_file] [:name, :wp_content_dir, :wp_plugins_dir, :path, :version, :db_file]
end end
# @param [ URI ] target_base_uri # @param [ URI ] target_base_uri
@@ -30,7 +30,6 @@ class WpItem
# #
# @return [ WpItem ] # @return [ WpItem ]
def initialize(target_base_uri, options = {}) def initialize(target_base_uri, options = {})
options[:wp_content_dir] ||= 'wp-content' options[:wp_content_dir] ||= 'wp-content'
options[:wp_plugins_dir] ||= options[:wp_content_dir] + '/plugins' options[:wp_plugins_dir] ||= options[:wp_content_dir] + '/plugins'
@@ -38,6 +37,27 @@ class WpItem
forge_uri(target_base_uri) forge_uri(target_base_uri)
end end
def identifier
@identifier ||= name
end
# @return [ Hash ]
def db_data
@db_data ||= json(db_file)[identifier] || {}
end
def latest_version
db_data['latest_version']
end
def last_updated
db_data['last_ipdated']
end
def popular?
db_data['popular']
end
# @param [ Hash ] options # @param [ Hash ] options
# #
# @return [ void ] # @return [ void ]

View File

@@ -29,7 +29,10 @@ class WpItem
# #
# @return [ Boolean ] # @return [ Boolean ]
def exists_from_response?(response, options = {}) def exists_from_response?(response, options = {})
if [200, 401, 403].include?(response.code) # 301 included as some items do a self-redirect
# Redirects to the 404 and homepage should be ignored (unless dynamic content is used)
# by the page hashes (error_404_hash & homepage_hash)
if [200, 401, 403, 301].include?(response.code)
if response.has_valid_hash?(options[:error_404_hash], options[:homepage_hash]) if response.has_valid_hash?(options[:error_404_hash], options[:homepage_hash])
if options[:exclude_content] if options[:exclude_content]
unless response.body.match(options[:exclude_content]) unless response.body.match(options[:exclude_content])

View File

@@ -12,7 +12,9 @@ class WpItem
# @return [ String,nil ] The url to the readme file, nil if not found # @return [ String,nil ] The url to the readme file, nil if not found
def readme_url def readme_url
%w{readme.txt README.txt}.each do |readme| # See https://github.com/wpscanteam/wpscan/pull/737#issuecomment-66375445
# for any question about the order
%w{readme.txt README.txt Readme.txt ReadMe.txt README.TXT readme.TXT}.each do |readme|
url = @uri.merge(readme).to_s url = @uri.merge(readme).to_s
return url if url_is_200?(url) return url if url_is_200?(url)
end end
@@ -40,7 +42,7 @@ class WpItem
# @return [ Boolean ] # @return [ Boolean ]
def has_directory_listing? def has_directory_listing?
Browser.get(@uri.to_s).body[%r{<title>Index of}] ? true : false directory_listing_enabled?(@uri)
end end
# Discover any error_log files created by WordPress # Discover any error_log files created by WordPress

View File

@@ -4,21 +4,29 @@ class WpItem
module Output module Output
# @return [ Void ] # @return [ Void ]
def output def output(verbose = false)
outdated = VersionCompare.lesser?(version, latest_version) if latest_version
puts puts
puts " | Name: #{self}" #this will also output the version number if detected puts info("Name: #{self}") #this will also output the version number if detected
puts " | Location: #{url}" puts " | Latest version: #{latest_version} #{'(up to date)' if version}" if latest_version && !outdated
#puts " | WordPress: #{wordpress_url}" if wordpress_org_item? puts " | Last updated: #{last_updated}" if last_updated
puts ' | Directory listing enabled: Yes' if has_directory_listing? puts " | Location: #{url}"
puts " | Readme: #{readme_url}" if has_readme? puts " | Readme: #{readme_url}" if has_readme?
puts " | Changelog: #{changelog_url}" if has_changelog? puts " | Changelog: #{changelog_url}" if has_changelog?
puts warning("The version is out of date, the latest version is #{latest_version}") if latest_version && outdated
puts warning("Directory listing is enabled: #{url}") if has_directory_listing?
puts warning("An error_log file has been found: #{error_log_url}") if has_error_log?
additional_output(verbose) if respond_to?(:additional_output)
if version.nil? && vulnerabilities.length > 0
puts
puts warning('We could not determine a version so all vulnerabilities are printed out')
end
vulnerabilities.output vulnerabilities.output
if has_error_log?
puts ' | ' + red('[!]') + " An error_log file has been found : #{error_log_url}"
end
end end
end end
end end

View File

@@ -13,7 +13,7 @@ class WpItem
# This check is needed because readme_url can return nil # This check is needed because readme_url can return nil
if has_readme? if has_readme?
response = Browser.get(readme_url) response = Browser.get(readme_url)
@version = response.body[%r{stable tag: #{WpVersion.version_pattern}}i, 1] @version = extract_version(response.body)
end end
end end
@version @version
@@ -22,7 +22,31 @@ class WpItem
# @return [ String ] # @return [ String ]
def to_s def to_s
item_version = self.version item_version = self.version
"#@name#{' v' + item_version.strip if item_version}" "#{@name}#{' - v' + item_version.strip if item_version}"
end
# Extracts the version number from a given string/body
#
# @return [ String ] detected version
def extract_version(body)
version = body[/\b(?:stable tag|version):\s*(?!trunk)([0-9a-z\.-]+)/i, 1]
if version.nil? || version !~ /[0-9]+/
extracted_versions = body.scan(/[=]+\s+(?:v(?:ersion)?\s*)?([0-9\.-]+)[ \ta-z0-9\(\)\.-]*[=]+/i)
return if extracted_versions.nil? || extracted_versions.length == 0
extracted_versions.flatten!
# must contain at least one number
extracted_versions = extracted_versions.select { |x| x =~ /[0-9]+/ }
sorted = extracted_versions.sort { |x,y|
begin
Gem::Version.new(x) <=> Gem::Version.new(y)
rescue
0
end
}
return sorted.last
else
return version
end
end end
end end

View File

@@ -2,23 +2,23 @@
class WpItem class WpItem
module Vulnerable module Vulnerable
attr_accessor :vulns_file, :vulns_xpath attr_accessor :db_file, :identifier
# Get the vulnerabilities associated to the WpItem # Get the vulnerabilities associated to the WpItem
# Filters out already fixed vulnerabilities # Filters out already fixed vulnerabilities
# #
# @return [ Vulnerabilities ] # @return [ Vulnerabilities ]
def vulnerabilities def vulnerabilities
xml = xml(vulns_file) return @vulnerabilities if @vulnerabilities
vulnerabilities = Vulnerabilities.new
xml.xpath(vulns_xpath).each do |node| @vulnerabilities = Vulnerabilities.new
vuln = Vulnerability.load_from_xml_node(node)
if vulnerable_to?(vuln) [*db_data['vulnerabilities']].each do |vulnerability|
vulnerabilities << vuln vulnerability = Vulnerability.load_from_json_item(vulnerability)
end @vulnerabilities << vulnerability if vulnerable_to?(vulnerability)
end end
vulnerabilities
@vulnerabilities
end end
def vulnerable? def vulnerable?
@@ -32,7 +32,7 @@ class WpItem
# @return [ Boolean ] # @return [ Boolean ]
def vulnerable_to?(vuln) def vulnerable_to?(vuln)
if version && vuln && vuln.fixed_in && !vuln.fixed_in.empty? if version && vuln && vuln.fixed_in && !vuln.fixed_in.empty?
unless VersionCompare::is_newer_or_same?(vuln.fixed_in, version) unless VersionCompare::lesser_or_equal?(vuln.fixed_in, version)
return true return true
end end
else else
@@ -41,5 +41,4 @@ class WpItem
return false return false
end end
end end
end end

View File

@@ -1,10 +1,6 @@
# encoding: UTF-8 # encoding: UTF-8
require 'wp_plugin/vulnerable'
class WpPlugin < WpItem class WpPlugin < WpItem
include WpPlugin::Vulnerable
# Sets the @uri # Sets the @uri
# #
# @param [ URI ] target_base_uri The URI of the wordpress blog # @param [ URI ] target_base_uri The URI of the wordpress blog
@@ -14,4 +10,7 @@ class WpPlugin < WpItem
@uri = target_base_uri.merge(URI.encode(wp_plugins_dir + '/' + name + '/')) @uri = target_base_uri.merge(URI.encode(wp_plugins_dir + '/' + name + '/'))
end end
def db_file
@db_file ||= PLUGINS_FILE
end
end end

View File

@@ -1,20 +0,0 @@
# encoding: UTF-8
class WpPlugin < WpItem
module Vulnerable
# @return [ String ] The path to the file containing vulnerabilities
def vulns_file
unless @vulns_file
@vulns_file = PLUGINS_VULNS_FILE
end
@vulns_file
end
# @return [ String ]
def vulns_xpath
"//plugin[@name='#{@name}']/vulnerability"
end
end
end

View File

@@ -2,16 +2,20 @@
require 'wp_theme/findable' require 'wp_theme/findable'
require 'wp_theme/versionable' require 'wp_theme/versionable'
require 'wp_theme/vulnerable' require 'wp_theme/info'
require 'wp_theme/output'
require 'wp_theme/childtheme'
class WpTheme < WpItem class WpTheme < WpItem
extend WpTheme::Findable extend WpTheme::Findable
include WpTheme::Versionable include WpTheme::Versionable
include WpTheme::Vulnerable include WpTheme::Info
include WpTheme::Output
include WpTheme::Childtheme
attr_writer :style_url attr_accessor :referenced_url
def allowed_options; super << :style_url end def allowed_options; super << :referenced_url end
# Sets the @uri # Sets the @uri
# #
@@ -24,10 +28,10 @@ class WpTheme < WpItem
# @return [ String ] The url to the theme stylesheet # @return [ String ] The url to the theme stylesheet
def style_url def style_url
unless @style_url @uri.merge('style.css').to_s
@style_url = uri.merge('style.css').to_s
end
@style_url
end end
def db_file
@db_file ||= THEMES_FILE
end
end end

View File

@@ -0,0 +1,37 @@
# encoding: UTF-8
class WpTheme < WpItem
module Childtheme
def parent_theme_limit
3
end
def is_child_theme?
return true unless @theme_template.nil?
false
end
def get_parent_theme_style_url
if is_child_theme?
return style_url.sub("/#{name}/style.css", "/#{@theme_template}/style.css")
end
nil
end
def get_parent_theme
if is_child_theme?
base_url = @uri.clone
base_url.path = base_url.path.sub(/(?<url>.*\/)#{Regexp.escape(@wp_content_dir)}\/.+/, '\k<url>')
return WpTheme.new(base_url,
{
name: @theme_template,
style_url: get_parent_theme_style_url,
wp_content_dir: @wp_content_dir
})
end
nil
end
end
end

View File

@@ -30,21 +30,16 @@ class WpTheme < WpItem
response = Browser.get_and_follow_location(target_uri.to_s) response = Browser.get_and_follow_location(target_uri.to_s)
# https + domain is optional because of relative links # https + domain is optional because of relative links
matches = %r{(?:https?://[^"']+)?/([^/]+)/themes/([^"']+)/style.css}i.match(response.body) return unless response.body =~ %r{(?:https?://[^"']+/)?([^/\s]+)/themes/([^"'/]+)[^"']*/style.css}i
if matches
return new( new(
target_uri, target_uri,
{ name: Regexp.last_match[2],
name: matches[2], referenced_url: Regexp.last_match[0],
style_url: matches[0], wp_content_dir: Regexp.last_match[1]
wp_content_dir: matches[1] )
}
)
end
end end
# http://code.google.com/p/wpscan/issues/detail?id=141
#
# @param [ URI ] target_uri # @param [ URI ] target_uri
# #
# @return [ WpTheme ] # @return [ WpTheme ]
@@ -52,7 +47,6 @@ class WpTheme < WpItem
body = Browser.get(target_uri.to_s).body body = Browser.get(target_uri.to_s).body
regexp = %r{<meta name="generator" content="([^\s"]+)\s?([^"]+)?" />\s+<meta name="generator" content="WooFramework\s?([^"]+)?" />} regexp = %r{<meta name="generator" content="([^\s"]+)\s?([^"]+)?" />\s+<meta name="generator" content="WooFramework\s?([^"]+)?" />}
if matches = regexp.match(body) if matches = regexp.match(body)
woo_theme_name = matches[1] woo_theme_name = matches[1]
woo_theme_version = matches[2] woo_theme_version = matches[2]
@@ -60,10 +54,8 @@ class WpTheme < WpItem
return new( return new(
target_uri, target_uri,
{ name: woo_theme_name,
name: woo_theme_name, version: woo_theme_version
version: woo_theme_version
}
) )
end end
end end

View File

@@ -0,0 +1,34 @@
# encoding: UTF-8
class WpTheme < WpItem
module Info
attr_reader :theme_name, :theme_uri, :theme_description,
:theme_author, :theme_author_uri, :theme_template,
:theme_license, :theme_license_uri, :theme_tags,
:theme_text_domain
def parse_style
style = Browser.get(style_url).body
@theme_name = parse_style_tag(style, 'Theme Name')
@theme_uri = parse_style_tag(style, 'Theme URI')
@theme_description = parse_style_tag(style, 'Description')
@theme_author = parse_style_tag(style, 'Author')
@theme_author_uri = parse_style_tag(style, 'Author URI')
@theme_template = parse_style_tag(style, 'Template')
@theme_license = parse_style_tag(style, 'License')
@theme_license_uri = parse_style_tag(style, 'License URI')
@theme_tags = parse_style_tag(style, 'Tags')
@theme_text_domain = parse_style_tag(style, 'Text Domain')
end
private
def parse_style_tag(style, tag)
value = style[/^\s*#{Regexp.escape(tag)}:\s*(.*)/i, 1]
return value.strip if value
nil
end
end
end

View File

@@ -0,0 +1,26 @@
# encoding: UTF-8
class WpTheme
module Output
# @return [ Void ]
def additional_output(verbose = false)
parse_style
theme_desc = verbose ? @theme_description : truncate(@theme_description, 100)
puts " | Style URL: #{style_url}"
puts " | Referenced style.css: #{referenced_url}" if referenced_url && referenced_url != style_url
puts " | Theme Name: #{@theme_name}" if @theme_name
puts " | Theme URI: #{@theme_uri}" if @theme_uri
puts " | Description: #{theme_desc}"
puts " | Author: #{@theme_author}" if @theme_author
puts " | Author URI: #{@theme_author_uri}" if @theme_author_uri
puts " | Template: #{@theme_template}" if @theme_template and verbose
puts " | License: #{@theme_license}" if @theme_license and verbose
puts " | License URI: #{@theme_license_uri}" if @theme_license_uri and verbose
puts " | Tags: #{@theme_tags}" if @theme_tags and verbose
puts " | Text Domain: #{@theme_text_domain}" if @theme_text_domain and verbose
end
end
end

View File

@@ -2,16 +2,8 @@
class WpTheme < WpItem class WpTheme < WpItem
module Versionable module Versionable
def version def version
unless @version @version ||= Browser.get(style_url).body[%r{Version:\s*(?!trunk)([0-9a-z\.-]+)}i, 1]
@version = Browser.get(style_url).body[%r{Version:\s([^\s]+)}i, 1]
# Get Version from readme.txt
@version ||= super
end
@version
end end
end end
end end

View File

@@ -1,20 +0,0 @@
# encoding: UTF-8
class WpTheme < WpItem
module Vulnerable
# @return [ String ] The path to the file containing vulnerabilities
def vulns_file
unless @vulns_file
@vulns_file = THEMES_VULNS_FILE
end
@vulns_file
end
# @return [ String ]
def vulns_xpath
"//theme[@name='#{@name}']/vulnerability"
end
end
end

View File

@@ -3,11 +3,13 @@
require 'wp_timthumb/versionable' require 'wp_timthumb/versionable'
require 'wp_timthumb/existable' require 'wp_timthumb/existable'
require 'wp_timthumb/output' require 'wp_timthumb/output'
require 'wp_timthumb/vulnerable'
class WpTimthumb < WpItem class WpTimthumb < WpItem
include WpTimthumb::Versionable include WpTimthumb::Versionable
include WpTimthumb::Existable include WpTimthumb::Existable
include WpTimthumb::Output include WpTimthumb::Output
include WpTimthumb::Vulnerable
# @param [ WpTimthumb ] other # @param [ WpTimthumb ] other
# #

View File

@@ -3,8 +3,11 @@
class WpTimthumb < WpItem class WpTimthumb < WpItem
module Output module Output
def output def output(verbose = false)
puts ' | ' + red('[!]') + " #{self}" puts
puts info("#{self}") #this will also output the version number if detected
vulnerabilities.output
end end
end end

View File

@@ -0,0 +1,55 @@
# encoding: UTF-8
class WpTimthumb < WpItem
module Vulnerable
# @return [ Vulnerabilities ]
def vulnerabilities
vulns = Vulnerabilities.new
[:check_rce_132, :check_rce_webshot].each do |method|
vuln = self.send(method)
vulns << vuln if vuln
end
vulns
end
def check_rce_132
rce_132_vuln unless VersionCompare.lesser_or_equal?('1.33', version)
end
# Vulnerable versions : > 1.35 (or >= 2.0) and < 2.8.14
def check_rce_webshot
return if VersionCompare.lesser_or_equal?('2.8.14', version) || VersionCompare.lesser_or_equal?(version, '1.35')
response = Browser.get(uri.merge('?webshot=1&src=http://' + default_allowed_domains.sample))
rce_webshot_vuln unless response.body =~ /WEBSHOT_ENABLED == true/
end
# @return [ Array<String> ] The default allowed domains (between the 2.0 and 2.8.13)
def default_allowed_domains
%w(flickr.com picasa.com img.youtube.com upload.wikimedia.org)
end
# @return [ Vulnerability ] The RCE in the <= 1.32
def rce_132_vuln
Vulnerability.new(
'Timthumb <= 1.32 Remote Code Execution',
'RCE',
{ exploitdb: ['17602'] },
'1.33'
)
end
# @return [ Vulnerability ] The RCE due to the WebShot in the <= 2.8.13
def rce_webshot_vuln
Vulnerability.new(
'Timthumb <= 2.8.13 WebShot Remote Code Execution',
'RCE',
{ url: ['http://seclists.org/fulldisclosure/2014/Jun/117'] },
'2.8.14'
)
end
end
end

View File

@@ -12,10 +12,10 @@ class WpUser < WpItem
# @return [ Array<Symbol> ] # @return [ Array<Symbol> ]
def allowed_options; [:id, :login, :display_name, :password] end def allowed_options; [:id, :login, :display_name, :password] end
# @return [ URI ] The uri to the auhor page # @return [ URI ] The uri to the author page
def uri def uri
if id if id
return @uri.merge("?author=#{id}") @uri.merge("?author=#{id}")
else else
raise 'The id is nil' raise 'The id is nil'
end end
@@ -23,14 +23,39 @@ class WpUser < WpItem
# @return [ String ] # @return [ String ]
def login_url def login_url
@uri.merge('wp-login.php').to_s unless @login_url
@login_url = @uri.merge('wp-login.php').to_s
# Let's check if the login url is redirected (to https url for example)
if redirection = redirection(@login_url)
@login_url = redirection
end
end
@login_url
end
def redirection(url)
redirection = nil
response = Browser.get(url)
if response.code == 301 || response.code == 302
redirection = response.headers_hash['location']
# Let's check if there is a redirection in the redirection
if other_redirection = redirection(redirection)
redirection = other_redirection
end
end
redirection
end end
# @return [ String ] # @return [ String ]
def to_s def to_s
s = "#{id}" s = "#{id}"
s += " | #{login}" if login s << " | #{login}" if login
s += " | #{display_name}" if display_name s << " | #{display_name}" if display_name
s s
end end

View File

@@ -25,16 +25,16 @@ class WpUser < WpItem
hydra = browser.hydra hydra = browser.hydra
queue_count = 0 queue_count = 0
found = false found = false
progress_bar = self.progress_bar(count_file_lines(wordlist), options) progress_bar = self.progress_bar(count_file_lines(wordlist)+1, options)
File.open(wordlist).each do |password| File.open(wordlist).each do |password|
password.chop! password.chomp!
# A successfull login will redirect us to the redirect_to parameter # A successfull login will redirect us to the redirect_to parameter
# Generate a random one on each request # Generate a random one on each request
unless redirect_url unless redirect_url
random = (0...8).map { 65.+(rand(26)).chr }.join random = (0...8).map { 65.+(rand(26)).chr }.join
redirect_url = "#@uri#{random}/" redirect_url = "#{@uri}#{random}/"
end end
request = login_request(password, redirect_url) request = login_request(password, redirect_url)
@@ -63,9 +63,10 @@ class WpUser < WpItem
# run all of the remaining requests # run all of the remaining requests
hydra.run hydra.run
puts if options[:show_progression] # mandatory to avoid the output of the progressbar to be overriden
end end
# @param [ Integer ] targets_size # @param [ Integer ] passwords_size
# @param [ Hash ] options # @param [ Hash ] options
# #
# @return [ ProgressBar ] # @return [ ProgressBar ]
@@ -103,19 +104,19 @@ class WpUser < WpItem
# @return [ Boolean ] # @return [ Boolean ]
def valid_password?(response, password, redirect_url, options = {}) def valid_password?(response, password, redirect_url, options = {})
if response.code == 302 && response.headers_hash && response.headers_hash['Location'] == redirect_url if response.code == 302 && response.headers_hash && response.headers_hash['Location'] == redirect_url
progression = "#{green('[SUCCESS]')} Login : #{login} Password : #{password}\n\n" progression = "#{info('[SUCCESS]')} Login : #{login} Password : #{password}\n\n"
valid = true valid = true
elsif response.body =~ /login_error/i elsif response.body =~ /login_error/i
verbose = "\n Incorrect login and/or password." verbose = "\n Incorrect login and/or password."
elsif response.timed_out? elsif response.timed_out?
progression = "#{red('ERROR:')} Request timed out." progression = critical('ERROR: Request timed out.')
elsif response.code == 0 elsif response.code == 0
progression = "#{red('ERROR:')} No response from remote server. WAF/IPS?" progression = critical("ERROR: No response from remote server. WAF/IPS? (#{response.return_message})")
elsif response.code.to_s =~ /^50/ elsif response.code.to_s =~ /^50/
progression = "#{red('ERROR:')} Server error, try reducing the number of threads." progression = critical('ERROR: Server error, try reducing the number of threads.')
else else
progression = "#{red('ERROR:')} We received an unknown response for #{password}..." progression = critical("ERROR: We received an unknown response for #{password}...")
verbose = red(" Code: #{response.code}\n Body: #{response.body}\n") verbose = critical(" Code: #{response.code}\n Body: #{response.body}\n")
end end
puts "\n " + progression if progression && options[:show_progression] puts "\n " + progression if progression && options[:show_progression]

View File

@@ -22,6 +22,8 @@ class WpUser < WpItem
if response.code == 301 # login in location? if response.code == 301 # login in location?
location = response.headers_hash['Location'] location = response.headers_hash['Location']
return if location.nil? || location.empty?
@login = Existable.login_from_author_pattern(location) @login = Existable.login_from_author_pattern(location)
@display_name = Existable.display_name_from_body( @display_name = Existable.display_name_from_body(
Browser.get(location).body Browser.get(location).body
@@ -37,7 +39,9 @@ class WpUser < WpItem
# #
# @return [ String ] The login # @return [ String ] The login
def self.login_from_author_pattern(text) def self.login_from_author_pattern(text)
text[%r{/author/([^/\b]+)/?}i, 1] return unless text =~ %r{/author/([^/\b"']+)/?}i
Regexp.last_match[1].force_encoding('UTF-8')
end end
# @param [ String ] body # @param [ String ] body
@@ -49,7 +53,8 @@ class WpUser < WpItem
unless login unless login
# No Permalinks # No Permalinks
login = body[%r{<body class="archive author author-([^\s]+) author-(\d+)}i, 1] login = body[%r{<body class="archive author author-([^\s]+)[ "]}i, 1]
login ? login.force_encoding('UTF-8') : nil
end end
login login
@@ -66,9 +71,12 @@ class WpUser < WpItem
title_tag.force_encoding('UTF-8') if title_tag.encoding == Encoding::ASCII_8BIT title_tag.force_encoding('UTF-8') if title_tag.encoding == Encoding::ASCII_8BIT
title_tag = Nokogiri::HTML::DocumentFragment.parse(title_tag).to_s title_tag = Nokogiri::HTML::DocumentFragment.parse(title_tag).to_s
# &amp; are not decoded with Nokogiri # &amp; are not decoded with Nokogiri
title_tag.sub!('&amp;', '&') title_tag.gsub!('&amp;', '&')
name = title_tag[%r{([^|«]+) }, 1] # replace UTF chars like &#187; with dummy character
title_tag.gsub!(/&#(\d+);/, '|')
name = title_tag[%r{([^|«»]+) }, 1]
return name.strip if name return name.strip if name
end end

View File

@@ -1,21 +1,27 @@
# encoding: UTF-8 # encoding: UTF-8
require 'wp_version/findable' require 'wp_version/findable'
require 'wp_version/vulnerable'
require 'wp_version/output' require 'wp_version/output'
class WpVersion < WpItem class WpVersion < WpItem
extend WpVersion::Findable extend WpVersion::Findable
include WpVersion::Vulnerable
include WpVersion::Output include WpVersion::Output
# The version number # The version number
attr_accessor :number attr_accessor :number
alias_method :version, :number # Needed to have the right behaviour in Vulnerable#vulnerable_to?
# @return [ Array ] # @return [ Array ]
def allowed_options; super << :number << :found_from end def allowed_options; super << :number << :found_from end
def identifier
@identifier ||= number
end
def db_file
@db_file ||= WORDPRESSES_FILE
end
# @param [ WpVersion ] other # @param [ WpVersion ] other
# #
# @return [ Boolean ] # @return [ Boolean ]
@@ -23,4 +29,10 @@ class WpVersion < WpItem
number == other.number number == other.number
end end
# @return [ Array<String> ] All the stable versions from version_file
def self.all(versions_file = WP_VERSIONS_FILE)
Nokogiri.XML(File.open(versions_file)).css('version').reduce([]) do |a, node|
a << node.text.to_s
end
end
end end

View File

@@ -12,7 +12,7 @@ class WpVersion < WpItem
# #
# @return [ WpVersion ] # @return [ WpVersion ]
def find(target_uri, wp_content_dir, wp_plugins_dir, versions_xml) def find(target_uri, wp_content_dir, wp_plugins_dir, versions_xml)
methods.grep(/find_from_/).each do |method| methods.grep(/^find_from_/).each do |method|
if method === :find_from_advanced_fingerprinting if method === :find_from_advanced_fingerprinting
version = send(method, target_uri, wp_content_dir, wp_plugins_dir, versions_xml) version = send(method, target_uri, wp_content_dir, wp_plugins_dir, versions_xml)
@@ -31,7 +31,7 @@ class WpVersion < WpItem
# #
# @return [ String ] # @return [ String ]
def version_pattern def version_pattern
'([^\r\n"\']+\.[^\r\n"\']+)' '([^\r\n"\',]+\.[^\r\n"\',]+)'
end end
protected protected
@@ -68,7 +68,7 @@ class WpVersion < WpItem
def find_from_meta_generator(target_uri) def find_from_meta_generator(target_uri)
scan_url( scan_url(
target_uri, target_uri,
%r{name="generator" content="wordpress #{version_pattern}"}i %r{name="generator" content="wordpress #{version_pattern}.*"}i
) )
end end
@@ -100,18 +100,6 @@ class WpVersion < WpItem
) )
end end
# Attempts to find the WordPress version from,
# the generator tag in the RSS2 feed source.
#
# Have not been able to find an example of this - Ryan
#def find_from_rss2_generator(target_uri)
# scan_url(
# target_uri,
# %r{<generator>http://wordpress.org/?v=(#{WpVersion.version_pattern})</generator>}i,
# 'feed/rss/'
# )
#end
# Attempts to find the WordPress version from, # Attempts to find the WordPress version from,
# the generator tag in the Atom source. # the generator tag in the Atom source.
# #
@@ -126,17 +114,33 @@ class WpVersion < WpItem
) )
end end
# Attempts to find the WordPress version from, def find_from_stylesheets_numbers(target_uri)
# the generator tag in the comment rss source. wp_versions = WpVersion.all
# found = {}
# Have not been able to find an example of this - Ryan pattern = /\bver=([0-9\.]+)/i
#def find_from_comments_rss_generator(target_uri)
# scan_url( Nokogiri::HTML(Browser.get(target_uri.to_s).body).css('link,script').each do |tag|
# target_uri, %w(href src).each do |attribute|
# %r{<!-- generator="WordPress/#{WpVersion.version_pattern}" -->}i, attr_value = tag.attribute(attribute).to_s
# 'comments/feed/'
# ) next if attr_value.nil? || attr_value.empty?
#end
uri = Addressable::URI.parse(attr_value)
next unless uri.query && uri.query.match(pattern)
version = Regexp.last_match[1].to_s
found[version] ||= 0
found[version] += 1
end
end
found.delete_if { |v, _| !wp_versions.include?(v) }
best_guess = found.sort_by(&:last).last
# best_guess[0]: version number, [1] numbers of occurences
best_guess && best_guess[1] > 1 ? best_guess[0] : nil
end
# Uses data/wp_versions.xml to try to identify a # Uses data/wp_versions.xml to try to identify a
# wordpress version. # wordpress version.
@@ -190,8 +194,6 @@ class WpVersion < WpItem
# Attempts to find the WordPress version from the sitemap.xml file. # Attempts to find the WordPress version from the sitemap.xml file.
# #
# See: http://code.google.com/p/wpscan/issues/detail?id=109
#
# @param [ URI ] target_uri # @param [ URI ] target_uri
# #
# @return [ String ] The version number # @return [ String ] The version number

View File

@@ -3,15 +3,18 @@
class WpVersion < WpItem class WpVersion < WpItem
module Output module Output
def output def output(verbose = false)
puts green('[+]') + " WordPress version #{self.number} identified from #{self.found_from}" puts
puts info("WordPress version #{self.number} identified from #{self.found_from}")
vulnerabilities = self.vulnerabilities vulnerabilities = self.vulnerabilities
unless vulnerabilities.empty? unless vulnerabilities.empty?
puts if vulnerabilities.size == 1
puts red('[!]') + " #{vulnerabilities.size} vulnerabilities identified from the version number:" puts critical("#{vulnerabilities.size} vulnerability identified from the version number")
else
puts critical("#{vulnerabilities.size} vulnerabilities identified from the version number")
end
vulnerabilities.output vulnerabilities.output
end end
end end

View File

@@ -1,20 +0,0 @@
# encoding: UTF-8
class WpVersion < WpItem
module Vulnerable
# @return [ String ] The path to the file containing vulnerabilities
def vulns_file
unless @vulns_file
@vulns_file = WP_VULNS_FILE
end
@vulns_file
end
# @return [ String ]
def vulns_xpath
"//wordpress[@version='#{@number}']/vulnerability"
end
end
end

View File

@@ -2,25 +2,14 @@
require 'common/cache_file_store' require 'common/cache_file_store'
# Implementaion of a cache_key (Typhoeus::Request#hash has too many options)
module Typhoeus
class Request
module Cacheable
def cache_key
Digest::SHA2.hexdigest("#{url}-#{options[:body]}-#{options[:method]}")[0..32]
end
end
end
end
class TyphoeusCache < CacheFileStore class TyphoeusCache < CacheFileStore
def get(request) def get(request)
read_entry(request.cache_key) read_entry(request.hash.to_s)
end end
def set(request, response) def set(request, response)
write_entry(request.cache_key, response, request.cache_ttl) write_entry(request.hash.to_s, response, request.cache_ttl)
end end
end end

View File

@@ -1,37 +0,0 @@
# encoding: UTF-8
require 'common/updater/updater'
class GitUpdater < Updater
def is_installed?
%x[git #{repo_directory_arguments()} status 2>&1] =~ /On branch/ ? true : false
end
# Git has not a revsion number like SVN,
# so we will take the 7 first chars of the last commit hash
def local_revision_number
git_log = %x[git #{repo_directory_arguments()} log -1 2>&1]
git_log[/commit ([0-9a-z]{7})/i, 1].to_s
end
def update
%x[git #{repo_directory_arguments()} pull]
end
def has_local_changes?
%x[git #{repo_directory_arguments()} diff --exit-code 2>&1] =~ /diff/ ? true : false
end
def reset_head
%x[git #{repo_directory_arguments()} reset --hard HEAD]
end
protected
def repo_directory_arguments
if @repo_directory
return "--git-dir=\"#{@repo_directory}/.git\" --work-tree=\"#{@repo_directory}\""
end
end
end

View File

@@ -1,23 +0,0 @@
# encoding: UTF-8
require 'common/updater/updater'
class SvnUpdater < Updater
REVISION_PATTERN = /revision="(\d+)"/i
TRUNK_URL = 'https://github.com/wpscanteam/wpscan'
def is_installed?
%x[svn info "#@repo_directory" --xml 2>&1] =~ /revision=/ ? true : false
end
def local_revision_number
local_revision = %x[svn info "#@repo_directory" --xml 2>&1]
local_revision[REVISION_PATTERN, 1].to_s
end
def update
%x[svn up "#@repo_directory"]
end
end

View File

@@ -1,25 +0,0 @@
# encoding: UTF-8
# This class act as an absract one
class Updater
attr_reader :repo_directory
# TODO : add a last '/ to repo_directory if it's not present
def initialize(repo_directory = nil)
@repo_directory = repo_directory
end
def is_installed?
raise NotImplementedError
end
def local_revision_number
raise NotImplementedError
end
def update
raise NotImplementedError
end
end

View File

@@ -1,23 +0,0 @@
# encoding: UTF-8
class UpdaterFactory
def self.get_updater(repo_directory)
self.available_updaters_classes().each do |updater_symbol|
updater = Object.const_get(updater_symbol).new(repo_directory)
if updater.is_installed?
return updater
end
end
nil
end
protected
# return array of class symbols
def self.available_updaters_classes
Object.constants.grep(/^.+Updater$/)
end
end

View File

@@ -2,14 +2,18 @@
class VersionCompare class VersionCompare
# Compares two version strings. Returns true if version1 is equal to version2 # Compares two version strings. Returns true if version1 <= version2
# or when version1 is older than version2 # and false otherwise
# #
# @param [ String ] version1 # @param [ String ] version1
# @param [ String ] version2 # @param [ String ] version2
# #
# @return [ Boolean ] # @return [ Boolean ]
def self.is_newer_or_same?(version1, version2) def self.lesser_or_equal?(version1, version2)
# Prepend a '0' if the version starts with a '.'
version1 = prepend_zero(version1)
version2 = prepend_zero(version2)
return true if (version1 == version2) return true if (version1 == version2)
# Both versions must be set # Both versions must be set
return false unless (version1 and version2) return false unless (version1 and version2)
@@ -22,5 +26,37 @@ class VersionCompare
raise raise
end end
return false return false
end end
# Compares two version strings. Returns true if version1 < version2
# and false otherwise
#
# @param [ String ] version1
# @param [ String ] version2
#
# @return [ Boolean ]
def self.lesser?(version1, version2)
# Prepend a '0' if the version starts with a '.'
version1 = prepend_zero(version1)
version2 = prepend_zero(version2)
return false if (version1 == version2)
# Both versions must be set
return false unless (version1 and version2)
return false if (version1.empty? or version2.empty?)
begin
return true if (Gem::Version.new(version1) < Gem::Version.new(version2))
rescue ArgumentError => e
# Example: ArgumentError: Malformed version number string a
return false if e.message =~ /Malformed version number string/
raise
end
return false
end
# @return [ String ]
def self.prepend_zero(version)
return nil if version.nil?
version[0,1] == '.' ? "0#{version}" : version
end
end end

View File

@@ -28,12 +28,14 @@ begin
require 'pp' require 'pp'
require 'shellwords' require 'shellwords'
require 'fileutils' require 'fileutils'
require 'pathname'
# Third party libs # Third party libs
require 'typhoeus' require 'typhoeus'
require 'json' require 'yajl/json_gem'
require 'nokogiri' require 'nokogiri'
require 'terminal-table' require 'terminal-table'
require 'ruby-progressbar' require 'ruby-progressbar'
require 'addressable/uri'
# Custom libs # Custom libs
require 'common/browser' require 'common/browser'
require 'common/custom_option_parser' require 'common/custom_option_parser'

View File

@@ -52,8 +52,11 @@ class WebSite
url ||= @uri.to_s url ||= @uri.to_s
response = Browser.get(url) response = Browser.get(url)
redirected_uri = URI.parse(add_trailing_slash(add_http_protocol(url)))
if response.code == 301 || response.code == 302 if response.code == 301 || response.code == 302
redirection = response.headers_hash['location'] redirection = redirected_uri.merge(response.headers_hash['location']).to_s
return redirection if url == redirection # prevents infinite loop
# Let's check if there is a redirection in the redirection # Let's check if there is a redirection in the redirection
if other_redirection = redirection(redirection) if other_redirection = redirection(redirection)
@@ -71,7 +74,7 @@ class WebSite
# #
# @return [ String ] The MD5 hash of the page # @return [ String ] The MD5 hash of the page
def self.page_hash(page) def self.page_hash(page)
page = Browser.get(page) unless page.is_a?(Typhoeus::Response) page = Browser.get(page, { followlocation: true, cache_ttl: 0 }) unless page.is_a?(Typhoeus::Response)
Digest::MD5.hexdigest(page.body.gsub(/<!--.*?-->/m, '')) Digest::MD5.hexdigest(page.body.gsub(/<!--.*?-->/m, ''))
end end

View File

@@ -12,12 +12,9 @@ class WebSite
# Gets a robots.txt URL # Gets a robots.txt URL
# @return [ String ] # @return [ String ]
def robots_url def robots_url
temp = @uri.clone @uri.clone.merge('robots.txt').to_s
temp.path = '/robots.txt'
temp.to_s
end end
# Parse robots.txt # Parse robots.txt
# @return [ Array ] URLs generated from robots.txt # @return [ Array ] URLs generated from robots.txt
def parse_robots_txt def parse_robots_txt
@@ -31,6 +28,7 @@ class WebSite
if entries if entries
entries.flatten! entries.flatten!
entries.compact.sort! entries.compact.sort!
entries.uniq!
wordpress_path = @uri.path wordpress_path = @uri.path
RobotsTxt.known_dirs.each do |d| RobotsTxt.known_dirs.each do |d|
entries.delete(d) entries.delete(d)
@@ -42,9 +40,9 @@ class WebSite
entries.each do |d| entries.each do |d|
begin begin
temp = @uri.clone temp = @uri.clone
temp.path = d temp.path = d.strip
rescue URI::Error rescue URI::Error
temp = d temp = d.strip
end end
return_object << temp.to_s return_object << temp.to_s
end end

View File

@@ -1,19 +1,19 @@
# encoding: UTF-8 # encoding: UTF-8
require 'web_site' require 'web_site'
require 'wp_target/malwares'
require 'wp_target/wp_readme' require 'wp_target/wp_readme'
require 'wp_target/wp_registrable' require 'wp_target/wp_registrable'
require 'wp_target/wp_config_backup' require 'wp_target/wp_config_backup'
require 'wp_target/wp_must_use_plugins'
require 'wp_target/wp_login_protection' require 'wp_target/wp_login_protection'
require 'wp_target/wp_custom_directories' require 'wp_target/wp_custom_directories'
require 'wp_target/wp_full_path_disclosure' require 'wp_target/wp_full_path_disclosure'
class WpTarget < WebSite class WpTarget < WebSite
include WpTarget::Malwares
include WpTarget::WpReadme include WpTarget::WpReadme
include WpTarget::WpRegistrable include WpTarget::WpRegistrable
include WpTarget::WpConfigBackup include WpTarget::WpConfigBackup
include WpTarget::WpMustUsePlugins
include WpTarget::WpLoginProtection include WpTarget::WpLoginProtection
include WpTarget::WpCustomDirectories include WpTarget::WpCustomDirectories
include WpTarget::WpFullPathDisclosure include WpTarget::WpFullPathDisclosure
@@ -21,14 +21,20 @@ class WpTarget < WebSite
attr_reader :verbose attr_reader :verbose
def initialize(target_url, options = {}) def initialize(target_url, options = {})
raise Exception.new('target_url can not be nil or empty') if target_url.nil? || target_url == ''
super(target_url) super(target_url)
@verbose = options[:verbose] @verbose = options[:verbose]
@wp_content_dir = options[:wp_content_dir] @wp_content_dir = options[:wp_content_dir]
@wp_plugins_dir = options[:wp_plugins_dir] @wp_plugins_dir = options[:wp_plugins_dir]
@multisite = nil @multisite = nil
@vhost = options[:vhost]
Browser.instance.referer = url
if @vhost
Browser.instance.vhost = @vhost
end
Browser.instance(options.merge(:max_threads => options[:threads]))
end end
# check if the target website is # check if the target website is
@@ -38,7 +44,14 @@ class WpTarget < WebSite
response = Browser.get_and_follow_location(@uri.to_s) response = Browser.get_and_follow_location(@uri.to_s)
if response.body =~ /["'][^"']*\/wp-content\/[^"']*["']/i # Note: in the future major WPScan version, change the user-agent to see
# if the response is a 200 ?
fail "The target is responding with a 403, this might be due to a WAF or a plugin.\n" \
'You should try to supply a valid user-agent via the --user-agent option or use the --random-agent option' if response.code == 403
dir = wp_content_dir ? wp_content_dir : 'wp-content'
if response.body =~ /["'][^"']*\/#{Regexp.escape(dir)}\/[^"']*["']/i
wordpress = true wordpress = true
else else
@@ -65,9 +78,7 @@ class WpTarget < WebSite
# Let's check if the login url is redirected (to https url for example) # Let's check if the login url is redirected (to https url for example)
redirection = redirection(url) redirection = redirection(url)
if redirection url = redirection if redirection
url = redirection
end
url url
end end
@@ -93,7 +104,7 @@ class WpTarget < WebSite
end end
# :nocov: # :nocov:
# The version is not yet considerated # The version is not yet considered
# #
# @param [ String ] name # @param [ String ] name
# @param [ String ] version # @param [ String ] version
@@ -116,11 +127,16 @@ class WpTarget < WebSite
# @return [ String ] # @return [ String ]
def debug_log_url def debug_log_url
@uri.merge("#{wp_content_dir()}/debug.log").to_s @uri.merge("#{wp_content_dir}/debug.log").to_s
end
# @return [ String ]
def upload_dir_url
@uri.merge("#{wp_content_dir}/uploads/").to_s
end end
# Script for replacing strings in wordpress databases # Script for replacing strings in wordpress databases
# reveals databse credentials after hitting submit # reveals database credentials after hitting submit
# http://interconnectit.com/124/search-and-replace-for-wordpress-databases/ # http://interconnectit.com/124/search-and-replace-for-wordpress-databases/
# #
# @return [ String ] # @return [ String ]
@@ -133,4 +149,8 @@ class WpTarget < WebSite
resp = Browser.get(search_replace_db_2_url) resp = Browser.get(search_replace_db_2_url)
resp.code == 200 && resp.body[%r{by interconnect}i] resp.code == 200 && resp.body[%r{by interconnect}i]
end end
def upload_directory_listing_enabled?
directory_listing_enabled?(upload_dir_url)
end
end end

View File

@@ -1,50 +0,0 @@
# encoding: UTF-8
class WpTarget < WebSite
module Malwares
# Used as cache :
# nil => malwares not checked,
# [] => no malwares,
# otherwise array of malwares url found
@malwares = nil
def has_malwares?(malwares_file_path = nil)
!malwares(malwares_file_path).empty?
end
# return array of string (url of malwares found)
def malwares(malwares_file_path = nil)
unless @malwares
malwares_found = []
malwares_file = Malwares.malwares_file(malwares_file_path)
index_page_body = Browser.get(@uri.to_s).body
File.open(malwares_file, 'r') do |file|
file.readlines.collect do |url|
chomped_url = url.chomp
if chomped_url.length > 0
malwares_found += index_page_body.scan(Malwares.malware_pattern(chomped_url))
end
end
end
malwares_found.flatten!
malwares_found.uniq!
@malwares = malwares_found
end
@malwares
end
def self.malwares_file(malwares_file_path)
malwares_file_path || DATA_DIR + '/malwares.txt'
end
def self.malware_pattern(url_regex)
# no need to escape regex here, because malware.txt contains regex
%r{<(?:script|iframe).* src=(?:"|')(#{url_regex}[^"']*)(?:"|')[^>]*>}i
end
end
end

View File

@@ -40,9 +40,9 @@ class WpTarget < WebSite
# @return [ Array ] # @return [ Array ]
def self.config_backup_files def self.config_backup_files
%w{ %w{
wp-config.php~ #wp-config.php# wp-config.php.save wp-config.php.swp wp-config.php.swo wp-config.php_bak wp-config.php~ #wp-config.php# wp-config.php.save .wp-config.php.swp wp-config.php.swp wp-config.php.swo
wp-config.bak wp-config.php.bak wp-config.save wp-config.old wp-config.php.old wp-config.php.orig wp-config.php_bak wp-config.bak wp-config.php.bak wp-config.save wp-config.old wp-config.php.old
wp-config.orig wp-config.php.original wp-config.original wp-config.txt wp-config.php.orig wp-config.orig wp-config.php.original wp-config.original wp-config.txt
} # thanks to Feross.org for these } # thanks to Feross.org for these
end end

View File

@@ -23,9 +23,9 @@ class WpTarget < WebSite
# @return [ Boolean ] # @return [ Boolean ]
def default_wp_content_dir_exists? def default_wp_content_dir_exists?
response = Browser.get(@uri.merge('wp-content').to_s) response = Browser.get(@uri.merge('wp-content').to_s)
hash = Digest::MD5.hexdigest(response.body)
if WpTarget.valid_response_codes.include?(response.code) if WpTarget.valid_response_codes.include?(response.code)
hash = WebSite.page_hash(response)
return true if hash != error_404_hash and hash != homepage_hash return true if hash != error_404_hash and hash != homepage_hash
end end

View File

@@ -2,19 +2,21 @@
class WpTarget < WebSite class WpTarget < WebSite
module WpFullPathDisclosure module WpFullPathDisclosure
# Check for Full Path Disclosure (FPD) # Check for Full Path Disclosure (FPD)
# #
# @return [ Boolean ] # @return [ Boolean ]
def has_full_path_disclosure? def has_full_path_disclosure?
response = Browser.get(full_path_disclosure_url()) Browser.get(full_path_disclosure_url).body[%r/Fatal error/i] ? true : false
response.body[%r{Fatal error}i] ? true : false end
def full_path_disclosure_data
return nil unless has_full_path_disclosure?
Browser.get(full_path_disclosure_url).body[/Fatal error:.+? in (.+?) on/i, 1]
end end
# @return [ String ] # @return [ String ]
def full_path_disclosure_url def full_path_disclosure_url
@uri.merge('wp-includes/rss-functions.php').to_s @uri.merge('wp-includes/rss-functions.php').to_s
end end
end end
end end

View File

@@ -8,11 +8,10 @@ class WpTarget < WebSite
@login_protection_plugin = nil @login_protection_plugin = nil
def has_login_protection? def has_login_protection?
!login_protection_plugin().nil? !login_protection_plugin.nil?
end end
# Checks if a login protection plugin is enabled # Checks if a login protection plugin is enabled
# http://code.google.com/p/wpscan/issues/detail?id=111
# return a WpPlugin object or nil if no one is found # return a WpPlugin object or nil if no one is found
def login_protection_plugin def login_protection_plugin
unless @login_protection_plugin unless @login_protection_plugin
@@ -75,7 +74,7 @@ class WpTarget < WebSite
# http://wordpress.org/extend/plugins/login-security-solution/ # http://wordpress.org/extend/plugins/login-security-solution/
def has_login_security_solution_protection? def has_login_security_solution_protection?
Browser.get(login_security_solution_url()).code != 404 Browser.get(login_security_solution_url).code != 404
end end
def login_security_solution_url def login_security_solution_url
@@ -100,5 +99,12 @@ class WpTarget < WebSite
plugin_url('bluetrait-event-viewer') plugin_url('bluetrait-event-viewer')
end end
# https://wordpress.org/plugins/security-protection/
def has_security_protection_protection?
Nokogiri::HTML(Browser.get(login_url).body).css('script').each do |node|
return true if node['src'] =~ /security-protection.js/i
end
false
end
end end
end end

View File

@@ -0,0 +1,24 @@
# encoding: UTF-8
class WpTarget < WebSite
module WpMustUsePlugins
# Checks to see if the must use plugin folder exists
#
# @return [ Boolean ]
def has_must_use_plugins?
response = Browser.get(must_use_url)
if response && [200, 401, 403].include?(response.code)
hash = WebSite.page_hash(response)
return true if hash != error_404_hash && hash != homepage_hash
end
false
end
# @return [ String ] The must use plugins directory URL
def must_use_url
@uri.merge("#{wp_content_dir}/mu-plugins/").to_s
end
end
end

View File

@@ -10,7 +10,7 @@ class WpTarget < WebSite
# #
# @return [ Boolean ] # @return [ Boolean ]
def has_readme? def has_readme?
response = Browser.get(readme_url()) response = Browser.get(readme_url)
unless response.code == 404 unless response.code == 404
return response.body =~ %r{wordpress}i ? true : false return response.body =~ %r{wordpress}i ? true : false

View File

@@ -46,7 +46,7 @@ def usage
puts '-Use custom plugins directory ...' puts '-Use custom plugins directory ...'
puts "ruby #{script_name} -u www.example.com --wp-plugins-dir wp-content/custom-plugins" puts "ruby #{script_name} -u www.example.com --wp-plugins-dir wp-content/custom-plugins"
puts puts
puts '-Update ...' puts '-Update the DB ...'
puts "ruby #{script_name} --update" puts "ruby #{script_name} --update"
puts puts
puts '-Debug output ...' puts '-Debug output ...'
@@ -60,13 +60,12 @@ end
def help def help
puts 'Help :' puts 'Help :'
puts puts
puts 'Some values are settable in conf/browser.conf.json :' puts 'Some values are settable in a config file, see the example.conf.json'
puts ' user-agent, proxy, proxy-auth, threads, cache timeout and request timeout'
puts puts
puts '--update Update to the latest revision' puts '--update Update to the database to the latest version.'
puts '--url | -u <target url> The WordPress URL/domain to scan.' puts '--url | -u <target url> The WordPress URL/domain to scan.'
puts '--force | -f Forces WPScan to not check if the remote site is running WordPress.' puts '--force | -f Forces WPScan to not check if the remote site is running WordPress.'
puts '--enumerate | -e [option(s)] Enumeration.' puts '--enumerate | -e [option(s)] Enumeration.'
puts ' option :' puts ' option :'
puts ' u usernames from id 1 to 10' puts ' u usernames from id 1 to 10'
puts ' u[10-20] usernames from id 10 to 20 (you must write [] chars)' puts ' u[10-20] usernames from id 10 to 20 (you must write [] chars)'
@@ -80,20 +79,54 @@ def help
puts ' Multiple values are allowed : "-e tt,p" will enumerate timthumbs and plugins' puts ' Multiple values are allowed : "-e tt,p" will enumerate timthumbs and plugins'
puts ' If no option is supplied, the default is "vt,tt,u,vp"' puts ' If no option is supplied, the default is "vt,tt,u,vp"'
puts puts
puts '--exclude-content-based "<regexp or string>" Used with the enumeration option, will exclude all occurrences based on the regexp or string supplied' puts '--exclude-content-based "<regexp or string>"'
puts ' You do not need to provide the regexp delimiters, but you must write the quotes (simple or double)' puts ' Used with the enumeration option, will exclude all occurrences based on the regexp or string supplied.'
puts '--config-file | -c <config file> Use the specified config file' puts ' You do not need to provide the regexp delimiters, but you must write the quotes (simple or double).'
puts '--follow-redirection If the target url has a redirection, it will be followed without asking if you wanted to do so or not' puts '--config-file | -c <config file> Use the specified config file, see the example.conf.json.'
puts '--wp-content-dir <wp content dir> WPScan try to find the content directory (ie wp-content) by scanning the index page, however you can specified it. Subdirectories are allowed' puts '--user-agent | -a <User-Agent> Use the specified User-Agent.'
puts '--wp-plugins-dir <wp plugins dir> Same thing than --wp-content-dir but for the plugins directory. If not supplied, WPScan will use wp-content-dir/plugins. Subdirectories are allowed' puts '--cookie <String> String to read cookies from.'
puts '--proxy <[protocol://]host:port> Supply a proxy (will override the one from conf/browser.conf.json).' puts '--random-agent | -r Use a random User-Agent.'
puts ' HTTP, SOCKS4 SOCKS4A and SOCKS5 are supported. If no protocol is given (format host:port), HTTP will be used' puts '--follow-redirection If the target url has a redirection, it will be followed without asking if you wanted to do so or not'
puts '--proxy-auth <username:password> Supply the proxy login credentials (will override the one from conf/browser.conf.json).' puts '--batch Never ask for user input, use the default behaviour.'
puts '--basic-auth <username:password> Set the HTTP Basic authentication' puts '--no-color Do not use colors in the output.'
puts '--wordlist | -w <wordlist> Supply a wordlist for the password bruter and do the brute.' puts '--wp-content-dir <wp content dir> WPScan try to find the content directory (ie wp-content) by scanning the index page, however you can specified it.'
puts '--threads | -t <number of threads> The number of threads to use when multi-threading requests. (will override the value from conf/browser.conf.json)' puts ' Subdirectories are allowed.'
puts '--username | -U <username> Only brute force the supplied username.' puts '--wp-plugins-dir <wp plugins dir> Same thing than --wp-content-dir but for the plugins directory.'
puts '--help | -h This help screen.' puts ' If not supplied, WPScan will use wp-content-dir/plugins. Subdirectories are allowed'
puts '--verbose | -v Verbose output.' puts '--proxy <[protocol://]host:port> Supply a proxy. HTTP, SOCKS4 SOCKS4A and SOCKS5 are supported.'
puts ' If no protocol is given (format host:port), HTTP will be used.'
puts '--proxy-auth <username:password> Supply the proxy login credentials.'
puts '--basic-auth <username:password> Set the HTTP Basic authentication.'
puts '--wordlist | -w <wordlist> Supply a wordlist for the password brute forcer.'
puts '--username | -U <username> Only brute force the supplied username.'
puts '--usernames <path-to-file> Only brute force the usernames from the file.'
puts '--threads | -t <number of threads> The number of threads to use when multi-threading requests.'
puts '--cache-ttl <cache-ttl> Typhoeus cache TTL.'
puts '--request-timeout <request-timeout> Request Timeout.'
puts '--connect-timeout <connect-timeout> Connect Timeout.'
puts '--max-threads <max-threads> Maximum Threads.'
puts '--throttle <milliseconds> Milliseconds to wait before doing another web request. If used, the --threads should be set to 1.'
puts '--help | -h This help screen.'
puts '--verbose | -v Verbose output.'
puts '--version Output the current version and exit.'
puts puts
end end
# Hook to check if the target if down during the scan
# And have the number of requests performed to display at the end of the scan
# The target is considered down after 30 requests with status = 0
down = 0
@total_requests_done = 0
Typhoeus.on_complete do |response|
next if response.cached?
down += 1 if response.code == 0
@total_requests_done += 1
fail 'The target seems to be down' if down >= 30
next unless Browser.instance.throttle > 0
sleep(Browser.instance.throttle)
end

View File

@@ -1,8 +1,8 @@
# encoding: UTF-8 # encoding: UTF-8
class WpscanOptions class WpscanOptions
ACCESSOR_OPTIONS = [ ACCESSOR_OPTIONS = [
:batch,
:enumerate_plugins, :enumerate_plugins,
:enumerate_only_vulnerable_plugins, :enumerate_only_vulnerable_plugins,
:enumerate_all_plugins, :enumerate_all_plugins,
@@ -12,25 +12,38 @@ class WpscanOptions
:enumerate_timthumbs, :enumerate_timthumbs,
:enumerate_usernames, :enumerate_usernames,
:enumerate_usernames_range, :enumerate_usernames_range,
:no_color,
:log,
:proxy, :proxy,
:proxy_auth, :proxy_auth,
:threads, :threads,
:url, :url,
:vhost,
:wordlist, :wordlist,
:force, :force,
:update, :update,
:verbose, :verbose,
:username, :username,
:usernames,
:password, :password,
:follow_redirection, :follow_redirection,
:wp_content_dir, :wp_content_dir,
:wp_plugins_dir, :wp_plugins_dir,
:help, :help,
:config_file, :config_file,
:cookie,
:exclude_content_based, :exclude_content_based,
:basic_auth, :basic_auth,
:debug_output, :debug_output,
:version :version,
:user_agent,
:random_agent,
:cache_ttl,
:request_timeout,
:connect_timeout,
:max_threads,
:no_banner,
:throttle
] ]
attr_accessor *ACCESSOR_OPTIONS attr_accessor *ACCESSOR_OPTIONS
@@ -42,11 +55,17 @@ class WpscanOptions
end end
def url=(url) def url=(url)
raise 'Empty URL given' if !url raise Exception.new('Empty URL given') if url.nil? || url == ''
url = Addressable::URI.parse(url).normalize.to_s unless url.ascii_only?
@url = URI.parse(add_http_protocol(url)).to_s @url = URI.parse(add_http_protocol(url)).to_s
end end
def vhost=(vhost)
@vhost = vhost
end
def threads=(threads) def threads=(threads)
@threads = threads.is_a?(Integer) ? threads : threads.to_i @threads = threads.is_a?(Integer) ? threads : threads.to_i
end end
@@ -59,6 +78,12 @@ class WpscanOptions
end end
end end
def usernames=(file)
fail "The file #{file} does not exist" unless File.exists?(file)
@usernames = file
end
def proxy=(proxy) def proxy=(proxy)
if proxy.index(':') == nil if proxy.index(':') == nil
raise 'Invalid proxy format. Should be host:port.' raise 'Invalid proxy format. Should be host:port.'
@@ -136,6 +161,10 @@ class WpscanOptions
!to_h.empty? !to_h.empty?
end end
def random_agent=(useless)
@user_agent = get_random_user_agent
end
# return Hash # return Hash
def to_h def to_h
options = {} options = {}
@@ -222,11 +251,15 @@ class WpscanOptions
def self.get_opt_long def self.get_opt_long
GetoptLong.new( GetoptLong.new(
['--url', '-u', GetoptLong::REQUIRED_ARGUMENT], ['--url', '-u', GetoptLong::REQUIRED_ARGUMENT],
['--vhost',GetoptLong::OPTIONAL_ARGUMENT],
['--enumerate', '-e', GetoptLong::OPTIONAL_ARGUMENT], ['--enumerate', '-e', GetoptLong::OPTIONAL_ARGUMENT],
['--username', '-U', GetoptLong::REQUIRED_ARGUMENT], ['--username', '-U', GetoptLong::REQUIRED_ARGUMENT],
['--usernames', GetoptLong::REQUIRED_ARGUMENT],
['--wordlist', '-w', GetoptLong::REQUIRED_ARGUMENT], ['--wordlist', '-w', GetoptLong::REQUIRED_ARGUMENT],
['--threads', '-t', GetoptLong::REQUIRED_ARGUMENT], ['--threads', '-t', GetoptLong::REQUIRED_ARGUMENT],
['--force', '-f', GetoptLong::NO_ARGUMENT], ['--force', '-f', GetoptLong::NO_ARGUMENT],
['--user-agent', '-a', GetoptLong::REQUIRED_ARGUMENT],
['--random-agent', '-r', GetoptLong::NO_ARGUMENT],
['--help', '-h', GetoptLong::NO_ARGUMENT], ['--help', '-h', GetoptLong::NO_ARGUMENT],
['--verbose', '-v', GetoptLong::NO_ARGUMENT], ['--verbose', '-v', GetoptLong::NO_ARGUMENT],
['--proxy', GetoptLong::REQUIRED_ARGUMENT], ['--proxy', GetoptLong::REQUIRED_ARGUMENT],
@@ -239,7 +272,17 @@ class WpscanOptions
['--exclude-content-based', GetoptLong::REQUIRED_ARGUMENT], ['--exclude-content-based', GetoptLong::REQUIRED_ARGUMENT],
['--basic-auth', GetoptLong::REQUIRED_ARGUMENT], ['--basic-auth', GetoptLong::REQUIRED_ARGUMENT],
['--debug-output', GetoptLong::NO_ARGUMENT], ['--debug-output', GetoptLong::NO_ARGUMENT],
['--version', GetoptLong::NO_ARGUMENT] ['--version', GetoptLong::NO_ARGUMENT],
['--cache-ttl', GetoptLong::REQUIRED_ARGUMENT],
['--request-timeout', GetoptLong::REQUIRED_ARGUMENT],
['--connect-timeout', GetoptLong::REQUIRED_ARGUMENT],
['--max-threads', GetoptLong::REQUIRED_ARGUMENT],
['--batch', GetoptLong::NO_ARGUMENT],
['--no-color', GetoptLong::NO_ARGUMENT],
['--cookie', GetoptLong::REQUIRED_ARGUMENT],
['--log', GetoptLong::NO_ARGUMENT],
['--no-banner', GetoptLong::NO_ARGUMENT],
['--throttle', GetoptLong::REQUIRED_ARGUMENT]
) )
end end

View File

@@ -1,127 +0,0 @@
# encoding: UTF-8
class CheckerPlugin < Plugin
def initialize
super(author: 'WPScanTeam - @erwanlr')
register_options(
['--check-vuln-ref-urls', '--cvru', 'Check all the vulnerabilities reference urls for 404'],
['--check-local-vulnerable-files LOCAL_DIRECTORY', '--clvf', 'Perform a recursive scan in the LOCAL_DIRECTORY to find vulnerable files or shells']
)
end
def run(options = {})
if options[:check_vuln_ref_urls]
check_vuln_ref_urls
end
if options[:check_local_vulnerable_files]
check_local_vulnerable_files(options[:check_local_vulnerable_files])
end
end
def check_vuln_ref_urls
vuln_ref_files = [PLUGINS_VULNS_FILE, THEMES_VULNS_FILE, WP_VULNS_FILE]
error_codes = [404, 500, 403]
not_found_regexp = %r{No Results Found|error 404|ID Invalid or Not Found}i
puts '[+] Checking vulnerabilities reference urls'
vuln_ref_files.each do |vuln_ref_file|
xml = xml(vuln_ref_file)
urls = []
xml.xpath('//reference').each { |node| urls << node.text }
urls.uniq!
dead_urls = []
queue_count = 0
request_count = 0
browser = Browser.instance
hydra = browser.hydra
number_of_urls = urls.size
urls.each do |url|
request = browser.forge_request(url, { cache_ttl: 0, followlocation: true })
request_count += 1
request.on_complete do |response|
print "\r [+] Checking #{vuln_ref_file} #{number_of_urls} total ... #{(request_count * 100) / number_of_urls}% complete."
if error_codes.include?(response.code) or not_found_regexp.match(response.body)
dead_urls << url
end
end
hydra.queue(request)
queue_count += 1
if queue_count == browser.max_threads
hydra.run
queue_count = 0
end
end
hydra.run
puts
unless dead_urls.empty?
dead_urls.each { |url| puts " Not Found #{url}" }
end
end
end
def check_local_vulnerable_files(dir_to_scan)
if Dir::exist?(dir_to_scan)
xml_file = LOCAL_FILES_FILE
local_hashes = {}
file_extension_to_scan = '*.{js,php,swf,html,htm}'
print '[+] Generating local hashes ... '
Dir[File::join(dir_to_scan, '**', file_extension_to_scan)].each do |filename|
sha1sum = Digest::SHA1.file(filename).hexdigest
if local_hashes.has_key?(sha1sum)
local_hashes[sha1sum] << filename
else
local_hashes[sha1sum] = [filename]
end
end
puts 'done.'
puts '[+] Checking for vulnerable files ...'
xml = xml(xml_file)
xml.xpath('//hash').each do |node|
sha1sum = node.attribute('sha1').text
if local_hashes.has_key?(sha1sum)
local_filenames = local_hashes[sha1sum]
vuln_title = node.search('title').text
vuln_filename = node.search('file').text
vuln_refrence = node.search('reference').text
puts " #{vuln_filename} found :"
puts ' | Location(s):'
local_filenames.each do |file|
puts " | - #{file}"
end
puts ' |'
puts " | Title: #{vuln_title}"
puts " | Refrence: #{vuln_refrence}" if !vuln_refrence.empty?
puts
end
end
puts 'done.'
else
puts "The supplied directory '#{dir_to_scan}' does not exist"
end
end
end

View File

@@ -1,104 +0,0 @@
# encoding: UTF-8
# This tool generates a list to use for plugin and theme enumeration
class GenerateList
attr_accessor :verbose
# type = themes | plugins
def initialize(type, verbose)
if type =~ /plugins/i
@type = 'plugin'
@svn_url = 'http://plugins.svn.wordpress.org/'
@popular_url = 'http://wordpress.org/plugins/browse/popular/'
@popular_regex = %r{<h3><a href="http://wordpress.org/plugins/([^/]+)/">.+</a></h3>}i
elsif type =~ /themes/i
@type = 'theme'
@svn_url = 'http://themes.svn.wordpress.org/'
@popular_url = 'http://wordpress.org/themes/browse/popular/'
@popular_regex = %r{<h3><a href="http://wordpress.org/themes/([^/]+)">.+</a></h3>}i
else
raise "Type #{type} not defined"
end
@verbose = verbose
@browser = Browser.instance(request_timeout: 20000, connect_timeout: 20000, max_threads: 1, cache_ttl: 0)
end
def set_file_name(type)
case @type
when 'plugin'
case type
when :full
@file_name = PLUGINS_FULL_FILE
when :popular
@file_name = PLUGINS_FILE
else
raise 'Unknown type'
end
when 'theme'
case type
when :full
@file_name = THEMES_FULL_FILE
when :popular
@file_name = THEMES_FILE
else
raise 'Unknown type'
end
else
raise "Unknown type #@type"
end
end
def generate_full_list
set_file_name(:full)
items = SvnParser.new(@svn_url).parse
save items
end
def generate_popular_list(pages)
set_file_name(:popular)
items = get_popular_items(pages)
save items
end
# Send a HTTP request to the WordPress most popular theme or plugin webpage
# parse the response for the names.
def get_popular_items(pages)
found_items = []
page_count = 1
(1...(pages.to_i + 1)).each do |page|
# First page has another URL
url = (page == 1) ? @popular_url : @popular_url + 'page/' + page.to_s + '/'
puts "[+] Parsing page #{page_count}" if @verbose
code = 0
while code != 200
puts red("[!] Retrying request for page #{page} (Code: #{code})") unless code == 0
request = @browser.forge_request(url)
response = request.run
code = response.code
sleep(5) unless code == 200
end
page_count += 1
found = 0
response.body.scan(@popular_regex).each do |item|
found_items << item[0]
found = found + 1
end
puts "[+] Found #{found} items on page #{page}" if @verbose
end
found_items.sort!
found_items.uniq
end
# Save the file
def save(items)
items.sort!
items.uniq!
puts "[*] We have parsed #{items.length} #{@type}s"
File.open(@file_name, 'w') { |f| f.puts(items) }
puts "New #@file_name file created"
end
end

View File

@@ -1,53 +0,0 @@
# encoding: UTF-8
class ListGeneratorPlugin < Plugin
def initialize
super(author: 'WPScanTeam - @FireFart')
register_options(
['--generate-plugin-list [NUMBER_OF_PAGES]', '--gpl', Integer, 'Generate a new data/plugins.txt file. (supply number of *pages* to parse, default : 150)'],
['--generate-full-plugin-list', '--gfpl', 'Generate a new full data/plugins.txt file'],
['--generate-theme-list [NUMBER_OF_PAGES]', '--gtl', Integer, 'Generate a new data/themes.txt file. (supply number of *pages* to parse, default : 20)'],
['--generate-full-theme-list', '--gftl', 'Generate a new full data/themes.txt file'],
['--generate-all', '--ga', 'Generate a new full plugins, full themes, popular plugins and popular themes list']
)
end
def run(options = {})
@verbose = options[:verbose] || false
generate_all = options[:generate_all] || false
if options.has_key?(:generate_plugin_list) || generate_all
most_popular('plugin', options[:generate_plugin_list] || 150)
end
if options[:generate_full_plugin_list] || generate_all
full('plugin')
end
if options.has_key?(:generate_theme_list) || generate_all
most_popular('theme', options[:generate_theme_list] || 20)
end
if options[:generate_full_theme_list] || generate_all
full('theme')
end
end
private
def most_popular(type, number_of_pages)
puts "[+] Generating new most popular #{type} list"
puts
GenerateList.new(type + 's', @verbose).generate_popular_list(number_of_pages)
end
def full(type)
puts "[+] Generating new full #{type} list"
puts
GenerateList.new(type + 's', @verbose).generate_full_list
end
end

View File

@@ -1,31 +0,0 @@
# encoding: UTF-8
# This Class Parses SVN Repositories via HTTP
class SvnParser
attr_accessor :verbose, :svn_root, :keep_empty_dirs
def initialize(svn_root)
@svn_root = svn_root
end
def parse
get_root_directories
end
#Private methods start here
private
# Gets all directories in the SVN root
def get_root_directories
dirs = []
rootindex = Browser.get(@svn_root).body
rootindex.scan(%r{<li><a href=".+">(.+)/</a></li>}i).each do |dir|
dirs << dir[0]
end
dirs.sort!
dirs.uniq
end
end

View File

@@ -1,65 +0,0 @@
# encoding: UTF-8
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 versions: #{vuln_core_count}"
puts "[#] Total vulnerable plugins: #{vuln_plugin_count}"
puts "[#] Total vulnerable themes: #{vuln_theme_count}"
puts "[#] Total version vulnerabilities: #{version_vulns_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_core_count(file=WP_VULNS_FILE)
xml(file).xpath('count(//wordpress)').to_i
end
def vuln_plugin_count(file=PLUGINS_VULNS_FILE)
xml(file).xpath('count(//plugin)').to_i
end
def vuln_theme_count(file=THEMES_VULNS_FILE)
xml(file).xpath('count(//theme)').to_i
end
def version_vulns_count(file=WP_VULNS_FILE)
xml(file).xpath('count(//vulnerability)').to_i
end
def plugin_vulns_count(file=PLUGINS_VULNS_FILE)
xml(file).xpath('count(//vulnerability)').to_i
end
def theme_vulns_count(file=THEMES_VULNS_FILE)
xml(file).xpath('count(//vulnerability)').to_i
end
def total_plugins(file=PLUGINS_FULL_FILE)
lines_in_file(file)
end
def total_themes(file=THEMES_FULL_FILE)
lines_in_file(file)
end
def lines_in_file(file)
IO.readlines(file).size
end
end

View File

@@ -1,35 +0,0 @@
# encoding: UTF-8
require File.expand_path(File.dirname(__FILE__) + '/../common/common_helper')
require_files_from_directory(WPSTOOLS_LIB_DIR)
require_files_from_directory(WPSTOOLS_PLUGINS_DIR, '**/*.rb')
def usage
script_name = $0
puts
puts '-h for further help.'
puts
puts 'Examples:'
puts
puts "- Generate a new 'most popular' plugin list, up to 150 pages ..."
puts "ruby #{script_name} --generate-plugin-list 150"
puts
puts '- Generate a new full plugin list'
puts "ruby #{script_name} --generate-full-plugin-list"
puts
puts "- Generate a new 'most popular' theme list, up to 150 pages ..."
puts "ruby #{script_name} --generate-theme-list 150"
puts
puts '- Generate a new full theme list'
puts "ruby #{script_name} --generate-full-theme-list"
puts
puts '- Generate all list'
puts "ruby #{script_name} --generate-all"
puts
puts 'Locally scan a wordpress installation for vulnerable files or shells'
puts "ruby #{script_name} --check-local-vulnerable-files /var/www/wordpress/"
puts
puts 'See README for further information.'
puts
end

View File

@@ -6,9 +6,9 @@ describe Browser do
it_behaves_like 'Browser::Actions' it_behaves_like 'Browser::Actions'
it_behaves_like 'Browser::Options' it_behaves_like 'Browser::Options'
CONFIG_FILE_WITHOUT_PROXY = SPEC_FIXTURES_CONF_DIR + '/browser/browser.conf.json' CONFIG_FILE_WITHOUT_PROXY = SPEC_FIXTURES_CONF_DIR + '/browser.conf.json'
CONFIG_FILE_WITH_PROXY = SPEC_FIXTURES_CONF_DIR + '/browser/browser.conf_proxy.json' CONFIG_FILE_WITH_PROXY = SPEC_FIXTURES_CONF_DIR + '/browser.conf_proxy.json'
#CONFIG_FILE_WITH_PROXY_AND_AUTH = SPEC_FIXTURES_CONF_DIR + '/browser/browser.conf_proxy_auth.json' #CONFIG_FILE_WITH_PROXY_AND_AUTH = SPEC_FIXTURES_CONF_DIR + '/browser.conf_proxy_auth.json'
subject(:browser) { subject(:browser) {
Browser.reset Browser.reset
@@ -16,17 +16,16 @@ describe Browser do
} }
let(:options) { {} } let(:options) { {} }
let(:instance_vars_to_check) { let(:instance_vars_to_check) {
['user_agent', 'user_agent_mode', 'available_user_agents', 'proxy', ['proxy', 'max_threads', 'cache_ttl', 'request_timeout', 'connect_timeout']
'max_threads', 'cache_ttl', 'request_timeout', 'connect_timeout']
} }
let(:json_config_without_proxy) { JSON.parse(File.read(CONFIG_FILE_WITHOUT_PROXY)) } let(:json_config_without_proxy) { JSON.parse(File.read(CONFIG_FILE_WITHOUT_PROXY)) }
let(:json_config_with_proxy) { JSON.parse(File.read(CONFIG_FILE_WITH_PROXY)) } let(:json_config_with_proxy) { JSON.parse(File.read(CONFIG_FILE_WITH_PROXY)) }
def check_instance_variables(browser, json_expected_vars) def check_instance_variables(browser, json_expected_vars)
json_expected_vars['max_threads'] ||= 1 # max_thread can not be nil json_expected_vars['max_threads'] ||= 20 # max_thread can not be nil
instance_vars_to_check.each do |variable_name| instance_vars_to_check.each do |variable_name|
browser.send(:"#{variable_name}").should === json_expected_vars[variable_name] expect(browser.send(:"#{variable_name}")).to be === json_expected_vars[variable_name]
end end
end end
@@ -39,12 +38,6 @@ describe Browser do
describe '::instance' do describe '::instance' do
after { check_instance_variables(browser, @json_expected_vars) } after { check_instance_variables(browser, @json_expected_vars) }
context "when default config_file = #{CONFIG_FILE_WITHOUT_PROXY}" do
it 'will check the instance vars' do
@json_expected_vars = json_config_without_proxy
end
end
context "when :config_file = #{CONFIG_FILE_WITH_PROXY}" do context "when :config_file = #{CONFIG_FILE_WITH_PROXY}" do
let(:options) { { config_file: CONFIG_FILE_WITH_PROXY } } let(:options) { { config_file: CONFIG_FILE_WITH_PROXY } }
@@ -57,7 +50,7 @@ describe Browser do
let(:cache_dir) { CACHE_DIR + '/somewhere' } let(:cache_dir) { CACHE_DIR + '/somewhere' }
let(:options) { { cache_dir: cache_dir } } let(:options) { { cache_dir: cache_dir } }
after { subject.cache_dir.should == cache_dir } after { expect(subject.cache_dir).to eq cache_dir }
it 'sets @cache_dir' do it 'sets @cache_dir' do
@json_expected_vars = json_config_without_proxy @json_expected_vars = json_config_without_proxy
@@ -71,7 +64,7 @@ describe Browser do
it 'raises an error' do it 'raises an error' do
File.symlink('./testfile', config_file) File.symlink('./testfile', config_file)
expect { browser.load_config(config_file) }.to raise_error("[ERROR] Config file is a symlink.") expect { browser.load_config(config_file) }.to raise_error('[ERROR] Config file is a symlink.')
File.unlink(config_file) File.unlink(config_file)
end end
end end
@@ -91,11 +84,11 @@ describe Browser do
describe '::append_params_header_field' do describe '::append_params_header_field' do
after :each do after :each do
Browser.append_params_header_field( expect(Browser.append_params_header_field(
@params, @params,
@field, @field,
@field_value @field_value
).should === @expected )).to be === @expected
end end
context 'when there is no headers' do context 'when there is no headers' do
@@ -137,22 +130,23 @@ describe Browser do
headers: { 'User-Agent' => 'SomeUA' }, headers: { 'User-Agent' => 'SomeUA' },
ssl_verifypeer: false, ssl_verifyhost: 0, ssl_verifypeer: false, ssl_verifyhost: 0,
cookiejar: cookie_jar, cookiefile: cookie_jar, cookiejar: cookie_jar, cookiefile: cookie_jar,
timeout: 2000, connecttimeout: 1000 timeout: 60, connecttimeout: 10,
maxredirs: 3,
referer: nil
} }
} }
after :each do after :each do
browser.stub(user_agent: 'SomeUA') browser.user_agent = 'SomeUA'
browser.cache_ttl = 250 browser.cache_ttl = 250
browser.merge_request_params(params).should == @expected expect(browser.merge_request_params(params)).to eq @expected
end end
it 'sets the User-Agent header field and cache_ttl' do it 'sets the User-Agent header field and cache_ttl' do
@expected = default_expectation @expected = default_expectation
end end
context 'when @proxy' do context 'when @proxy' do
let(:proxy) { '127.0.0.1:9050' } let(:proxy) { '127.0.0.1:9050' }
let(:proxy_expectation) { default_expectation.merge(proxy: proxy) } let(:proxy_expectation) { default_expectation.merge(proxy: proxy) }
@@ -171,11 +165,19 @@ describe Browser do
end end
end end
context 'when @request_timeout' do
it 'gives an Integer' do
browser.request_timeout = '10'
@expected = default_expectation.merge(timeout: 10)
end
end
context 'when @basic_auth' do context 'when @basic_auth' do
it 'appends the basic_auth' do it 'appends the basic_auth' do
browser.basic_auth = 'user:pass' browser.basic_auth = 'user:pass'
@expected = default_expectation.merge( @expected = default_expectation.merge(
headers: default_expectation[:headers].merge('Authorization' => 'Basic '+Base64.encode64('user:pass').chomp) headers: default_expectation[:headers].merge('Authorization' => 'Basic ' + Base64.encode64('user:pass').chomp)
) )
end end
end end
@@ -187,18 +189,35 @@ describe Browser do
@expected = default_expectation.merge(params) @expected = default_expectation.merge(params)
end end
end end
context 'when the maxredirs is alreday set' do
let(:params) { { maxredirs: 100 } }
it 'does not override it' do
@expected = default_expectation.merge(params)
end
end
context 'when @cookie' do
let(:cookie) { 'foor=bar;bar=foo' }
before { browser.cookie = cookie }
it 'sets the cookie' do
@expected = default_expectation.merge(cookie: cookie)
end
end
end end
describe '#forge_request' do describe '#forge_request' do
let(:url) { 'http://example.localhost' } let(:url) { 'http://example.localhost' }
it 'returns the correct Typhoeus::Request' do it 'returns the correct Typhoeus::Request' do
subject.stub(merge_request_params: { cache_ttl: 10 }) allow(subject).to receive_messages(merge_request_params: { cache_ttl: 10 })
request = subject.forge_request(url) request = subject.forge_request(url)
request.should be_a Typhoeus::Request expect(request).to be_a Typhoeus::Request
request.url.should == url expect(request.url).to eq url
request.cache_ttl.should == 10 expect(request.cache_ttl).to eq 10
end end
end end
@@ -213,7 +232,7 @@ describe Browser do
response1 = Browser.get(url) response1 = Browser.get(url)
response2 = Browser.get(url) response2 = Browser.get(url)
response1.body.should == response2.body expect(response1.body).to eq response2.body
#WebMock.should have_requested(:get, url).times(1) # This one fail, dunno why :s (but it works without mock) #WebMock.should have_requested(:get, url).times(1) # This one fail, dunno why :s (but it works without mock)
end end
end end

View File

@@ -17,33 +17,50 @@ describe CacheFileStore do
describe '#storage_path' do describe '#storage_path' do
it 'returns the storage path given in the #new' do it 'returns the storage path given in the #new' do
@cache.storage_path.should == cache_dir expect(@cache.storage_path).to match(/#{cache_dir}/)
end end
end end
describe '#serializer' do describe '#serializer' do
it 'should return the default serializer : Marshal' do it 'should return the default serializer : Marshal' do
@cache.serializer.should == Marshal expect(@cache.serializer).to eq Marshal
@cache.serializer.should_not == YAML expect(@cache.serializer).not_to eq YAML
end end
end end
describe '#clean' do describe '#clean' do
it "should remove all files from the cache dir (#{@cache_dir}" do it "should remove all files from the cache dir (#{@cache_dir}" do
# let's create some files into the directory first # clean is executed by other tests before
(0..5).each do |i| before = count_files_in_dir(@cache.cache_dir)
File.new(cache_dir + "/file_#{i}.txt", File::CREAT) test_dir = File.expand_path("#{@cache.cache_dir}/test")
end Dir.mkdir test_dir
#change the modification date
count_files_in_dir(cache_dir, 'file_*.txt').should == 6 %x[ touch -t 200701310846.26 #{test_dir} ]
expect(count_files_in_dir(@cache.cache_dir)).to eq (before + 1)
@cache.clean @cache.clean
count_files_in_dir(cache_dir).should == 0 expect(count_files_in_dir(@cache.cache_dir)).to eq before
end end
end end
describe '#read_entry (nonexistent entry)' do describe '#read_entry' do
it 'should return nil' do after { expect(@cache.read_entry(key)).to eq @expected }
@cache.read_entry(Digest::SHA1.hexdigest('hello world')).should be_nil
context 'when the entry does not exist' do
let(:key) { Digest::SHA1.hexdigest('hello world') }
it 'should return nil' do
@expected = nil
end
end
context 'when the file exist but is empty (marshal data too short error)' do
let(:key) { 'empty-file' }
it 'returns nil' do
File.new(File.join(@cache.storage_path, key), File::CREAT)
@expected = nil
end
end end
end end
@@ -51,7 +68,7 @@ describe CacheFileStore do
after :each do after :each do
@cache.write_entry(@key, @data, @timeout) @cache.write_entry(@key, @data, @timeout)
@cache.read_entry(@key).should === @expected expect(@cache.read_entry(@key)).to be === @expected
end end
it 'should get the correct entry (string)' do it 'should get the correct entry (string)' do
@@ -70,4 +87,16 @@ describe CacheFileStore do
## TODO write / read for an object ## TODO write / read for an object
end end
describe '#storage_dir' do
it 'should create a unique storage dir' do
storage_dirs = []
(1..5).each do |_|
storage_dirs << CacheFileStore.new(cache_dir).storage_path
end
expect(storage_dirs.uniq.size).to eq 5
end
end
end end

View File

@@ -10,20 +10,15 @@ describe WpItems do
let(:expected) do let(:expected) do
{ {
request_params: { cache_ttl: 0, followlocation: true }, request_params: { cache_ttl: 0, followlocation: true },
targets_items_from_file: [ WpItem.new(uri, name: 'item1'), targets_items_from_file: [ WpItem.new(uri, name: 'item1'),
WpItem.new(uri, name:'item-2'), WpItem.new(uri, name: 'item-2'),
WpItem.new(uri, name: 'mr-smith')], WpItem.new(uri, name: 'mr-smith')],
vulnerable_targets_items: [ WpItem.new(uri, name: 'mr-smith'), vulnerable_targets_items: [ WpItem.new(uri, name: 'mr-smith'),
WpItem.new(uri, name: 'neo')], WpItem.new(uri, name: 'neo')],
passive_detection: WpItems.new << WpItem.new(uri, name: 'js-source') << passive_detection: (1..13).reduce(WpItems.new) { |o, i| o << WpItem.new(uri, name: "detect-me-#{i}") }
WpItem.new(uri, name: 'escaped-url') <<
WpItem.new(uri, name: 'link-tag') <<
WpItem.new(uri, name: 'script-tag') <<
WpItem.new(uri, name: 'style-tag') <<
WpItem.new(uri, name: 'style-tag-import')
} }
end end
end end

Some files were not shown because too many files have changed in this diff Show More