arachni 0.2.2.1

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 (262) hide show
  1. data/ACKNOWLEDGMENTS.md +14 -0
  2. data/AUTHORS.md +6 -0
  3. data/CHANGELOG.md +162 -0
  4. data/CONTRIBUTORS.md +10 -0
  5. data/EXPLOITATION.md +429 -0
  6. data/HACKING.md +101 -0
  7. data/LICENSE.md +341 -0
  8. data/README.md +350 -0
  9. data/Rakefile +86 -0
  10. data/bin/arachni +22 -0
  11. data/bin/arachni_web +77 -0
  12. data/bin/arachni_xmlrpc +21 -0
  13. data/bin/arachni_xmlrpcd +82 -0
  14. data/bin/arachni_xmlrpcd_monitor +74 -0
  15. data/conf/README.webui.yaml.txt +44 -0
  16. data/conf/webui.yaml +11 -0
  17. data/external/metasploit/LICENSE +24 -0
  18. data/external/metasploit/modules/exploits/unix/webapp/arachni_exec.rb +142 -0
  19. data/external/metasploit/modules/exploits/unix/webapp/arachni_path_traversal.rb +113 -0
  20. data/external/metasploit/modules/exploits/unix/webapp/arachni_php_eval.rb +150 -0
  21. data/external/metasploit/modules/exploits/unix/webapp/arachni_php_include.rb +141 -0
  22. data/external/metasploit/modules/exploits/unix/webapp/arachni_sqlmap.rb +92 -0
  23. data/external/metasploit/plugins/arachni.rb +536 -0
  24. data/getoptslong.rb +241 -0
  25. data/lib/anemone.rb +2 -0
  26. data/lib/anemone/cookie_store.rb +35 -0
  27. data/lib/anemone/core.rb +371 -0
  28. data/lib/anemone/exceptions.rb +5 -0
  29. data/lib/anemone/http.rb +144 -0
  30. data/lib/anemone/page.rb +337 -0
  31. data/lib/anemone/page_store.rb +160 -0
  32. data/lib/anemone/storage.rb +34 -0
  33. data/lib/anemone/storage/base.rb +75 -0
  34. data/lib/anemone/storage/exceptions.rb +15 -0
  35. data/lib/anemone/storage/mongodb.rb +89 -0
  36. data/lib/anemone/storage/pstore.rb +50 -0
  37. data/lib/anemone/storage/redis.rb +90 -0
  38. data/lib/anemone/storage/tokyo_cabinet.rb +57 -0
  39. data/lib/anemone/tentacle.rb +40 -0
  40. data/lib/arachni.rb +16 -0
  41. data/lib/audit_store.rb +346 -0
  42. data/lib/component_manager.rb +293 -0
  43. data/lib/component_options.rb +395 -0
  44. data/lib/exceptions.rb +76 -0
  45. data/lib/framework.rb +637 -0
  46. data/lib/http.rb +809 -0
  47. data/lib/issue.rb +302 -0
  48. data/lib/module.rb +4 -0
  49. data/lib/module/auditor.rb +455 -0
  50. data/lib/module/base.rb +188 -0
  51. data/lib/module/element_db.rb +158 -0
  52. data/lib/module/key_filler.rb +87 -0
  53. data/lib/module/manager.rb +87 -0
  54. data/lib/module/output.rb +68 -0
  55. data/lib/module/trainer.rb +240 -0
  56. data/lib/module/utilities.rb +110 -0
  57. data/lib/options.rb +547 -0
  58. data/lib/parser.rb +2 -0
  59. data/lib/parser/auditable.rb +522 -0
  60. data/lib/parser/elements.rb +296 -0
  61. data/lib/parser/page.rb +149 -0
  62. data/lib/parser/parser.rb +717 -0
  63. data/lib/plugin.rb +4 -0
  64. data/lib/plugin/base.rb +110 -0
  65. data/lib/plugin/manager.rb +162 -0
  66. data/lib/report.rb +4 -0
  67. data/lib/report/base.rb +119 -0
  68. data/lib/report/manager.rb +92 -0
  69. data/lib/rpc/xml/client/base.rb +71 -0
  70. data/lib/rpc/xml/client/dispatcher.rb +49 -0
  71. data/lib/rpc/xml/client/instance.rb +88 -0
  72. data/lib/rpc/xml/server/base.rb +90 -0
  73. data/lib/rpc/xml/server/dispatcher.rb +357 -0
  74. data/lib/rpc/xml/server/framework.rb +206 -0
  75. data/lib/rpc/xml/server/instance.rb +191 -0
  76. data/lib/rpc/xml/server/module/manager.rb +46 -0
  77. data/lib/rpc/xml/server/options.rb +124 -0
  78. data/lib/rpc/xml/server/output.rb +299 -0
  79. data/lib/rpc/xml/server/plugin/manager.rb +58 -0
  80. data/lib/ruby.rb +5 -0
  81. data/lib/ruby/object.rb +32 -0
  82. data/lib/ruby/string.rb +74 -0
  83. data/lib/ruby/xmlrpc/server.rb +27 -0
  84. data/lib/spider.rb +200 -0
  85. data/lib/typhoeus/request.rb +91 -0
  86. data/lib/typhoeus/response.rb +34 -0
  87. data/lib/ui/cli/cli.rb +744 -0
  88. data/lib/ui/cli/output.rb +279 -0
  89. data/lib/ui/web/log.rb +82 -0
  90. data/lib/ui/web/output_stream.rb +94 -0
  91. data/lib/ui/web/report_manager.rb +222 -0
  92. data/lib/ui/web/server.rb +903 -0
  93. data/lib/ui/web/server/db/placeholder +0 -0
  94. data/lib/ui/web/server/public/banner.png +0 -0
  95. data/lib/ui/web/server/public/bodybg-small.png +0 -0
  96. data/lib/ui/web/server/public/bodybg.png +0 -0
  97. data/lib/ui/web/server/public/css/smoothness/images/pbar-ani.gif +0 -0
  98. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  99. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  100. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  101. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  102. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  103. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  104. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  105. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  106. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  107. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  108. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  109. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  110. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  111. data/lib/ui/web/server/public/css/smoothness/jquery-ui-1.8.9.custom.css +573 -0
  112. data/lib/ui/web/server/public/favicon.ico +0 -0
  113. data/lib/ui/web/server/public/footer.jpg +0 -0
  114. data/lib/ui/web/server/public/icons/error.png +0 -0
  115. data/lib/ui/web/server/public/icons/info.png +0 -0
  116. data/lib/ui/web/server/public/icons/ok.png +0 -0
  117. data/lib/ui/web/server/public/icons/status.png +0 -0
  118. data/lib/ui/web/server/public/js/jquery-1.4.4.min.js +167 -0
  119. data/lib/ui/web/server/public/js/jquery-ui-1.8.9.custom.min.js +781 -0
  120. data/lib/ui/web/server/public/logo.png +0 -0
  121. data/lib/ui/web/server/public/nav-left.jpg +0 -0
  122. data/lib/ui/web/server/public/nav-right.jpg +0 -0
  123. data/lib/ui/web/server/public/nav-selected-left.jpg +0 -0
  124. data/lib/ui/web/server/public/nav-selected-right.jpg +0 -0
  125. data/lib/ui/web/server/public/reports/placeholder +1 -0
  126. data/lib/ui/web/server/public/sidebar-bottom.jpg +0 -0
  127. data/lib/ui/web/server/public/sidebar-h4.jpg +0 -0
  128. data/lib/ui/web/server/public/sidebar-top.jpg +0 -0
  129. data/lib/ui/web/server/public/spider.png +0 -0
  130. data/lib/ui/web/server/public/style.css +604 -0
  131. data/lib/ui/web/server/tmp/placeholder +0 -0
  132. data/lib/ui/web/server/views/dispatcher.erb +85 -0
  133. data/lib/ui/web/server/views/dispatcher_error.erb +14 -0
  134. data/lib/ui/web/server/views/error.erb +1 -0
  135. data/lib/ui/web/server/views/flash.erb +18 -0
  136. data/lib/ui/web/server/views/home.erb +14 -0
  137. data/lib/ui/web/server/views/instance.erb +213 -0
  138. data/lib/ui/web/server/views/layout.erb +95 -0
  139. data/lib/ui/web/server/views/log.erb +40 -0
  140. data/lib/ui/web/server/views/modules.erb +71 -0
  141. data/lib/ui/web/server/views/options.erb +23 -0
  142. data/lib/ui/web/server/views/output_results.erb +51 -0
  143. data/lib/ui/web/server/views/plugins.erb +42 -0
  144. data/lib/ui/web/server/views/report_formats.erb +30 -0
  145. data/lib/ui/web/server/views/reports.erb +55 -0
  146. data/lib/ui/web/server/views/settings.erb +120 -0
  147. data/lib/ui/web/server/views/welcome.erb +38 -0
  148. data/lib/ui/xmlrpc/dispatcher_monitor.rb +204 -0
  149. data/lib/ui/xmlrpc/xmlrpc.rb +843 -0
  150. data/logs/placeholder +0 -0
  151. data/metamodules/autothrottle.rb +74 -0
  152. data/metamodules/timeout_notice.rb +118 -0
  153. data/metamodules/uniformity.rb +98 -0
  154. data/modules/audit/code_injection.rb +136 -0
  155. data/modules/audit/code_injection_timing.rb +115 -0
  156. data/modules/audit/code_injection_timing/payloads.txt +4 -0
  157. data/modules/audit/csrf.rb +301 -0
  158. data/modules/audit/ldapi.rb +103 -0
  159. data/modules/audit/ldapi/errors.txt +26 -0
  160. data/modules/audit/os_cmd_injection.rb +103 -0
  161. data/modules/audit/os_cmd_injection/payloads.txt +2 -0
  162. data/modules/audit/os_cmd_injection_timing.rb +104 -0
  163. data/modules/audit/os_cmd_injection_timing/payloads.txt +3 -0
  164. data/modules/audit/path_traversal.rb +141 -0
  165. data/modules/audit/response_splitting.rb +105 -0
  166. data/modules/audit/rfi.rb +193 -0
  167. data/modules/audit/sqli.rb +120 -0
  168. data/modules/audit/sqli/regexp_ids.txt +90 -0
  169. data/modules/audit/sqli_blind_rdiff.rb +321 -0
  170. data/modules/audit/sqli_blind_timing.rb +103 -0
  171. data/modules/audit/sqli_blind_timing/payloads.txt +51 -0
  172. data/modules/audit/trainer.rb +89 -0
  173. data/modules/audit/unvalidated_redirect.rb +90 -0
  174. data/modules/audit/xpath.rb +104 -0
  175. data/modules/audit/xpath/errors.txt +26 -0
  176. data/modules/audit/xss.rb +99 -0
  177. data/modules/audit/xss_event.rb +134 -0
  178. data/modules/audit/xss_path.rb +125 -0
  179. data/modules/audit/xss_script_tag.rb +112 -0
  180. data/modules/audit/xss_tag.rb +112 -0
  181. data/modules/audit/xss_uri.rb +125 -0
  182. data/modules/recon/allowed_methods.rb +104 -0
  183. data/modules/recon/backdoors.rb +131 -0
  184. data/modules/recon/backdoors/filenames.txt +16 -0
  185. data/modules/recon/backup_files.rb +177 -0
  186. data/modules/recon/backup_files/extensions.txt +28 -0
  187. data/modules/recon/common_directories.rb +138 -0
  188. data/modules/recon/common_directories/directories.txt +265 -0
  189. data/modules/recon/common_files.rb +138 -0
  190. data/modules/recon/common_files/filenames.txt +17 -0
  191. data/modules/recon/directory_listing.rb +171 -0
  192. data/modules/recon/grep/captcha.rb +62 -0
  193. data/modules/recon/grep/credit_card.rb +85 -0
  194. data/modules/recon/grep/cvs_svn_users.rb +73 -0
  195. data/modules/recon/grep/emails.rb +59 -0
  196. data/modules/recon/grep/html_objects.rb +53 -0
  197. data/modules/recon/grep/private_ip.rb +54 -0
  198. data/modules/recon/grep/ssn.rb +53 -0
  199. data/modules/recon/htaccess_limit.rb +82 -0
  200. data/modules/recon/http_put.rb +95 -0
  201. data/modules/recon/interesting_responses.rb +118 -0
  202. data/modules/recon/unencrypted_password_forms.rb +119 -0
  203. data/modules/recon/webdav.rb +126 -0
  204. data/modules/recon/xst.rb +107 -0
  205. data/path_extractors/anchors.rb +35 -0
  206. data/path_extractors/forms.rb +35 -0
  207. data/path_extractors/frames.rb +38 -0
  208. data/path_extractors/generic.rb +39 -0
  209. data/path_extractors/links.rb +35 -0
  210. data/path_extractors/meta_refresh.rb +39 -0
  211. data/path_extractors/scripts.rb +37 -0
  212. data/path_extractors/sitemap.rb +31 -0
  213. data/plugins/autologin.rb +137 -0
  214. data/plugins/content_types.rb +90 -0
  215. data/plugins/cookie_collector.rb +99 -0
  216. data/plugins/form_dicattack.rb +185 -0
  217. data/plugins/healthmap.rb +94 -0
  218. data/plugins/http_dicattack.rb +133 -0
  219. data/plugins/metamodules.rb +118 -0
  220. data/plugins/proxy.rb +248 -0
  221. data/plugins/proxy/server.rb +66 -0
  222. data/plugins/waf_detector.rb +184 -0
  223. data/profiles/comprehensive.afp +74 -0
  224. data/profiles/full.afp +75 -0
  225. data/reports/afr.rb +59 -0
  226. data/reports/ap.rb +55 -0
  227. data/reports/html.rb +179 -0
  228. data/reports/html/default.erb +967 -0
  229. data/reports/metareport.rb +139 -0
  230. data/reports/metareport/arachni_metareport.rb +174 -0
  231. data/reports/plugin_formatters/html/content_types.rb +82 -0
  232. data/reports/plugin_formatters/html/cookie_collector.rb +66 -0
  233. data/reports/plugin_formatters/html/form_dicattack.rb +54 -0
  234. data/reports/plugin_formatters/html/healthmap.rb +76 -0
  235. data/reports/plugin_formatters/html/http_dicattack.rb +54 -0
  236. data/reports/plugin_formatters/html/metaformatters/timeout_notice.rb +65 -0
  237. data/reports/plugin_formatters/html/metaformatters/uniformity.rb +71 -0
  238. data/reports/plugin_formatters/html/metamodules.rb +93 -0
  239. data/reports/plugin_formatters/html/waf_detector.rb +54 -0
  240. data/reports/plugin_formatters/stdout/content_types.rb +73 -0
  241. data/reports/plugin_formatters/stdout/cookie_collector.rb +61 -0
  242. data/reports/plugin_formatters/stdout/form_dicattack.rb +52 -0
  243. data/reports/plugin_formatters/stdout/healthmap.rb +72 -0
  244. data/reports/plugin_formatters/stdout/http_dicattack.rb +53 -0
  245. data/reports/plugin_formatters/stdout/metaformatters/timeout_notice.rb +55 -0
  246. data/reports/plugin_formatters/stdout/metaformatters/uniformity.rb +68 -0
  247. data/reports/plugin_formatters/stdout/metamodules.rb +89 -0
  248. data/reports/plugin_formatters/stdout/waf_detector.rb +48 -0
  249. data/reports/plugin_formatters/xml/content_types.rb +91 -0
  250. data/reports/plugin_formatters/xml/cookie_collector.rb +70 -0
  251. data/reports/plugin_formatters/xml/form_dicattack.rb +57 -0
  252. data/reports/plugin_formatters/xml/healthmap.rb +82 -0
  253. data/reports/plugin_formatters/xml/http_dicattack.rb +57 -0
  254. data/reports/plugin_formatters/xml/metaformatters/timeout_notice.rb +67 -0
  255. data/reports/plugin_formatters/xml/metaformatters/uniformity.rb +82 -0
  256. data/reports/plugin_formatters/xml/metamodules.rb +91 -0
  257. data/reports/plugin_formatters/xml/waf_detector.rb +58 -0
  258. data/reports/stdout.rb +182 -0
  259. data/reports/txt.rb +77 -0
  260. data/reports/xml.rb +231 -0
  261. data/reports/xml/buffer.rb +98 -0
  262. metadata +516 -0
@@ -0,0 +1,35 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extracts paths from anchor elements.
15
+ #
16
+ # @author: Tasos "Zapotek" Laskos
17
+ # <tasos.laskos@gmail.com>
18
+ # <zapotek@segfault.gr>
19
+ # @version: 0.1
20
+ #
21
+ class Anchors < Paths
22
+
23
+ #
24
+ # Returns an array of paths as plain strings
25
+ #
26
+ # @param [Nokogiri] Nokogiri document
27
+ #
28
+ # @return [Array<String>] paths
29
+ #
30
+ def run( doc )
31
+ doc.search( "//a[@href]" ).map { |a| a['href'] }
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extracts paths from "form" HTML elements.
15
+ #
16
+ # @author: Tasos "Zapotek" Laskos
17
+ # <tasos.laskos@gmail.com>
18
+ # <zapotek@segfault.gr>
19
+ # @version: 0.1
20
+ #
21
+ class Forms < Paths
22
+
23
+ #
24
+ # Returns an array of paths as plain strings
25
+ #
26
+ # @param [Nokogiri] Nokogiri document
27
+ #
28
+ # @return [Array<String>] paths
29
+ #
30
+ def run( doc )
31
+ doc.search( "//form[@action]" ).map { |a| a['action'] }
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extracts paths from frames.
15
+ #
16
+ # @author: Tasos "Zapotek" Laskos
17
+ # <tasos.laskos@gmail.com>
18
+ # <zapotek@segfault.gr>
19
+ # @version: 0.1
20
+ #
21
+ class Frames < Paths
22
+
23
+ #
24
+ # Returns an array of paths as plain strings
25
+ #
26
+ # @param [Nokogiri] Nokogiri document
27
+ #
28
+ # @return [Array<String>] paths
29
+ #
30
+ def run( doc )
31
+ doc.css( 'frame', 'iframe' ).map {
32
+ |a|
33
+ a.attributes['src'].content rescue next
34
+ }
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extract URLs from arbitrary text.
15
+ #
16
+ # You might think that this renders the rest path extractors redundant
17
+ # but the others can extract paths from HTML attributes, this one can only extract
18
+ # full URLs.
19
+ #
20
+ # @author: Tasos "Zapotek" Laskos
21
+ # <tasos.laskos@gmail.com>
22
+ # <zapotek@segfault.gr>
23
+ # @version: 0.1
24
+ #
25
+ class Generic < Paths
26
+
27
+ #
28
+ # Returns an array of paths as plain strings
29
+ #
30
+ # @param [Nokogiri] Nokogiri document
31
+ #
32
+ # @return [Array<String>] paths
33
+ #
34
+ def run( doc )
35
+ URI.extract( doc.to_s )
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extracts paths from "link" HTML elements.
15
+ #
16
+ # @author: Tasos "Zapotek" Laskos
17
+ # <tasos.laskos@gmail.com>
18
+ # <zapotek@segfault.gr>
19
+ # @version: 0.1
20
+ #
21
+ class Links < Paths
22
+
23
+ #
24
+ # Returns an array of paths as plain strings
25
+ #
26
+ # @param [Nokogiri] Nokogiri document
27
+ #
28
+ # @return [Array<String>] paths
29
+ #
30
+ def run( doc )
31
+ doc.search( "//link[@href]" ).map { |a| a['href'] }
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extracts meta refresh URLs.
15
+ #
16
+ # @author: Tasos "Zapotek" Laskos
17
+ # <tasos.laskos@gmail.com>
18
+ # <zapotek@segfault.gr>
19
+ # @version: 0.1
20
+ #
21
+ class MetaRefresh < Paths
22
+
23
+ #
24
+ # Returns an array of paths as plain strings
25
+ #
26
+ # @param [Nokogiri] Nokogiri document
27
+ #
28
+ # @return [Array<String>] paths
29
+ #
30
+ def run( doc )
31
+ begin
32
+ doc.search( "//meta[@http-equiv='refresh']" ).
33
+ map { |url| url['content'].split( ';' )[1].split( '=' )[1] }
34
+ rescue
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # Extracts paths from "script" HTML elements.<br/>
15
+ # Both from "src" and the text inside the scripts.
16
+ #
17
+ # @author: Tasos "Zapotek" Laskos
18
+ # <tasos.laskos@gmail.com>
19
+ # <zapotek@segfault.gr>
20
+ # @version: 0.1
21
+ #
22
+ class Scripts < Paths
23
+
24
+ #
25
+ # Returns an array of paths as plain strings
26
+ #
27
+ # @param [Nokogiri] Nokogiri document
28
+ #
29
+ # @return [Array<String>] paths
30
+ #
31
+ def run( doc )
32
+ doc.search( "//script[@src]" ).map { |a| a['src'] } |
33
+ doc.search( "//script" ).map { |script| URI.extract( script.to_s ) }
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Anemone::Extractors
12
+
13
+ #
14
+ # @author: Tasos "Zapotek" Laskos
15
+ # <tasos.laskos@gmail.com>
16
+ # <zapotek@segfault.gr>
17
+ # @version: 0.1
18
+ #
19
+ class Sitemap < Paths
20
+
21
+ #
22
+ # @param [Nokogiri] Nokogiri document
23
+ #
24
+ # @return [Array<String>] paths
25
+ #
26
+ def run( doc )
27
+ [ '/sitemap.xml', '/sitemap.xml.gz' ]
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,137 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Arachni
12
+ module Plugins
13
+
14
+ #
15
+ # Automated login plugin.
16
+ #
17
+ # It looks for the login form in the user provided URL,
18
+ # merges its input field with the user supplied parameters and sets the cookies
19
+ # of the response as framework-wide cookies to be used by the spider later on.
20
+ #
21
+ # @author: Tasos "Zapotek" Laskos
22
+ # <tasos.laskos@gmail.com>
23
+ # <zapotek@segfault.gr>
24
+ # @version: 0.1
25
+ #
26
+ class AutoLogin < Arachni::Plugin::Base
27
+
28
+ attr_accessor :http
29
+
30
+ #
31
+ # @param [Arachni::Framework] framework
32
+ # @param [Hash] options options passed to the plugin
33
+ #
34
+ def initialize( framework, options )
35
+ @framework = framework
36
+ @options = options
37
+
38
+ @framework.pause!
39
+ print_info( "System paused." )
40
+ end
41
+
42
+ def prepare
43
+ @params = parse_params
44
+
45
+ # we need to declared this in order to pass ourselves
46
+ # as the auditor to the form later in order to submit it.
47
+ @http = @framework.http
48
+ end
49
+
50
+ def run( )
51
+
52
+ # grab the page containing the login form
53
+ res = @framework.http.get( @options['url'], :async => false ).response
54
+
55
+ parser = Arachni::Parser.new( @framework.opts, res )
56
+ # parse the response as a Page object
57
+ page = parser.run
58
+
59
+ # find the login form
60
+ login_form = nil
61
+ page.forms.each {
62
+ |form|
63
+ login_form = form if login_form?( form )
64
+ }
65
+
66
+ if !login_form
67
+ print_error( 'Could not find a form suiting the provided params at: ' +
68
+ @options['url'] )
69
+ return
70
+ end
71
+
72
+ name = login_form.raw['attrs']['name'] ? login_form.raw['attrs']['name'] : '<n/a>'
73
+ print_status( "Found log-in form with name: " + name )
74
+
75
+ # merge the input fields of the form with the user supplied parameters
76
+ login_form.auditable.merge!( @params )
77
+
78
+ # register us as the auditor
79
+ login_form.auditor( self )
80
+ res = login_form.submit( :async => false ).response
81
+
82
+ if !res
83
+ print_error( 'Form submitted but no response was returned.' )
84
+ return
85
+ else
86
+ print_ok( 'Form submitted successfully.' )
87
+ end
88
+
89
+ end
90
+
91
+ def clean_up
92
+ @framework.resume!
93
+ end
94
+
95
+ def login_form?( form )
96
+ avail = form.auditable.keys
97
+ provided = @params.keys
98
+
99
+ provided.each {
100
+ |name|
101
+ return false if !avail.include?( name )
102
+ }
103
+
104
+ return true
105
+ end
106
+
107
+ def parse_params
108
+ params = {}
109
+ @options['params'].split( '&' ).each {
110
+ |param|
111
+ k, v = param.split( '=', 2 )
112
+ params[k] = v
113
+ }
114
+ return params
115
+ end
116
+
117
+
118
+ def self.info
119
+ {
120
+ :name => 'AutoLogin',
121
+ :description => %q{It looks for the login form in the user provided URL,
122
+ merges its input fields with the user supplied parameters and sets the cookies
123
+ of the response and request as framework-wide cookies to be used by the spider later on.
124
+ },
125
+ :author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
126
+ :version => '0.1',
127
+ :options => [
128
+ Arachni::OptUrl.new( 'url', [ true, 'The URL that contains the login form.' ] ),
129
+ Arachni::OptString.new( 'params', [ true, 'Form parameters to submit. ( username=user&password=pass )' ] )
130
+ ]
131
+ }
132
+ end
133
+
134
+ end
135
+
136
+ end
137
+ end
@@ -0,0 +1,90 @@
1
+ =begin
2
+ Arachni
3
+ Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
4
+
5
+ This is free software; you can copy and distribute and modify
6
+ this program under the term of the GPL v2.0 License
7
+ (See LICENSE file for details)
8
+
9
+ =end
10
+
11
+ module Arachni
12
+ module Plugins
13
+
14
+ #
15
+ # Logs content-types of all server responses.
16
+ #
17
+ # @author: Tasos "Zapotek" Laskos
18
+ # <tasos.laskos@gmail.com>
19
+ # <zapotek@segfault.gr>
20
+ # @version: 0.1
21
+ #
22
+ class ContentTypes < Arachni::Plugin::Base
23
+
24
+ #
25
+ # @param [Arachni::Framework] framework
26
+ # @param [Hash] options options passed to the plugin
27
+ #
28
+ def initialize( framework, options )
29
+ @framework = framework
30
+ @options = options
31
+ end
32
+
33
+ def prepare
34
+ @results = {}
35
+ @exclude = Regexp.new( @options['exclude'] )
36
+
37
+ @logged = Set.new
38
+ end
39
+
40
+ def run( )
41
+ @framework.http.on_complete {
42
+ |res|
43
+
44
+ next if @logged.include?( res.request.method.to_s.upcase + res.effective_url )
45
+ next if !(type = res.headers_hash['Content-type'] ) || type.empty?
46
+
47
+ if( !@options['exclude'].empty? && !type.match( @exclude ) ) ||
48
+ @options['exclude'].empty?
49
+ @results[type] ||= []
50
+ @results[type] << {
51
+ :url => res.effective_url,
52
+ :method => res.request.method.to_s.upcase,
53
+ :params => res.request.params
54
+ }
55
+
56
+ @logged << res.request.method.to_s.upcase + res.effective_url
57
+ end
58
+ }
59
+ end
60
+
61
+ def clean_up
62
+ # we need to wait until the framework has finished running
63
+ # before logging the results
64
+ while( @framework.running? )
65
+ ::IO.select( nil, nil, nil, 1 )
66
+ end
67
+
68
+ register_results( @results )
69
+ end
70
+
71
+ def self.info
72
+ {
73
+ :name => 'Content-types',
74
+ :description => %q{Logs content-types of server responses.
75
+ It can help you categorize and identify publicly available file-types
76
+ which in turn can help you identify accidentally leaked files.},
77
+ :author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
78
+ :version => '0.1',
79
+ :options => [
80
+ Arachni::OptString.new( 'exclude', [ false,
81
+ 'Exclude content-types that match this regular expression.', 'text' ]
82
+ )
83
+ ]
84
+ }
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+ end