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,206 @@
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 Options.instance.dir['lib'] + 'framework'
14
+ require Options.instance.dir['lib'] + 'rpc/xml/server/module/manager'
15
+ require Options.instance.dir['lib'] + 'rpc/xml/server/plugin/manager'
16
+
17
+ module RPC
18
+ module XML
19
+ module Server
20
+
21
+ #
22
+ # Extends the Framework adding XML-RPC specific functionality
23
+ #
24
+ # @author: Tasos "Zapotek" Laskos
25
+ # <tasos.laskos@gmail.com>
26
+ # <zapotek@segfault.gr>
27
+ # @version: 0.1.1
28
+ #
29
+ class Framework < Arachni::Framework
30
+
31
+ #
32
+ # Our run() method needs to run the parent's run() method in
33
+ # a separate thread.
34
+ #
35
+ alias :old_run :run
36
+
37
+ # make this inherited methods visible again
38
+ private :old_run, :stats, :pause!, :paused?, :resume!, :lsmod, :modules, :lsplug, :clean_up!
39
+ public :stats, :pause!, :paused?, :resume!, :lsmod, :modules, :lsplug, :clean_up!
40
+
41
+ #
42
+ # Aborts the running audit.
43
+ #
44
+ def abort!
45
+ @job.kill
46
+ return true
47
+ end
48
+
49
+ #
50
+ # Checks to see if an audit is running.
51
+ #
52
+ # @return [Bool]
53
+ #
54
+ def busy?
55
+ return false if !@job
56
+ return @job.alive?
57
+ end
58
+
59
+ #
60
+ # Checks whether the framework is in debug mode
61
+ #
62
+ def debug?
63
+ @@debug
64
+ end
65
+
66
+ #
67
+ # Checks whether the framework is in debug mode
68
+ #
69
+ def verbose?
70
+ @@verbose
71
+ end
72
+
73
+
74
+ #
75
+ # some XMLRPC libraries of other languages map remote objects to local objects
76
+ # creating an invalid syntax situation since the aforementioned languages
77
+ # may not allow "?" or "!" in method names.
78
+ #
79
+ # so we alias these methods to make it easier on 3rd party developers.
80
+ #
81
+ alias :pause :pause!
82
+ alias :is_paused :paused?
83
+ alias :resume :resume!
84
+ alias :clean_up :clean_up!
85
+ alias :is_busy :busy?
86
+ alias :is_debug :debug?
87
+ alias :is_verbose :verbose?
88
+
89
+ def initialize( opts )
90
+ super( opts )
91
+ @modules = Arachni::RPC::XML::Server::Module::Manager.new( opts )
92
+ @plugins = Arachni::RPC::XML::Server::Plugin::Manager.new( self )
93
+ end
94
+
95
+ #
96
+ # Returns an array of hashes with information
97
+ # about all available reports
98
+ #
99
+ # @return [Array<Hash>]
100
+ #
101
+ def lsplug
102
+
103
+ plug_info = []
104
+
105
+ @plugins.available( ).each {
106
+ |plugin|
107
+
108
+ info = @plugins[plugin].info
109
+
110
+ info[:plug_name] = plugin
111
+ info[:path] = @plugins.name_to_path( plugin )
112
+
113
+ info[:options] = [info[:options]].flatten.compact.map {
114
+ |opt|
115
+ opt_h = opt.to_h
116
+ opt_h['default'] = '' if opt_h['default'].nil?
117
+ opt_h['type'] = opt.type
118
+ opt_h
119
+ }
120
+
121
+ plug_info << info
122
+ }
123
+
124
+ @plugins.clear( )
125
+
126
+ return plug_info
127
+ end
128
+
129
+
130
+ #
131
+ # Starts the audit.
132
+ #
133
+ # The audit is started in a new thread to avoid service blocking.
134
+ #
135
+ def run
136
+ @job = Thread.new {
137
+ exception_jail { old_run }
138
+ }
139
+ return true
140
+ end
141
+
142
+ #
143
+ # Returns the results of the audit.
144
+ #
145
+ # @return [YAML] YAML dump of the results hash
146
+ #
147
+ def report
148
+ exception_jail {
149
+ return false if !@job
150
+
151
+ store = audit_store( true )
152
+ store.framework = ''
153
+ return YAML.dump( store.to_h.dup )
154
+ }
155
+ end
156
+
157
+ #
158
+ # Returns the results of the audit as a serialized AuditStore object.
159
+ #
160
+ # @return [YAML] YAML dump of the AuditStore
161
+ #
162
+ def auditstore
163
+ exception_jail {
164
+ return false if !@job
165
+
166
+ store = audit_store( true )
167
+ store.framework = nil
168
+
169
+ return YAML.dump( store )
170
+ }
171
+ end
172
+
173
+ #
174
+ # Enables debugging output
175
+ #
176
+ def debug_on
177
+ @@debug = true
178
+ end
179
+
180
+ #
181
+ # Disables debugging output
182
+ #
183
+ def debug_off
184
+ @@debug = false
185
+ end
186
+
187
+ #
188
+ # Enables debugging output
189
+ #
190
+ def verbose_on
191
+ @@verbose = true
192
+ end
193
+
194
+ #
195
+ # Disables debugging output
196
+ #
197
+ def verbose_off
198
+ @@verbose = false
199
+ end
200
+
201
+ end
202
+
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,191 @@
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
+ require 'webrick'
12
+ require 'webrick/https'
13
+ require 'xmlrpc/server'
14
+ require 'openssl'
15
+
16
+ module Arachni
17
+
18
+ require Options.instance.dir['lib'] + 'rpc/xml/server/base'
19
+ require Options.instance.dir['lib'] + 'rpc/xml/server/output'
20
+ require Options.instance.dir['lib'] + 'rpc/xml/server/framework'
21
+ require Options.instance.dir['lib'] + 'rpc/xml/server/options'
22
+
23
+ module RPC
24
+ module XML
25
+ module Server
26
+
27
+ #
28
+ # XMLRPC Server class
29
+ #
30
+ # Provides an XML-RPC server to assist with general integration and UI development.
31
+ #
32
+ # Only instantiated by the Dispatcher to provide support for multiple
33
+ # and concurent XMLRPC clients/scans.
34
+ #
35
+ # @author: Tasos "Zapotek" Laskos
36
+ # <tasos.laskos@gmail.com>
37
+ # <zapotek@segfault.gr>
38
+ # @version: 0.1.3
39
+ #
40
+ class Instance < Base
41
+
42
+ # the output interface for XML-RPC
43
+ include Arachni::UI::Output
44
+ include Arachni::Module::Utilities
45
+
46
+ private :shutdown, :alive?
47
+ public :shutdown, :alive?
48
+
49
+
50
+ #
51
+ # Initializes the XML-RPC interface, the HTTP(S) server and the framework.
52
+ #
53
+ # @param [Options] opts
54
+ #
55
+ def initialize( opts )
56
+
57
+ prep_framework
58
+ banner
59
+
60
+ @opts = opts
61
+ super( @opts )
62
+
63
+ if @opts.debug
64
+ debug!
65
+ end
66
+
67
+
68
+ if @opts.reroute_to_logfile
69
+ reroute_to_file( @opts.dir['root'] +
70
+ "logs/XMLRPC-Server - #{Process.pid}:#{@opts.rpc_port} - #{Time.now.asctime}.log" )
71
+ else
72
+ reroute_to_file( false )
73
+ end
74
+
75
+ set_handlers
76
+
77
+ # trap interupts and exit cleanly when required
78
+ trap( 'HUP' ) { shutdown }
79
+ trap( 'INT' ) { shutdown }
80
+
81
+ end
82
+
83
+ #
84
+ # Resets the framework leaving it lemon fresh for the next scan.
85
+ #
86
+ # If you reuse without reseting, Arachni will eat your kitten!<br/>
87
+ # (And I don't mean sexually...)
88
+ #
89
+ def reset
90
+
91
+ print_status( 'Resetting...' )
92
+
93
+ exception_jail {
94
+ @framework.modules.clear
95
+ Arachni.reset
96
+ Arachni::Options.instance.reset
97
+ prep_framework
98
+ set_handlers
99
+ output
100
+ }
101
+
102
+ print_status( 'Done.' )
103
+
104
+ return true
105
+ end
106
+
107
+ #
108
+ # Flushes the output buffer and returns all pending system messages.
109
+ #
110
+ # All messages are classified based on their type.
111
+ #
112
+ # @return [Array<Hash>]
113
+ #
114
+ def output
115
+ flush_buffer( )
116
+ end
117
+
118
+ #
119
+ # Makes the HTTP(S) server go bye-bye...Lights out!
120
+ #
121
+ def shutdown
122
+ print_status( 'Shutting down...' )
123
+ super
124
+ print_status( 'Done.' )
125
+ return true
126
+ end
127
+ alias :shutdown! :shutdown
128
+
129
+ #
130
+ # Starts the HTTP(S) server and the XML-RPC service.
131
+ #
132
+ def run
133
+
134
+ begin
135
+ print_status( 'Starting the server...' )
136
+ # start the show!
137
+ super
138
+ rescue Exception => e
139
+ exception_jail{ raise e }
140
+ exit 0
141
+ end
142
+ end
143
+
144
+ private
145
+
146
+ #
147
+ # Initialises the RPC framework.
148
+ #
149
+ def prep_framework
150
+ @framework = nil
151
+ @framework = Arachni::RPC::XML::Server::Framework.new( Options.instance )
152
+ end
153
+
154
+ #
155
+ # Outputs the Arachni banner.<br/>
156
+ # Displays version number, revision number, author details etc.
157
+ #
158
+ def banner
159
+
160
+ puts 'Arachni - Web Application Security Scanner Framework v' +
161
+ @framework.version + ' [' + @framework.revision + ']
162
+ Author: Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
163
+ <zapotek@segfault.gr>
164
+ (With the support of the community and the Arachni Team.)
165
+
166
+ Website: http://github.com/Zapotek/arachni
167
+ Documentation: http://github.com/Zapotek/arachni/wiki'
168
+ puts
169
+ puts
170
+
171
+ end
172
+
173
+ #
174
+ # Starts the XML-RPC service and attaches it to the HTTP(S) server.<br/>
175
+ # It also prepares all the RPC handlers.
176
+ #
177
+ def set_handlers
178
+ @service.clear_handlers
179
+ add_handler( "service", self )
180
+ add_handler( "framework", @framework )
181
+ add_handler( "opts", @framework.opts )
182
+ add_handler( "modules", @framework.modules )
183
+ add_handler( "plugins", @framework.plugins )
184
+ end
185
+
186
+ end
187
+
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,46 @@
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 Options.instance.dir['lib'] + 'module/manager'
14
+
15
+ module RPC
16
+ module XML
17
+ module Server
18
+
19
+ module Module
20
+
21
+ #
22
+ # We need to extend the original Manager and redeclare its inherited methods
23
+ # which are required over XMLRPC.
24
+ #
25
+ # @author: Tasos "Zapotek" Laskos
26
+ # <tasos.laskos@gmail.com>
27
+ # <zapotek@segfault.gr>
28
+ # @version: 0.1.1
29
+ #
30
+ class Manager < ::Arachni::Module::Manager
31
+
32
+ # make these inherited methods visible again
33
+ private :load, :available
34
+ public :load, :available
35
+
36
+ def initialize( opts )
37
+ super( opts )
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,124 @@
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
+ #
14
+ # Overrides the Options class adding support for direct options parsing.
15
+ #
16
+ # Not much to look at but it streamlines XML-RPC server option handling.
17
+ #
18
+ # @author: Tasos "Zapotek" Laskos
19
+ # <tasos.laskos@gmail.com>
20
+ # <zapotek@segfault.gr>
21
+ # @version: 0.1
22
+ #
23
+ class Options
24
+
25
+ def set( hash )
26
+ hash.each_pair {
27
+ |k, v|
28
+ begin
29
+ send( "#{k.to_s}=", v )
30
+ rescue Exception => e
31
+ ap e
32
+ ap e.backtrace
33
+ end
34
+ }
35
+ true
36
+ end
37
+
38
+ #
39
+ # Resets all important options that can affect the scan
40
+ # during framework reuse.
41
+ #
42
+ def reset
43
+ # nil everything out
44
+ self.instance_variables.each {
45
+ |var|
46
+
47
+ # do *NOT* nil out @dir, we'll loose our paths!
48
+ next if var.to_s == '@dir'
49
+
50
+ begin
51
+ instance_variable_set( var.to_s, nil )
52
+ rescue Exception
53
+ end
54
+ }
55
+
56
+
57
+ @exclude = []
58
+ @include = []
59
+ @redundant = []
60
+ @lsmod = []
61
+ @exclude_cookies = []
62
+
63
+ # set some defaults
64
+ @redirect_limit = 20
65
+
66
+ # relatively low but will give good performance without bottleneck
67
+ # on low bandwidth conections
68
+ @http_req_limit = 20
69
+ end
70
+
71
+ #
72
+ # Sets the URL include filter.
73
+ #
74
+ # Only URLs matching any of these rules will be crawled.
75
+ #
76
+ # @param [Array<Regexp>] arr
77
+ #
78
+ def include=( arr )
79
+ @include = arr.map{ |rule| Regexp.new( rule ) }
80
+ return true
81
+ end
82
+
83
+ #
84
+ # Sets the URL exclude filter.
85
+ #
86
+ # URLs matching any of these rules will not be crawled.
87
+ #
88
+ # @param [Array<Regexp>] arr
89
+ #
90
+ def exclude=( arr )
91
+ @exclude = arr.map{ |rule| Regexp.new( rule ) }
92
+ return true
93
+ end
94
+
95
+ #
96
+ # Sets the redundancy filters.
97
+ #
98
+ # Filter example:
99
+ # [
100
+ # {
101
+ # 'regexp' => 'calendar.php', # URL to apply the filter to
102
+ # 'count' => 5 # how many times to crawl the url
103
+ # },
104
+ # {
105
+ # 'regexp' => 'gallery.php',
106
+ # 'count' => 3
107
+ # }
108
+ # ]
109
+ #
110
+ # @param [Array<Hash>] arr
111
+ #
112
+ def redundant=( arr )
113
+ ruleset = []
114
+ arr.each {
115
+ |rule|
116
+ rule['regexp'] = Regexp.new( rule['regexp'] )
117
+ ruleset << rule
118
+ }
119
+ @redundant = ruleset.dup
120
+ return true
121
+ end
122
+
123
+ end
124
+ end