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.
- data/ACKNOWLEDGMENTS.md +14 -0
- data/AUTHORS.md +6 -0
- data/CHANGELOG.md +162 -0
- data/CONTRIBUTORS.md +10 -0
- data/EXPLOITATION.md +429 -0
- data/HACKING.md +101 -0
- data/LICENSE.md +341 -0
- data/README.md +350 -0
- data/Rakefile +86 -0
- data/bin/arachni +22 -0
- data/bin/arachni_web +77 -0
- data/bin/arachni_xmlrpc +21 -0
- data/bin/arachni_xmlrpcd +82 -0
- data/bin/arachni_xmlrpcd_monitor +74 -0
- data/conf/README.webui.yaml.txt +44 -0
- data/conf/webui.yaml +11 -0
- data/external/metasploit/LICENSE +24 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_exec.rb +142 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_path_traversal.rb +113 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_php_eval.rb +150 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_php_include.rb +141 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_sqlmap.rb +92 -0
- data/external/metasploit/plugins/arachni.rb +536 -0
- data/getoptslong.rb +241 -0
- data/lib/anemone.rb +2 -0
- data/lib/anemone/cookie_store.rb +35 -0
- data/lib/anemone/core.rb +371 -0
- data/lib/anemone/exceptions.rb +5 -0
- data/lib/anemone/http.rb +144 -0
- data/lib/anemone/page.rb +337 -0
- data/lib/anemone/page_store.rb +160 -0
- data/lib/anemone/storage.rb +34 -0
- data/lib/anemone/storage/base.rb +75 -0
- data/lib/anemone/storage/exceptions.rb +15 -0
- data/lib/anemone/storage/mongodb.rb +89 -0
- data/lib/anemone/storage/pstore.rb +50 -0
- data/lib/anemone/storage/redis.rb +90 -0
- data/lib/anemone/storage/tokyo_cabinet.rb +57 -0
- data/lib/anemone/tentacle.rb +40 -0
- data/lib/arachni.rb +16 -0
- data/lib/audit_store.rb +346 -0
- data/lib/component_manager.rb +293 -0
- data/lib/component_options.rb +395 -0
- data/lib/exceptions.rb +76 -0
- data/lib/framework.rb +637 -0
- data/lib/http.rb +809 -0
- data/lib/issue.rb +302 -0
- data/lib/module.rb +4 -0
- data/lib/module/auditor.rb +455 -0
- data/lib/module/base.rb +188 -0
- data/lib/module/element_db.rb +158 -0
- data/lib/module/key_filler.rb +87 -0
- data/lib/module/manager.rb +87 -0
- data/lib/module/output.rb +68 -0
- data/lib/module/trainer.rb +240 -0
- data/lib/module/utilities.rb +110 -0
- data/lib/options.rb +547 -0
- data/lib/parser.rb +2 -0
- data/lib/parser/auditable.rb +522 -0
- data/lib/parser/elements.rb +296 -0
- data/lib/parser/page.rb +149 -0
- data/lib/parser/parser.rb +717 -0
- data/lib/plugin.rb +4 -0
- data/lib/plugin/base.rb +110 -0
- data/lib/plugin/manager.rb +162 -0
- data/lib/report.rb +4 -0
- data/lib/report/base.rb +119 -0
- data/lib/report/manager.rb +92 -0
- data/lib/rpc/xml/client/base.rb +71 -0
- data/lib/rpc/xml/client/dispatcher.rb +49 -0
- data/lib/rpc/xml/client/instance.rb +88 -0
- data/lib/rpc/xml/server/base.rb +90 -0
- data/lib/rpc/xml/server/dispatcher.rb +357 -0
- data/lib/rpc/xml/server/framework.rb +206 -0
- data/lib/rpc/xml/server/instance.rb +191 -0
- data/lib/rpc/xml/server/module/manager.rb +46 -0
- data/lib/rpc/xml/server/options.rb +124 -0
- data/lib/rpc/xml/server/output.rb +299 -0
- data/lib/rpc/xml/server/plugin/manager.rb +58 -0
- data/lib/ruby.rb +5 -0
- data/lib/ruby/object.rb +32 -0
- data/lib/ruby/string.rb +74 -0
- data/lib/ruby/xmlrpc/server.rb +27 -0
- data/lib/spider.rb +200 -0
- data/lib/typhoeus/request.rb +91 -0
- data/lib/typhoeus/response.rb +34 -0
- data/lib/ui/cli/cli.rb +744 -0
- data/lib/ui/cli/output.rb +279 -0
- data/lib/ui/web/log.rb +82 -0
- data/lib/ui/web/output_stream.rb +94 -0
- data/lib/ui/web/report_manager.rb +222 -0
- data/lib/ui/web/server.rb +903 -0
- data/lib/ui/web/server/db/placeholder +0 -0
- data/lib/ui/web/server/public/banner.png +0 -0
- data/lib/ui/web/server/public/bodybg-small.png +0 -0
- data/lib/ui/web/server/public/bodybg.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/pbar-ani.gif +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/jquery-ui-1.8.9.custom.css +573 -0
- data/lib/ui/web/server/public/favicon.ico +0 -0
- data/lib/ui/web/server/public/footer.jpg +0 -0
- data/lib/ui/web/server/public/icons/error.png +0 -0
- data/lib/ui/web/server/public/icons/info.png +0 -0
- data/lib/ui/web/server/public/icons/ok.png +0 -0
- data/lib/ui/web/server/public/icons/status.png +0 -0
- data/lib/ui/web/server/public/js/jquery-1.4.4.min.js +167 -0
- data/lib/ui/web/server/public/js/jquery-ui-1.8.9.custom.min.js +781 -0
- data/lib/ui/web/server/public/logo.png +0 -0
- data/lib/ui/web/server/public/nav-left.jpg +0 -0
- data/lib/ui/web/server/public/nav-right.jpg +0 -0
- data/lib/ui/web/server/public/nav-selected-left.jpg +0 -0
- data/lib/ui/web/server/public/nav-selected-right.jpg +0 -0
- data/lib/ui/web/server/public/reports/placeholder +1 -0
- data/lib/ui/web/server/public/sidebar-bottom.jpg +0 -0
- data/lib/ui/web/server/public/sidebar-h4.jpg +0 -0
- data/lib/ui/web/server/public/sidebar-top.jpg +0 -0
- data/lib/ui/web/server/public/spider.png +0 -0
- data/lib/ui/web/server/public/style.css +604 -0
- data/lib/ui/web/server/tmp/placeholder +0 -0
- data/lib/ui/web/server/views/dispatcher.erb +85 -0
- data/lib/ui/web/server/views/dispatcher_error.erb +14 -0
- data/lib/ui/web/server/views/error.erb +1 -0
- data/lib/ui/web/server/views/flash.erb +18 -0
- data/lib/ui/web/server/views/home.erb +14 -0
- data/lib/ui/web/server/views/instance.erb +213 -0
- data/lib/ui/web/server/views/layout.erb +95 -0
- data/lib/ui/web/server/views/log.erb +40 -0
- data/lib/ui/web/server/views/modules.erb +71 -0
- data/lib/ui/web/server/views/options.erb +23 -0
- data/lib/ui/web/server/views/output_results.erb +51 -0
- data/lib/ui/web/server/views/plugins.erb +42 -0
- data/lib/ui/web/server/views/report_formats.erb +30 -0
- data/lib/ui/web/server/views/reports.erb +55 -0
- data/lib/ui/web/server/views/settings.erb +120 -0
- data/lib/ui/web/server/views/welcome.erb +38 -0
- data/lib/ui/xmlrpc/dispatcher_monitor.rb +204 -0
- data/lib/ui/xmlrpc/xmlrpc.rb +843 -0
- data/logs/placeholder +0 -0
- data/metamodules/autothrottle.rb +74 -0
- data/metamodules/timeout_notice.rb +118 -0
- data/metamodules/uniformity.rb +98 -0
- data/modules/audit/code_injection.rb +136 -0
- data/modules/audit/code_injection_timing.rb +115 -0
- data/modules/audit/code_injection_timing/payloads.txt +4 -0
- data/modules/audit/csrf.rb +301 -0
- data/modules/audit/ldapi.rb +103 -0
- data/modules/audit/ldapi/errors.txt +26 -0
- data/modules/audit/os_cmd_injection.rb +103 -0
- data/modules/audit/os_cmd_injection/payloads.txt +2 -0
- data/modules/audit/os_cmd_injection_timing.rb +104 -0
- data/modules/audit/os_cmd_injection_timing/payloads.txt +3 -0
- data/modules/audit/path_traversal.rb +141 -0
- data/modules/audit/response_splitting.rb +105 -0
- data/modules/audit/rfi.rb +193 -0
- data/modules/audit/sqli.rb +120 -0
- data/modules/audit/sqli/regexp_ids.txt +90 -0
- data/modules/audit/sqli_blind_rdiff.rb +321 -0
- data/modules/audit/sqli_blind_timing.rb +103 -0
- data/modules/audit/sqli_blind_timing/payloads.txt +51 -0
- data/modules/audit/trainer.rb +89 -0
- data/modules/audit/unvalidated_redirect.rb +90 -0
- data/modules/audit/xpath.rb +104 -0
- data/modules/audit/xpath/errors.txt +26 -0
- data/modules/audit/xss.rb +99 -0
- data/modules/audit/xss_event.rb +134 -0
- data/modules/audit/xss_path.rb +125 -0
- data/modules/audit/xss_script_tag.rb +112 -0
- data/modules/audit/xss_tag.rb +112 -0
- data/modules/audit/xss_uri.rb +125 -0
- data/modules/recon/allowed_methods.rb +104 -0
- data/modules/recon/backdoors.rb +131 -0
- data/modules/recon/backdoors/filenames.txt +16 -0
- data/modules/recon/backup_files.rb +177 -0
- data/modules/recon/backup_files/extensions.txt +28 -0
- data/modules/recon/common_directories.rb +138 -0
- data/modules/recon/common_directories/directories.txt +265 -0
- data/modules/recon/common_files.rb +138 -0
- data/modules/recon/common_files/filenames.txt +17 -0
- data/modules/recon/directory_listing.rb +171 -0
- data/modules/recon/grep/captcha.rb +62 -0
- data/modules/recon/grep/credit_card.rb +85 -0
- data/modules/recon/grep/cvs_svn_users.rb +73 -0
- data/modules/recon/grep/emails.rb +59 -0
- data/modules/recon/grep/html_objects.rb +53 -0
- data/modules/recon/grep/private_ip.rb +54 -0
- data/modules/recon/grep/ssn.rb +53 -0
- data/modules/recon/htaccess_limit.rb +82 -0
- data/modules/recon/http_put.rb +95 -0
- data/modules/recon/interesting_responses.rb +118 -0
- data/modules/recon/unencrypted_password_forms.rb +119 -0
- data/modules/recon/webdav.rb +126 -0
- data/modules/recon/xst.rb +107 -0
- data/path_extractors/anchors.rb +35 -0
- data/path_extractors/forms.rb +35 -0
- data/path_extractors/frames.rb +38 -0
- data/path_extractors/generic.rb +39 -0
- data/path_extractors/links.rb +35 -0
- data/path_extractors/meta_refresh.rb +39 -0
- data/path_extractors/scripts.rb +37 -0
- data/path_extractors/sitemap.rb +31 -0
- data/plugins/autologin.rb +137 -0
- data/plugins/content_types.rb +90 -0
- data/plugins/cookie_collector.rb +99 -0
- data/plugins/form_dicattack.rb +185 -0
- data/plugins/healthmap.rb +94 -0
- data/plugins/http_dicattack.rb +133 -0
- data/plugins/metamodules.rb +118 -0
- data/plugins/proxy.rb +248 -0
- data/plugins/proxy/server.rb +66 -0
- data/plugins/waf_detector.rb +184 -0
- data/profiles/comprehensive.afp +74 -0
- data/profiles/full.afp +75 -0
- data/reports/afr.rb +59 -0
- data/reports/ap.rb +55 -0
- data/reports/html.rb +179 -0
- data/reports/html/default.erb +967 -0
- data/reports/metareport.rb +139 -0
- data/reports/metareport/arachni_metareport.rb +174 -0
- data/reports/plugin_formatters/html/content_types.rb +82 -0
- data/reports/plugin_formatters/html/cookie_collector.rb +66 -0
- data/reports/plugin_formatters/html/form_dicattack.rb +54 -0
- data/reports/plugin_formatters/html/healthmap.rb +76 -0
- data/reports/plugin_formatters/html/http_dicattack.rb +54 -0
- data/reports/plugin_formatters/html/metaformatters/timeout_notice.rb +65 -0
- data/reports/plugin_formatters/html/metaformatters/uniformity.rb +71 -0
- data/reports/plugin_formatters/html/metamodules.rb +93 -0
- data/reports/plugin_formatters/html/waf_detector.rb +54 -0
- data/reports/plugin_formatters/stdout/content_types.rb +73 -0
- data/reports/plugin_formatters/stdout/cookie_collector.rb +61 -0
- data/reports/plugin_formatters/stdout/form_dicattack.rb +52 -0
- data/reports/plugin_formatters/stdout/healthmap.rb +72 -0
- data/reports/plugin_formatters/stdout/http_dicattack.rb +53 -0
- data/reports/plugin_formatters/stdout/metaformatters/timeout_notice.rb +55 -0
- data/reports/plugin_formatters/stdout/metaformatters/uniformity.rb +68 -0
- data/reports/plugin_formatters/stdout/metamodules.rb +89 -0
- data/reports/plugin_formatters/stdout/waf_detector.rb +48 -0
- data/reports/plugin_formatters/xml/content_types.rb +91 -0
- data/reports/plugin_formatters/xml/cookie_collector.rb +70 -0
- data/reports/plugin_formatters/xml/form_dicattack.rb +57 -0
- data/reports/plugin_formatters/xml/healthmap.rb +82 -0
- data/reports/plugin_formatters/xml/http_dicattack.rb +57 -0
- data/reports/plugin_formatters/xml/metaformatters/timeout_notice.rb +67 -0
- data/reports/plugin_formatters/xml/metaformatters/uniformity.rb +82 -0
- data/reports/plugin_formatters/xml/metamodules.rb +91 -0
- data/reports/plugin_formatters/xml/waf_detector.rb +58 -0
- data/reports/stdout.rb +182 -0
- data/reports/txt.rb +77 -0
- data/reports/xml.rb +231 -0
- data/reports/xml/buffer.rb +98 -0
- 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
|