arachni 1.1 → 1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +159 -0
  3. data/LICENSE.md +126 -196
  4. data/README.md +32 -24
  5. data/arachni.gemspec +7 -7
  6. data/components/checks/active/code_injection_timing.rb +3 -3
  7. data/components/checks/active/csrf.rb +2 -2
  8. data/components/checks/active/file_inclusion.rb +6 -7
  9. data/components/checks/active/os_cmd_injection.rb +3 -3
  10. data/components/checks/active/path_traversal.rb +7 -7
  11. data/components/checks/active/response_splitting.rb +9 -4
  12. data/components/checks/active/session_fixation.rb +7 -3
  13. data/components/checks/active/source_code_disclosure.rb +5 -5
  14. data/components/checks/active/unvalidated_redirect.rb +12 -3
  15. data/components/checks/active/unvalidated_redirect_dom.rb +3 -3
  16. data/components/checks/active/xss.rb +23 -10
  17. data/components/checks/active/xss_dom_inputs.rb +113 -11
  18. data/components/checks/active/xxe.rb +3 -3
  19. data/components/checks/passive/backdoors.rb +6 -5
  20. data/components/checks/passive/backup_directories.rb +6 -6
  21. data/components/checks/passive/backup_files.rb +6 -6
  22. data/components/checks/passive/common_admin_interfaces.rb +58 -0
  23. data/components/checks/passive/common_admin_interfaces/admin-panels.txt +49 -0
  24. data/components/checks/passive/common_directories/directories.txt +0 -16
  25. data/components/checks/passive/common_files.rb +6 -5
  26. data/components/checks/passive/common_files/filenames.txt +0 -2
  27. data/components/checks/passive/directory_listing.rb +6 -6
  28. data/components/checks/passive/grep/cookie_set_for_parent_domain.rb +3 -3
  29. data/components/checks/passive/grep/hsts.rb +6 -3
  30. data/components/checks/passive/grep/http_only_cookies.rb +3 -3
  31. data/components/checks/passive/grep/insecure_cookies.rb +2 -2
  32. data/components/checks/passive/grep/insecure_cors_policy.rb +6 -4
  33. data/components/checks/passive/grep/x_frame_options.rb +6 -4
  34. data/components/checks/passive/htaccess_limit.rb +6 -2
  35. data/components/checks/passive/http_put.rb +8 -4
  36. data/components/checks/passive/interesting_responses.rb +3 -2
  37. data/components/checks/passive/localstart_asp.rb +6 -2
  38. data/components/checks/passive/origin_spoof_access_restriction_bypass.rb +5 -1
  39. data/components/checks/passive/xst.rb +6 -2
  40. data/components/fingerprinters/frameworks/aspx_mvc.rb +43 -0
  41. data/components/fingerprinters/frameworks/cakephp.rb +28 -0
  42. data/components/fingerprinters/frameworks/cherrypy.rb +31 -0
  43. data/components/fingerprinters/frameworks/django.rb +33 -0
  44. data/components/fingerprinters/frameworks/jsf.rb +30 -0
  45. data/components/fingerprinters/frameworks/rack.rb +5 -7
  46. data/components/fingerprinters/frameworks/rails.rb +43 -0
  47. data/components/fingerprinters/languages/aspx.rb +11 -11
  48. data/components/fingerprinters/languages/{jsp.rb → java.rb} +11 -7
  49. data/components/fingerprinters/languages/php.rb +6 -6
  50. data/components/fingerprinters/languages/python.rb +14 -6
  51. data/components/fingerprinters/languages/ruby.rb +3 -5
  52. data/components/fingerprinters/servers/apache.rb +5 -4
  53. data/components/fingerprinters/servers/gunicorn.rb +33 -0
  54. data/components/fingerprinters/servers/jetty.rb +1 -1
  55. data/components/fingerprinters/servers/tomcat.rb +11 -4
  56. data/components/path_extractors/anchors.rb +5 -12
  57. data/components/path_extractors/areas.rb +5 -13
  58. data/components/path_extractors/comments.rb +5 -3
  59. data/components/path_extractors/data_url.rb +21 -0
  60. data/components/path_extractors/forms.rb +5 -13
  61. data/components/path_extractors/frames.rb +6 -13
  62. data/components/path_extractors/generic.rb +3 -12
  63. data/components/path_extractors/links.rb +5 -13
  64. data/components/path_extractors/meta_refresh.rb +5 -13
  65. data/components/path_extractors/scripts.rb +8 -14
  66. data/components/plugins/autologin.rb +17 -5
  67. data/components/plugins/defaults/meta/remedies/discovery.rb +11 -29
  68. data/components/plugins/login_script.rb +40 -10
  69. data/components/plugins/metrics.rb +235 -0
  70. data/components/plugins/proxy.rb +21 -4
  71. data/components/plugins/proxy/panel/page_accordion.html.erb +34 -2
  72. data/components/plugins/restrict_to_dom_state.rb +70 -0
  73. data/components/plugins/vector_feed.rb +38 -9
  74. data/components/reporters/plugin_formatters/html/metrics.rb +290 -0
  75. data/components/reporters/plugin_formatters/stdout/metrics.rb +80 -0
  76. data/components/reporters/plugin_formatters/xml/metrics.rb +29 -0
  77. data/components/reporters/stdout.rb +4 -2
  78. data/components/reporters/xml.rb +4 -4
  79. data/components/reporters/xml/schema.xsd +95 -0
  80. data/lib/arachni.rb +2 -0
  81. data/lib/arachni/browser.rb +132 -77
  82. data/lib/arachni/browser/javascript.rb +173 -45
  83. data/lib/arachni/browser/javascript/scripts/dom_monitor.js +81 -6
  84. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +31 -3
  85. data/lib/arachni/browser_cluster.rb +41 -15
  86. data/lib/arachni/browser_cluster/job.rb +4 -0
  87. data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +0 -9
  88. data/lib/arachni/browser_cluster/worker.rb +8 -5
  89. data/lib/arachni/check/auditor.rb +20 -8
  90. data/lib/arachni/check/base.rb +38 -6
  91. data/lib/arachni/element/base.rb +18 -1
  92. data/lib/arachni/element/capabilities/analyzable/differential.rb +0 -1
  93. data/lib/arachni/element/capabilities/analyzable/taint.rb +40 -10
  94. data/lib/arachni/element/capabilities/analyzable/timeout.rb +27 -23
  95. data/lib/arachni/element/capabilities/auditable/dom.rb +22 -0
  96. data/lib/arachni/element/capabilities/inputtable.rb +6 -2
  97. data/lib/arachni/element/capabilities/submittable.rb +1 -1
  98. data/lib/arachni/element/cookie.rb +37 -23
  99. data/lib/arachni/element/cookie/capabilities/mutable.rb +6 -6
  100. data/lib/arachni/element/cookie/dom.rb +0 -8
  101. data/lib/arachni/element/form.rb +28 -14
  102. data/lib/arachni/element/form/capabilities/auditable.rb +2 -2
  103. data/lib/arachni/element/form/capabilities/mutable.rb +5 -5
  104. data/lib/arachni/element/form/dom.rb +0 -8
  105. data/lib/arachni/element/generic_dom.rb +1 -1
  106. data/lib/arachni/element/json.rb +2 -1
  107. data/lib/arachni/element/json/capabilities/inputtable.rb +6 -6
  108. data/lib/arachni/element/json/capabilities/mutable.rb +1 -1
  109. data/lib/arachni/element/link.rb +13 -16
  110. data/lib/arachni/element/link/dom.rb +1 -14
  111. data/lib/arachni/element/link_template.rb +3 -2
  112. data/lib/arachni/element/link_template/dom.rb +0 -16
  113. data/lib/arachni/element/server.rb +51 -9
  114. data/lib/arachni/element/xml.rb +1 -0
  115. data/lib/arachni/ethon/easy.rb +4 -1
  116. data/lib/arachni/framework/parts/audit.rb +26 -77
  117. data/lib/arachni/framework/parts/browser.rb +50 -55
  118. data/lib/arachni/framework/parts/check.rb +4 -3
  119. data/lib/arachni/framework/parts/data.rb +41 -6
  120. data/lib/arachni/framework/parts/state.rb +16 -7
  121. data/lib/arachni/http/client.rb +66 -38
  122. data/lib/arachni/http/client/dynamic_404_handler.rb +46 -14
  123. data/lib/arachni/http/headers.rb +22 -10
  124. data/lib/arachni/http/proxy_server.rb +67 -22
  125. data/lib/arachni/http/proxy_server/ssl-interceptor-cacert.pem +34 -0
  126. data/lib/arachni/http/proxy_server/ssl-interceptor-cakey.pem +51 -0
  127. data/lib/arachni/http/request.rb +71 -18
  128. data/lib/arachni/issue.rb +17 -3
  129. data/lib/arachni/option_groups/browser_cluster.rb +34 -1
  130. data/lib/arachni/option_groups/http.rb +1 -1
  131. data/lib/arachni/page.rb +26 -13
  132. data/lib/arachni/page/dom/transition.rb +2 -2
  133. data/lib/arachni/parser.rb +28 -11
  134. data/lib/arachni/platform/fingerprinter.rb +5 -0
  135. data/lib/arachni/platform/manager.rb +65 -32
  136. data/lib/arachni/plugin/base.rb +8 -0
  137. data/lib/arachni/processes/instances.rb +25 -11
  138. data/lib/arachni/reporter/manager.rb +2 -2
  139. data/lib/arachni/rpc/client/instance.rb +4 -0
  140. data/lib/arachni/rpc/server/framework/master.rb +3 -3
  141. data/lib/arachni/rpc/server/framework/multi_instance.rb +0 -8
  142. data/lib/arachni/rpc/server/instance.rb +2 -1
  143. data/lib/arachni/ruby/array.rb +5 -0
  144. data/lib/arachni/ruby/hash.rb +5 -0
  145. data/lib/arachni/ruby/string.rb +2 -3
  146. data/lib/arachni/session.rb +32 -6
  147. data/lib/arachni/state/framework.rb +6 -2
  148. data/lib/arachni/support/cache.rb +1 -0
  149. data/lib/arachni/support/cache/base.rb +12 -8
  150. data/lib/arachni/support/cache/least_recently_pushed.rb +29 -0
  151. data/lib/arachni/support/cache/least_recently_used.rb +5 -8
  152. data/lib/arachni/support/cache/preference.rb +1 -1
  153. data/lib/arachni/support/cache/random_replacement.rb +1 -25
  154. data/lib/arachni/support/database/queue.rb +21 -8
  155. data/lib/arachni/support/lookup/base.rb +7 -1
  156. data/lib/arachni/support/mixins/observable.rb +3 -1
  157. data/lib/arachni/support/profiler.rb +51 -10
  158. data/lib/arachni/support/signature.rb +11 -2
  159. data/lib/arachni/trainer.rb +8 -2
  160. data/lib/arachni/uri.rb +28 -25
  161. data/lib/arachni/uri/scope.rb +1 -1
  162. data/lib/arachni/utilities.rb +8 -0
  163. data/lib/arachni/watir/element.rb +1 -1
  164. data/lib/version +1 -1
  165. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +388 -53
  166. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +41 -0
  167. data/spec/arachni/browser/javascript_spec.rb +235 -61
  168. data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +0 -9
  169. data/spec/arachni/browser_cluster_spec.rb +58 -10
  170. data/spec/arachni/browser_spec.rb +170 -26
  171. data/spec/arachni/check/auditor_spec.rb +22 -3
  172. data/spec/arachni/check/base_spec.rb +84 -0
  173. data/spec/arachni/element/body_spec.rb +1 -1
  174. data/spec/arachni/element/capabilities/analyzable/taint_spec.rb +3 -3
  175. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +1 -1
  176. data/spec/arachni/element/cookie/dom_spec.rb +0 -9
  177. data/spec/arachni/element/cookie_spec.rb +85 -0
  178. data/spec/arachni/element/form/dom_spec.rb +0 -9
  179. data/spec/arachni/element/form_spec.rb +46 -3
  180. data/spec/arachni/element/json_spec.rb +20 -0
  181. data/spec/arachni/element/link/dom_spec.rb +0 -9
  182. data/spec/arachni/element/link_spec.rb +40 -15
  183. data/spec/arachni/element/link_template/dom_spec.rb +0 -8
  184. data/spec/arachni/element/link_template_spec.rb +2 -6
  185. data/spec/arachni/element/server_spec.rb +94 -8
  186. data/spec/arachni/element/xml_spec.rb +20 -0
  187. data/spec/arachni/framework/parts/audit_spec.rb +12 -14
  188. data/spec/arachni/framework/parts/browser_spec.rb +0 -171
  189. data/spec/arachni/framework/parts/platform_spec.rb +14 -8
  190. data/spec/arachni/framework/parts/report_spec.rb +1 -1
  191. data/spec/arachni/framework/parts/state_spec.rb +0 -9
  192. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +19 -0
  193. data/spec/arachni/http/client_spec.rb +169 -42
  194. data/spec/arachni/http/headers_spec.rb +18 -0
  195. data/spec/arachni/http/request_spec.rb +23 -0
  196. data/spec/arachni/issue_spec.rb +17 -6
  197. data/spec/arachni/page_spec.rb +22 -2
  198. data/spec/arachni/parser_spec.rb +5 -0
  199. data/spec/arachni/platform/manager_spec.rb +57 -25
  200. data/spec/arachni/reporter/manager_spec.rb +26 -0
  201. data/spec/arachni/rpc/server/active_options_spec.rb +9 -4
  202. data/spec/arachni/state/framework_spec.rb +2 -8
  203. data/spec/arachni/support/cache/least_recently_pushed_spec.rb +90 -0
  204. data/spec/arachni/support/cache/least_recently_used_spec.rb +5 -13
  205. data/spec/arachni/support/database/queue_spec.rb +7 -0
  206. data/spec/arachni/support/mixins/observable_spec.rb +15 -1
  207. data/spec/arachni/trainer_spec.rb +2 -2
  208. data/spec/components/checks/active/code_injection_timing_spec.rb +1 -1
  209. data/spec/components/checks/active/file_inclusion_spec.rb +6 -6
  210. data/spec/components/checks/active/path_traversal_spec.rb +2 -2
  211. data/spec/components/checks/active/source_code_disclosure_spec.rb +2 -2
  212. data/spec/components/checks/active/unvalidated_redirect_spec.rb +6 -6
  213. data/spec/components/checks/active/xss_dom_inputs_spec.rb +3 -5
  214. data/spec/components/checks/active/xss_dom_script_context_spec.rb +1 -1
  215. data/spec/components/checks/active/xss_spec.rb +5 -5
  216. data/spec/components/checks/passive/common_admin_interfaces_spec.rb +15 -0
  217. data/spec/components/checks/passive/interesting_responses_spec.rb +14 -1
  218. data/spec/components/fingerprinters/frameworks/aspx_mvc_spec.rb +31 -0
  219. data/spec/components/fingerprinters/frameworks/cakephp_spec.rb +22 -0
  220. data/spec/components/fingerprinters/frameworks/cherrypy_spec.rb +28 -0
  221. data/spec/components/fingerprinters/frameworks/django_spec.rb +37 -0
  222. data/spec/components/fingerprinters/frameworks/jsf_spec.rb +27 -0
  223. data/spec/components/fingerprinters/frameworks/rack_spec.rb +11 -14
  224. data/spec/components/fingerprinters/frameworks/rails_spec.rb +53 -0
  225. data/spec/components/fingerprinters/languages/asp_spec.rb +7 -9
  226. data/spec/components/fingerprinters/languages/aspx_spec.rb +10 -24
  227. data/spec/components/fingerprinters/languages/java_spec.rb +88 -0
  228. data/spec/components/fingerprinters/languages/php_spec.rb +19 -12
  229. data/spec/components/fingerprinters/languages/python_spec.rb +22 -9
  230. data/spec/components/fingerprinters/languages/ruby.rb +6 -4
  231. data/spec/components/fingerprinters/os/bsd_spec.rb +6 -4
  232. data/spec/components/fingerprinters/os/linux_spec.rb +6 -4
  233. data/spec/components/fingerprinters/os/solaris_spec.rb +6 -4
  234. data/spec/components/fingerprinters/os/unix_spec.rb +6 -4
  235. data/spec/components/fingerprinters/os/windows_spec.rb +6 -4
  236. data/spec/components/fingerprinters/servers/apache_spec.rb +15 -4
  237. data/spec/components/fingerprinters/servers/gunicorn_spec.rb +28 -0
  238. data/spec/components/fingerprinters/servers/iis_spec.rb +6 -6
  239. data/spec/components/fingerprinters/servers/jetty_spec.rb +6 -6
  240. data/spec/components/fingerprinters/servers/nginx_spec.rb +6 -4
  241. data/spec/components/fingerprinters/servers/tomcat_spec.rb +15 -6
  242. data/spec/components/path_extractors/data_url_spec.rb +19 -0
  243. data/spec/components/plugins/autologin_spec.rb +23 -0
  244. data/spec/components/plugins/login_script_spec.rb +112 -24
  245. data/spec/components/plugins/restrict_to_dom_state_spec.rb +16 -0
  246. data/spec/components/plugins/vector_feed_spec.rb +39 -1
  247. data/spec/support/factories/page/dom.rb +9 -4
  248. data/spec/support/factories/page/dom/transition.rb +31 -9
  249. data/spec/support/factories/scan_report.rb +8 -6
  250. data/spec/support/fixtures/empty/placeholder +0 -0
  251. data/spec/support/fixtures/report.afr +0 -0
  252. data/spec/support/fixtures/reporters/manager_spec/error.rb +18 -0
  253. data/spec/support/servers/arachni/browser.rb +117 -11
  254. data/spec/support/servers/arachni/browser/javascript/dom_monitor.rb +148 -4
  255. data/spec/support/servers/arachni/check/auditor.rb +4 -0
  256. data/spec/support/servers/arachni/element/cookie/cookie_dom.rb +1 -1
  257. data/spec/support/servers/arachni/http/client.rb +5 -0
  258. data/spec/support/servers/arachni/http/client/dynamic_404_handler.rb +13 -0
  259. data/spec/support/servers/checks/active/code_injection_timing.rb +1 -1
  260. data/spec/support/servers/checks/active/file_inclusion.rb +2 -2
  261. data/spec/support/servers/checks/active/path_traversal.rb +2 -2
  262. data/spec/support/servers/checks/active/source_code_disclosure.rb +40 -33
  263. data/spec/support/servers/checks/active/trainer_check.rb +9 -10
  264. data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +7 -4
  265. data/spec/support/servers/checks/active/xss.rb +35 -0
  266. data/spec/support/servers/checks/active/xss_dom.rb +1 -1
  267. data/spec/support/servers/checks/active/xss_dom_inputs.rb +24 -0
  268. data/spec/support/servers/checks/active/xss_dom_script_context.rb +1 -1
  269. data/spec/support/servers/checks/passive/common_admin_interfaces.rb +6 -0
  270. data/spec/support/servers/plugins/autologin.rb +9 -0
  271. data/spec/support/servers/plugins/restrict_to_dom_state.rb +4 -0
  272. data/spec/support/shared/element/base.rb +42 -0
  273. data/spec/support/shared/element/capabilities/auditable.rb +4 -4
  274. data/spec/support/shared/element/capabilities/auditable/dom.rb +26 -0
  275. data/spec/support/shared/element/capabilities/inputtable.rb +16 -11
  276. data/spec/support/shared/element/capabilities/submitable.rb +7 -2
  277. data/spec/support/shared/fingerprinter.rb +8 -0
  278. data/spec/support/shared/path_extractor.rb +1 -1
  279. data/ui/cli/framework.rb +3 -3
  280. data/ui/cli/framework/option_parser.rb +9 -0
  281. data/ui/cli/output.rb +9 -0
  282. data/ui/cli/reporter.rb +5 -2
  283. data/ui/cli/utilities.rb +4 -2
  284. metadata +76 -17
  285. data/lib/arachni/http/proxy_server/ssl-interceptor-cert.pem +0 -34
  286. data/lib/arachni/http/proxy_server/ssl-interceptor-pkey.pem +0 -51
  287. data/spec/components/fingerprinters/languages/jsp_spec.rb +0 -56
@@ -0,0 +1,33 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ module Arachni
10
+ module Platform::Fingerprinters
11
+
12
+ # Identifies Gunicorn resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ # @version 0.1
16
+ class Gunicorn < Platform::Fingerprinter
17
+
18
+ def run
19
+ return update_platforms if server_or_powered_by_include?( 'gunicorn' )
20
+
21
+ headers.keys.each do |header|
22
+ return update_platforms if header.start_with?( 'x-gunicorn')
23
+ end
24
+ end
25
+
26
+ def update_platforms
27
+ platforms << :python << :gunicorn
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -19,7 +19,7 @@ module Platform::Fingerprinters
19
19
  class Jetty < Platform::Fingerprinter
20
20
 
21
21
  def run
22
- platforms << :jsp << :jetty if server_or_powered_by_include? 'jetty'
22
+ platforms << :java << :jetty if server_or_powered_by_include? 'jetty'
23
23
  end
24
24
 
25
25
  end
@@ -9,17 +9,24 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies Tomcat web servers.
14
13
  #
15
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- #
17
15
  # @version 0.1
18
- #
19
16
  class Tomcat < Platform::Fingerprinter
20
17
 
18
+ IDS = %w(coyote tomcat)
19
+
21
20
  def run
22
- platforms << :tomcat << :jsp if server_or_powered_by_include? 'tomcat'
21
+ IDS.each do |id|
22
+ next if !server_or_powered_by_include? id
23
+
24
+ return update_platforms
25
+ end
26
+ end
27
+
28
+ def update_platforms
29
+ platforms << :java << :tomcat
23
30
  end
24
31
 
25
32
  end
@@ -6,24 +6,17 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- #
10
9
  # Extracts paths from anchor elements.
11
10
  #
12
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
12
  #
14
- # @version 0.1.1
15
- #
13
+ # @version 0.2
16
14
  class Arachni::Parser::Extractors::Anchors < Arachni::Parser::Extractors::Base
17
15
 
18
- #
19
- # Returns an array of paths as plain strings
20
- #
21
- # @param [Nokogiri] doc Nokogiri document
22
- #
23
- # @return [Array<String>] paths
24
- #
25
- def run( doc )
26
- doc.search( '//a[@href]' ).map { |a| a['href'] }
16
+ def run
17
+ return [] if !includes?( 'href' )
18
+
19
+ document.search( '//a[@href]' ).map { |a| a['href'] }
27
20
  end
28
21
 
29
22
  end
@@ -6,24 +6,16 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- #
10
9
  # Extracts paths from anchor elements.
11
10
  #
12
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- #
14
- # @version 0.1.1
15
- #
12
+ # @version 0.2
16
13
  class Arachni::Parser::Extractors::Areas < Arachni::Parser::Extractors::Base
17
14
 
18
- #
19
- # Returns an array of paths as plain strings
20
- #
21
- # @param [Nokogiri] doc Nokogiri document
22
- #
23
- # @return [Array<String>] paths
24
- #
25
- def run( doc )
26
- doc.search( '//area[@href]' ).map { |a| a['href'] }
15
+ def run
16
+ return [] if !includes?( 'area' ) || !includes?( 'href' )
17
+
18
+ document.search( '//area[@href]' ).map { |a| a['href'] }
27
19
  end
28
20
 
29
21
  end
@@ -9,11 +9,13 @@
9
9
  # Extract paths from HTML comments.
10
10
  #
11
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
12
- # @version 0.1.1
12
+ # @version 0.2
13
13
  class Arachni::Parser::Extractors::Comments < Arachni::Parser::Extractors::Base
14
14
 
15
- def run( doc )
16
- doc.xpath( '//comment()' ).map do |comment|
15
+ def run
16
+ return [] if !includes?( '<!--' )
17
+
18
+ document.xpath( '//comment()' ).map do |comment|
17
19
  comment.text.scan( /(\/[\/a-zA-Z0-9%._-]+)/ )
18
20
  end.flatten.select { |s| s.include? '/' }
19
21
  end
@@ -0,0 +1,21 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ # Extracts paths from anchor elements.
10
+ #
11
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
12
+ # @version 0.2
13
+ class Arachni::Parser::Extractors::DataURL < Arachni::Parser::Extractors::Base
14
+
15
+ def run
16
+ return [] if !includes?( 'data-url' )
17
+
18
+ document.search( '//a[@data-url]' ).map { |a| a['data-url'] }
19
+ end
20
+
21
+ end
@@ -6,24 +6,16 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- #
10
9
  # Extracts paths from "form" HTML elements.
11
10
  #
12
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- #
14
- # @version 0.1.1
15
- #
12
+ # @version 0.2
16
13
  class Arachni::Parser::Extractors::Forms < Arachni::Parser::Extractors::Base
17
14
 
18
- #
19
- # Returns an array of paths as plain strings
20
- #
21
- # @param [Nokogiri] doc Nokogiri document
22
- #
23
- # @return [Array<String>] paths
24
- #
25
- def run( doc )
26
- doc.search( '//form[@action]' ).map { |a| a['action'] }
15
+ def run
16
+ return [] if !includes?( 'action' )
17
+
18
+ document.search( '//form[@action]' ).map { |a| a['action'] }
27
19
  end
28
20
 
29
21
  end
@@ -6,24 +6,17 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- #
10
9
  # Extracts paths from frames.
11
10
  #
12
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- #
14
- # @version 0.1.1
15
- #
12
+ # @version 0.2
16
13
  class Arachni::Parser::Extractors::Frames < Arachni::Parser::Extractors::Base
17
14
 
18
- #
19
- # Returns an array of paths as plain strings
20
- #
21
- # @param [Nokogiri] doc Nokogiri document
22
- #
23
- # @return [Array<String>] paths
24
- #
25
- def run( doc )
26
- doc.css( 'frame', 'iframe' ).map { |a| a.attributes['src'].content rescue next }
15
+ def run
16
+ return [] if !includes?( 'frame' )
17
+
18
+ document.css( 'frame', 'iframe' ).
19
+ map { |a| a.attributes['src'].content rescue next }
27
20
  end
28
21
 
29
22
  end
@@ -8,7 +8,6 @@
8
8
 
9
9
  require 'uri'
10
10
 
11
- #
12
11
  # Extract URLs from arbitrary text.
13
12
  #
14
13
  # You might think that this renders the rest path extractors redundant
@@ -17,19 +16,11 @@ require 'uri'
17
16
  #
18
17
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
19
18
  #
20
- # @version 0.2.1
21
- #
19
+ # @version 0.3
22
20
  class Arachni::Parser::Extractors::Generic < Arachni::Parser::Extractors::Base
23
21
 
24
- #
25
- # Returns an array of paths as plain strings
26
- #
27
- # @param [Nokogiri] doc Nokogiri document
28
- #
29
- # @return [Array<String>] paths
30
- #
31
- def run( doc )
32
- URI.extract( doc.to_s, %w(http https) ).map do |u|
22
+ def run
23
+ URI.extract( html, %w(http https) ).map do |u|
33
24
  #
34
25
  # This extractor needs to be a tiny bit intelligent because
35
26
  # due to its generic nature it'll inevitably match some garbage.
@@ -6,24 +6,16 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- #
10
9
  # Extracts paths from "link" HTML elements.
11
10
  #
12
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- #
14
- # @version 0.1.1
15
- #
12
+ # @version 0.2
16
13
  class Arachni::Parser::Extractors::Links < Arachni::Parser::Extractors::Base
17
14
 
18
- #
19
- # Returns an array of paths as plain strings
20
- #
21
- # @param [Nokogiri] doc Nokogiri document
22
- #
23
- # @return [Array<String>] paths
24
- #
25
- def run( doc )
26
- doc.search( "//link[@href]" ).map { |a| a['href'] }
15
+ def run
16
+ return [] if !includes?( 'link' )
17
+
18
+ document.search( '//link[@href]' ).map { |a| a['href'] }
27
19
  end
28
20
 
29
21
  end
@@ -6,24 +6,16 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- #
10
9
  # Extracts meta refresh URLs.
11
10
  #
12
11
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- #
14
- # @version 0.1.2
15
- #
12
+ # @version 0.2
16
13
  class Arachni::Parser::Extractors::MetaRefresh < Arachni::Parser::Extractors::Base
17
14
 
18
- #
19
- # Returns an array of paths as plain strings
20
- #
21
- # @param [Nokogiri] doc Nokogiri document
22
- #
23
- # @return [Array<String>] paths
24
- #
25
- def run( doc )
26
- doc.search( "//meta[
15
+ def run
16
+ return [] if !includes?( 'http-equiv' )
17
+
18
+ document.search( "//meta[
27
19
  translate(
28
20
  @http-equiv,
29
21
  'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
@@ -6,24 +6,18 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- # Extracts paths from "script" HTML elements.<br/>
10
- # Both from "src" and the text inside the scripts.
9
+ # Extracts paths from `script` HTML elements.
10
+ # Both from `src` and the text inside the scripts.
11
11
  #
12
12
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- #
14
- # @version 0.1.2
13
+ # @version 0.2
15
14
  class Arachni::Parser::Extractors::Scripts < Arachni::Parser::Extractors::Base
16
15
 
17
- #
18
- # Returns an array of paths as plain strings
19
- #
20
- # @param [Nokogiri] doc Nokogiri document
21
- #
22
- # @return [Array<String>] paths
23
- #
24
- def run( doc )
25
- doc.search( '//script[@src]' ).map { |a| a['src'] } |
26
- doc.xpath( '//script' ).map(&:text).join.
16
+ def run
17
+ return [] if !includes?( 'script' )
18
+
19
+ document.search( '//script[@src]' ).map { |a| a['src'] } |
20
+ document.xpath( '//script' ).map(&:text).join.
27
21
  scan( /[\/a-zA-Z0-9%._-]+/ ).
28
22
  select { |s| s.include?( '.' ) && s.include?( '/' ) }
29
23
  end
@@ -13,14 +13,15 @@
13
13
  # framework-wide cookies.
14
14
  #
15
15
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- #
17
- # @version 0.2
16
+ # @version 0.2.1
18
17
  class Arachni::Plugins::AutoLogin < Arachni::Plugin::Base
19
18
 
20
19
  STATUSES = {
21
- ok: 'Form submitted successfully.',
22
- form_not_found: 'Could not find a form suiting the provided parameters.',
23
- check_failed: 'Form submitted but the response did not match the verifier.'
20
+ ok: 'Form submitted successfully.',
21
+ form_not_found: 'Could not find a form suiting the provided parameters.',
22
+ form_not_visible: 'The form was located but its DOM element is not ' <<
23
+ 'visible and thus cannot be submitted.',
24
+ check_failed: 'Form submitted but the response did not match the verifier.'
24
25
  }
25
26
 
26
27
  def prepare
@@ -46,6 +47,14 @@ class Arachni::Plugins::AutoLogin < Arachni::Plugin::Base
46
47
  print_error STATUSES[:form_not_found]
47
48
  @errored = true
48
49
  return
50
+ rescue Arachni::Session::Error::FormNotVisible
51
+ register_results(
52
+ 'status' => 'form_not_visible',
53
+ 'message' => STATUSES[:form_not_visible]
54
+ )
55
+ print_error STATUSES[:form_not_visible]
56
+ @errored = true
57
+ return
49
58
  end
50
59
 
51
60
  framework.options.session.check_url ||= response.url
@@ -93,6 +102,9 @@ class Arachni::Plugins::AutoLogin < Arachni::Plugin::Base
93
102
  It looks for the login form in the user provided URL, merges its input fields
94
103
  with the user supplied parameters and sets the cookies of the response and
95
104
  request as framework-wide cookies.
105
+
106
+ **NOTICE**: If the login form is by default hidden and requires a sequence of DOM
107
+ interactions in order to become visible, this plugin will not be able to submit it.
96
108
  },
97
109
  author: 'Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>',
98
110
  version: '0.2',
@@ -6,32 +6,19 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- # Catches custom 404 or similar server behavior that can confuse discovery
10
- # checks.
9
+ # Catches custom-404s that somehow slipped past the {HTTP::Client::Dynamic404Handler}
10
+ # (or similar server behavior) that can confuse discovery checks.
11
11
  #
12
12
  # This is relatively easy to determine since valid responses to discovery checks
13
- # should vary wildly while custom 404 responses will have many commonalities
13
+ # should vary wildly, while custom-404 responses will have many commonalities
14
14
  # every time.
15
15
  #
16
16
  # This is a sort of baseline implementation/anomaly detection.
17
17
  #
18
18
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
19
- #
20
- # @version 0.3
19
+ # @version 0.3.1
21
20
  class Arachni::Plugins::Discovery < Arachni::Plugin::Base
22
21
 
23
- # Valid responses to discovery checks should vary *wildly* especially
24
- # considering the types of directories and files that these checks look for.
25
- #
26
- # On the other hand custom 404 or such responses will have many things in
27
- # common which makes it possible to spot them without much bother.
28
- SIMILARITY_TOLERANCE = 0.25
29
-
30
- REMARK = 'This issue was logged by a discovery check but ' +
31
- 'the response for the resource it identified is very similar to responses ' +
32
- 'for other resources of similar type. This is a strong indication that ' +
33
- 'the logged issue is a false positive.'
34
-
35
22
  def run
36
23
  wait_while_framework_running
37
24
 
@@ -50,6 +37,9 @@ class Arachni::Plugins::Discovery < Arachni::Plugin::Base
50
37
  next if !issue.tags.includes_tags?( :discovery )
51
38
 
52
39
  issue.variations.each do |variation|
40
+ # Skip it if already flagged as untrusted.
41
+ next if variation.untrusted?
42
+
53
43
  processed_issues += 1
54
44
 
55
45
  # We'll do this per path since 404 handlers and such operate per
@@ -87,17 +77,9 @@ class Arachni::Plugins::Discovery < Arachni::Plugin::Base
87
77
  similarity = Float( diff.size * issue_digests_per_path[path].size ) /
88
78
  response_size_per_path[path]
89
79
 
90
- next if similarity < SIMILARITY_TOLERANCE
91
-
92
- # Gotcha!
93
- issue_digests_per_path[path].each do |digest|
94
- Data.issues[digest].variations.each do |issue|
95
- issue.add_remark :meta_analysis, REMARK
96
-
97
- # Requires manual verification.
98
- issue.trusted = false
99
- end
100
- end
80
+ Arachni::Element::Server.flag_issues_if_untrusted(
81
+ similarity, issue_digests_per_path[path]
82
+ )
101
83
  end
102
84
  end
103
85
 
@@ -112,7 +94,7 @@ while the server responses were exhibiting an anomalous factor of similarity.
112
94
  There's a good chance that these issues are false positives.
113
95
  },
114
96
  author: 'Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>',
115
- version: '0.3',
97
+ version: '0.3.1',
116
98
  tags: %w(anomaly discovery file directories meta)
117
99
  }
118
100
  end