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.
Files changed (262) hide show
  1. data/ACKNOWLEDGMENTS.md +14 -0
  2. data/AUTHORS.md +6 -0
  3. data/CHANGELOG.md +162 -0
  4. data/CONTRIBUTORS.md +10 -0
  5. data/EXPLOITATION.md +429 -0
  6. data/HACKING.md +101 -0
  7. data/LICENSE.md +341 -0
  8. data/README.md +350 -0
  9. data/Rakefile +86 -0
  10. data/bin/arachni +22 -0
  11. data/bin/arachni_web +77 -0
  12. data/bin/arachni_xmlrpc +21 -0
  13. data/bin/arachni_xmlrpcd +82 -0
  14. data/bin/arachni_xmlrpcd_monitor +74 -0
  15. data/conf/README.webui.yaml.txt +44 -0
  16. data/conf/webui.yaml +11 -0
  17. data/external/metasploit/LICENSE +24 -0
  18. data/external/metasploit/modules/exploits/unix/webapp/arachni_exec.rb +142 -0
  19. data/external/metasploit/modules/exploits/unix/webapp/arachni_path_traversal.rb +113 -0
  20. data/external/metasploit/modules/exploits/unix/webapp/arachni_php_eval.rb +150 -0
  21. data/external/metasploit/modules/exploits/unix/webapp/arachni_php_include.rb +141 -0
  22. data/external/metasploit/modules/exploits/unix/webapp/arachni_sqlmap.rb +92 -0
  23. data/external/metasploit/plugins/arachni.rb +536 -0
  24. data/getoptslong.rb +241 -0
  25. data/lib/anemone.rb +2 -0
  26. data/lib/anemone/cookie_store.rb +35 -0
  27. data/lib/anemone/core.rb +371 -0
  28. data/lib/anemone/exceptions.rb +5 -0
  29. data/lib/anemone/http.rb +144 -0
  30. data/lib/anemone/page.rb +337 -0
  31. data/lib/anemone/page_store.rb +160 -0
  32. data/lib/anemone/storage.rb +34 -0
  33. data/lib/anemone/storage/base.rb +75 -0
  34. data/lib/anemone/storage/exceptions.rb +15 -0
  35. data/lib/anemone/storage/mongodb.rb +89 -0
  36. data/lib/anemone/storage/pstore.rb +50 -0
  37. data/lib/anemone/storage/redis.rb +90 -0
  38. data/lib/anemone/storage/tokyo_cabinet.rb +57 -0
  39. data/lib/anemone/tentacle.rb +40 -0
  40. data/lib/arachni.rb +16 -0
  41. data/lib/audit_store.rb +346 -0
  42. data/lib/component_manager.rb +293 -0
  43. data/lib/component_options.rb +395 -0
  44. data/lib/exceptions.rb +76 -0
  45. data/lib/framework.rb +637 -0
  46. data/lib/http.rb +809 -0
  47. data/lib/issue.rb +302 -0
  48. data/lib/module.rb +4 -0
  49. data/lib/module/auditor.rb +455 -0
  50. data/lib/module/base.rb +188 -0
  51. data/lib/module/element_db.rb +158 -0
  52. data/lib/module/key_filler.rb +87 -0
  53. data/lib/module/manager.rb +87 -0
  54. data/lib/module/output.rb +68 -0
  55. data/lib/module/trainer.rb +240 -0
  56. data/lib/module/utilities.rb +110 -0
  57. data/lib/options.rb +547 -0
  58. data/lib/parser.rb +2 -0
  59. data/lib/parser/auditable.rb +522 -0
  60. data/lib/parser/elements.rb +296 -0
  61. data/lib/parser/page.rb +149 -0
  62. data/lib/parser/parser.rb +717 -0
  63. data/lib/plugin.rb +4 -0
  64. data/lib/plugin/base.rb +110 -0
  65. data/lib/plugin/manager.rb +162 -0
  66. data/lib/report.rb +4 -0
  67. data/lib/report/base.rb +119 -0
  68. data/lib/report/manager.rb +92 -0
  69. data/lib/rpc/xml/client/base.rb +71 -0
  70. data/lib/rpc/xml/client/dispatcher.rb +49 -0
  71. data/lib/rpc/xml/client/instance.rb +88 -0
  72. data/lib/rpc/xml/server/base.rb +90 -0
  73. data/lib/rpc/xml/server/dispatcher.rb +357 -0
  74. data/lib/rpc/xml/server/framework.rb +206 -0
  75. data/lib/rpc/xml/server/instance.rb +191 -0
  76. data/lib/rpc/xml/server/module/manager.rb +46 -0
  77. data/lib/rpc/xml/server/options.rb +124 -0
  78. data/lib/rpc/xml/server/output.rb +299 -0
  79. data/lib/rpc/xml/server/plugin/manager.rb +58 -0
  80. data/lib/ruby.rb +5 -0
  81. data/lib/ruby/object.rb +32 -0
  82. data/lib/ruby/string.rb +74 -0
  83. data/lib/ruby/xmlrpc/server.rb +27 -0
  84. data/lib/spider.rb +200 -0
  85. data/lib/typhoeus/request.rb +91 -0
  86. data/lib/typhoeus/response.rb +34 -0
  87. data/lib/ui/cli/cli.rb +744 -0
  88. data/lib/ui/cli/output.rb +279 -0
  89. data/lib/ui/web/log.rb +82 -0
  90. data/lib/ui/web/output_stream.rb +94 -0
  91. data/lib/ui/web/report_manager.rb +222 -0
  92. data/lib/ui/web/server.rb +903 -0
  93. data/lib/ui/web/server/db/placeholder +0 -0
  94. data/lib/ui/web/server/public/banner.png +0 -0
  95. data/lib/ui/web/server/public/bodybg-small.png +0 -0
  96. data/lib/ui/web/server/public/bodybg.png +0 -0
  97. data/lib/ui/web/server/public/css/smoothness/images/pbar-ani.gif +0 -0
  98. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  99. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  100. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  101. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  102. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  103. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  104. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  105. data/lib/ui/web/server/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  106. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  107. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  108. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  109. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  110. data/lib/ui/web/server/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  111. data/lib/ui/web/server/public/css/smoothness/jquery-ui-1.8.9.custom.css +573 -0
  112. data/lib/ui/web/server/public/favicon.ico +0 -0
  113. data/lib/ui/web/server/public/footer.jpg +0 -0
  114. data/lib/ui/web/server/public/icons/error.png +0 -0
  115. data/lib/ui/web/server/public/icons/info.png +0 -0
  116. data/lib/ui/web/server/public/icons/ok.png +0 -0
  117. data/lib/ui/web/server/public/icons/status.png +0 -0
  118. data/lib/ui/web/server/public/js/jquery-1.4.4.min.js +167 -0
  119. data/lib/ui/web/server/public/js/jquery-ui-1.8.9.custom.min.js +781 -0
  120. data/lib/ui/web/server/public/logo.png +0 -0
  121. data/lib/ui/web/server/public/nav-left.jpg +0 -0
  122. data/lib/ui/web/server/public/nav-right.jpg +0 -0
  123. data/lib/ui/web/server/public/nav-selected-left.jpg +0 -0
  124. data/lib/ui/web/server/public/nav-selected-right.jpg +0 -0
  125. data/lib/ui/web/server/public/reports/placeholder +1 -0
  126. data/lib/ui/web/server/public/sidebar-bottom.jpg +0 -0
  127. data/lib/ui/web/server/public/sidebar-h4.jpg +0 -0
  128. data/lib/ui/web/server/public/sidebar-top.jpg +0 -0
  129. data/lib/ui/web/server/public/spider.png +0 -0
  130. data/lib/ui/web/server/public/style.css +604 -0
  131. data/lib/ui/web/server/tmp/placeholder +0 -0
  132. data/lib/ui/web/server/views/dispatcher.erb +85 -0
  133. data/lib/ui/web/server/views/dispatcher_error.erb +14 -0
  134. data/lib/ui/web/server/views/error.erb +1 -0
  135. data/lib/ui/web/server/views/flash.erb +18 -0
  136. data/lib/ui/web/server/views/home.erb +14 -0
  137. data/lib/ui/web/server/views/instance.erb +213 -0
  138. data/lib/ui/web/server/views/layout.erb +95 -0
  139. data/lib/ui/web/server/views/log.erb +40 -0
  140. data/lib/ui/web/server/views/modules.erb +71 -0
  141. data/lib/ui/web/server/views/options.erb +23 -0
  142. data/lib/ui/web/server/views/output_results.erb +51 -0
  143. data/lib/ui/web/server/views/plugins.erb +42 -0
  144. data/lib/ui/web/server/views/report_formats.erb +30 -0
  145. data/lib/ui/web/server/views/reports.erb +55 -0
  146. data/lib/ui/web/server/views/settings.erb +120 -0
  147. data/lib/ui/web/server/views/welcome.erb +38 -0
  148. data/lib/ui/xmlrpc/dispatcher_monitor.rb +204 -0
  149. data/lib/ui/xmlrpc/xmlrpc.rb +843 -0
  150. data/logs/placeholder +0 -0
  151. data/metamodules/autothrottle.rb +74 -0
  152. data/metamodules/timeout_notice.rb +118 -0
  153. data/metamodules/uniformity.rb +98 -0
  154. data/modules/audit/code_injection.rb +136 -0
  155. data/modules/audit/code_injection_timing.rb +115 -0
  156. data/modules/audit/code_injection_timing/payloads.txt +4 -0
  157. data/modules/audit/csrf.rb +301 -0
  158. data/modules/audit/ldapi.rb +103 -0
  159. data/modules/audit/ldapi/errors.txt +26 -0
  160. data/modules/audit/os_cmd_injection.rb +103 -0
  161. data/modules/audit/os_cmd_injection/payloads.txt +2 -0
  162. data/modules/audit/os_cmd_injection_timing.rb +104 -0
  163. data/modules/audit/os_cmd_injection_timing/payloads.txt +3 -0
  164. data/modules/audit/path_traversal.rb +141 -0
  165. data/modules/audit/response_splitting.rb +105 -0
  166. data/modules/audit/rfi.rb +193 -0
  167. data/modules/audit/sqli.rb +120 -0
  168. data/modules/audit/sqli/regexp_ids.txt +90 -0
  169. data/modules/audit/sqli_blind_rdiff.rb +321 -0
  170. data/modules/audit/sqli_blind_timing.rb +103 -0
  171. data/modules/audit/sqli_blind_timing/payloads.txt +51 -0
  172. data/modules/audit/trainer.rb +89 -0
  173. data/modules/audit/unvalidated_redirect.rb +90 -0
  174. data/modules/audit/xpath.rb +104 -0
  175. data/modules/audit/xpath/errors.txt +26 -0
  176. data/modules/audit/xss.rb +99 -0
  177. data/modules/audit/xss_event.rb +134 -0
  178. data/modules/audit/xss_path.rb +125 -0
  179. data/modules/audit/xss_script_tag.rb +112 -0
  180. data/modules/audit/xss_tag.rb +112 -0
  181. data/modules/audit/xss_uri.rb +125 -0
  182. data/modules/recon/allowed_methods.rb +104 -0
  183. data/modules/recon/backdoors.rb +131 -0
  184. data/modules/recon/backdoors/filenames.txt +16 -0
  185. data/modules/recon/backup_files.rb +177 -0
  186. data/modules/recon/backup_files/extensions.txt +28 -0
  187. data/modules/recon/common_directories.rb +138 -0
  188. data/modules/recon/common_directories/directories.txt +265 -0
  189. data/modules/recon/common_files.rb +138 -0
  190. data/modules/recon/common_files/filenames.txt +17 -0
  191. data/modules/recon/directory_listing.rb +171 -0
  192. data/modules/recon/grep/captcha.rb +62 -0
  193. data/modules/recon/grep/credit_card.rb +85 -0
  194. data/modules/recon/grep/cvs_svn_users.rb +73 -0
  195. data/modules/recon/grep/emails.rb +59 -0
  196. data/modules/recon/grep/html_objects.rb +53 -0
  197. data/modules/recon/grep/private_ip.rb +54 -0
  198. data/modules/recon/grep/ssn.rb +53 -0
  199. data/modules/recon/htaccess_limit.rb +82 -0
  200. data/modules/recon/http_put.rb +95 -0
  201. data/modules/recon/interesting_responses.rb +118 -0
  202. data/modules/recon/unencrypted_password_forms.rb +119 -0
  203. data/modules/recon/webdav.rb +126 -0
  204. data/modules/recon/xst.rb +107 -0
  205. data/path_extractors/anchors.rb +35 -0
  206. data/path_extractors/forms.rb +35 -0
  207. data/path_extractors/frames.rb +38 -0
  208. data/path_extractors/generic.rb +39 -0
  209. data/path_extractors/links.rb +35 -0
  210. data/path_extractors/meta_refresh.rb +39 -0
  211. data/path_extractors/scripts.rb +37 -0
  212. data/path_extractors/sitemap.rb +31 -0
  213. data/plugins/autologin.rb +137 -0
  214. data/plugins/content_types.rb +90 -0
  215. data/plugins/cookie_collector.rb +99 -0
  216. data/plugins/form_dicattack.rb +185 -0
  217. data/plugins/healthmap.rb +94 -0
  218. data/plugins/http_dicattack.rb +133 -0
  219. data/plugins/metamodules.rb +118 -0
  220. data/plugins/proxy.rb +248 -0
  221. data/plugins/proxy/server.rb +66 -0
  222. data/plugins/waf_detector.rb +184 -0
  223. data/profiles/comprehensive.afp +74 -0
  224. data/profiles/full.afp +75 -0
  225. data/reports/afr.rb +59 -0
  226. data/reports/ap.rb +55 -0
  227. data/reports/html.rb +179 -0
  228. data/reports/html/default.erb +967 -0
  229. data/reports/metareport.rb +139 -0
  230. data/reports/metareport/arachni_metareport.rb +174 -0
  231. data/reports/plugin_formatters/html/content_types.rb +82 -0
  232. data/reports/plugin_formatters/html/cookie_collector.rb +66 -0
  233. data/reports/plugin_formatters/html/form_dicattack.rb +54 -0
  234. data/reports/plugin_formatters/html/healthmap.rb +76 -0
  235. data/reports/plugin_formatters/html/http_dicattack.rb +54 -0
  236. data/reports/plugin_formatters/html/metaformatters/timeout_notice.rb +65 -0
  237. data/reports/plugin_formatters/html/metaformatters/uniformity.rb +71 -0
  238. data/reports/plugin_formatters/html/metamodules.rb +93 -0
  239. data/reports/plugin_formatters/html/waf_detector.rb +54 -0
  240. data/reports/plugin_formatters/stdout/content_types.rb +73 -0
  241. data/reports/plugin_formatters/stdout/cookie_collector.rb +61 -0
  242. data/reports/plugin_formatters/stdout/form_dicattack.rb +52 -0
  243. data/reports/plugin_formatters/stdout/healthmap.rb +72 -0
  244. data/reports/plugin_formatters/stdout/http_dicattack.rb +53 -0
  245. data/reports/plugin_formatters/stdout/metaformatters/timeout_notice.rb +55 -0
  246. data/reports/plugin_formatters/stdout/metaformatters/uniformity.rb +68 -0
  247. data/reports/plugin_formatters/stdout/metamodules.rb +89 -0
  248. data/reports/plugin_formatters/stdout/waf_detector.rb +48 -0
  249. data/reports/plugin_formatters/xml/content_types.rb +91 -0
  250. data/reports/plugin_formatters/xml/cookie_collector.rb +70 -0
  251. data/reports/plugin_formatters/xml/form_dicattack.rb +57 -0
  252. data/reports/plugin_formatters/xml/healthmap.rb +82 -0
  253. data/reports/plugin_formatters/xml/http_dicattack.rb +57 -0
  254. data/reports/plugin_formatters/xml/metaformatters/timeout_notice.rb +67 -0
  255. data/reports/plugin_formatters/xml/metaformatters/uniformity.rb +82 -0
  256. data/reports/plugin_formatters/xml/metamodules.rb +91 -0
  257. data/reports/plugin_formatters/xml/waf_detector.rb +58 -0
  258. data/reports/stdout.rb +182 -0
  259. data/reports/txt.rb +77 -0
  260. data/reports/xml.rb +231 -0
  261. data/reports/xml/buffer.rb +98 -0
  262. 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