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,138 @@
|
|
|
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
|
+
# Looks for sensitive common files on the server.
|
|
17
|
+
#
|
|
18
|
+
# @author: Tasos "Zapotek" Laskos
|
|
19
|
+
# <tasos.laskos@gmail.com>
|
|
20
|
+
# <zapotek@segfault.gr>
|
|
21
|
+
# @version: 0.1.3
|
|
22
|
+
#
|
|
23
|
+
#
|
|
24
|
+
class CommonFiles < Arachni::Module::Base
|
|
25
|
+
|
|
26
|
+
include Arachni::Module::Utilities
|
|
27
|
+
|
|
28
|
+
def initialize( page )
|
|
29
|
+
super( page )
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def prepare
|
|
33
|
+
# to keep track of the requests and not repeat them
|
|
34
|
+
@@__audited ||= Set.new
|
|
35
|
+
|
|
36
|
+
# our results array
|
|
37
|
+
@results = []
|
|
38
|
+
|
|
39
|
+
@@__filenames ||=[]
|
|
40
|
+
return if !@@__filenames.empty?
|
|
41
|
+
|
|
42
|
+
read_file( 'filenames.txt' ) {
|
|
43
|
+
|file|
|
|
44
|
+
@@__filenames << file
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def run( )
|
|
49
|
+
|
|
50
|
+
path = get_path( @page.url )
|
|
51
|
+
return if @@__audited.include?( path )
|
|
52
|
+
|
|
53
|
+
print_status( "Scanning..." )
|
|
54
|
+
@@__filenames.each {
|
|
55
|
+
|file|
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# Test for the existance of the file
|
|
59
|
+
#
|
|
60
|
+
# We're not worrying about its contents, the Trainer will
|
|
61
|
+
# analyze it and if it's HTML it'll extract any new attack vectors.
|
|
62
|
+
#
|
|
63
|
+
|
|
64
|
+
url = path + file
|
|
65
|
+
|
|
66
|
+
print_status( "Checking for #{url}" )
|
|
67
|
+
|
|
68
|
+
req = @http.get( url, :train => true )
|
|
69
|
+
|
|
70
|
+
req.on_complete {
|
|
71
|
+
|res|
|
|
72
|
+
print_status( "Analyzing #{res.effective_url}" )
|
|
73
|
+
__log_results( res, file )
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@@__audited << path
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def self.info
|
|
82
|
+
{
|
|
83
|
+
:name => 'CommonFiles',
|
|
84
|
+
:description => %q{Tries to find common sensitive files on the server.},
|
|
85
|
+
:elements => [ ],
|
|
86
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
87
|
+
:version => '0.1.3',
|
|
88
|
+
:references => {},
|
|
89
|
+
:targets => { 'Generic' => 'all' },
|
|
90
|
+
:issue => {
|
|
91
|
+
:name => %q{A common sensitive file exists on the server.},
|
|
92
|
+
:description => %q{},
|
|
93
|
+
:tags => [ 'common', 'path', 'file' ],
|
|
94
|
+
:cwe => '',
|
|
95
|
+
:severity => Issue::Severity::LOW,
|
|
96
|
+
:cvssv2 => '',
|
|
97
|
+
:remedy_guidance => '',
|
|
98
|
+
:remedy_code => '',
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#
|
|
105
|
+
# Adds an issue to the @results array<br/>
|
|
106
|
+
# and outputs an "OK" message with the filename and its url.
|
|
107
|
+
#
|
|
108
|
+
# @param [Net::HTTPResponse] res the HTTP response
|
|
109
|
+
# @param [String] filename the discovered filename
|
|
110
|
+
#
|
|
111
|
+
def __log_results( res, filename )
|
|
112
|
+
|
|
113
|
+
return if( res.code != 200 || @http.custom_404?( res ) )
|
|
114
|
+
|
|
115
|
+
url = res.effective_url
|
|
116
|
+
# append the result to the results array
|
|
117
|
+
@results << Issue.new( {
|
|
118
|
+
:url => url,
|
|
119
|
+
:injected => filename,
|
|
120
|
+
:id => filename,
|
|
121
|
+
:elem => Issue::Element::PATH,
|
|
122
|
+
:response => res.body,
|
|
123
|
+
:headers => {
|
|
124
|
+
:request => res.request.headers,
|
|
125
|
+
:response => res.headers,
|
|
126
|
+
}
|
|
127
|
+
}.merge( self.class.info ) )
|
|
128
|
+
|
|
129
|
+
# register our results with the system
|
|
130
|
+
register_results( @results )
|
|
131
|
+
|
|
132
|
+
# inform the user that we have a match
|
|
133
|
+
print_ok( "Found #{filename} at " + url )
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
robots.txt
|
|
2
|
+
sitemap.xml
|
|
3
|
+
sitemap.xml.gz
|
|
4
|
+
phpinfo.php
|
|
5
|
+
CVS/Repository
|
|
6
|
+
CVS/Root
|
|
7
|
+
CVS/Entries
|
|
8
|
+
.git/HEAD
|
|
9
|
+
_mmServerScripts/MMHTTPDB.php
|
|
10
|
+
_mmServerScripts/MMHTTPDB.asp
|
|
11
|
+
_mmDBScripts/MMHTTPDB.php
|
|
12
|
+
_mmDBScripts/MMHTTPDB.asp
|
|
13
|
+
config/database.yml
|
|
14
|
+
install.php
|
|
15
|
+
wp-admin/install.php
|
|
16
|
+
wp-admin/setup-config.php
|
|
17
|
+
config.php
|
|
@@ -0,0 +1,171 @@
|
|
|
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
|
+
# Tries to force directory listings.
|
|
17
|
+
#
|
|
18
|
+
# Can't take credit for this one, it's Michal's (lcamtuf's) method from Skipfish.
|
|
19
|
+
#
|
|
20
|
+
# @author: Tasos "Zapotek" Laskos
|
|
21
|
+
# <tasos.laskos@gmail.com>
|
|
22
|
+
# <zapotek@segfault.gr>
|
|
23
|
+
# @version: 0.1
|
|
24
|
+
#
|
|
25
|
+
class DirectoryListing < Arachni::Module::Base
|
|
26
|
+
|
|
27
|
+
include Arachni::Module::Utilities
|
|
28
|
+
|
|
29
|
+
DIFF_THRESHOLD = 1000
|
|
30
|
+
|
|
31
|
+
def initialize( page )
|
|
32
|
+
super( page )
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def prepare
|
|
36
|
+
foo = File.basename( __FILE__, '.rb' )
|
|
37
|
+
@dirs = [
|
|
38
|
+
"\\.#{foo}\\",
|
|
39
|
+
"\\.\\",
|
|
40
|
+
".#{foo}/",
|
|
41
|
+
"./"
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
@@__checked ||= Set.new
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def run( )
|
|
48
|
+
|
|
49
|
+
path = get_path( @page.url )
|
|
50
|
+
|
|
51
|
+
return if !URI( path ).path || URI( path ).path.gsub( '/', '' ).empty?
|
|
52
|
+
|
|
53
|
+
# no redundant checks pl0x! kthxb.
|
|
54
|
+
return if @@__checked.include?( path )
|
|
55
|
+
|
|
56
|
+
@harvested = []
|
|
57
|
+
|
|
58
|
+
@dirs = [ @page.url ] | @dirs.map { |dir| path + dir } | [ path ]
|
|
59
|
+
@dirs.each_with_index {
|
|
60
|
+
|url, i|
|
|
61
|
+
|
|
62
|
+
@http.get( url ).on_complete {
|
|
63
|
+
|res|
|
|
64
|
+
|
|
65
|
+
if res
|
|
66
|
+
@harvested[i] = res
|
|
67
|
+
__check( path ) if __done_harvesting?
|
|
68
|
+
end
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def __done_harvesting?
|
|
75
|
+
|
|
76
|
+
return false if @harvested.size != 6
|
|
77
|
+
@harvested.each {
|
|
78
|
+
|res|
|
|
79
|
+
return false if !res
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def __check( path )
|
|
86
|
+
|
|
87
|
+
@@__checked << path
|
|
88
|
+
|
|
89
|
+
# if we have a 403 Forbidden it means that we succesfully
|
|
90
|
+
# built a pah which would force a directory listing *but*
|
|
91
|
+
# the web server kicked our asses...so let's run away like
|
|
92
|
+
# little girls...
|
|
93
|
+
@harvested.each {
|
|
94
|
+
|res|
|
|
95
|
+
return if res.code == 403
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if !File.basename( @harvested[0].effective_url, '?*' ).empty? &&
|
|
99
|
+
__same_page?( @harvested[0], @harvested[5] )
|
|
100
|
+
return
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if !__same_page?( @harvested[1], @harvested[0] ) &&
|
|
105
|
+
!__same_page?( @harvested[1], @harvested[2] )
|
|
106
|
+
__log_results( @harvested[5] )
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
if !__same_page?( @harvested[3], @harvested[0] ) &&
|
|
110
|
+
!__same_page?( @harvested[3], @harvested[4] )
|
|
111
|
+
__log_results( @harvested[5] )
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def __same_page?( res1, res2 )
|
|
117
|
+
|
|
118
|
+
# back out...
|
|
119
|
+
return false if res1.code != res2.code
|
|
120
|
+
return false if (res1.body.size - res2.body.size).abs > DIFF_THRESHOLD
|
|
121
|
+
|
|
122
|
+
return true
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def self.info
|
|
126
|
+
{
|
|
127
|
+
:name => 'Directory listing',
|
|
128
|
+
:description => %q{Tries to force directory listings.},
|
|
129
|
+
:elements => [ ],
|
|
130
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
|
|
131
|
+
:version => '0.1',
|
|
132
|
+
:references => {},
|
|
133
|
+
:targets => { 'Generic' => 'all' },
|
|
134
|
+
:issue => {
|
|
135
|
+
:name => %q{Directory listing is enabled.},
|
|
136
|
+
:description => %q{In most circumstances enabling directory listings is a bad practise
|
|
137
|
+
as it allows an attacker to better grasp the web application's structure.},
|
|
138
|
+
:tags => [ 'path', 'directory', 'listing', 'index' ],
|
|
139
|
+
:cwe => '548',
|
|
140
|
+
:severity => Issue::Severity::LOW,
|
|
141
|
+
:cvssv2 => '',
|
|
142
|
+
:remedy_guidance => '',
|
|
143
|
+
:remedy_code => '',
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def __log_results( res )
|
|
149
|
+
|
|
150
|
+
return if res.code != 200 || res.body.empty?
|
|
151
|
+
|
|
152
|
+
issue = Issue.new( {
|
|
153
|
+
:url => res.effective_url,
|
|
154
|
+
:method => res.request.method.to_s.upcase,
|
|
155
|
+
:elem => Issue::Element::SERVER,
|
|
156
|
+
:response => res.body,
|
|
157
|
+
:headers => {
|
|
158
|
+
:request => res.request.headers,
|
|
159
|
+
:response => res.headers,
|
|
160
|
+
}
|
|
161
|
+
}.merge( self.class.info ) )
|
|
162
|
+
|
|
163
|
+
# register our results with the system
|
|
164
|
+
register_results( [issue] )
|
|
165
|
+
|
|
166
|
+
print_ok( 'Found: ' + res.effective_url )
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
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 Modules
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
#
|
|
16
|
+
# @author: Tasos "Zapotek" Laskos
|
|
17
|
+
# <tasos.laskos@gmail.com>
|
|
18
|
+
# <zapotek@segfault.gr>
|
|
19
|
+
# @version: 0.1
|
|
20
|
+
#
|
|
21
|
+
class CAPTCHA < Arachni::Module::Base
|
|
22
|
+
|
|
23
|
+
def initialize( page )
|
|
24
|
+
@page = page
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def run( )
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
# since we only care about forms parse the HTML and match forms only
|
|
31
|
+
Nokogiri::HTML( @page.body ).xpath( "//form" ).each {
|
|
32
|
+
|form|
|
|
33
|
+
# pretty dumb way to do this but it's a pretty dumb issue anyways...
|
|
34
|
+
match_and_log( /captcha/i, form.to_s )
|
|
35
|
+
}
|
|
36
|
+
rescue
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.info
|
|
42
|
+
{
|
|
43
|
+
:name => 'CAPTCHA',
|
|
44
|
+
:description => %q{Greps pages for forms with CAPTCHAs.},
|
|
45
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
|
|
46
|
+
:version => '0.1',
|
|
47
|
+
:targets => { 'Generic' => 'all' },
|
|
48
|
+
:issue => {
|
|
49
|
+
:name => %q{Found a CAPTCHA protected form.},
|
|
50
|
+
:description => %q{Arachni can't audit CAPTCHA protected forms, consider auditing manually.},
|
|
51
|
+
:cwe => '',
|
|
52
|
+
:severity => Issue::Severity::INFORMATIONAL,
|
|
53
|
+
:cvssv2 => '',
|
|
54
|
+
:remedy_guidance => %q{},
|
|
55
|
+
:remedy_code => '',
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
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 Modules
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Credit Card Number recon module.
|
|
16
|
+
#
|
|
17
|
+
# Scans every page for credit card numbers.
|
|
18
|
+
#
|
|
19
|
+
# @author: morpheuslaw <msidagni@nopsec.com>
|
|
20
|
+
# @version: 0.1
|
|
21
|
+
#
|
|
22
|
+
class CreditCards < Arachni::Module::Base
|
|
23
|
+
|
|
24
|
+
def initialize( page )
|
|
25
|
+
@page = page
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def run( )
|
|
29
|
+
ccNumber = /\b(((4\d{3})|(5[1-5]\d{2})|(6011))-?\d{4}-?\d{4}-?\d{4}|3[4,7][\d\s-]{15})\b/
|
|
30
|
+
|
|
31
|
+
# match CC number candidates and verify matches before logging
|
|
32
|
+
match_and_log( ccNumber ){
|
|
33
|
+
|match|
|
|
34
|
+
__luhn_check( match )
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Checks for a valid credit card number
|
|
40
|
+
#
|
|
41
|
+
def __luhn_check( cc_number )
|
|
42
|
+
cc_number = cc_number.gsub( /D/, '' )
|
|
43
|
+
cc_length = cc_number.length
|
|
44
|
+
parity = cc_length % 2
|
|
45
|
+
|
|
46
|
+
sum = 0
|
|
47
|
+
for i in 0..cc_length
|
|
48
|
+
digit = cc_number[i].to_i - 48
|
|
49
|
+
|
|
50
|
+
if i % 2 == parity
|
|
51
|
+
digit = digit * 2
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if digit > 9
|
|
55
|
+
digit = digit - 9
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
sum = sum + digit
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
return (sum % 10) == 0
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.info
|
|
65
|
+
{
|
|
66
|
+
:name => 'Credit card number disclosure',
|
|
67
|
+
:description => %q{Scans pages for credit card numbers.},
|
|
68
|
+
:author => 'morpheuslaw <msidagni@nopsec.com>',
|
|
69
|
+
:version => '0.1',
|
|
70
|
+
:targets => { 'Generic' => 'all' },
|
|
71
|
+
:issue => {
|
|
72
|
+
:name => %q{Credit card number disclosure.},
|
|
73
|
+
:description => %q{A credit card number is disclosed in the body of the page.},
|
|
74
|
+
:cwe => '200',
|
|
75
|
+
:severity => Issue::Severity::MEDIUM,
|
|
76
|
+
:cvssv2 => '0',
|
|
77
|
+
:remedy_guidance => %q{Remove credit card numbers from the body of the HTML pages.},
|
|
78
|
+
:remedy_code => '',
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|