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,35 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extracts paths from anchor elements.
|
|
15
|
+
#
|
|
16
|
+
# @author: Tasos "Zapotek" Laskos
|
|
17
|
+
# <tasos.laskos@gmail.com>
|
|
18
|
+
# <zapotek@segfault.gr>
|
|
19
|
+
# @version: 0.1
|
|
20
|
+
#
|
|
21
|
+
class Anchors < Paths
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Returns an array of paths as plain strings
|
|
25
|
+
#
|
|
26
|
+
# @param [Nokogiri] Nokogiri document
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>] paths
|
|
29
|
+
#
|
|
30
|
+
def run( doc )
|
|
31
|
+
doc.search( "//a[@href]" ).map { |a| a['href'] }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extracts paths from "form" HTML elements.
|
|
15
|
+
#
|
|
16
|
+
# @author: Tasos "Zapotek" Laskos
|
|
17
|
+
# <tasos.laskos@gmail.com>
|
|
18
|
+
# <zapotek@segfault.gr>
|
|
19
|
+
# @version: 0.1
|
|
20
|
+
#
|
|
21
|
+
class Forms < Paths
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Returns an array of paths as plain strings
|
|
25
|
+
#
|
|
26
|
+
# @param [Nokogiri] Nokogiri document
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>] paths
|
|
29
|
+
#
|
|
30
|
+
def run( doc )
|
|
31
|
+
doc.search( "//form[@action]" ).map { |a| a['action'] }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extracts paths from frames.
|
|
15
|
+
#
|
|
16
|
+
# @author: Tasos "Zapotek" Laskos
|
|
17
|
+
# <tasos.laskos@gmail.com>
|
|
18
|
+
# <zapotek@segfault.gr>
|
|
19
|
+
# @version: 0.1
|
|
20
|
+
#
|
|
21
|
+
class Frames < Paths
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Returns an array of paths as plain strings
|
|
25
|
+
#
|
|
26
|
+
# @param [Nokogiri] Nokogiri document
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>] paths
|
|
29
|
+
#
|
|
30
|
+
def run( doc )
|
|
31
|
+
doc.css( 'frame', 'iframe' ).map {
|
|
32
|
+
|a|
|
|
33
|
+
a.attributes['src'].content rescue next
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extract URLs from arbitrary text.
|
|
15
|
+
#
|
|
16
|
+
# You might think that this renders the rest path extractors redundant
|
|
17
|
+
# but the others can extract paths from HTML attributes, this one can only extract
|
|
18
|
+
# full URLs.
|
|
19
|
+
#
|
|
20
|
+
# @author: Tasos "Zapotek" Laskos
|
|
21
|
+
# <tasos.laskos@gmail.com>
|
|
22
|
+
# <zapotek@segfault.gr>
|
|
23
|
+
# @version: 0.1
|
|
24
|
+
#
|
|
25
|
+
class Generic < Paths
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Returns an array of paths as plain strings
|
|
29
|
+
#
|
|
30
|
+
# @param [Nokogiri] Nokogiri document
|
|
31
|
+
#
|
|
32
|
+
# @return [Array<String>] paths
|
|
33
|
+
#
|
|
34
|
+
def run( doc )
|
|
35
|
+
URI.extract( doc.to_s )
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extracts paths from "link" HTML elements.
|
|
15
|
+
#
|
|
16
|
+
# @author: Tasos "Zapotek" Laskos
|
|
17
|
+
# <tasos.laskos@gmail.com>
|
|
18
|
+
# <zapotek@segfault.gr>
|
|
19
|
+
# @version: 0.1
|
|
20
|
+
#
|
|
21
|
+
class Links < Paths
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Returns an array of paths as plain strings
|
|
25
|
+
#
|
|
26
|
+
# @param [Nokogiri] Nokogiri document
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>] paths
|
|
29
|
+
#
|
|
30
|
+
def run( doc )
|
|
31
|
+
doc.search( "//link[@href]" ).map { |a| a['href'] }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extracts meta refresh URLs.
|
|
15
|
+
#
|
|
16
|
+
# @author: Tasos "Zapotek" Laskos
|
|
17
|
+
# <tasos.laskos@gmail.com>
|
|
18
|
+
# <zapotek@segfault.gr>
|
|
19
|
+
# @version: 0.1
|
|
20
|
+
#
|
|
21
|
+
class MetaRefresh < Paths
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Returns an array of paths as plain strings
|
|
25
|
+
#
|
|
26
|
+
# @param [Nokogiri] Nokogiri document
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>] paths
|
|
29
|
+
#
|
|
30
|
+
def run( doc )
|
|
31
|
+
begin
|
|
32
|
+
doc.search( "//meta[@http-equiv='refresh']" ).
|
|
33
|
+
map { |url| url['content'].split( ';' )[1].split( '=' )[1] }
|
|
34
|
+
rescue
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Extracts paths from "script" HTML elements.<br/>
|
|
15
|
+
# Both from "src" and the text inside the scripts.
|
|
16
|
+
#
|
|
17
|
+
# @author: Tasos "Zapotek" Laskos
|
|
18
|
+
# <tasos.laskos@gmail.com>
|
|
19
|
+
# <zapotek@segfault.gr>
|
|
20
|
+
# @version: 0.1
|
|
21
|
+
#
|
|
22
|
+
class Scripts < Paths
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Returns an array of paths as plain strings
|
|
26
|
+
#
|
|
27
|
+
# @param [Nokogiri] Nokogiri document
|
|
28
|
+
#
|
|
29
|
+
# @return [Array<String>] paths
|
|
30
|
+
#
|
|
31
|
+
def run( doc )
|
|
32
|
+
doc.search( "//script[@src]" ).map { |a| a['src'] } |
|
|
33
|
+
doc.search( "//script" ).map { |script| URI.extract( script.to_s ) }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
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 Anemone::Extractors
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# @author: Tasos "Zapotek" Laskos
|
|
15
|
+
# <tasos.laskos@gmail.com>
|
|
16
|
+
# <zapotek@segfault.gr>
|
|
17
|
+
# @version: 0.1
|
|
18
|
+
#
|
|
19
|
+
class Sitemap < Paths
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# @param [Nokogiri] Nokogiri document
|
|
23
|
+
#
|
|
24
|
+
# @return [Array<String>] paths
|
|
25
|
+
#
|
|
26
|
+
def run( doc )
|
|
27
|
+
[ '/sitemap.xml', '/sitemap.xml.gz' ]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
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 Plugins
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Automated login plugin.
|
|
16
|
+
#
|
|
17
|
+
# It looks for the login form in the user provided URL,
|
|
18
|
+
# merges its input field with the user supplied parameters and sets the cookies
|
|
19
|
+
# of the response as framework-wide cookies to be used by the spider later on.
|
|
20
|
+
#
|
|
21
|
+
# @author: Tasos "Zapotek" Laskos
|
|
22
|
+
# <tasos.laskos@gmail.com>
|
|
23
|
+
# <zapotek@segfault.gr>
|
|
24
|
+
# @version: 0.1
|
|
25
|
+
#
|
|
26
|
+
class AutoLogin < Arachni::Plugin::Base
|
|
27
|
+
|
|
28
|
+
attr_accessor :http
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# @param [Arachni::Framework] framework
|
|
32
|
+
# @param [Hash] options options passed to the plugin
|
|
33
|
+
#
|
|
34
|
+
def initialize( framework, options )
|
|
35
|
+
@framework = framework
|
|
36
|
+
@options = options
|
|
37
|
+
|
|
38
|
+
@framework.pause!
|
|
39
|
+
print_info( "System paused." )
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def prepare
|
|
43
|
+
@params = parse_params
|
|
44
|
+
|
|
45
|
+
# we need to declared this in order to pass ourselves
|
|
46
|
+
# as the auditor to the form later in order to submit it.
|
|
47
|
+
@http = @framework.http
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def run( )
|
|
51
|
+
|
|
52
|
+
# grab the page containing the login form
|
|
53
|
+
res = @framework.http.get( @options['url'], :async => false ).response
|
|
54
|
+
|
|
55
|
+
parser = Arachni::Parser.new( @framework.opts, res )
|
|
56
|
+
# parse the response as a Page object
|
|
57
|
+
page = parser.run
|
|
58
|
+
|
|
59
|
+
# find the login form
|
|
60
|
+
login_form = nil
|
|
61
|
+
page.forms.each {
|
|
62
|
+
|form|
|
|
63
|
+
login_form = form if login_form?( form )
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if !login_form
|
|
67
|
+
print_error( 'Could not find a form suiting the provided params at: ' +
|
|
68
|
+
@options['url'] )
|
|
69
|
+
return
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
name = login_form.raw['attrs']['name'] ? login_form.raw['attrs']['name'] : '<n/a>'
|
|
73
|
+
print_status( "Found log-in form with name: " + name )
|
|
74
|
+
|
|
75
|
+
# merge the input fields of the form with the user supplied parameters
|
|
76
|
+
login_form.auditable.merge!( @params )
|
|
77
|
+
|
|
78
|
+
# register us as the auditor
|
|
79
|
+
login_form.auditor( self )
|
|
80
|
+
res = login_form.submit( :async => false ).response
|
|
81
|
+
|
|
82
|
+
if !res
|
|
83
|
+
print_error( 'Form submitted but no response was returned.' )
|
|
84
|
+
return
|
|
85
|
+
else
|
|
86
|
+
print_ok( 'Form submitted successfully.' )
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def clean_up
|
|
92
|
+
@framework.resume!
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def login_form?( form )
|
|
96
|
+
avail = form.auditable.keys
|
|
97
|
+
provided = @params.keys
|
|
98
|
+
|
|
99
|
+
provided.each {
|
|
100
|
+
|name|
|
|
101
|
+
return false if !avail.include?( name )
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return true
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def parse_params
|
|
108
|
+
params = {}
|
|
109
|
+
@options['params'].split( '&' ).each {
|
|
110
|
+
|param|
|
|
111
|
+
k, v = param.split( '=', 2 )
|
|
112
|
+
params[k] = v
|
|
113
|
+
}
|
|
114
|
+
return params
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def self.info
|
|
119
|
+
{
|
|
120
|
+
:name => 'AutoLogin',
|
|
121
|
+
:description => %q{It looks for the login form in the user provided URL,
|
|
122
|
+
merges its input fields with the user supplied parameters and sets the cookies
|
|
123
|
+
of the response and request as framework-wide cookies to be used by the spider later on.
|
|
124
|
+
},
|
|
125
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
|
|
126
|
+
:version => '0.1',
|
|
127
|
+
:options => [
|
|
128
|
+
Arachni::OptUrl.new( 'url', [ true, 'The URL that contains the login form.' ] ),
|
|
129
|
+
Arachni::OptString.new( 'params', [ true, 'Form parameters to submit. ( username=user&password=pass )' ] )
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
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 Plugins
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Logs content-types of all server responses.
|
|
16
|
+
#
|
|
17
|
+
# @author: Tasos "Zapotek" Laskos
|
|
18
|
+
# <tasos.laskos@gmail.com>
|
|
19
|
+
# <zapotek@segfault.gr>
|
|
20
|
+
# @version: 0.1
|
|
21
|
+
#
|
|
22
|
+
class ContentTypes < Arachni::Plugin::Base
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# @param [Arachni::Framework] framework
|
|
26
|
+
# @param [Hash] options options passed to the plugin
|
|
27
|
+
#
|
|
28
|
+
def initialize( framework, options )
|
|
29
|
+
@framework = framework
|
|
30
|
+
@options = options
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def prepare
|
|
34
|
+
@results = {}
|
|
35
|
+
@exclude = Regexp.new( @options['exclude'] )
|
|
36
|
+
|
|
37
|
+
@logged = Set.new
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def run( )
|
|
41
|
+
@framework.http.on_complete {
|
|
42
|
+
|res|
|
|
43
|
+
|
|
44
|
+
next if @logged.include?( res.request.method.to_s.upcase + res.effective_url )
|
|
45
|
+
next if !(type = res.headers_hash['Content-type'] ) || type.empty?
|
|
46
|
+
|
|
47
|
+
if( !@options['exclude'].empty? && !type.match( @exclude ) ) ||
|
|
48
|
+
@options['exclude'].empty?
|
|
49
|
+
@results[type] ||= []
|
|
50
|
+
@results[type] << {
|
|
51
|
+
:url => res.effective_url,
|
|
52
|
+
:method => res.request.method.to_s.upcase,
|
|
53
|
+
:params => res.request.params
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@logged << res.request.method.to_s.upcase + res.effective_url
|
|
57
|
+
end
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def clean_up
|
|
62
|
+
# we need to wait until the framework has finished running
|
|
63
|
+
# before logging the results
|
|
64
|
+
while( @framework.running? )
|
|
65
|
+
::IO.select( nil, nil, nil, 1 )
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
register_results( @results )
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.info
|
|
72
|
+
{
|
|
73
|
+
:name => 'Content-types',
|
|
74
|
+
:description => %q{Logs content-types of server responses.
|
|
75
|
+
It can help you categorize and identify publicly available file-types
|
|
76
|
+
which in turn can help you identify accidentally leaked files.},
|
|
77
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
|
|
78
|
+
:version => '0.1',
|
|
79
|
+
:options => [
|
|
80
|
+
Arachni::OptString.new( 'exclude', [ false,
|
|
81
|
+
'Exclude content-types that match this regular expression.', 'text' ]
|
|
82
|
+
)
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
end
|