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,82 @@
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
+
13
+ require Arachni::Options.instance.dir['reports'] + '/xml/buffer.rb'
14
+
15
+ module Reports
16
+
17
+ class XML
18
+ module PluginFormatters
19
+
20
+ class MetaModules
21
+ module MetaFormatters
22
+
23
+ #
24
+ # XML formatter for the results of the Uniformity metamodule
25
+ #
26
+ # @author: Tasos "Zapotek" Laskos
27
+ # <tasos.laskos@gmail.com>
28
+ # <zapotek@segfault.gr>
29
+ # @version: 0.1
30
+ #
31
+ class Uniformity < Arachni::Plugin::Formatter
32
+
33
+ include Arachni::Reports::Buffer
34
+
35
+ def initialize( metadata )
36
+ @results = metadata[:results]
37
+ @description = metadata[:description]
38
+ end
39
+
40
+ def run
41
+ start_tag( 'uniformity' )
42
+ simple_tag( 'description', @description )
43
+ start_tag( 'results' )
44
+
45
+ uniformals = @results['uniformals']
46
+ pages = @results['pages']
47
+
48
+ uniformals.each_pair {
49
+ |id, uniformal|
50
+
51
+ start_uniformals( id )
52
+
53
+ uniformal['hashes'].each_with_index {
54
+ |hash, i|
55
+ add_uniformal( i, uniformal )
56
+ }
57
+
58
+ end_tag( 'uniformals' )
59
+ }
60
+
61
+ end_tag( 'results' )
62
+ end_tag( 'uniformity' )
63
+ end
64
+
65
+ def add_uniformal( idx, uniformal )
66
+ __buffer( "<issue index=\"#{uniformal['indices'][idx]}\" hash=\"#{uniformal['hashes'][idx]}\" />" )
67
+ end
68
+
69
+ def start_uniformals( id )
70
+ __buffer( "<uniformals id=\"#{id}\">" )
71
+ end
72
+
73
+
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,91 @@
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
+
13
+ require Arachni::Options.instance.dir['reports'] + '/xml/buffer.rb'
14
+
15
+ module Reports
16
+
17
+ class XML
18
+ module PluginFormatters
19
+
20
+ #
21
+ # XML formatter for the results of the MetaModules plugin
22
+ #
23
+ # @author: Tasos "Zapotek" Laskos
24
+ # <tasos.laskos@gmail.com>
25
+ # <zapotek@segfault.gr>
26
+ # @version: 0.1
27
+ #
28
+ class MetaModules
29
+
30
+ include Arachni::Reports::Buffer
31
+
32
+ def initialize( plugin_data )
33
+ @results = plugin_data[:results]
34
+ @description = plugin_data[:description]
35
+ end
36
+
37
+ def run
38
+ start_tag( 'metamodules' )
39
+ simple_tag( 'description', @description )
40
+ start_tag( 'results' )
41
+
42
+ format_meta_results( @results ).values.each { |xml| append( xml ) }
43
+
44
+ end_tag( 'results' )
45
+ end_tag( 'metamodules' )
46
+ end
47
+
48
+ #
49
+ # Runs plugin formatters for the running report and returns a hash
50
+ # with the prepared/formatted results.
51
+ #
52
+ # @param [AuditStore#plugins] plugins plugin data/results
53
+ #
54
+ def format_meta_results( plugins )
55
+
56
+ ancestor = self.class.ancestors[0]
57
+
58
+ # add the PluginFormatters module to the report
59
+ eval( "module MetaFormatters end" )
60
+
61
+ # prepare the directory of the formatters for the running report
62
+ lib = File.dirname( __FILE__ ) + '/metaformatters/'
63
+
64
+ @@formatters ||= {}
65
+ # initialize a new component manager to handle the plugin formatters
66
+ @@formatters[ancestor] ||= ::Arachni::Report::FormatterManager.new( lib, ancestor.const_get( 'MetaFormatters' ) )
67
+
68
+ # load all the formatters
69
+ @@formatters[ancestor].load( ['*'] ) if @@formatters[ancestor].empty?
70
+
71
+ # run the formatters and gather the formatted data they return
72
+ formatted = {}
73
+ @@formatters[ancestor].each_pair {
74
+ |name, formatter|
75
+ plugin_results = plugins[name]
76
+ next if !plugin_results || plugin_results[:results].empty?
77
+
78
+ formatted[name] = formatter.new( plugin_results.deep_clone ).run
79
+ }
80
+
81
+ return formatted
82
+ end
83
+
84
+
85
+ end
86
+
87
+ end
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,58 @@
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
+
13
+ require Arachni::Options.instance.dir['reports'] + '/xml/buffer.rb'
14
+
15
+ module Reports
16
+
17
+ class XML
18
+ module PluginFormatters
19
+
20
+ #
21
+ # XML formatter for the results of the WAF Detector plugin
22
+ #
23
+ # @author: Tasos "Zapotek" Laskos
24
+ # <tasos.laskos@gmail.com>
25
+ # <zapotek@segfault.gr>
26
+ # @version: 0.1
27
+ #
28
+ class WAFDetector < Arachni::Plugin::Formatter
29
+
30
+ include Buffer
31
+
32
+ def initialize( plugin_data )
33
+ @results = plugin_data[:results]
34
+ @description = plugin_data[:description]
35
+ end
36
+
37
+ def run
38
+ start_tag( 'waf_detector' )
39
+ simple_tag( 'description', @description )
40
+
41
+ start_tag( 'results' )
42
+
43
+ simple_tag( 'message', @results[:msg] )
44
+ simple_tag( 'code', @results[:code].to_s )
45
+
46
+ end_tag( 'results' )
47
+ end_tag( 'waf_detector' )
48
+
49
+ return buffer( )
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,182 @@
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 Reports
13
+
14
+ #
15
+ # Default report.
16
+ #
17
+ # Outputs the issues to stdout, used with the CLI UI.<br/>
18
+ # All UIs must have a default report.
19
+ #
20
+ #
21
+ # @author: Tasos "Zapotek" Laskos
22
+ # <tasos.laskos@gmail.com>
23
+ # <zapotek@segfault.gr>
24
+ # @version: 0.2.1
25
+ #
26
+ class Stdout < Arachni::Report::Base
27
+
28
+ #
29
+ # @param [AuditStore] audit_store
30
+ # @param [Hash] options options passed to the report
31
+ #
32
+ def initialize( audit_store, options )
33
+ @audit_store = audit_store
34
+ end
35
+
36
+ def run( )
37
+
38
+ print_line( "\n" )
39
+ print_line( "=" * 80 )
40
+ print_line( "\n" )
41
+ print_ok( 'Web Application Security Report - Arachni Framework' )
42
+ print_line
43
+ print_info( 'Report generated on: ' + Time.now.to_s )
44
+ print_info( 'Report false positives: ' + REPORT_FP )
45
+ print_line
46
+ print_ok( 'System settings:' )
47
+ print_info( '---------------' )
48
+ print_info( 'Version: ' + @audit_store.version )
49
+ print_info( 'Revision: '+ @audit_store.revision )
50
+ print_info( 'Audit started on: ' + @audit_store.start_datetime )
51
+ print_info( 'Audit finished on: ' + @audit_store.finish_datetime )
52
+ print_info( 'Runtime: ' + @audit_store.delta_time )
53
+ print_line
54
+ print_info( 'URL: ' + @audit_store.options['url'] )
55
+ print_info( 'User agent: ' + @audit_store.options['user_agent'] )
56
+ print_line
57
+ print_status( 'Audited elements: ' )
58
+ print_info( '* Links' ) if @audit_store.options['audit_links']
59
+ print_info( '* Forms' ) if @audit_store.options['audit_forms']
60
+ print_info( '* Cookies' ) if @audit_store.options['audit_cookies']
61
+ print_info( '* Headers' ) if @audit_store.options['audit_headers']
62
+ print_line
63
+ print_status( 'Modules: ' + @audit_store.options['mods'].join( ', ' ) )
64
+ print_line
65
+ print_status( 'Filters: ' )
66
+
67
+ if @audit_store.options['exclude']
68
+ print_info( " Exclude:" )
69
+ @audit_store.options['exclude'].each {
70
+ |ex|
71
+ print_info( ' ' + ex )
72
+ }
73
+ end
74
+
75
+ if @audit_store.options['include']
76
+ print_info( " Include:" )
77
+ @audit_store.options['include'].each {
78
+ |inc|
79
+ print_info( " " + inc )
80
+ }
81
+ end
82
+
83
+ if @audit_store.options['redundant']
84
+ print_info( " Redundant:" )
85
+ @audit_store.options['redundant'].each {
86
+ |red|
87
+ print_info( " " + red['regexp'] + ':' + red['count'].to_s )
88
+ }
89
+ end
90
+
91
+ print_line
92
+ print_status( 'Cookies: ' )
93
+ if( @audit_store.options['cookies'] )
94
+ @audit_store.options['cookies'].each {
95
+ |cookie|
96
+ print_info( " #{cookie[0]} = #{cookie[1]}" )
97
+ }
98
+ end
99
+
100
+ print_line
101
+ print_info( '===========================' )
102
+ print_line
103
+ print_ok( @audit_store.issues.size.to_s + " issues were detected." )
104
+ print_line
105
+
106
+ @audit_store.issues.each_with_index {
107
+ |issue, i|
108
+
109
+ print_ok( "[#{i+1}] " + issue.name )
110
+ print_info( '~~~~~~~~~~~~~~~~~~~~' )
111
+
112
+ print_info( 'ID Hash: ' + issue._hash )
113
+ print_info( 'Severity: ' + issue.severity ) if issue.severity
114
+ print_info( 'URL: ' + issue.url )
115
+ print_info( 'Element: ' + issue.elem )
116
+ print_info( 'Method: ' + issue.method ) if issue.method
117
+ print_info( 'Tags: ' + issue.tags.join( ', ' ) ) if issue.tags.is_a?( Array )
118
+ print_info( 'Variable: ' + issue.var ) if issue.var
119
+ print_info( 'Description: ' )
120
+ print_info( issue.description )
121
+
122
+ if issue.cwe && !issue.cwe.empty?
123
+ print_line
124
+ print_info( "CWE: http://cwe.mitre.org/data/definitions/#{issue.cwe}.html" )
125
+ end
126
+
127
+ print_line
128
+ print_info( 'Requires manual verification?: ' + issue.verification.to_s )
129
+ print_line
130
+
131
+ if( issue.references )
132
+ print_info( 'References:' )
133
+ issue.references.each{
134
+ |ref|
135
+ print_info( ' ' + ref[0] + ' - ' + ref[1] )
136
+ }
137
+ end
138
+
139
+ print_info_variations( issue )
140
+
141
+ print_line
142
+ }
143
+
144
+ print_line
145
+ print_ok( 'Plugin data:' )
146
+ print_info( '---------------' )
147
+ print_line
148
+
149
+ # let the plugin formatters to their thing and print their results
150
+ format_plugin_results( @audit_store.plugins )
151
+ end
152
+
153
+ def self.info
154
+ {
155
+ :name => 'Stdout',
156
+ :description => %q{Prints the results to standard output.},
157
+ :author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
158
+ :version => '0.2.1',
159
+ }
160
+ end
161
+
162
+ def print_info_variations( issue )
163
+ print_line
164
+ print_status( 'Variations' )
165
+ print_info( '----------' )
166
+ issue.variations.each_with_index {
167
+ |var, i|
168
+ print_info( "Variation #{i+1}:" )
169
+ print_info( 'URL: ' + var['url'] )
170
+ print_info( 'ID: ' + var['id'].to_s ) if var['id']
171
+ print_info( 'Injected value: ' + var['injected'].to_s ) if var['injected']
172
+ print_info( 'Regular expression: ' + var['regexp'].to_s ) if var['regexp']
173
+ print_info( 'Matched string: ' + var['regexp_match'].to_s ) if var['regexp_match']
174
+
175
+ print_line
176
+ }
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+ end
@@ -0,0 +1,77 @@
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
+
12
+ module Arachni
13
+
14
+ module Reports
15
+
16
+ #
17
+ # Creates a plain text report of the audit.
18
+ #
19
+ # It redirects stdout to an outfile and runs the default (stdout.rb) report.
20
+ #
21
+ # @author: Tasos "Zapotek" Laskos
22
+ # <tasos.laskos@gmail.com>
23
+ # <zapotek@segfault.gr>
24
+ # @version: 0.2
25
+ #
26
+ class Text < Arachni::Report::Base
27
+
28
+ #
29
+ # @param [AuditStore] audit_store
30
+ # @param [Hash] options options passed to the report
31
+ #
32
+ def initialize( audit_store, options )
33
+ @audit_store = audit_store
34
+ @outfile = options['outfile']
35
+
36
+ require Options.instance.dir['reports'] + 'stdout'
37
+
38
+ # get an instance of the stdout report
39
+ @__stdout_rep = Arachni::Reports::Stdout.new( audit_store, options )
40
+ end
41
+
42
+ def run( )
43
+
44
+ print_line( )
45
+ print_status( 'Creating text report...' )
46
+
47
+ # redirect output streams to the outfile
48
+ stdout = $stdout.dup
49
+ stderr = $stderr.dup
50
+ $stderr = $stdout = File.new( @outfile, 'w' )
51
+
52
+ @__stdout_rep.run( )
53
+
54
+ $stdout.close
55
+ $stdout = stdout.dup
56
+ $stderr = stderr.dup
57
+
58
+ print_status( 'Saved in \'' + @outfile + '\'.' )
59
+ end
60
+
61
+ def self.info
62
+ {
63
+ :name => 'Text report',
64
+ :description => %q{Exports a report as a plain text file.},
65
+ :author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
66
+ :version => '0.2',
67
+ :options => [
68
+ Arachni::OptString.new( 'outfile', [ false, 'Where to save the report.',
69
+ Time.now.to_s + '.txt' ] ),
70
+ ]
71
+ }
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+ end