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,104 @@
|
|
|
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
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# OS command injection module using timing attacks.
|
|
17
|
+
#
|
|
18
|
+
# @author: Tasos "Zapotek" Laskos
|
|
19
|
+
# <tasos.laskos@gmail.com>
|
|
20
|
+
# <zapotek@segfault.gr>
|
|
21
|
+
# @version: 0.2
|
|
22
|
+
#
|
|
23
|
+
# @see http://cwe.mitre.org/data/definitions/78.html
|
|
24
|
+
# @see http://www.owasp.org/index.php/OS_Command_Injection
|
|
25
|
+
#
|
|
26
|
+
class OSCmdInjectionTiming < Arachni::Module::Base
|
|
27
|
+
|
|
28
|
+
include Arachni::Module::Utilities
|
|
29
|
+
|
|
30
|
+
def initialize( page )
|
|
31
|
+
super( page )
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def prepare( )
|
|
35
|
+
|
|
36
|
+
@@__injection_str ||= []
|
|
37
|
+
|
|
38
|
+
if @@__injection_str.empty?
|
|
39
|
+
read_file( 'payloads.txt' ) {
|
|
40
|
+
|str|
|
|
41
|
+
|
|
42
|
+
[ '', '&&', '|', ';' ].each {
|
|
43
|
+
|sep|
|
|
44
|
+
@@__injection_str << sep + " " + str
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@@__injection_str << "`" + str + "`"
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
@__opts = {
|
|
52
|
+
:format => [ Format::STRAIGHT ],
|
|
53
|
+
:timeout => 4000,
|
|
54
|
+
:timeout_divider => 1000
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def run
|
|
60
|
+
audit_timeout( @@__injection_str, @__opts )
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.info
|
|
64
|
+
{
|
|
65
|
+
:name => 'OS command injection (timing)',
|
|
66
|
+
:description => %q{Tries to find operating system command injections using timing attacks.},
|
|
67
|
+
:elements => [
|
|
68
|
+
Issue::Element::FORM,
|
|
69
|
+
Issue::Element::LINK,
|
|
70
|
+
Issue::Element::COOKIE,
|
|
71
|
+
Issue::Element::HEADER
|
|
72
|
+
],
|
|
73
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
74
|
+
:version => '0.1',
|
|
75
|
+
:references => {
|
|
76
|
+
'OWASP' => 'http://www.owasp.org/index.php/OS_Command_Injection'
|
|
77
|
+
},
|
|
78
|
+
:targets => { 'Generic' => 'all' },
|
|
79
|
+
:issue => {
|
|
80
|
+
:name => %q{Operating system command injection (timing attack)},
|
|
81
|
+
:description => %q{The web application allows an attacker to
|
|
82
|
+
execute arbitrary OS commands even though it does not return
|
|
83
|
+
the command output in the HTML body.
|
|
84
|
+
(This issue was discovered using a timing attack; timing attacks
|
|
85
|
+
can result in false positives in cases where the server takes
|
|
86
|
+
an abnormally long time to respond.
|
|
87
|
+
Either case, these issues will require further investigation
|
|
88
|
+
even if they are false positives.)},
|
|
89
|
+
:tags => [ 'os', 'command', 'code', 'injection', 'timing', 'blind' ],
|
|
90
|
+
:cwe => '78',
|
|
91
|
+
:severity => Issue::Severity::HIGH,
|
|
92
|
+
:cvssv2 => '9.0',
|
|
93
|
+
:remedy_guidance => %q{User inputs must be validated and filtered
|
|
94
|
+
before being evaluated as OS level commands.},
|
|
95
|
+
:remedy_code => '',
|
|
96
|
+
:metasploitable => 'unix/webapp/arachni_exec'
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
}
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# Path Traversal audit module.
|
|
17
|
+
#
|
|
18
|
+
# @author: Tasos "Zapotek" Laskos
|
|
19
|
+
# <tasos.laskos@gmail.com>
|
|
20
|
+
# <zapotek@segfault.gr>
|
|
21
|
+
# @version: 0.2.1
|
|
22
|
+
#
|
|
23
|
+
# @see http://cwe.mitre.org/data/definitions/22.html
|
|
24
|
+
# @see http://www.owasp.org/index.php/Path_Traversal
|
|
25
|
+
# @see http://projects.webappsec.org/Path-Traversal
|
|
26
|
+
#
|
|
27
|
+
class PathTraversal < Arachni::Module::Base
|
|
28
|
+
|
|
29
|
+
def initialize( page )
|
|
30
|
+
super( page )
|
|
31
|
+
|
|
32
|
+
@results = []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def prepare( )
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# the way this works is pretty cool since it will actually
|
|
39
|
+
# exploit the vulnerability in order to verify that it worked
|
|
40
|
+
# which also means that the results of the exploitation will
|
|
41
|
+
# appear in the report.
|
|
42
|
+
#
|
|
43
|
+
# *but* we may run into a web page that details the structure of
|
|
44
|
+
# the 'passwd' file and get a false positive; so we need to check
|
|
45
|
+
# the html code in @page.html before checking the responses of the audit
|
|
46
|
+
# and give accurate feedback about the context in which the vulnerability
|
|
47
|
+
# was flagged.
|
|
48
|
+
#
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@__trv = '../../../../../../../../../../../../../../../../'
|
|
52
|
+
@__ext = [
|
|
53
|
+
"",
|
|
54
|
+
"\0.htm",
|
|
55
|
+
"\0.html",
|
|
56
|
+
"\0.asp",
|
|
57
|
+
"\0.aspx",
|
|
58
|
+
"\0.php",
|
|
59
|
+
"\0.txt",
|
|
60
|
+
"\0.gif",
|
|
61
|
+
"\0.jpg",
|
|
62
|
+
"\0.jpeg",
|
|
63
|
+
"\0.png",
|
|
64
|
+
"\0.css"
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
@__params = [
|
|
68
|
+
{
|
|
69
|
+
'value' => 'etc/passwd',
|
|
70
|
+
'regexp' => /\w+:.+:[0-9]+:[0-9]+:.+:[0-9a-zA-Z\/]+/i
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
'value' => 'boot.ini',
|
|
74
|
+
'regexp' => /\[boot loader\](.*)\[operating systems\]/i
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
@__opts = {
|
|
80
|
+
# we don't want the Auditor to interfere with our injecion strings
|
|
81
|
+
:format => [ Format::STRAIGHT ],
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def run( )
|
|
87
|
+
|
|
88
|
+
@__params.each {
|
|
89
|
+
|param|
|
|
90
|
+
|
|
91
|
+
@__opts[:regexp] = param['regexp']
|
|
92
|
+
@__ext.each {
|
|
93
|
+
|ext|
|
|
94
|
+
|
|
95
|
+
injection_str = @__trv + param['value'] + ext
|
|
96
|
+
audit( injection_str, @__opts )
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def self.info
|
|
103
|
+
{
|
|
104
|
+
:name => 'PathTraversal',
|
|
105
|
+
:description => %q{It injects paths of common files (/etc/passwd and boot.ini)
|
|
106
|
+
and evaluates the existance of a path traversal vulnerability
|
|
107
|
+
based on the presence of relevant content in the HTML responses.},
|
|
108
|
+
:elements => [
|
|
109
|
+
Issue::Element::FORM,
|
|
110
|
+
Issue::Element::LINK,
|
|
111
|
+
Issue::Element::COOKIE,
|
|
112
|
+
Issue::Element::HEADER
|
|
113
|
+
],
|
|
114
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
115
|
+
:version => '0.2.1',
|
|
116
|
+
:references => {
|
|
117
|
+
'OWASP' => 'http://www.owasp.org/index.php/Path_Traversal',
|
|
118
|
+
'WASC' => 'http://projects.webappsec.org/Path-Traversal'
|
|
119
|
+
},
|
|
120
|
+
:targets => { 'Generic' => 'all' },
|
|
121
|
+
|
|
122
|
+
:issue => {
|
|
123
|
+
:name => %q{Path Traversal},
|
|
124
|
+
:description => %q{The web application enforces improper limitation
|
|
125
|
+
of a pathname to a restricted directory.},
|
|
126
|
+
:tags => [ 'path', 'traversal', 'injection', 'regexp' ],
|
|
127
|
+
:cwe => '22',
|
|
128
|
+
:severity => Issue::Severity::MEDIUM,
|
|
129
|
+
:cvssv2 => '4.3',
|
|
130
|
+
:remedy_guidance => %q{User inputs must be validated and filtered
|
|
131
|
+
before being used as a part of a filesystem path.},
|
|
132
|
+
:remedy_code => '',
|
|
133
|
+
:metasploitable => 'unix/webapp/arachni_path_traversal'
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# HTTP Response Splitting audit module.
|
|
17
|
+
#
|
|
18
|
+
# It audits links, forms and cookies.
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
# @author: Tasos "Zapotek" Laskos
|
|
22
|
+
# <tasos.laskos@gmail.com>
|
|
23
|
+
# <zapotek@segfault.gr>
|
|
24
|
+
# @version: 0.1.5
|
|
25
|
+
#
|
|
26
|
+
# @see http://cwe.mitre.org/data/definitions/20.html
|
|
27
|
+
# @see http://www.owasp.org/index.php/HTTP_Response_Splitting
|
|
28
|
+
# @see http://www.securiteam.com/securityreviews/5WP0E2KFGK.html
|
|
29
|
+
#
|
|
30
|
+
class ResponseSplitting < Arachni::Module::Base
|
|
31
|
+
|
|
32
|
+
def initialize( page )
|
|
33
|
+
super( page )
|
|
34
|
+
|
|
35
|
+
# initialize the header
|
|
36
|
+
@__header = ''
|
|
37
|
+
|
|
38
|
+
# initialize the array that will hold the results
|
|
39
|
+
@results = []
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def prepare( )
|
|
43
|
+
|
|
44
|
+
# the header to inject...
|
|
45
|
+
# what we will check for in the response header
|
|
46
|
+
# is the existence of the "x-crlf-safe" field.
|
|
47
|
+
# if we find it it means that the attack was succesful
|
|
48
|
+
# thus site is vulnerable.
|
|
49
|
+
@__header = "\r\nX-CRLF-Safe: no"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def run( )
|
|
53
|
+
|
|
54
|
+
# try to inject the headers into all vectors
|
|
55
|
+
# and pass a block that will check for a positive result
|
|
56
|
+
audit( @__header, :param_flip => true ) {
|
|
57
|
+
|res, opts|
|
|
58
|
+
if res.headers_hash['X-CRLF-Safe'] &&
|
|
59
|
+
!res.headers_hash['X-CRLF-Safe'].empty?
|
|
60
|
+
|
|
61
|
+
opts[:injected] = URI.encode( opts[:injected] )
|
|
62
|
+
log( opts, res )
|
|
63
|
+
end
|
|
64
|
+
}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def self.info
|
|
69
|
+
{
|
|
70
|
+
:name => 'ResponseSplitting',
|
|
71
|
+
:description => %q{Tries to inject some data into the webapp and figure out
|
|
72
|
+
if any of them end up in the response header.},
|
|
73
|
+
:elements => [
|
|
74
|
+
Issue::Element::FORM,
|
|
75
|
+
Issue::Element::LINK,
|
|
76
|
+
Issue::Element::COOKIE,
|
|
77
|
+
Issue::Element::HEADER
|
|
78
|
+
],
|
|
79
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
80
|
+
:version => '0.1.5',
|
|
81
|
+
:references => {
|
|
82
|
+
'SecuriTeam' => 'http://www.securiteam.com/securityreviews/5WP0E2KFGK.html',
|
|
83
|
+
'OWASP' => 'http://www.owasp.org/index.php/HTTP_Response_Splitting'
|
|
84
|
+
},
|
|
85
|
+
:targets => { 'Generic' => 'all' },
|
|
86
|
+
|
|
87
|
+
:issue => {
|
|
88
|
+
:name => %q{Response splitting},
|
|
89
|
+
:description => %q{The web application includes user input
|
|
90
|
+
in the response HTTP header.},
|
|
91
|
+
:tags => [ 'response', 'splitting', 'injection', 'header' ],
|
|
92
|
+
:cwe => '20',
|
|
93
|
+
:severity => Issue::Severity::MEDIUM,
|
|
94
|
+
:cvssv2 => '5.0',
|
|
95
|
+
:remedy_guidance => %q{User inputs must be validated and filtered
|
|
96
|
+
before being included as part of the HTTP response headers.},
|
|
97
|
+
:remedy_code => '',
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
$Id$
|
|
3
|
+
|
|
4
|
+
Arachni
|
|
5
|
+
Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
|
6
|
+
|
|
7
|
+
This is free software; you can copy and distribute and modify
|
|
8
|
+
this program under the term of the GPL v2.0 License
|
|
9
|
+
(See LICENSE file for details)
|
|
10
|
+
|
|
11
|
+
=end
|
|
12
|
+
|
|
13
|
+
module Arachni
|
|
14
|
+
|
|
15
|
+
module Modules
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# Simple Remote File Inclusion tutorial module.
|
|
19
|
+
#
|
|
20
|
+
# It audits links, forms and cookies and will give you a good idea<br/>
|
|
21
|
+
# of how to write modules for Arachni.
|
|
22
|
+
#
|
|
23
|
+
#
|
|
24
|
+
# @author: Tasos "Zapotek" Laskos
|
|
25
|
+
# <tasos.laskos@gmail.com>
|
|
26
|
+
# <zapotek@segfault.gr>
|
|
27
|
+
# @version: 0.1.3
|
|
28
|
+
#
|
|
29
|
+
# @see http://cwe.mitre.org/data/definitions/94.html
|
|
30
|
+
# @see http://projects.webappsec.org/Remote-File-Inclusion
|
|
31
|
+
# @see http://en.wikipedia.org/wiki/Remote_File_Inclusion
|
|
32
|
+
#
|
|
33
|
+
class RFI < Arachni::Module::Base # *always* extend Arachni::Module::Base
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Arachni::Module::HTTP instance
|
|
37
|
+
#
|
|
38
|
+
# You don't really need to declare this,
|
|
39
|
+
# you inherit it from Arachni::Module
|
|
40
|
+
#
|
|
41
|
+
# It's an initialized object of the Arachni::Module::HTTP instance
|
|
42
|
+
# class configured with proxy, authentication, SSL settings etc.
|
|
43
|
+
#
|
|
44
|
+
# Look at Arachni::Module::HTTP instance doc to see what you get.
|
|
45
|
+
#
|
|
46
|
+
# If you need direct access to the Net::HTTP session you can get
|
|
47
|
+
# it from @http.session
|
|
48
|
+
#
|
|
49
|
+
# @return [Arachni::Module::HTTP]
|
|
50
|
+
#
|
|
51
|
+
attr_reader :http
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# REQUIRED
|
|
55
|
+
#
|
|
56
|
+
# Initializes the module and the parent.
|
|
57
|
+
#
|
|
58
|
+
# @see Arachni::Module::Base
|
|
59
|
+
# @see Page
|
|
60
|
+
#
|
|
61
|
+
# @param [Page] page you can always expect this to be provided
|
|
62
|
+
# by the system.
|
|
63
|
+
#
|
|
64
|
+
def initialize( page )
|
|
65
|
+
# unless you want to do something freaky
|
|
66
|
+
# *do not* ommit the following line
|
|
67
|
+
super( page )
|
|
68
|
+
|
|
69
|
+
# init your stuff here
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# OPTIONAL
|
|
74
|
+
#
|
|
75
|
+
# Gets called before any other method, right after initialization.
|
|
76
|
+
# It provides you with a way to setup your module's data.
|
|
77
|
+
#
|
|
78
|
+
# It may be redundant but it's optional anyways...
|
|
79
|
+
#
|
|
80
|
+
def prepare( )
|
|
81
|
+
#
|
|
82
|
+
# You can use print_debug() for debugging.
|
|
83
|
+
# Don't over-do ti though, debugging messages are supposed to
|
|
84
|
+
# be helpful don't flood the output.
|
|
85
|
+
#
|
|
86
|
+
# Debugging output will only appear if "--debug" is enabled.
|
|
87
|
+
#
|
|
88
|
+
print_debug( 'In prepare()' )
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# you can setup your module's environment as you wish
|
|
92
|
+
# but it's good practice to prefix your attributes and methods
|
|
93
|
+
# with 2 underscores ( @__foo_attr, __foo_meth() )
|
|
94
|
+
#
|
|
95
|
+
@__opts = {}
|
|
96
|
+
@__opts[:substring] = '705cd559b16e6946826207c2199bd890'
|
|
97
|
+
|
|
98
|
+
# inject this url to assess RFI
|
|
99
|
+
@__injection_url = 'http://zapotek.github.com/arachni/rfi.md5.txt'
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# the module can be made to detect XSS and many other kinds
|
|
104
|
+
# of attack just as easily if you adjust the above attributes
|
|
105
|
+
# accordingly.
|
|
106
|
+
#
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# REQUIRED
|
|
112
|
+
#
|
|
113
|
+
# This is used to deliver the module's payload whatever it may be.
|
|
114
|
+
#
|
|
115
|
+
def run( )
|
|
116
|
+
print_debug( 'In run()' )
|
|
117
|
+
|
|
118
|
+
audit( @__injection_url, @__opts )
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
#
|
|
122
|
+
# OPTIONAL
|
|
123
|
+
#
|
|
124
|
+
# This is called after run() has finished executing,
|
|
125
|
+
# it allows you to clean up after yourself.
|
|
126
|
+
#
|
|
127
|
+
# May also be redundant but, once again, it's optional
|
|
128
|
+
#
|
|
129
|
+
def clean_up( )
|
|
130
|
+
print_debug( 'In clean_up()' )
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
#
|
|
134
|
+
# REQUIRED
|
|
135
|
+
#
|
|
136
|
+
# Do not ommit any of the info.
|
|
137
|
+
#
|
|
138
|
+
def self.info
|
|
139
|
+
{
|
|
140
|
+
:name => 'Remote File Inclusion',
|
|
141
|
+
:description => %q{It injects a remote URL in all available
|
|
142
|
+
inputs and checks for relevant content in the HTTP response body.},
|
|
143
|
+
#
|
|
144
|
+
# Arachni needs to know what elements the module plans to audit
|
|
145
|
+
# before invoking it. If a page doesn't have any of those elements
|
|
146
|
+
# there's no point putting the module in the thread queue.
|
|
147
|
+
#
|
|
148
|
+
# If you want the module to run no-matter what leave the array
|
|
149
|
+
# empty or don't define it at all.
|
|
150
|
+
#
|
|
151
|
+
:elements => [
|
|
152
|
+
Issue::Element::FORM,
|
|
153
|
+
Issue::Element::LINK,
|
|
154
|
+
Issue::Element::COOKIE,
|
|
155
|
+
Issue::Element::HEADER
|
|
156
|
+
],
|
|
157
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
158
|
+
:version => '0.1.3',
|
|
159
|
+
:references => {
|
|
160
|
+
'WASC' => 'http://projects.webappsec.org/Remote-File-Inclusion',
|
|
161
|
+
'Wikipedia' => 'http://en.wikipedia.org/wiki/Remote_File_Inclusion'
|
|
162
|
+
},
|
|
163
|
+
:targets => { 'Generic' => 'all' },
|
|
164
|
+
|
|
165
|
+
:issue => {
|
|
166
|
+
:name => %q{Remote file inclusion},
|
|
167
|
+
:description => %q{The web application can be forced to include
|
|
168
|
+
3rd party remote content which can often lead to arbitrary code
|
|
169
|
+
execution, amongst other attacks.},
|
|
170
|
+
:tags => [ 'remote', 'file', 'inclusion', 'injection', 'regexp' ],
|
|
171
|
+
:cwe => '94',
|
|
172
|
+
#
|
|
173
|
+
# Severity can be:
|
|
174
|
+
#
|
|
175
|
+
# Issue::Severity::HIGH
|
|
176
|
+
# Issue::Severity::MEDIUM
|
|
177
|
+
# Issue::Severity::LOW
|
|
178
|
+
# Issue::Severity::INFORMATIONAL
|
|
179
|
+
#
|
|
180
|
+
:severity => Issue::Severity::HIGH,
|
|
181
|
+
:cvssv2 => '7.5',
|
|
182
|
+
:remedy_guidance => %q{Enforce strict validation and filtering
|
|
183
|
+
on user inputs.},
|
|
184
|
+
:remedy_code => '',
|
|
185
|
+
:metasploitable => 'unix/webapp/arachni_php_include'
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
}
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|