arachni 1.1 → 1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -33,7 +33,11 @@ class Arachni::Checks::Xst < Arachni::Check::Base
33
33
  http.trace( page.url ) do |response|
34
34
  next if response.code != 200 || response.body.to_s.empty?
35
35
 
36
- log vector: Element::Server.new( response.url ), response: response
36
+ log(
37
+ vector: Element::Server.new( response.url ),
38
+ response: response,
39
+ proof: response.status_line
40
+ )
37
41
  print_ok 'TRACE is enabled.'
38
42
  end
39
43
  end
@@ -48,7 +52,7 @@ class Arachni::Checks::Xst < Arachni::Check::Base
48
52
  description: %q{Sends an HTTP TRACE request and checks if it succeeded.},
49
53
  elements: [ Element::Server ],
50
54
  author: 'Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>',
51
- version: '0.1.6',
55
+ version: '0.1.7',
52
56
 
53
57
  issue: {
54
58
  name: %q{HTTP TRACE},
@@ -0,0 +1,43 @@
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 ASP.NET MVC resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ # @version 0.1
16
+ class ASPXMVC < Platform::Fingerprinter
17
+
18
+ ANTI_CSRF_NONCE = '__requestverificationtoken'
19
+ HEADER_FIELDS = %w(x-aspnetmvc-version)
20
+
21
+ def run
22
+ # Naive but enough, I think.
23
+ if html? && page.body =~ /input.*#{ANTI_CSRF_NONCE}/i
24
+ return update_platforms
25
+ end
26
+
27
+ if (headers.keys & HEADER_FIELDS).any?
28
+ return update_platforms
29
+ end
30
+
31
+ if cookies.include?( ANTI_CSRF_NONCE )
32
+ update_platforms
33
+ end
34
+ end
35
+
36
+ def update_platforms
37
+ platforms << :asp << :aspx << :windows << :aspx_mvc
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,28 @@
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 CakePHP resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ #
16
+ # @version 0.1
17
+ class CakePHP < Platform::Fingerprinter
18
+
19
+ def run
20
+ if cookies.include?( 'cakephp' )
21
+ platforms << :php << :cakephp
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,31 @@
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 CherryPy resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ # @version 0.1
16
+ class CherryPy < Platform::Fingerprinter
17
+
18
+ def run
19
+ return if !server_or_powered_by_include?( 'cherrypy' )
20
+
21
+ update_platforms
22
+ end
23
+
24
+ def update_platforms
25
+ platforms << :python << :cherrypy
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
@@ -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 Django resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ # @version 0.1
16
+ class Django < Platform::Fingerprinter
17
+
18
+ def run
19
+ return update_platforms if server_or_powered_by_include?( 'django' )
20
+
21
+ headers.keys.each do |header|
22
+ return update_platforms if header.start_with?( 'x-django')
23
+ end
24
+ end
25
+
26
+ def update_platforms
27
+ platforms << :python << :django
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,30 @@
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 JSF resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ #
16
+ # @version 0.1
17
+ class JSF < Platform::Fingerprinter
18
+
19
+ def run
20
+ if server_or_powered_by_include?( 'jsf' ) ||
21
+ parameters.include?( 'javax.faces.token')
22
+
23
+ platforms << :java << :jsf
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
@@ -9,21 +9,19 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies Rack applications.
14
13
  #
15
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- #
17
- # @version 0.1
18
- #
15
+ # @version 0.1.2
19
16
  class Rack < Platform::Fingerprinter
20
17
 
21
18
  SESSIONID = 'rack.session'
22
- ID = 'mod_rack'
23
19
 
24
20
  def run
25
- return if !cookies.include?( SESSIONID ) &&
26
- !server_or_powered_by_include?( ID )
21
+ return if !powered_by.include?( 'mod_rack' ) &&
22
+ !headers.keys.find { |h| h.include? 'x-rack' } &&
23
+ !cookies.include?( SESSIONID )
24
+
27
25
  platforms << :ruby << :rack
28
26
  end
29
27
 
@@ -0,0 +1,43 @@
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 Rails resources.
13
+ #
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ # @version 0.1.1
16
+ class Rails < Platform::Fingerprinter
17
+
18
+ IDs = %w(rails)
19
+
20
+ def run
21
+ headers.keys.each do |header|
22
+ return update_platforms if header.start_with?( 'x-rails' )
23
+ end
24
+
25
+ IDs.each do |id|
26
+ next if !server_or_powered_by_include? id
27
+
28
+ return update_platforms
29
+ end
30
+
31
+ if cookies.include?( '_rails_admin_session' )
32
+ update_platforms
33
+ end
34
+ end
35
+
36
+ def update_platforms
37
+ platforms << :ruby << :rack << :rails
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
@@ -9,38 +9,38 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies ASPX resources.
14
13
  #
15
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- #
17
- # @version 0.1
18
- #
15
+ # @version 0.1.1
19
16
  class ASPX < Platform::Fingerprinter
20
17
 
21
18
  EXTENSION = 'aspx'
22
19
  SESSION_COOKIE = 'asp.net_sessionid'
23
20
  X_POWERED_BY = 'asp.net'
24
- VIEWSTATE = 'viewstate'
21
+ VIEWSTATE = '__viewstate'
25
22
  HEADER_FIELDS = %w(x-aspnet-version x-aspnetmvc-version)
26
23
 
27
24
  def run
28
25
  if extension == EXTENSION ||
29
26
  # Session ID in URL, like:
30
27
  # http://blah.com/(S(yn5cby55lgzstcen0ng2b4iq))/stuff.aspx
31
- uri.path =~ /\/\(s\([a-z0-9]+\)\)\//i ||
32
- cookies.include?( SESSION_COOKIE )
28
+ uri.path =~ /\/\(s\([a-z0-9]+\)\)\//i
29
+
33
30
  return update_platforms
34
31
  end
35
32
 
36
- page.forms.each do |form|
37
- form.inputs.each do |k, v|
38
- return update_platforms if k.downcase.include? VIEWSTATE
39
- end
33
+ # Naive but enough, I think.
34
+ if html? && page.body =~ /input.*#{VIEWSTATE}/i
35
+ return update_platforms
40
36
  end
41
37
 
42
38
  if server_or_powered_by_include?( X_POWERED_BY ) ||
43
39
  (headers.keys & HEADER_FIELDS).any?
40
+ return update_platforms
41
+ end
42
+
43
+ if cookies.include?( SESSION_COOKIE )
44
44
  update_platforms
45
45
  end
46
46
  end
@@ -9,22 +9,26 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- # Identifies JSP resources.
12
+ # Identifies Java resources.
13
13
  #
14
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
- #
16
- # @version 0.1.1
17
- class JSP < Platform::Fingerprinter
15
+ # @version 0.1.3
16
+ class Java < Platform::Fingerprinter
18
17
 
19
18
  EXTENSION = 'jsp'
20
19
  SESSIONID = 'jsessionid'
21
20
 
22
21
  def run
23
22
  if extension == EXTENSION || parameters.include?( SESSIONID ) ||
24
- cookies.include?( SESSIONID ) ||
23
+ server_or_powered_by_include?( 'java' ) ||
25
24
  server_or_powered_by_include?( 'servlet' ) ||
26
- server_or_powered_by_include?( 'jsp' )
27
- platforms << :jsp << :tomcat
25
+ server_or_powered_by_include?( 'jsp' ) ||
26
+ server_or_powered_by_include?( 'jboss' ) ||
27
+ server_or_powered_by_include?( 'glassfish' ) ||
28
+ server_or_powered_by_include?( 'oracle' ) ||
29
+ cookies.include?( SESSIONID )
30
+
31
+ platforms << :java
28
32
  end
29
33
  end
30
34
 
@@ -9,13 +9,10 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies PHP resources.
14
13
  #
15
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- #
17
- # @version 0.1
18
- #
15
+ # @version 0.1.1
19
16
  class PHP < Platform::Fingerprinter
20
17
 
21
18
  EXTENSION = /php\d*/ # In case it's php5 or something.
@@ -23,8 +20,11 @@ class PHP < Platform::Fingerprinter
23
20
 
24
21
  def run
25
22
  if uri.path =~ /.php\d*\/*/ || extension =~ EXTENSION ||
26
- parameters.include?( SESSIONID ) || cookies.include?( SESSIONID ) ||
27
- server_or_powered_by_include?( 'php' )
23
+ parameters.include?( SESSIONID ) ||
24
+ server_or_powered_by_include?( 'php' ) ||
25
+ headers.include?( 'x-php-pid' ) ||
26
+ cookies.include?( SESSIONID )
27
+
28
28
  platforms << :php
29
29
  end
30
30
  end
@@ -9,21 +9,29 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies Python resources.
14
13
  #
15
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- #
17
- # @version 0.1
18
- #
15
+ # @version 0.1.2
19
16
  class Python < Platform::Fingerprinter
20
17
 
18
+ IDS = %w(python zope zserver wsgi plone)
21
19
  EXTENSION = 'py'
22
20
 
23
21
  def run
24
- if extension == EXTENSION || powered_by.include?( 'python' )
25
- platforms << :python
22
+ return update_platforms if extension == EXTENSION
23
+
24
+ IDS.each do |id|
25
+ return update_platforms if server_or_powered_by_include?( id )
26
26
  end
27
+
28
+ if cookies.include?( '_ZopeId' )
29
+ update_platforms
30
+ end
31
+ end
32
+
33
+ def update_platforms
34
+ platforms << :python
27
35
  end
28
36
 
29
37
  end
@@ -9,21 +9,19 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies Ruby resources.
14
13
  #
15
14
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
15
  #
17
16
  # @version 0.1
18
- #
19
17
  class Ruby < Platform::Fingerprinter
20
18
 
21
- IDs = %w(mod_rails mod_rack phusion passenger)
19
+ IDs = %w(mod_rack phusion passenger)
22
20
 
23
21
  def run
24
22
  IDs.each do |id|
25
- next if !server_or_powered_by_include? id
26
- return platforms << :ruby
23
+ next if !powered_by.include? id
24
+ return platforms << :ruby << :rack
27
25
  end
28
26
  end
29
27
 
@@ -9,17 +9,18 @@
9
9
  module Arachni
10
10
  module Platform::Fingerprinters
11
11
 
12
- #
13
12
  # Identifies Apache 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 Apache < Platform::Fingerprinter
20
17
 
21
18
  def run
22
- platforms << :apache if server_or_powered_by_include? 'apache'
19
+ if server_or_powered_by_include?( 'apache' ) &&
20
+ !server_or_powered_by_include?( 'coyote' )
21
+
22
+ platforms << :apache
23
+ end
23
24
  end
24
25
 
25
26
  end