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,140 +1,132 @@
1
- #.
2
- # agent.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 Plugin
4
+ class CQ5
5
+ class Agent < Watobo::Session
6
+ def initialize(base_request, in_queue, out_queue )
7
+ @work_queue = in_queue
8
+ @disp_queue = out_queue
9
+ @request = base_request
10
+
11
+
12
+ super(@request.object_id, Watobo::Conf::Scanner.to_h )
9
13
 
10
- # @private
11
- module Watobo#:nodoc: all
12
- module Plugin
13
- class CQ5
14
- class Agent < Watobo::Session
15
- def initialize(base_request, in_queue, out_queue )
16
- @work_queue = in_queue
17
- @disp_queue = out_queue
18
- @request = base_request
19
-
20
-
21
- super(@request.object_id, Watobo::Conf::Scanner.to_h )
22
-
23
- end
24
-
25
- def stop
26
- @agent_thread.kill
27
- end
28
-
29
- def run
30
- return nil if @work_queue.nil? or @disp_queue.nil?
31
-
32
- @agent_thread = Thread.new(){
33
- puts "#{self} running ..."
34
- loop do
35
- begin
36
-
37
- item = @work_queue.deq
38
- # not interested in jcr:content ... skip ...
39
- next if item[:url] =~ /jcr%3acontent$/
40
-
41
- get_pages item
42
- file_info item
43
-
44
- rescue => bang
45
- puts bang
46
- puts bang.backtrace
47
- exit
48
- end
49
- end
50
- }
51
- @agent_thread
52
- end
53
-
54
- def get_pages(item)
55
- test = @request.copy
56
- # puts item
57
- url = item[:url].gsub(/\/$/,'') + '/.pages.json'
58
- test.replaceURL( url )
59
-
60
- request, response = sendRequest test
61
-
62
- return false unless response.respond_to? :status
63
- item[:pages_status] = response.status
64
- # @disp_queue << item
65
-
66
-
67
- if response.content_type =~ /json/i
68
- begin
69
- ntpages = JSON.parse response.body.to_s
70
-
71
- if ntpages['pages']
72
-
73
- ntpages['pages'].each do |p|
74
- #unless @use_relative_path
75
- ep = p['escapedPath']
76
- next if ep.nil?
77
- next if ep.empty?
78
-
79
- purl = ''
80
-
81
- purl = @request.url.to_s.gsub(/\/$/, '') + p['escapedPath']
82
- puts "+ #{purl}"
83
-
84
- next if purl.empty?
85
-
86
- item = {
87
- :url => purl,
88
- :page_info => p,
89
- :file_info => nil,
90
- :status => nil
91
- }
92
-
93
- @disp_queue << item
94
- end
95
- end
96
-
97
- rescue => bang
98
- puts bang
99
- puts ntpages
100
- puts "---"
101
- end
102
- end
103
- #puts response.body.to_s
104
- true
105
- end
106
-
107
- def file_info(item)
108
- #url = item[:url]
109
- #@request.replaceURL "#{url}/.json"
110
- test = @request.copy
111
- test.set_file_extension "json"
112
- # puts "\n>> #{@request.url}"
113
- request, response = sendRequest test
114
-
115
- return false unless response.respond_to? :status
116
- item[:info_status] = response.status
117
-
118
- if response.content_type =~ /json/i
119
- info = JSON.parse response.body.to_s
120
- item[:file_info] = info
121
- end
122
- #@disp_queue << item
123
- true
124
- end
125
-
126
- def sendRequest(request, prefs={})
127
- begin
128
- test_req, test_resp = self.doRequest(request, prefs)
129
- return test_req, test_resp
130
- rescue => bang
131
- puts bang
132
- puts bang.backtrace if $DEBUG
133
- end
134
- return nil, nil
135
- end
136
- end
137
-
138
- end
139
- end
14
+ end
15
+
16
+ def stop
17
+ @agent_thread.kill
18
+ end
19
+
20
+ def run
21
+ return nil if @work_queue.nil? or @disp_queue.nil?
22
+
23
+ @agent_thread = Thread.new(){
24
+ puts "#{self} running ..."
25
+ loop do
26
+ begin
27
+
28
+ item = @work_queue.deq
29
+ # not interested in jcr:content ... skip ...
30
+ next if item[:url] =~ /jcr%3acontent$/
31
+ puts item[:url]
32
+
33
+ get_pages item
34
+ file_info item
35
+
36
+ rescue => bang
37
+ puts bang
38
+ puts bang.backtrace
39
+ exit
40
+ end
41
+ end
42
+ }
43
+ @agent_thread
44
+ end
45
+
46
+ def get_pages(item)
47
+ test = @request.copy
48
+ # puts item
49
+ url = item[:url].gsub(/\/$/,'') + '/.pages.json'
50
+ test.replaceURL( url )
51
+
52
+ request, response = sendRequest test
53
+
54
+ return false unless response.respond_to? :status
55
+ item[:pages_status] = response.status
56
+ # @disp_queue << item
57
+
58
+
59
+ if response.content_type =~ /json/i
60
+ begin
61
+ ntpages = JSON.parse response.body.to_s
62
+
63
+ if ntpages['pages']
64
+
65
+ ntpages['pages'].each do |p|
66
+ #unless @use_relative_path
67
+ ep = p['escapedPath']
68
+ next if ep.nil?
69
+ next if ep.empty?
70
+
71
+ purl = ''
72
+
73
+ purl = @request.url.to_s.gsub(/\/$/, '') + p['escapedPath']
74
+ puts "+ #{purl}"
75
+
76
+ next if purl.empty?
77
+
78
+ item = {
79
+ :url => purl,
80
+ :page_info => p,
81
+ :file_info => nil,
82
+ :status => nil
83
+ }
84
+
85
+ @disp_queue << item
86
+ end
87
+ end
88
+
89
+ rescue => bang
90
+ puts bang
91
+ puts ntpages
92
+ puts "---"
93
+ end
94
+ end
95
+ #puts response.body.to_s
96
+ true
97
+ end
98
+
99
+ def file_info(item)
100
+ #url = item[:url]
101
+ #@request.replaceURL "#{url}/.json"
102
+ test = @request.copy
103
+ test.set_file_extension "json"
104
+ # puts "\n>> #{@request.url}"
105
+ request, response = sendRequest test
106
+
107
+ return false unless response.respond_to? :status
108
+ item[:info_status] = response.status
109
+
110
+ if response.content_type =~ /json/i
111
+ info = JSON.parse response.body.to_s
112
+ item[:file_info] = info
113
+ end
114
+ #@disp_queue << item
115
+ true
116
+ end
117
+
118
+ def sendRequest(request, prefs={})
119
+ begin
120
+ test_req, test_resp = self.doRequest(request, prefs)
121
+ return test_req, test_resp
122
+ rescue => bang
123
+ puts bang
124
+ puts bang.backtrace if $DEBUG
125
+ end
126
+ return nil, nil
127
+ end
128
+ end
129
+
130
+ end
131
+ end
140
132
  end
@@ -1,53 +1,47 @@
1
- #.
2
- # dispatcher.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 Plugin
4
+ class CQ5
5
+ class Dispatcher
9
6
 
10
- # @private
11
- module Watobo#:nodoc: all
12
- module Plugin
13
- class CQ5
14
- class Dispatcher
15
-
16
- def stop
17
- @t_disp.kill unless @t_disp.nil?
18
- end
19
-
20
- def run
21
- @known_urls = []
22
- puts Watobo::Plugin::CQ5.ignore_patterns
23
- @t_disp = Thread.new{
24
- loop do
25
- new_item = @dqueue.deq
26
- unless @known_urls.include?( new_item[:url] )
27
- @known_urls << new_item[:url]
28
- if Watobo::Plugin::CQ5.ignore_patterns.empty?
29
- # puts "* no ignore patterns defined"
30
- @wqueue << new_item
31
- elsif Watobo::Plugin::CQ5.ignore_patterns.select{|ip| new_item[:url] =~ /#{ip}/i }.empty?
32
- @wqueue << new_item
33
- end
34
-
35
- @rqueue << new_item
36
- else
37
- puts "[DUPLICATED] >> #{new_item[:url]}"
38
- end
39
-
40
- end
41
- }
42
- end
43
-
44
- def initialize(disp_queue, work_queue, result_queue)
45
- @dqueue = disp_queue
46
- @wqueue = work_queue
47
- @rqueue = result_queue
48
- @t_disp = nil
49
- end
50
- end
51
- end
52
- end
7
+ def stop
8
+ @t_disp.kill unless @t_disp.nil?
9
+ end
10
+
11
+ def run
12
+ @known_urls = []
13
+ puts Watobo::Plugin::CQ5.ignore_patterns
14
+ @t_disp = Thread.new {
15
+ loop do
16
+ if @dqueue.size > 0
17
+ new_item = @dqueue.deq
18
+ unless @known_urls.include?(new_item[:url])
19
+ @known_urls << new_item[:url]
20
+ if Watobo::Plugin::CQ5.ignore_patterns.empty?
21
+ # puts "* no ignore patterns defined"
22
+ @wqueue << new_item
23
+ elsif Watobo::Plugin::CQ5.ignore_patterns.select { |ip| new_item[:url] =~ /#{ip}/i }.empty?
24
+ @wqueue << new_item
25
+ end
26
+
27
+ @rqueue << new_item
28
+ else
29
+ puts "[DUPLICATED] >> #{new_item[:url]}"
30
+ end
31
+ else
32
+ sleep 0.2
33
+ end
34
+ end
35
+ }
36
+ end
37
+
38
+ def initialize(disp_queue, work_queue, result_queue)
39
+ @dqueue = disp_queue
40
+ @wqueue = work_queue
41
+ @rqueue = result_queue
42
+ @t_disp = nil
43
+ end
44
+ end
45
+ end
46
+ end
53
47
  end
@@ -1,187 +1,178 @@
1
- #.
2
- # engine.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 Plugin
13
- class CQ5
14
- @max_agents = 10
15
- @disp_queue = Queue.new
16
- @work_queue = Queue.new
17
- @gui_queue = Queue.new
18
-
19
- @agents = []
20
- @use_relative_path = false
21
-
22
-
23
- def self.reset
24
- @disp_queue.clear
25
- @work_queue.clear
26
- @agents.map {|a| a.stop }
27
- @agents = []
28
- end
29
-
30
- def self.ignore_patterns=(ipats)
31
- @ignore_patterns = ipats
32
- end
33
-
34
- def self.ignore_patterns
35
- @ignore_patterns
36
- end
37
-
38
-
39
- def self.use_relative_path=(urp)
40
- @use_relative_path = urp
41
- end
42
-
43
- def self.queue_size
44
- @work_queue.size
45
- end
46
-
47
- def self.status
48
-
49
- end
50
-
51
- def self.running?
52
- @work_queue.size == 0 &&
53
- @work_queue.num_waiting == @max_agents
54
- end
55
-
56
- def self.stop
57
- @agents.map {|a| a.stop }
58
- end
59
-
60
- def self.run(start_path, gui_queue=nil)
61
- @agents = []
62
- puts "\nCQ5 Engine running on #{start_path}"
63
- @dispatcher = Dispatcher.new( @disp_queue, @work_queue, gui_queue )
64
- @dispatcher.run
65
-
66
- vr = find_valid_request(start_path)
67
- unless vr.nil?
68
- puts "Baseline Request: " + vr.url.to_s
69
-
70
- @max_agents.times do
71
- puts " * Start Agent"
72
- a = Agent.new( vr.copy, @work_queue, @disp_queue )
73
- @agents << a
74
- a.run
75
- end
76
-
77
-
78
- else
79
- return false
80
- end
81
-
82
-
83
- end
84
-
85
- def self.get_user_info
86
- # https://mysite/cqa/libs/cq/security/userinfo.json?cq_ck=1427468388796
87
- end
88
-
89
- def self.find_valid_request(start_path)
90
- # create a dummy agent to make test requests
91
- agent = Agent.new nil, nil, nil
92
- checked = []
93
- #puts start_path.class
94
- valid_request = nil
95
-
96
- Watobo::Chats.to_a.reverse.each do |chat|
97
- next unless chat.request.method_get?
98
- url = chat.request.url.to_s
99
- # url.gsub!(chat.request.site, chat.request.host)
100
- path = chat.request.path
101
-
102
- # next if checked.include? path
103
-
104
- checked << path
105
- # puts path.class
106
- # puts url.class
107
- # puts start_path
108
- # puts url
109
-
110
- pattern = Regexp.quote(start_path)
111
- pattern = start_path
112
- #puts pattern
113
-
114
- #puts "---\n"
115
-
116
- if url =~ /#{pattern}/
117
- test = chat.copyRequest
118
- test.replaceFileExt('.pages.json')
119
-
120
-
121
- puts "* [#{chat.id}] " + test.url.to_s
122
-
123
- request, response = agent.doRequest test
124
-
125
- # puts response
126
-
127
- unless response.content_type =~ /json/i
128
- puts "! .pages.json is filtered !"
129
- next
130
- end
131
- ntpages = JSON.parse response.body.to_s
132
- if ntpages['pages']
133
- valid_request = test
134
-
135
- ntpages['pages'].each do |p|
136
- # check if escapedPath is absolut or relativ
137
- # if we find directory separator '/' we assume it's absolute
138
- ep = p['escapedPath'].gsub(/^\//,'').strip
139
- puts "EscapedPath: #{ep}"
140
-
141
- # find the home directory of the application
142
- ep_dirs = ep.split('/')
143
-
144
- puts "EscapedPath-Dirs (#{ep_dirs.length}): " + ep_dirs.join("\n")
145
- # request dir
146
- r_dir = "#{test.dir}"
147
- puts "Test-Request-Dir: " + r_dir
148
- puts "Check for #{ep_dirs[0]}, #{ep_dirs[1]}"
149
- # find offset of first escapePath directory
150
- i = r_dir.index( ep_dirs.first )
151
- puts "Index: #{i}"
152
- base_dir = r_dir
153
- puts base_dir
154
- unless i.nil?
155
- if i > 0
156
- base_dir = r_dir[0..i-1]
157
- else
158
- base_dir = ''
159
- end
160
- end
161
-
162
- puts "Base-Dir: #{base_dir}"
163
- test.setDir base_dir
164
-
165
- item = {
166
- #:url => base_url.gsub(/\/$/,'') + p['escapedPath'],
167
- :url => start_path,
168
- :page_info => p,
169
- :file_info => nil,
170
- :status => nil
171
- }
172
-
173
-
174
- @disp_queue << item
175
-
176
- end
177
- #test.replaceFileExt('')
178
- return valid_request
179
- end
180
- end
181
- end
182
- nil
183
- end
184
-
185
- end
186
- end
1
+ # @private
2
+ module Watobo#:nodoc: all
3
+ module Plugin
4
+ class CQ5
5
+ @max_agents = 10
6
+ @disp_queue = Queue.new
7
+ @work_queue = Queue.new
8
+ @gui_queue = Queue.new
9
+
10
+ @agents = []
11
+ @use_relative_path = false
12
+
13
+
14
+ def self.reset
15
+ @disp_queue.clear
16
+ @work_queue.clear
17
+ @agents.map {|a| a.stop }
18
+ @agents = []
19
+ end
20
+
21
+ def self.ignore_patterns=(ipats)
22
+ @ignore_patterns = ipats
23
+ end
24
+
25
+ def self.ignore_patterns
26
+ @ignore_patterns
27
+ end
28
+
29
+
30
+ def self.use_relative_path=(urp)
31
+ @use_relative_path = urp
32
+ end
33
+
34
+ def self.queue_size
35
+ @work_queue.size
36
+ end
37
+
38
+ def self.status
39
+
40
+ end
41
+
42
+ def self.running?
43
+ @work_queue.size == 0 &&
44
+ @work_queue.num_waiting == @max_agents
45
+ end
46
+
47
+ def self.stop
48
+ @agents.map {|a| a.stop }
49
+ end
50
+
51
+ def self.run(start_path, gui_queue=nil)
52
+ @agents = []
53
+ puts "\nCQ5 Engine running on #{start_path}"
54
+ @dispatcher = Dispatcher.new( @disp_queue, @work_queue, gui_queue )
55
+ @dispatcher.run
56
+
57
+ vr = find_valid_request(start_path)
58
+ unless vr.nil?
59
+ puts "Baseline Request: " + vr.url.to_s
60
+
61
+ @max_agents.times do
62
+ puts " * Start Agent"
63
+ a = Agent.new( vr.copy, @work_queue, @disp_queue )
64
+ @agents << a
65
+ a.run
66
+ end
67
+
68
+
69
+ else
70
+ return false
71
+ end
72
+
73
+
74
+ end
75
+
76
+ def self.get_user_info
77
+ # https://mysite/cqa/libs/cq/security/userinfo.json?cq_ck=1427468388796
78
+ end
79
+
80
+ def self.find_valid_request(start_path)
81
+ # create a dummy agent to make test requests
82
+ agent = Agent.new nil, nil, nil
83
+ checked = []
84
+ #puts start_path.class
85
+ valid_request = nil
86
+
87
+ Watobo::Chats.to_a.reverse.each do |chat|
88
+ next unless chat.request.method_get?
89
+ url = chat.request.url.to_s
90
+ # url.gsub!(chat.request.site, chat.request.host)
91
+ path = chat.request.path
92
+
93
+ # next if checked.include? path
94
+
95
+ checked << path
96
+ # puts path.class
97
+ # puts url.class
98
+ # puts start_path
99
+ # puts url
100
+
101
+ pattern = Regexp.quote(start_path)
102
+ pattern = start_path
103
+ #puts pattern
104
+
105
+ #puts "---\n"
106
+
107
+ if URI.parse(url).to_s =~ /#{pattern}/
108
+ test = chat.copyRequest
109
+ test.replaceFileExt('.pages.json')
110
+
111
+
112
+ puts "* [#{chat.id}] " + test.url.to_s
113
+
114
+ request, response = agent.doRequest test
115
+
116
+ puts response
117
+
118
+ unless response.content_type =~ /json/i
119
+ puts "! .pages.json is filtered !"
120
+ next
121
+ end
122
+ ntpages = JSON.parse response.body.to_s
123
+ if ntpages['pages']
124
+ valid_request = test
125
+
126
+ ntpages['pages'].each do |p|
127
+ # check if escapedPath is absolut or relativ
128
+ # if we find directory separator '/' we assume it's absolute
129
+ ep = p['escapedPath'].gsub(/^\//,'').strip
130
+ puts "EscapedPath: #{ep}"
131
+
132
+ # find the home directory of the application
133
+ ep_dirs = ep.split('/')
134
+
135
+ puts "EscapedPath-Dirs (#{ep_dirs.length}): " + ep_dirs.join("\n")
136
+ # request dir
137
+ r_dir = "#{test.dir}"
138
+ puts "Test-Request-Dir: " + r_dir
139
+ puts "Check for #{ep_dirs[0]}, #{ep_dirs[1]}"
140
+ # find offset of first escapePath directory
141
+ i = r_dir.index( ep_dirs.first )
142
+ puts "Index: #{i}"
143
+ base_dir = r_dir
144
+ puts base_dir
145
+ unless i.nil?
146
+ if i > 0
147
+ base_dir = r_dir[0..i-1]
148
+ else
149
+ base_dir = ''
150
+ end
151
+ end
152
+
153
+ puts "Base-Dir: #{base_dir}"
154
+ test.setDir base_dir
155
+
156
+ item = {
157
+ #:url => base_url.gsub(/\/$/,'') + p['escapedPath'],
158
+ :url => start_path,
159
+ :page_info => p,
160
+ :file_info => nil,
161
+ :status => nil
162
+ }
163
+
164
+
165
+ @disp_queue << item
166
+
167
+ end
168
+ #test.replaceFileExt('')
169
+ return valid_request
170
+ end
171
+ end
172
+ end
173
+ nil
174
+ end
175
+
176
+ end
177
+ end
187
178
  end