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,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
|
data/reports/stdout.rb
ADDED
|
@@ -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
|
data/reports/txt.rb
ADDED
|
@@ -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
|