watobo 0.9.21 → 0.9.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (283) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -1
  3. data/bin/nfq_server.rb +0 -9
  4. data/bin/watobo_gui.rb +3 -13
  5. data/custom-views/prettify-json.rb +9 -18
  6. data/icons/watobo.ico +0 -0
  7. data/icons/watobo.ico.old +0 -0
  8. data/lib/watobo.rb +10 -19
  9. data/lib/watobo/adapters.rb +5 -14
  10. data/lib/watobo/adapters/data_store.rb +50 -59
  11. data/lib/watobo/adapters/file/file_store.rb +287 -296
  12. data/lib/watobo/adapters/file/marshal_store.rb +293 -296
  13. data/lib/watobo/adapters/session_store.rb +5 -14
  14. data/lib/watobo/ca.rb +1 -10
  15. data/lib/watobo/config.rb +197 -206
  16. data/lib/watobo/constants.rb +0 -9
  17. data/lib/watobo/core.rb +3 -12
  18. data/lib/watobo/core/active_check.rb +72 -135
  19. data/lib/watobo/core/active_checks.rb +49 -58
  20. data/lib/watobo/core/ca.rb +369 -389
  21. data/lib/watobo/core/cert_store.rb +34 -43
  22. data/lib/watobo/core/chat.rb +92 -101
  23. data/lib/watobo/core/chats.rb +271 -280
  24. data/lib/watobo/core/client_cert_store.rb +106 -35
  25. data/lib/watobo/core/conversation.rb +48 -57
  26. data/lib/watobo/core/cookie.rb +23 -32
  27. data/lib/watobo/core/egress_handlers.rb +98 -0
  28. data/lib/watobo/core/finding.rb +66 -75
  29. data/lib/watobo/core/findings.rb +107 -114
  30. data/lib/watobo/core/forwarding_proxy.rb +13 -22
  31. data/lib/watobo/core/fuzz_gen.rb +0 -9
  32. data/lib/watobo/core/intercept_carver.rb +166 -177
  33. data/lib/watobo/core/intercept_filter.rb +235 -244
  34. data/lib/watobo/core/interceptor.rb +98 -107
  35. data/lib/watobo/core/min_class.rb +4 -13
  36. data/lib/watobo/core/netfilter_queue.rb +170 -179
  37. data/lib/watobo/core/ott_cache.rb +132 -141
  38. data/lib/watobo/core/parameter.rb +43 -52
  39. data/lib/watobo/core/passive_check.rb +103 -102
  40. data/lib/watobo/core/passive_checks.rb +48 -57
  41. data/lib/watobo/core/passive_scanner.rb +54 -55
  42. data/lib/watobo/core/plugin.rb +11 -20
  43. data/lib/watobo/core/project.rb +3 -9
  44. data/lib/watobo/core/proxy.rb +43 -52
  45. data/lib/watobo/core/request.rb +125 -123
  46. data/lib/watobo/core/response.rb +44 -53
  47. data/lib/watobo/core/scanner.rb +0 -9
  48. data/lib/watobo/core/scanner3.rb +405 -414
  49. data/lib/watobo/core/scope.rb +83 -92
  50. data/lib/watobo/core/session.rb +1043 -1026
  51. data/lib/watobo/core/sid_cache.rb +98 -107
  52. data/lib/watobo/core/subscriber.rb +25 -34
  53. data/lib/watobo/defaults.rb +21 -30
  54. data/lib/watobo/external/diff/lcs.rb +0 -9
  55. data/lib/watobo/external/diff/lcs/array.rb +0 -9
  56. data/lib/watobo/external/diff/lcs/block.rb +0 -9
  57. data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
  58. data/lib/watobo/external/diff/lcs/change.rb +0 -9
  59. data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
  60. data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
  61. data/lib/watobo/external/diff/lcs/string.rb +0 -9
  62. data/lib/watobo/externals.rb +6 -15
  63. data/lib/watobo/framework.rb +4 -13
  64. data/lib/watobo/framework/create_project.rb +60 -69
  65. data/lib/watobo/framework/init.rb +0 -9
  66. data/lib/watobo/framework/init_modules.rb +0 -9
  67. data/lib/watobo/framework/license_text.rb +28 -37
  68. data/lib/watobo/framework/load_chat.rb +13 -22
  69. data/lib/watobo/gui.rb +132 -123
  70. data/lib/watobo/gui/about_watobo.rb +0 -9
  71. data/lib/watobo/gui/browser_preview.rb +0 -9
  72. data/lib/watobo/gui/certificate_dialog.rb +0 -9
  73. data/lib/watobo/gui/chat_diff.rb +0 -9
  74. data/lib/watobo/gui/chatviewer_frame.rb +73 -72
  75. data/lib/watobo/gui/checkboxtree.rb +0 -9
  76. data/lib/watobo/gui/checks_policy_frame.rb +0 -9
  77. data/lib/watobo/gui/client_cert_dialog.rb +96 -87
  78. data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
  79. data/lib/watobo/gui/conversation_table.rb +158 -164
  80. data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
  81. data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
  82. data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
  83. data/lib/watobo/gui/custom_viewer.rb +374 -383
  84. data/lib/watobo/gui/dashboard.rb +296 -303
  85. data/lib/watobo/gui/define_scope_frame.rb +0 -9
  86. data/lib/watobo/gui/differ_frame.rb +215 -224
  87. data/lib/watobo/gui/edit_comment.rb +0 -9
  88. data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
  89. data/lib/watobo/gui/export_dialog.rb +104 -113
  90. data/lib/watobo/gui/finding_info.rb +0 -9
  91. data/lib/watobo/gui/findings_tree.rb +210 -217
  92. data/lib/watobo/gui/full_scan_dialog.rb +0 -9
  93. data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
  94. data/lib/watobo/gui/fxsave_thread.rb +14 -0
  95. data/lib/watobo/gui/goto_url_dialog.rb +70 -79
  96. data/lib/watobo/gui/hex_viewer.rb +0 -9
  97. data/lib/watobo/gui/html_viewer.rb +287 -296
  98. data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
  99. data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
  100. data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
  101. data/lib/watobo/gui/json_viewer.rb +287 -0
  102. data/lib/watobo/gui/list_box.rb +101 -110
  103. data/lib/watobo/gui/log_file_viewer.rb +32 -41
  104. data/lib/watobo/gui/log_viewer.rb +83 -88
  105. data/lib/watobo/gui/login_wizzard.rb +0 -9
  106. data/lib/watobo/gui/main_window.rb +587 -618
  107. data/lib/watobo/gui/manual_request_editor.rb +620 -565
  108. data/lib/watobo/gui/master_pw_dialog.rb +0 -9
  109. data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
  110. data/lib/watobo/gui/page_tree.rb +217 -226
  111. data/lib/watobo/gui/password_policy_dialog.rb +0 -9
  112. data/lib/watobo/gui/plugin_board.rb +0 -9
  113. data/lib/watobo/gui/preferences_dialog.rb +0 -9
  114. data/lib/watobo/gui/progress_window.rb +17 -27
  115. data/lib/watobo/gui/project_wizzard.rb +0 -9
  116. data/lib/watobo/gui/proxy_dialog.rb +1 -10
  117. data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
  118. data/lib/watobo/gui/request_builder_frame.rb +102 -111
  119. data/lib/watobo/gui/request_editor.rb +181 -137
  120. data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
  121. data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
  122. data/lib/watobo/gui/save_chat_dialog.rb +140 -149
  123. data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
  124. data/lib/watobo/gui/select_chat_dialog.rb +0 -9
  125. data/lib/watobo/gui/session_management_dialog.rb +0 -9
  126. data/lib/watobo/gui/sites_tree.rb +0 -9
  127. data/lib/watobo/gui/status_bar.rb +0 -9
  128. data/lib/watobo/gui/table_editor.rb +0 -9
  129. data/lib/watobo/gui/tagless_viewer.rb +0 -9
  130. data/lib/watobo/gui/templates/plugin.rb +0 -9
  131. data/lib/watobo/gui/templates/plugin2.rb +92 -100
  132. data/lib/watobo/gui/templates/plugin_base.rb +144 -153
  133. data/lib/watobo/gui/text_viewer.rb +0 -9
  134. data/lib/watobo/gui/transcoder_window.rb +0 -9
  135. data/lib/watobo/gui/utils/gui_utils.rb +0 -9
  136. data/lib/watobo/gui/utils/init_icons.rb +86 -95
  137. data/lib/watobo/gui/utils/load_icons.rb +33 -42
  138. data/lib/watobo/gui/utils/load_plugins.rb +116 -119
  139. data/lib/watobo/gui/utils/master_password.rb +68 -77
  140. data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
  141. data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
  142. data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
  143. data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
  144. data/lib/watobo/gui/utils/session_history.rb +112 -121
  145. data/lib/watobo/gui/workspace_dialog.rb +0 -9
  146. data/lib/watobo/gui/www_auth_dialog.rb +0 -9
  147. data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
  148. data/lib/watobo/http.rb +4 -13
  149. data/lib/watobo/http/cookies/cookies.rb +26 -35
  150. data/lib/watobo/http/data/data.rb +45 -54
  151. data/lib/watobo/http/data/json.rb +47 -55
  152. data/lib/watobo/http/url/url.rb +38 -47
  153. data/lib/watobo/http/xml/xml.rb +124 -130
  154. data/lib/watobo/interceptor.rb +3 -12
  155. data/lib/watobo/interceptor/proxy.rb +742 -739
  156. data/lib/watobo/interceptor/transparent.rb +22 -24
  157. data/lib/watobo/mixins.rb +10 -19
  158. data/lib/watobo/mixins/check_info.rb +27 -36
  159. data/lib/watobo/mixins/httpparser.rb +613 -637
  160. data/lib/watobo/mixins/request_parser.rb +88 -97
  161. data/lib/watobo/mixins/shapers.rb +515 -529
  162. data/lib/watobo/mixins/transcoders.rb +3 -11
  163. data/lib/watobo/parser.rb +1 -10
  164. data/lib/watobo/parser/html.rb +83 -92
  165. data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
  166. data/lib/watobo/sockets.rb +3 -12
  167. data/lib/watobo/sockets/agent.rb +828 -837
  168. data/lib/watobo/sockets/client_socket.rb +308 -312
  169. data/lib/watobo/sockets/connection.rb +401 -410
  170. data/lib/watobo/sockets/http_socket.rb +11 -13
  171. data/lib/watobo/sockets/ntlm_auth.rb +129 -138
  172. data/lib/watobo/utils.rb +10 -19
  173. data/lib/watobo/utils/check_regex.rb +0 -9
  174. data/lib/watobo/utils/copy_object.rb +0 -9
  175. data/lib/watobo/utils/crypto.rb +0 -9
  176. data/lib/watobo/utils/expand_range.rb +23 -32
  177. data/lib/watobo/utils/export_xml.rb +97 -106
  178. data/lib/watobo/utils/file_management.rb +9 -11
  179. data/lib/watobo/utils/hexprint.rb +9 -18
  180. data/lib/watobo/utils/load_chat.rb +0 -9
  181. data/lib/watobo/utils/load_icon.rb +0 -9
  182. data/lib/watobo/utils/ntlm.rb +866 -875
  183. data/lib/watobo/utils/print_debug.rb +12 -21
  184. data/lib/watobo/utils/response_builder.rb +90 -99
  185. data/lib/watobo/utils/response_hash.rb +0 -9
  186. data/lib/watobo/utils/secure_eval.rb +0 -9
  187. data/lib/watobo/utils/strings.rb +10 -19
  188. data/lib/watobo/utils/text2request.rb +0 -9
  189. data/lib/watobo/utils/url.rb +23 -32
  190. data/lib/watobo/utils/utf16.rb +11 -20
  191. data/modules/active/Apache/mod_status.rb +0 -9
  192. data/modules/active/Apache/multiview.rb +151 -160
  193. data/modules/active/Flash/crossdomain.rb +0 -9
  194. data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
  195. data/modules/active/cq5/cq5_default_selectors.rb +106 -115
  196. data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
  197. data/modules/active/directories/dirwalker.rb +0 -9
  198. data/modules/active/discovery/fileextensions.rb +0 -9
  199. data/modules/active/discovery/http_methods.rb +0 -9
  200. data/modules/active/discovery/jsmapfiles.rb +79 -0
  201. data/modules/active/domino/domino_db.rb +68 -76
  202. data/modules/active/dotNET/custom_errors.rb +102 -111
  203. data/modules/active/dotNET/dotnet_files.rb +90 -99
  204. data/modules/active/fileinclusion/lfi_simple.rb +0 -9
  205. data/modules/active/jboss/jboss_basic.rb +0 -9
  206. data/modules/active/sap/business_objects.rb +51 -60
  207. data/modules/active/sap/its_commands.rb +0 -9
  208. data/modules/active/sap/its_service_parameter.rb +0 -9
  209. data/modules/active/sap/its_services.rb +0 -9
  210. data/modules/active/sap/its_xss.rb +0 -9
  211. data/modules/active/shell_shock/shell_shock.rb +139 -148
  212. data/modules/active/siebel/siebel_apps.rb +160 -169
  213. data/modules/active/sqlinjection/sql_boolean.rb +0 -9
  214. data/modules/active/sqlinjection/sql_numerical.rb +198 -0
  215. data/modules/active/sqlinjection/sqli_error.rb +0 -9
  216. data/modules/active/sqlinjection/sqli_timing.rb +220 -229
  217. data/modules/active/struts2/default_handler_ognl.rb +106 -115
  218. data/modules/active/struts2/include_params_ognl.rb +105 -114
  219. data/modules/active/xml/xml_xxe.rb +112 -123
  220. data/modules/active/xss/xss_ng.rb +214 -223
  221. data/modules/active/xss/xss_simple.rb +0 -9
  222. data/modules/passive/ajax.rb +68 -77
  223. data/modules/passive/autocomplete.rb +56 -65
  224. data/modules/passive/cookie_options.rb +0 -9
  225. data/modules/passive/cookie_xss.rb +0 -9
  226. data/modules/passive/detect_code.rb +0 -9
  227. data/modules/passive/detect_fileupload.rb +0 -9
  228. data/modules/passive/detect_infrastructure.rb +0 -9
  229. data/modules/passive/detect_one_time_tokens.rb +0 -9
  230. data/modules/passive/dirindexing.rb +0 -9
  231. data/modules/passive/disclosure_domino.rb +55 -64
  232. data/modules/passive/disclosure_emails.rb +0 -9
  233. data/modules/passive/disclosure_ipaddr.rb +55 -53
  234. data/modules/passive/filename_as_parameter.rb +0 -9
  235. data/modules/passive/form_spotter.rb +0 -9
  236. data/modules/passive/hidden_fields.rb +50 -59
  237. data/modules/passive/hotspots.rb +0 -9
  238. data/modules/passive/in_script_parameter.rb +0 -9
  239. data/modules/passive/json_web_token.rb +93 -0
  240. data/modules/passive/multiple_server_headers.rb +0 -9
  241. data/modules/passive/possible_login.rb +0 -9
  242. data/modules/passive/redirect_url.rb +0 -9
  243. data/modules/passive/redirectionz.rb +0 -9
  244. data/modules/passive/sap-headers.rb +56 -65
  245. data/modules/passive/xss_dom.rb +0 -9
  246. data/plugins/aem/aem.rb +11 -20
  247. data/plugins/aem/gui/main.rb +118 -127
  248. data/plugins/aem/gui/tree_view.rb +171 -180
  249. data/plugins/aem/lib/agent.rb +130 -138
  250. data/plugins/aem/lib/dispatcher.rb +45 -51
  251. data/plugins/aem/lib/engine.rb +177 -186
  252. data/plugins/catalog/catalog.rb +345 -355
  253. data/plugins/crawler/crawler.rb +4 -13
  254. data/plugins/crawler/gui.rb +5 -14
  255. data/plugins/crawler/gui/auth_frame.rb +270 -279
  256. data/plugins/crawler/gui/crawler_gui.rb +271 -276
  257. data/plugins/crawler/gui/general_settings_frame.rb +96 -105
  258. data/plugins/crawler/gui/hooks_frame.rb +80 -89
  259. data/plugins/crawler/gui/scope_frame.rb +50 -59
  260. data/plugins/crawler/gui/settings_tabbook.rb +38 -47
  261. data/plugins/crawler/gui/status_frame.rb +59 -68
  262. data/plugins/crawler/lib/bags.rb +18 -27
  263. data/plugins/crawler/lib/constants.rb +11 -20
  264. data/plugins/crawler/lib/engine.rb +488 -497
  265. data/plugins/crawler/lib/grabber.rb +68 -77
  266. data/plugins/crawler/lib/status.rb +71 -80
  267. data/plugins/crawler/lib/uri_mp.rb +12 -21
  268. data/plugins/filefinder/filefinder.rb +326 -333
  269. data/plugins/sqlmap/bin/test.rb +78 -87
  270. data/plugins/sqlmap/gui.rb +4 -13
  271. data/plugins/sqlmap/gui/main.rb +218 -227
  272. data/plugins/sqlmap/gui/options_frame.rb +97 -106
  273. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
  274. data/plugins/sqlmap/sqlmap.rb +2 -11
  275. data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
  276. data/plugins/sslchecker/gui/cipher_table.rb +246 -254
  277. data/plugins/sslchecker/gui/gui.rb +258 -264
  278. data/plugins/sslchecker/gui/sslchecker.rb +4 -13
  279. data/plugins/sslchecker/lib/check.rb +127 -133
  280. data/plugins/wshell/gui/main.rb +119 -117
  281. data/plugins/wshell/lib/core.rb +38 -88
  282. data/plugins/wshell/wshell.rb +11 -20
  283. metadata +170 -164
@@ -1,12 +1,3 @@
1
- #.
2
- # crossdomain.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # .
11
2
  # crossdomain.rb
12
3
  #
@@ -0,0 +1,111 @@
1
+ # @private
2
+ module Watobo #:nodoc: all
3
+ module Modules
4
+ module Active
5
+ module Jwt
6
+
7
+ class Jwt_oauth2_none < Watobo::ActiveCheck
8
+ @@tested_directories = Hash.new
9
+
10
+ threat =<<'EOF'
11
+ Privilege Escalation
12
+ EOF
13
+
14
+ #
15
+ details =<<'EOD'
16
+
17
+ EOD
18
+
19
+
20
+ measure = 'Only accept secure algorithms.'
21
+
22
+ @info.update(
23
+ :check_name => 'OAuth2 Anonymous JWT', # name of check which briefly describes functionality, will be used for tree and progress views
24
+ :check_group => 'JWT',
25
+ :description => 'Checks if anonymous token (without signature) is supported by the application.', # description of checkfunction
26
+ :author => 'Andreas Schmidt', # author of check
27
+ :version => '1.0' # check version
28
+ )
29
+
30
+ @finding.update(
31
+ :threat => threat, # thread of vulnerability, e.g. loss of information
32
+ :class => "JWT - None", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
33
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
34
+ :rating => VULN_RATING_CRITICAL,
35
+ :measure => measure,
36
+ :details => details
37
+ )
38
+
39
+ def initialize(project, prefs={})
40
+ super(project, prefs)
41
+
42
+ def reset
43
+
44
+ end
45
+
46
+
47
+ end
48
+
49
+
50
+ def generateChecks(chat)
51
+ begin
52
+ # Check for JWT Bearer Header, e.g.
53
+ # Authorization: Bearer asdfasdfasdf.alksjdflkjsdlfjkweoriuwoejosjfoijowemrjosjajjojpj.Xm7q8hzlXlooWPyZPayq ...
54
+ bearer = chat.request.headers(' Bearer ')[0]
55
+ return true if bearer.nil?
56
+
57
+ jwt = bearer.match(/Bearer (.*)/)[1]
58
+ jh, jp, js = jwt.split('.')
59
+ jh = JSON.parse(Base64.decode64(jh))
60
+ jp = JSON.parse(Base64.decode64(jp))
61
+
62
+ # remove 'alg' from original header
63
+ jh.delete 'alg'
64
+
65
+ # TODO: improve check to also compare responses which don't have a body
66
+ body_orig = chat.response.body.to_s
67
+ return true if body_orig.empty?
68
+
69
+ checker = proc {
70
+ request = nil
71
+ response = nil
72
+ test_request = chat.copyRequest
73
+
74
+ # create new token with original header fields - except 'alg'
75
+ token = JWT.encode jp, nil, 'none', jh
76
+
77
+ new_auth_header = "Bearer #{token}"
78
+
79
+ test_request.set_header 'Authorization', new_auth_header
80
+
81
+ request, response = doRequest(test_request)
82
+
83
+ if response.body.to_s.strip == body_orig.strip
84
+
85
+ addFinding(request, response,
86
+ :check_pattern => token,
87
+ :proof_pattern => body_orig.strip,
88
+ #:test_item => '',
89
+ :chat => chat,
90
+ :title => "[#{request.file}]"
91
+ )
92
+ end
93
+
94
+ [request, response]
95
+ }
96
+ yield checker
97
+
98
+ rescue => bang
99
+ puts bang
100
+ puts bang.backtrace if $DEBUG
101
+ puts "ERROR!! #{Module.nesting[0].name}"
102
+ raise
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,116 +1,107 @@
1
- #.
2
- # cq5_default_selectors.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1
+ # @private
2
+ module Watobo#:nodoc: all
3
+ module Modules
4
+ module Active
5
+ module Cq5
6
+ #class Dir_indexing < Watobo::Mixin::Session
7
+ class Cq5_default_selectors < Watobo::ActiveCheck
9
8
 
10
- # @private
11
- module Watobo#:nodoc: all
12
- module Modules
13
- module Active
14
- module Cq5
15
- #class Dir_indexing < Watobo::Mixin::Session
16
- class Cq5_default_selectors < Watobo::ActiveCheck
17
-
18
- @info.update(
19
- :check_name => 'CQ5 Selectors', # name of check which briefly describes functionality, will be used for tree and progress views
20
- :description => "This module checks for default selectors.", # description of checkfunction
21
- :author => "Andreas Schmidt", # author of check
22
- :version => "1.0", # check version
23
- :check_group => "CQ5"
24
- )
25
-
26
- @finding.update(
27
- :threat => 'Selectors can reveal sensitive information about the application, e.g. password hashes (jackrabbit). Also, the query selector enables you to perform XPATH queries on the entire repository, which could slow your system down considerably, or even cause a denial of service if run multiple times', # thread of vulnerability, e.g. loss of information
28
- :class => "CQ5: Selectors", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
29
- :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
30
- :rating => VULN_RATING_INFO
31
- )
32
-
33
- def initialize(project, prefs={})
34
- super(project, prefs)
35
-
36
- @checked_locations = []
37
- @selectors = %w( query assets infinity children s7catalog pages feed feedentry tidy sysview docview permissions overlay 1 2 3 4 5 6 7 )
38
- @extensions = %w( json html csv zip xml )
39
- # specials are combinations which need one or more parameters to produce a valid result
40
- @specials = %w( query.json?statement=%2F%2F%2A cqactions.json?path=/&depth=1&authorizableId=* permissions.overlay.json?path=/ )
41
-
42
- @mixed = @selectors.map{|s| @extensions.map{|e| s + '.' + e } }.flatten
43
-
44
- end
45
-
46
- def reset()
47
- @checked_locations = []
48
- end
49
-
50
- def generateChecks(chat)
51
- path = chat.request.path
52
- return false if @checked_locations.include? path
53
- @checked_locations << path
54
-
55
- test_extensions = @extensions
56
- test_extensions.concat @specials
57
- test_extensions.concat @mixed
58
-
59
- test_extensions.each do |ext|
60
- checker = proc {
61
- begin
62
- test_request = nil
63
- test_response = nil
64
-
65
- test = chat.copyRequest
66
-
67
- # replace file extension only
68
-
69
- test.set_file_extension(ext)
70
-
71
- status, test_request, test_response = fileExists?(test)
72
-
73
- if status == true and test_response.content_type != chat.response.content_type and test_response.status_code < 300
74
-
75
- addFinding( test_request, test_response,
76
- :test_item => "#{test_request.url}",
77
- :proof_pattern => "#{test_response.status}",
78
- :chat => chat,
79
- :title => "[#{ext}]"
80
- )
81
-
82
- end
83
-
84
- # also test extensions on the path
85
- test = chat.copyRequest
86
-
87
- test.replaceFileExt(".#{ext}")
88
-
89
- status, test_request, test_response = fileExists?(test)
90
-
91
- if status == true and test_response.content_type != chat.response.content_type and test_response.status_code < 300
92
-
93
- addFinding( test_request, test_response,
94
- :test_item => "#{test_request.url}",
95
- :proof_pattern => "#{test_response.status}",
96
- :chat => chat,
97
- :title => "[#{ext}]"
98
- )
99
-
100
- end
101
- rescue => bang
102
- puts bang
103
- puts bang.backtrace if $DEBUG
104
- end
105
- [ test_request, test_response ]
106
-
107
- }
108
- yield checker
109
- end
110
-
111
- end
112
- end
113
- end
114
- end
115
- end
116
- end
9
+ @info.update(
10
+ :check_name => 'CQ5 Selectors', # name of check which briefly describes functionality, will be used for tree and progress views
11
+ :description => "This module checks for default selectors.", # description of checkfunction
12
+ :author => "Andreas Schmidt", # author of check
13
+ :version => "1.0", # check version
14
+ :check_group => "CQ5"
15
+ )
16
+
17
+ @finding.update(
18
+ :threat => 'Selectors can reveal sensitive information about the application, e.g. password hashes (jackrabbit). Also, the query selector enables you to perform XPATH queries on the entire repository, which could slow your system down considerably, or even cause a denial of service if run multiple times', # thread of vulnerability, e.g. loss of information
19
+ :class => "CQ5: Selectors", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
20
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
21
+ :rating => VULN_RATING_INFO
22
+ )
23
+
24
+ def initialize(project, prefs={})
25
+ super(project, prefs)
26
+
27
+ @checked_locations = []
28
+ @selectors = %w( query assets infinity children s7catalog pages feed feedentry tidy sysview docview permissions overlay 1 2 3 4 5 6 7 )
29
+ @extensions = %w( json html csv zip xml )
30
+ # specials are combinations which need one or more parameters to produce a valid result
31
+ @specials = %w( query.json?statement=%2F%2F%2A cqactions.json?path=/&depth=1&authorizableId=* permissions.overlay.json?path=/ )
32
+
33
+ @mixed = @selectors.map{|s| @extensions.map{|e| s + '.' + e } }.flatten
34
+
35
+ end
36
+
37
+ def reset()
38
+ @checked_locations = []
39
+ end
40
+
41
+ def generateChecks(chat)
42
+ path = chat.request.path
43
+ return false if @checked_locations.include? path
44
+ @checked_locations << path
45
+
46
+ test_extensions = @extensions
47
+ test_extensions.concat @specials
48
+ test_extensions.concat @mixed
49
+
50
+ test_extensions.each do |ext|
51
+ checker = proc {
52
+ begin
53
+ test_request = nil
54
+ test_response = nil
55
+
56
+ test = chat.copyRequest
57
+
58
+ # replace file extension only
59
+
60
+ test.set_file_extension(ext)
61
+
62
+ status, test_request, test_response = fileExists?(test)
63
+
64
+ if status == true and test_response.content_type != chat.response.content_type and test_response.status_code.to_i < 300
65
+
66
+ addFinding( test_request, test_response,
67
+ :test_item => "#{test_request.url}",
68
+ :proof_pattern => "#{test_response.status}",
69
+ :chat => chat,
70
+ :title => "[#{ext}]"
71
+ )
72
+
73
+ end
74
+
75
+ # also test extensions on the path
76
+ test = chat.copyRequest
77
+
78
+ test.replaceFileExt(".#{ext}")
79
+
80
+ status, test_request, test_response = fileExists?(test)
81
+
82
+ if status == true and test_response.content_type != chat.response.content_type and test_response.status_code.to_i < 300
83
+
84
+ addFinding( test_request, test_response,
85
+ :test_item => "#{test_request.url}",
86
+ :proof_pattern => "#{test_response.status}",
87
+ :chat => chat,
88
+ :title => "[#{ext}]"
89
+ )
90
+
91
+ end
92
+ rescue => bang
93
+ puts bang
94
+ puts bang.backtrace if $DEBUG
95
+ end
96
+ [ test_request, test_response ]
97
+
98
+ }
99
+ yield checker
100
+ end
101
+
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -1,134 +1,125 @@
1
- #.
2
- # cqp_user_enumeration.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
- # @private
11
- module Watobo#:nodoc: all
12
- module Modules
13
- module Active
14
- module Cq5
15
- #class Dir_indexing < Watobo::Mixin::Session
16
- class Cqp_user_enumeration < Watobo::ActiveCheck
17
-
18
- @info.update(
19
- :check_name => 'CQ5 CQP User Enumeration', # name of check which briefly describes functionality, will be used for tree and progress views
20
- :description => "This module checks if CQ JSON extension is aktive and enumerates all usernames.", # description of checkfunction
21
- :author => "Andreas Schmidt", # author of check
22
- :version => "1.0", # check version
23
- :check_group => "CQ5"
24
- )
25
-
26
- @finding.update(
27
- :threat => 'Information Disclosure.', # thread of vulnerability, e.g. loss of information
28
- :class => "CQ5: Users", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
29
- :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
30
- :rating => VULN_RATING_INFO
31
- )
32
- def initialize(project, prefs={})
33
- super(project, prefs)
34
-
35
- end
36
-
37
- def reset()
38
- @checked_locations = []
39
- end
40
-
41
- def generateChecks(chat)
42
-
43
- path = chat.request.path
44
- return false if @checked_locations.include? path
45
- @checked_locations << path
46
- #
47
- # via JSON Extension
48
-
49
- checker = proc {
50
- begin
51
- test_request = nil
52
- test_response = nil
53
-
54
- test = chat.copyRequest
55
-
56
- test.set_file_extension('.json')
57
-
58
- status, test_request, test_response = fileExists?(test)
59
-
60
- if status == true and test_response.has_body?
61
- if test_response.content_type =~ /json/
62
- j = JSON.parse test_response.body.to_s
63
- username = j['jcr:createdBy']
64
- puts "\nCQ5 User: #{username}"
65
- addFinding( test_request, test_response,
66
- :test_item => "#{test_request.url}",
67
- :proof_pattern => "jcr:createdBy.*#{username}",
68
- :chat => chat,
69
- :threat => "Usernames may help an attacker to perform authorization attacks, e.g. brute-force attacks.",
70
- :title => "[#{username}]"
71
- )
72
- end
73
-
74
- end
75
- rescue => bang
76
- puts bang
77
- puts bang.backtrace if $DEBUG
78
- end
79
- [ test_request, test_response ]
80
-
81
- }
82
- yield checker
83
-
84
- #
85
- # via XML Extension
86
-
87
- checker = proc {
88
- begin
89
- test_request = nil
90
- test_response = nil
91
-
92
- test = chat.copyRequest
93
-
94
- test.set_file_extension('.xml')
95
-
96
- status, test_request, test_response = fileExists?(test)
97
-
98
- if status == true and test_response.has_body?
99
- if test_response.content_type =~ /xml/
100
- xml = Nokogiri::XML(test_response.body.to_s)
101
- xml.traverse do |node|
102
- next unless node.respond_to? :attributes
103
- node.attributes.each do |attr|
104
- if attr[0] =~ /By$/i
105
- username = attr[1]
106
- addFinding( test_request, test_response,
107
- :test_item => "#{test_request.url}",
108
- :proof_pattern => "#{attr[0]}.*#{username}",
109
- :chat => chat,
110
- :threat => "Usernames may help an attacker to perform authorization attacks, e.g. brute-force attacks.",
111
- :title => "[#{username}]"
112
- )
113
- end
114
- end
115
- end
116
-
117
- end
118
-
119
- end
120
- rescue => bang
121
- puts bang
122
- puts bang.backtrace if $DEBUG
123
- end
124
- [ test_request, test_response ]
125
-
126
- }
127
- yield checker
128
-
129
- end
130
- end
131
- end
132
- end
133
- end
134
- end
1
+ # @private
2
+ module Watobo#:nodoc: all
3
+ module Modules
4
+ module Active
5
+ module Cq5
6
+ #class Dir_indexing < Watobo::Mixin::Session
7
+ class Cqp_user_enumeration < Watobo::ActiveCheck
8
+
9
+ @info.update(
10
+ :check_name => 'CQ5 CQP User Enumeration', # name of check which briefly describes functionality, will be used for tree and progress views
11
+ :description => "This module checks if CQ JSON extension is aktive and enumerates all usernames.", # description of checkfunction
12
+ :author => "Andreas Schmidt", # author of check
13
+ :version => "1.0", # check version
14
+ :check_group => "CQ5"
15
+ )
16
+
17
+ @finding.update(
18
+ :threat => 'Information Disclosure.', # thread of vulnerability, e.g. loss of information
19
+ :class => "CQ5: Users", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
20
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
21
+ :rating => VULN_RATING_INFO
22
+ )
23
+ def initialize(project, prefs={})
24
+ super(project, prefs)
25
+
26
+ end
27
+
28
+ def reset()
29
+ @checked_locations = []
30
+ end
31
+
32
+ def generateChecks(chat)
33
+
34
+ path = chat.request.path
35
+ return false if @checked_locations.include? path
36
+ @checked_locations << path
37
+ #
38
+ # via JSON Extension
39
+
40
+ checker = proc {
41
+ begin
42
+ test_request = nil
43
+ test_response = nil
44
+
45
+ test = chat.copyRequest
46
+
47
+ test.set_file_extension('.json')
48
+
49
+ status, test_request, test_response = fileExists?(test)
50
+
51
+ if status == true and test_response.has_body?
52
+ if test_response.content_type =~ /json/
53
+ j = JSON.parse test_response.body.to_s
54
+ username = j['jcr:createdBy']
55
+ puts "\nCQ5 User: #{username}"
56
+ addFinding( test_request, test_response,
57
+ :test_item => "#{test_request.url}",
58
+ :proof_pattern => "jcr:createdBy.*#{username}",
59
+ :chat => chat,
60
+ :threat => "Usernames may help an attacker to perform authorization attacks, e.g. brute-force attacks.",
61
+ :title => "[#{username}]"
62
+ )
63
+ end
64
+
65
+ end
66
+ rescue => bang
67
+ puts bang
68
+ puts bang.backtrace if $DEBUG
69
+ end
70
+ [ test_request, test_response ]
71
+
72
+ }
73
+ yield checker
74
+
75
+ #
76
+ # via XML Extension
77
+
78
+ checker = proc {
79
+ begin
80
+ test_request = nil
81
+ test_response = nil
82
+
83
+ test = chat.copyRequest
84
+
85
+ test.set_file_extension('.xml')
86
+
87
+ status, test_request, test_response = fileExists?(test)
88
+
89
+ if status == true and test_response.has_body?
90
+ if test_response.content_type =~ /xml/
91
+ xml = Nokogiri::XML(test_response.body.to_s)
92
+ xml.traverse do |node|
93
+ next unless node.respond_to? :attributes
94
+ node.attributes.each do |attr|
95
+ if attr[0] =~ /By$/i
96
+ username = attr[1]
97
+ addFinding( test_request, test_response,
98
+ :test_item => "#{test_request.url}",
99
+ :proof_pattern => "#{attr[0]}.*#{username}",
100
+ :chat => chat,
101
+ :threat => "Usernames may help an attacker to perform authorization attacks, e.g. brute-force attacks.",
102
+ :title => "[#{username}]"
103
+ )
104
+ end
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+ end
111
+ rescue => bang
112
+ puts bang
113
+ puts bang.backtrace if $DEBUG
114
+ end
115
+ [ test_request, test_response ]
116
+
117
+ }
118
+ yield checker
119
+
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end