watobo 0.9.19 → 0.9.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (266) hide show
  1. data/CHANGELOG.md +104 -0
  2. data/bin/nfq_server.rb +8 -20
  3. data/bin/watobo_gui.rb +8 -20
  4. data/config/forwarding_proxy.yml +2 -2
  5. data/lib/watobo.rb +12 -22
  6. data/lib/watobo/adapters.rb +12 -24
  7. data/lib/watobo/adapters/data_store.rb +76 -66
  8. data/lib/watobo/adapters/file/file_store.rb +295 -307
  9. data/lib/watobo/adapters/session_store.rb +13 -25
  10. data/lib/watobo/ca.rb +9 -21
  11. data/lib/watobo/config.rb +205 -217
  12. data/lib/watobo/constants.rb +8 -20
  13. data/lib/watobo/core.rb +11 -23
  14. data/lib/watobo/core/active_check.rb +11 -21
  15. data/lib/watobo/core/active_checks.rb +57 -69
  16. data/lib/watobo/core/ca.rb +388 -398
  17. data/lib/watobo/core/cert_store.rb +42 -54
  18. data/lib/watobo/core/chat.rb +100 -112
  19. data/lib/watobo/core/chats.rb +271 -275
  20. data/lib/watobo/core/client_cert_store.rb +33 -45
  21. data/lib/watobo/core/conversation.rb +56 -68
  22. data/lib/watobo/core/cookie.rb +31 -43
  23. data/lib/watobo/core/finding.rb +74 -86
  24. data/lib/watobo/core/findings.rb +113 -125
  25. data/lib/watobo/core/forwarding_proxy.rb +44 -35
  26. data/lib/watobo/core/fuzz_gen.rb +8 -20
  27. data/lib/watobo/core/intercept_carver.rb +176 -188
  28. data/lib/watobo/core/intercept_filter.rb +243 -255
  29. data/lib/watobo/core/interceptor.rb +106 -118
  30. data/lib/watobo/core/min_class.rb +12 -24
  31. data/lib/watobo/core/netfilter_queue.rb +178 -190
  32. data/lib/watobo/core/ott_cache.rb +152 -148
  33. data/lib/watobo/core/parameter.rb +53 -58
  34. data/lib/watobo/core/passive_check.rb +8 -20
  35. data/lib/watobo/core/passive_checks.rb +56 -68
  36. data/lib/watobo/core/passive_scanner.rb +54 -66
  37. data/lib/watobo/core/plugin.rb +19 -31
  38. data/lib/watobo/core/project.rb +8 -20
  39. data/lib/watobo/core/proxy.rb +51 -63
  40. data/lib/watobo/core/request.rb +128 -120
  41. data/lib/watobo/core/response.rb +59 -61
  42. data/lib/watobo/core/scanner.rb +8 -20
  43. data/lib/watobo/core/scanner3.rb +413 -425
  44. data/lib/watobo/core/scope.rb +91 -103
  45. data/lib/watobo/core/session.rb +109 -87
  46. data/lib/watobo/core/sid_cache.rb +106 -118
  47. data/lib/watobo/core/subscriber.rb +33 -45
  48. data/lib/watobo/defaults.rb +29 -41
  49. data/lib/watobo/external/diff/lcs.rb +8 -20
  50. data/lib/watobo/external/diff/lcs/array.rb +8 -20
  51. data/lib/watobo/external/diff/lcs/block.rb +8 -20
  52. data/lib/watobo/external/diff/lcs/callbacks.rb +8 -20
  53. data/lib/watobo/external/diff/lcs/change.rb +8 -20
  54. data/lib/watobo/external/diff/lcs/hunk.rb +8 -20
  55. data/lib/watobo/external/diff/lcs/ldiff.rb +8 -20
  56. data/lib/watobo/external/diff/lcs/string.rb +8 -20
  57. data/lib/watobo/externals.rb +14 -26
  58. data/lib/watobo/framework.rb +12 -24
  59. data/lib/watobo/framework/create_project.rb +68 -80
  60. data/lib/watobo/framework/init.rb +8 -20
  61. data/lib/watobo/framework/init_modules.rb +8 -20
  62. data/lib/watobo/framework/license_text.rb +36 -48
  63. data/lib/watobo/framework/load_chat.rb +21 -33
  64. data/lib/watobo/gui.rb +121 -133
  65. data/lib/watobo/gui/about_watobo.rb +8 -20
  66. data/lib/watobo/gui/browser_preview.rb +8 -20
  67. data/lib/watobo/gui/certificate_dialog.rb +8 -20
  68. data/lib/watobo/gui/chat_diff.rb +11 -21
  69. data/lib/watobo/gui/chatviewer_frame.rb +10 -22
  70. data/lib/watobo/gui/checkboxtree.rb +8 -20
  71. data/lib/watobo/gui/checks_policy_frame.rb +8 -20
  72. data/lib/watobo/gui/client_cert_dialog.rb +10 -21
  73. data/lib/watobo/gui/confirm_scan_dialog.rb +8 -20
  74. data/lib/watobo/gui/conversation_table.rb +54 -44
  75. data/lib/watobo/gui/conversation_table_ctrl.rb +215 -227
  76. data/lib/watobo/gui/conversation_table_ctrl2.rb +385 -393
  77. data/lib/watobo/gui/csrf_token_dialog.rb +11 -25
  78. data/lib/watobo/gui/custom_viewer.rb +357 -369
  79. data/lib/watobo/gui/dashboard.rb +8 -20
  80. data/lib/watobo/gui/define_scope_frame.rb +8 -20
  81. data/lib/watobo/gui/differ_frame.rb +223 -235
  82. data/lib/watobo/gui/edit_comment.rb +8 -20
  83. data/lib/watobo/gui/edit_scope_dialog.rb +8 -20
  84. data/lib/watobo/gui/export_dialog.rb +114 -0
  85. data/lib/watobo/gui/finding_info.rb +9 -21
  86. data/lib/watobo/gui/findings_tree.rb +8 -20
  87. data/lib/watobo/gui/full_scan_dialog.rb +8 -20
  88. data/lib/watobo/gui/fuzzer_gui.rb +8 -20
  89. data/lib/watobo/gui/goto_url_dialog.rb +78 -90
  90. data/lib/watobo/gui/hex_viewer.rb +25 -27
  91. data/lib/watobo/gui/html_viewer.rb +295 -307
  92. data/lib/watobo/gui/intercept_filter_dialog.rb +196 -208
  93. data/lib/watobo/gui/interceptor_gui.rb +1046 -1041
  94. data/lib/watobo/gui/interceptor_settings_dialog.rb +8 -20
  95. data/lib/watobo/gui/list_box.rb +109 -121
  96. data/lib/watobo/gui/log_file_viewer.rb +40 -52
  97. data/lib/watobo/gui/log_viewer.rb +87 -99
  98. data/lib/watobo/gui/login_wizzard.rb +8 -20
  99. data/lib/watobo/gui/main_window.rb +34 -33
  100. data/lib/watobo/gui/manual_request_editor.rb +25 -35
  101. data/lib/watobo/gui/master_pw_dialog.rb +8 -20
  102. data/lib/watobo/gui/mixins/gui_settings.rb +37 -49
  103. data/lib/watobo/gui/page_tree.rb +225 -237
  104. data/lib/watobo/gui/password_policy_dialog.rb +8 -20
  105. data/lib/watobo/gui/plugin_board.rb +8 -20
  106. data/lib/watobo/gui/preferences_dialog.rb +8 -20
  107. data/lib/watobo/gui/progress_window.rb +8 -20
  108. data/lib/watobo/gui/project_wizzard.rb +8 -20
  109. data/lib/watobo/gui/proxy_dialog.rb +117 -85
  110. data/lib/watobo/gui/quick_scan_dialog.rb +8 -20
  111. data/lib/watobo/gui/request_builder_frame.rb +125 -122
  112. data/lib/watobo/gui/request_editor.rb +53 -28
  113. data/lib/watobo/gui/rewrite_filters_dialog.rb +402 -414
  114. data/lib/watobo/gui/rewrite_rules_dialog.rb +380 -392
  115. data/lib/watobo/gui/save_chat_dialog.rb +148 -160
  116. data/lib/watobo/gui/scanner_settings_dialog.rb +8 -20
  117. data/lib/watobo/gui/select_chat_dialog.rb +8 -20
  118. data/lib/watobo/gui/session_management_dialog.rb +8 -20
  119. data/lib/watobo/gui/sites_tree.rb +118 -22
  120. data/lib/watobo/gui/status_bar.rb +8 -20
  121. data/lib/watobo/gui/table_editor.rb +76 -53
  122. data/lib/watobo/gui/tagless_viewer.rb +10 -21
  123. data/lib/watobo/gui/templates/plugin.rb +8 -20
  124. data/lib/watobo/gui/templates/plugin2.rb +99 -111
  125. data/lib/watobo/gui/templates/plugin_base.rb +152 -164
  126. data/lib/watobo/gui/text_viewer.rb +8 -20
  127. data/lib/watobo/gui/transcoder_window.rb +15 -22
  128. data/lib/watobo/gui/utils/gui_utils.rb +8 -20
  129. data/lib/watobo/gui/utils/init_icons.rb +94 -106
  130. data/lib/watobo/gui/utils/load_icons.rb +41 -53
  131. data/lib/watobo/gui/utils/load_plugins.rb +118 -130
  132. data/lib/watobo/gui/utils/master_password.rb +76 -88
  133. data/lib/watobo/gui/utils/save_default_settings.rb +121 -133
  134. data/lib/watobo/gui/utils/save_project_settings.rb +8 -20
  135. data/lib/watobo/gui/utils/save_proxy_settings.rb +53 -21
  136. data/lib/watobo/gui/utils/save_scanner_settings.rb +26 -38
  137. data/lib/watobo/gui/utils/session_history.rb +120 -132
  138. data/lib/watobo/gui/workspace_dialog.rb +8 -20
  139. data/lib/watobo/gui/www_auth_dialog.rb +8 -20
  140. data/lib/watobo/gui/xml_viewer_frame.rb +8 -20
  141. data/lib/watobo/http.rb +12 -23
  142. data/lib/watobo/http/cookies/cookies.rb +63 -70
  143. data/lib/watobo/http/data/data.rb +56 -64
  144. data/lib/watobo/http/data/json.rb +51 -0
  145. data/lib/watobo/http/url/url.rb +46 -58
  146. data/lib/watobo/http/xml/xml.rb +129 -141
  147. data/lib/watobo/interceptor.rb +11 -23
  148. data/lib/watobo/interceptor/proxy.rb +624 -625
  149. data/lib/watobo/interceptor/transparent.rb +22 -34
  150. data/lib/watobo/mixins.rb +18 -30
  151. data/lib/watobo/mixins/check_info.rb +35 -47
  152. data/lib/watobo/mixins/httpparser.rb +42 -35
  153. data/lib/watobo/mixins/request_parser.rb +8 -20
  154. data/lib/watobo/mixins/shapers.rb +484 -477
  155. data/lib/watobo/mixins/transcoders.rb +8 -20
  156. data/lib/watobo/parser.rb +9 -21
  157. data/lib/watobo/parser/html.rb +91 -103
  158. data/lib/watobo/sockets.rb +11 -23
  159. data/lib/watobo/sockets/agent.rb +836 -848
  160. data/lib/watobo/sockets/client_socket.rb +283 -277
  161. data/lib/watobo/sockets/connection.rb +409 -421
  162. data/lib/watobo/sockets/http_socket.rb +16 -23
  163. data/lib/watobo/sockets/ntlm_auth.rb +137 -149
  164. data/lib/watobo/utils.rb +18 -30
  165. data/lib/watobo/utils/check_regex.rb +8 -20
  166. data/lib/watobo/utils/copy_object.rb +8 -20
  167. data/lib/watobo/utils/crypto.rb +8 -20
  168. data/lib/watobo/utils/expand_range.rb +31 -43
  169. data/lib/watobo/utils/export_xml.rb +108 -0
  170. data/lib/watobo/utils/file_management.rb +8 -20
  171. data/lib/watobo/utils/hexprint.rb +17 -29
  172. data/lib/watobo/utils/load_chat.rb +8 -20
  173. data/lib/watobo/utils/load_icon.rb +8 -20
  174. data/lib/watobo/{external/ntlm → utils}/ntlm.rb +874 -796
  175. data/lib/watobo/utils/print_debug.rb +20 -32
  176. data/lib/watobo/utils/response_builder.rb +98 -110
  177. data/lib/watobo/utils/response_hash.rb +9 -20
  178. data/lib/watobo/utils/secure_eval.rb +10 -22
  179. data/lib/watobo/utils/strings.rb +18 -30
  180. data/lib/watobo/utils/text2request.rb +12 -20
  181. data/lib/watobo/utils/url.rb +31 -43
  182. data/lib/watobo/utils/utf16.rb +22 -0
  183. data/modules/active/Apache/mod_status.rb +9 -0
  184. data/modules/active/Apache/multiview.rb +161 -0
  185. data/modules/active/Flash/crossdomain.rb +9 -0
  186. data/modules/active/directories/dirwalker.rb +8 -20
  187. data/modules/active/discovery/fileextensions.rb +10 -22
  188. data/modules/active/discovery/http_methods.rb +8 -20
  189. data/modules/active/domino/domino_db.rb +8 -20
  190. data/modules/active/dotNET/custom_errors.rb +110 -122
  191. data/modules/active/dotNET/dotnet_files.rb +98 -110
  192. data/modules/active/fileinclusion/lfi_simple.rb +8 -20
  193. data/modules/active/jboss/jboss_basic.rb +8 -20
  194. data/modules/active/sap/business_objects.rb +63 -0
  195. data/modules/active/sap/its_commands.rb +8 -20
  196. data/modules/active/sap/its_service_parameter.rb +8 -20
  197. data/modules/active/sap/its_services.rb +8 -20
  198. data/modules/active/sap/its_xss.rb +8 -20
  199. data/modules/active/shell_shock/shell_shock.rb +149 -0
  200. data/modules/active/siebel/siebel_apps.rb +168 -180
  201. data/modules/active/sqlinjection/sql_boolean.rb +9 -21
  202. data/modules/active/sqlinjection/sqli_error.rb +10 -22
  203. data/modules/active/sqlinjection/sqli_timing.rb +228 -240
  204. data/modules/active/struts2/default_handler_ognl.rb +114 -126
  205. data/modules/active/struts2/include_params_ognl.rb +113 -125
  206. data/modules/active/xml/xml_xxe.rb +122 -127
  207. data/modules/active/xss/xss_ng.rb +223 -234
  208. data/modules/active/xss/xss_simple.rb +8 -20
  209. data/modules/passive/ajax.rb +76 -84
  210. data/modules/passive/autocomplete.rb +64 -76
  211. data/modules/passive/cookie_options.rb +8 -20
  212. data/modules/passive/cookie_xss.rb +9 -21
  213. data/modules/passive/detect_code.rb +9 -21
  214. data/modules/passive/detect_fileupload.rb +11 -22
  215. data/modules/passive/detect_infrastructure.rb +23 -35
  216. data/modules/passive/detect_one_time_tokens.rb +8 -20
  217. data/modules/passive/dirindexing.rb +9 -21
  218. data/modules/passive/disclosure_domino.rb +66 -79
  219. data/modules/passive/disclosure_emails.rb +9 -21
  220. data/modules/passive/disclosure_ipaddr.rb +15 -23
  221. data/modules/passive/filename_as_parameter.rb +8 -20
  222. data/modules/passive/form_spotter.rb +15 -21
  223. data/modules/passive/hidden_fields.rb +64 -70
  224. data/modules/passive/hotspots.rb +13 -22
  225. data/modules/passive/in_script_parameter.rb +15 -24
  226. data/modules/passive/multiple_server_headers.rb +8 -20
  227. data/modules/passive/possible_login.rb +12 -23
  228. data/modules/passive/redirect_url.rb +10 -22
  229. data/modules/passive/redirectionz.rb +9 -21
  230. data/modules/passive/sap-headers.rb +64 -76
  231. data/modules/passive/xss_dom.rb +10 -21
  232. data/plugins/catalog/catalog.rb +17 -23
  233. data/plugins/crawler/crawler.rb +12 -24
  234. data/plugins/crawler/gui.rb +13 -25
  235. data/plugins/crawler/gui/auth_frame.rb +278 -290
  236. data/plugins/crawler/gui/crawler_gui.rb +302 -320
  237. data/plugins/crawler/gui/general_settings_frame.rb +104 -116
  238. data/plugins/crawler/gui/hooks_frame.rb +88 -100
  239. data/plugins/crawler/gui/scope_frame.rb +58 -70
  240. data/plugins/crawler/gui/settings_tabbook.rb +46 -58
  241. data/plugins/crawler/gui/status_frame.rb +67 -78
  242. data/plugins/crawler/lib/bags.rb +26 -38
  243. data/plugins/crawler/lib/constants.rb +19 -31
  244. data/plugins/crawler/lib/engine.rb +505 -508
  245. data/plugins/crawler/lib/grabber.rb +77 -87
  246. data/plugins/crawler/lib/status.rb +82 -0
  247. data/plugins/crawler/lib/uri_mp.rb +20 -32
  248. data/plugins/filefinder/dbs/siebel_paths.txt +1118 -0
  249. data/plugins/filefinder/dbs/subs-big.lst +31986 -0
  250. data/plugins/filefinder/filefinder.rb +13 -23
  251. data/plugins/sqlmap/bin/test.rb +86 -98
  252. data/plugins/sqlmap/gui.rb +12 -24
  253. data/plugins/sqlmap/gui/main.rb +226 -238
  254. data/plugins/sqlmap/gui/options_frame.rb +105 -117
  255. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +103 -115
  256. data/plugins/sqlmap/sqlmap.rb +10 -22
  257. data/plugins/sslchecker/cli/sslchecker_cli.rb +8 -20
  258. data/plugins/sslchecker/gui/cipher_table.rb +252 -264
  259. data/plugins/sslchecker/gui/gui.rb +267 -276
  260. data/plugins/sslchecker/gui/sslchecker.rb +12 -24
  261. data/plugins/sslchecker/lib/check.rb +172 -80
  262. data/plugins/wshell/gui/main.rb +115 -127
  263. data/plugins/wshell/lib/core.rb +85 -97
  264. data/plugins/wshell/wshell.rb +19 -31
  265. metadata +14 -6
  266. data/.yardopts +0 -24
@@ -1,423 +1,411 @@
1
- # .
1
+ #.
2
2
  # connection.rb
3
- #
4
- # Copyright 2013 by siberas, http://www.siberas.de
5
- #
6
- # This file is part of WATOBO (Web Application Tool Box)
7
- # http://watobo.sourceforge.com
8
- #
9
- # WATOBO is free software; you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation version 2 of the License.
12
- #
13
- # WATOBO is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with WATOBO; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- # .
22
- # @private
23
- module Watobo#:nodoc: all
24
- module HTTPSocket
25
- class Connection_UNUSED
26
-
27
- include Watobo::Constants
28
- extend Watobo::Subscriber
29
-
30
-
31
-
32
- def initialize(request, prefs)
33
- @request = request
34
- @response = nil
35
-
36
- @proxy = Watobo::ForwardingProxy.get(site)
37
-
38
- unless @proxy.nil?
39
- host = @proxy.host
40
- port = @proxy.port
41
- else
42
- host = @request.host
43
- port = @request.port
44
- end
45
- # check if hostname is valid and can be resolved
46
- #hostip = IPSocket.getaddress(host)
47
-
48
- end
49
-
50
- def read_body( prefs={} )
51
- clen = @response.content_length
52
- data = ""
53
-
54
- begin
55
- if @response.is_chunked?
56
- Watobo::HTTPSocket.readChunkedBody(@socket) { |c|
57
- data += c
58
- }
59
- elsif clen > 0
60
- # puts "* read #{clen} bytes for body"
61
- Watobo::HTTPSocket.read_body(@socket, :max_bytes => clen) { |c|
62
- data += c
63
- break if data.length == clen
64
- }
65
- elsif clen < 0
66
- # puts "* no content-length information ... mmmmmpf"
67
- # eofcount = 0
68
- Watobo::HTTPSocket.read_body(@socket) do |c|
69
- data += c
70
- end
71
-
72
- end
73
-
74
- response.push data unless data.empty?
75
- unless prefs[:ignore_logout]==true or @session[:logout_signatures].empty?
76
- notify(:logout, self) if loggedOut?(response)
77
- end
78
-
79
- update_sids(request.host, response) if prefs[:update_sids] == true
80
- return true
81
-
82
- rescue => e
83
- puts "! Could not read response"
84
- puts e
85
- # puts e.backtrace
86
- end
87
-
88
- return false
89
- end
90
-
91
- def read_header( prefs={} )
92
-
93
- header = []
94
- msg = nil
95
- begin
96
- Watobo::HTTPSocket.read_header(@socket) do |line|
97
- #puts line
98
- # puts line.unpack("H*")
99
- header << line
100
- end
101
- rescue Errno::ECONNRESET
102
- msg = "<html><head><title>WATOBO</title></head><body>WATOBO: Connection Reset By Peer</body></html>"
103
- rescue Timeout::Error
104
- msg = "<html><head><title>WATOBO</title></head><body>WATOBO: Timeout</body></html>"
105
- rescue => bang
106
- puts "!ERROR: read_header"
107
- return nil
108
- end
109
-
110
- header = [ "HTTP/1.1 200 OK\r\n", "Server: WATOBO\r\n", "Content-Length: #{msg.length.to_i}\r\n", "Content-Type: text/html\r\n", "\r\n", "#{msg}" ] unless msg.nil?
111
-
112
- response = Watobo::Response.new header
113
- # update_sids(header)
114
-
115
- # update_sids(request.site, response) if prefs[:update_sids] == true
116
-
117
- unless prefs[:ignore_logout]==true or @session[:logout_signatures].empty?
118
- notify(:logout, self) if loggedOut?(response)
119
- end
120
-
121
- return response
122
- end
123
-
124
- def sslConnect(tcp_socket, current_prefs = {} )
125
- begin
126
-
127
- ctx = OpenSSL::SSL::SSLContext.new()
128
- ctx.ciphers = current_prefs[:ssl_cipher] if current_prefs.has_key? :ssl_cipher
129
-
130
- if current_prefs.has_key? :ssl_client_cert and current_prefs.has_key? :ssl_client_key
131
-
132
- ctx.cert = current_prefs[:ssl_client_cert]
133
- ctx.key = current_prefs[:ssl_client_key]
134
- if $DEBUG
135
- puts "[SSLconnect] Client Certificates"
136
- puts "= CERT ="
137
- # puts @ctx.cert.methods.sort
138
- puts ctx.cert.display
139
- puts "---"
140
- puts "= KEY ="
141
- puts ctx.key.display
142
- puts "---"
143
- end
144
- end
145
-
146
- @socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ctx)
147
- @socket.sync_close = true
148
-
149
- @socket.connect
150
- @socket.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
151
- puts "[SSLconnect]: #{@socket.state}" if $DEBUG
152
- return socket
153
- rescue => bang
154
- if current_prefs[:ssl_cipher].nil?
155
- puts "[SSLconnect] ... gr#!..*peep*.. "
156
- puts bang
157
- puts bang.backtrace if $DEBUG
158
- end
159
- end
160
- end
161
-
162
- # SSLProxyConnect
163
- # return SSLSocket, ResponseHeader of ConnectionSetup
164
- # On error SSLSocket is nil
165
- def sslProxyConnect( prefs )
166
- begin
167
- tcp_socket = nil
168
- response_header = []
169
-
170
- request = @request.copy
171
-
172
- # timeout(6) do
173
-
174
- tcp_socket = TCPSocket.new( @proxy.host, @proxy.port)
175
- tcp_socket.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
176
- tcp_socket.sync = true
177
-
178
- # setup request
179
- dummy = "CONNECT #{request.host}:#{request.port} HTTP/1.0\r\n"
180
- request.shift
181
- request.unshift dummy
182
-
183
- request.removeHeader("Proxy-Connection")
184
- request.removeHeader("Connection")
185
- request.removeHeader("Content-Length")
186
- request.removeBody()
187
- request.addHeader("Proxy-Connection", "Keep-Alive")
188
- request.addHeader("Pragma", "no-cache")
189
-
190
- # puts "=== sslProxyConnect ==="
191
- # puts request
192
-
193
- if proxy.has_login?
194
- case proxy.auth_type
195
- when AUTH_TYPE_NTLM
196
-
197
- t1 = Net::NTLM::Message::Type1.new()
198
- msg = "NTLM " + t1.encode64
199
- request.addHeader("Proxy-Authorization", msg)
200
-
201
- if $DEBUG
202
- puts "============= PROXY NTLM: T1 ======================="
203
- puts request
204
- puts "---"
205
- end
206
- data = request.join + "\r\n"
207
-
208
- tcp_socket.print data
209
- # puts "-----------------"
210
- cl = 0
211
- ntlm_challenge = nil
212
- while (line = tcp_socket.gets)
213
- response_header.push line
214
- puts line if $DEBUG
215
- if line =~ /^HTTP\/\d\.\d (\d+) (.*)/ then
216
- rcode = $1.to_i
217
- rmsg = $2
218
- end
219
- if line =~ /^Proxy-Authenticate: (NTLM) (.+)\r\n/
220
- ntlm_challenge = $2
221
- end
222
- if line =~ /^Content-Length: (\d*)/i
223
- cl = $1.to_i
224
- end
225
- break if line.strip.empty?
226
- end
227
-
228
-
229
- if cl > 0
230
- Watobo::HTTPSocket.read_body(tcp_socket) { |d|
231
- # puts d
232
- }
233
- end
234
-
235
- if rcode == 200 # Ok
236
- puts "* seems proxy doesn't require authentication"
237
- socket = sslConnect(tcp_socket, prefs)
238
- return socket, response_header
239
- end
240
-
241
- return socket, response_header if ntlm_challenge.nil? or ntlm_challenge == ""
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
242
9
 
243
- t2 = Net::NTLM::Message.decode64(ntlm_challenge)
244
- t3 = t2.response( { :user => proxy.username,
245
- :password => proxy.password,
246
- :domain => proxy.domain },
247
- { :workstation => proxy.workstation, :ntlmv2 => true } )
248
- request.removeHeader("Proxy-Authorization")
249
-
250
- msg = "NTLM " + t3.encode64
251
- request.addHeader("Proxy-Authorization", msg)
252
-
253
- data = request.join + "\r\n"
254
- if $DEBUG
255
- puts "============= T3 ======================="
256
- puts data
257
- puts "---"
258
- end
259
-
260
- tcp_socket.print data
261
- # puts "-----------------"
262
-
263
- response_header = []
264
- rcode = 0
265
- response_header = read_header(@socket)
266
- rcode = response_header.status
267
- if rcode =~/^200/ # Ok
268
- puts "[ProxyAuth-NTLM] Authorization Successful" if $DEBUG
269
- socket = sslConnect(tcp_socket, prefs)
270
- return socket, response_header
271
- elsif rcode =~ /^407/ # ProxyAuthentication Required
272
- # if rcode is still 407 authentication didn't work -> break
273
- msg = "NTLM-Authentication failed!"
274
- puts "[ProxyAuth-NTLM] #{msg}" if $DEBUG
275
- return nil, msg
276
- else
277
- puts "[SSLconnect] NTLM Authentication"
278
- puts "> #{rcode} <"
279
- return nil, response_header
280
- end
281
- end
282
- end # END OF PROXY AUTH
283
-
284
- # Start ProxyConnect Without Authentication
285
- data = request.join + "\r\n"
286
- tcp_socket.print data
287
- # puts "-----------------"
288
-
289
- response_header = []
290
- response_header = readHTTPHeader(@socket)
291
- rcode = response_header.status
292
- if rcode =~ /^200/ # Ok
293
- # puts "* proxy connection successfull"
294
- elsif rcode =~ /^407/ # ProxyAuthentication Required
295
- # if rcode is still 407 authentication didn't work -> break
296
-
297
- else
298
- puts "[SSLconnect] Response Status"
299
- puts "> #{rcode} <"
300
- end
301
-
302
- socket = sslConnect(@socket, prefs)
303
- return socket, response_header
304
- rescue => bang
305
- puts bang
306
- return nil, error_response(bang)
307
- end
308
- # return nil, nil
309
- end
310
-
311
- # proxyAuthNTLM
312
- # returns: ResponseHeaders
313
- def proxyAuthNTLM()
314
-
315
- request = @request.copy
316
-
317
-
318
- request.removeHeader("Proxy-Authorization")
319
- request.removeHeader("Proxy-Connection")
320
-
321
- response_header = []
322
-
323
- ntlm_challenge = nil
324
- t1 = Net::NTLM::Message::Type1.new()
325
- msg = "NTLM " + t1.encode64
326
-
327
- request.addHeader("Proxy-Authorization", msg)
328
- request.addHeader("Proxy-Connection", "Keep-Alive")
329
-
330
- # puts "============= T1 ======================="
331
- # puts auth_request
332
- data = request.join + "\r\n"
333
-
334
- @socket.print data
335
- # puts "-----------------"
336
- response_header = readHTTPHeader(@socket)
337
- rcode = nil
338
- rmsg = nil
339
- ntlm_challenge = nil
340
- clen = 0
341
- response_header.each do |line|
342
- # puts line
343
- if line =~ /^HTTP\/\d\.\d (\d+) (.*)/ then
344
- rcode = $1.to_i
345
- rmsg = $2
346
- end
347
- if line =~ /^Proxy-Authenticate: (NTLM) (.+)\r\n/
348
- ntlm_challenge = $2
349
- end
350
- if line =~ /^Content-Length: (\d{1,})\r\n/
351
- clen = $1.to_i
352
- end
353
- break if line.strip.empty?
354
- end
355
-
356
- #puts "* reading #{clen} bytes"
357
-
358
- if rcode == 407 # ProxyAuthentication Required
359
- return response_header if ntlm_challenge.nil? or ntlm_challenge == ""
360
- else
361
- puts "* no proxy authentication required!"
362
- return response_header
363
- end
364
-
365
- Watobo::HTTPSocket.read_body(@socket, :max_bytes => clen){ |d|
366
- #puts d
367
- }
368
-
369
- t2 = Net::NTLM::Message.decode64(ntlm_challenge)
370
- t3 = t2.response({:user => proxy.username, :password => proxy.password, :workstation => proxy.workstation, :domain => proxy.domain}, {:ntlmv2 => true})
371
- request.removeHeader("Proxy-Authorization")
372
- # request.removeHeader("Proxy-Connection")
373
-
374
- # request.addHeader("Proxy-Connection", "Close")
375
- # request.addHeader("Pragma", "no-cache")
376
- msg = "NTLM " + t3.encode64
377
- request.addHeader("Proxy-Authorization", msg)
378
- # puts "============= T3 ======================="
379
- # puts request
380
- # puts "------------------------"
381
- data = request.join + "\r\n"
382
- @socket.print data
383
-
384
- response_header = readHTTPHeader(@socket)
385
- response_header.each do |line|
386
- # puts line
387
- if line =~ /^HTTP\/\d\.\d (\d+) (.*)/ then
388
- rcode = $1.to_i
389
- rmsg = $2
390
- end
391
- if line =~ /^Proxy-Authenticate: (NTLM) (.+)\r\n/
392
- ntlm_challenge = $2
393
- end
394
- if line =~ /^Content-Length: (\d{1,})\r\n/
395
- clen = $1.to_i
396
- end
397
- break if line.strip.empty?
398
- end
399
- # Watobo::HTTPSocket.read_body(tcp_socket, :max_bytes => clen){ |d|
400
- #puts d
401
- # }
402
- return response_header
403
- end
404
-
405
- #
406
- # doProxyAuth
407
- #
408
- def doProxyAuth()
409
- # puts "DO PROXY AUTH"
410
- # puts proxy.to_yaml
411
- response_headers = nil
412
- case @proxy.auth_type
413
- when AUTH_TYPE_NTLM
414
- return proxyAuthNTLM()
415
-
416
- end # END OF NTLM
417
-
418
- end
419
-
420
-
421
- end
422
- end
423
- end
10
+ # @private
11
+ module Watobo#:nodoc: all
12
+ module HTTPSocket
13
+ class Connection_UNUSED
14
+
15
+ include Watobo::Constants
16
+ extend Watobo::Subscriber
17
+
18
+
19
+
20
+ def initialize(request, prefs)
21
+ @request = request
22
+ @response = nil
23
+
24
+ @proxy = Watobo::ForwardingProxy.get(site)
25
+
26
+ unless @proxy.nil?
27
+ host = @proxy.host
28
+ port = @proxy.port
29
+ else
30
+ host = @request.host
31
+ port = @request.port
32
+ end
33
+ # check if hostname is valid and can be resolved
34
+ #hostip = IPSocket.getaddress(host)
35
+
36
+ end
37
+
38
+ def read_body( prefs={} )
39
+ clen = @response.content_length
40
+ data = ""
41
+
42
+ begin
43
+ if @response.is_chunked?
44
+ Watobo::HTTPSocket.readChunkedBody(@socket) { |c|
45
+ data += c
46
+ }
47
+ elsif clen > 0
48
+ # puts "* read #{clen} bytes for body"
49
+ Watobo::HTTPSocket.read_body(@socket, :max_bytes => clen) { |c|
50
+ data += c
51
+ break if data.length == clen
52
+ }
53
+ elsif clen < 0
54
+ # puts "* no content-length information ... mmmmmpf"
55
+ # eofcount = 0
56
+ Watobo::HTTPSocket.read_body(@socket) do |c|
57
+ data += c
58
+ end
59
+
60
+ end
61
+
62
+ response.push data unless data.empty?
63
+ unless prefs[:ignore_logout]==true or @session[:logout_signatures].empty?
64
+ notify(:logout, self) if loggedOut?(response)
65
+ end
66
+
67
+ update_sids(request.host, response) if prefs[:update_sids] == true
68
+ return true
69
+
70
+ rescue => e
71
+ puts "! Could not read response"
72
+ puts e
73
+ # puts e.backtrace
74
+ end
75
+
76
+ return false
77
+ end
78
+
79
+ def read_header( prefs={} )
80
+
81
+ header = []
82
+ msg = nil
83
+ begin
84
+ Watobo::HTTPSocket.read_header(@socket) do |line|
85
+ #puts line
86
+ # puts line.unpack("H*")
87
+ header << line
88
+ end
89
+ rescue Errno::ECONNRESET
90
+ msg = "<html><head><title>WATOBO</title></head><body>WATOBO: Connection Reset By Peer</body></html>"
91
+ rescue Timeout::Error
92
+ msg = "<html><head><title>WATOBO</title></head><body>WATOBO: Timeout</body></html>"
93
+ rescue => bang
94
+ puts "!ERROR: read_header"
95
+ return nil
96
+ end
97
+
98
+ header = [ "HTTP/1.1 200 OK\r\n", "Server: WATOBO\r\n", "Content-Length: #{msg.length.to_i}\r\n", "Content-Type: text/html\r\n", "\r\n", "#{msg}" ] unless msg.nil?
99
+
100
+ response = Watobo::Response.new header
101
+ # update_sids(header)
102
+
103
+ # update_sids(request.site, response) if prefs[:update_sids] == true
104
+
105
+ unless prefs[:ignore_logout]==true or @session[:logout_signatures].empty?
106
+ notify(:logout, self) if loggedOut?(response)
107
+ end
108
+
109
+ return response
110
+ end
111
+
112
+ def sslConnect(tcp_socket, current_prefs = {} )
113
+ begin
114
+
115
+ ctx = OpenSSL::SSL::SSLContext.new()
116
+ ctx.ciphers = current_prefs[:ssl_cipher] if current_prefs.has_key? :ssl_cipher
117
+
118
+ if current_prefs.has_key? :ssl_client_cert and current_prefs.has_key? :ssl_client_key
119
+
120
+ ctx.cert = current_prefs[:ssl_client_cert]
121
+ ctx.key = current_prefs[:ssl_client_key]
122
+ if $DEBUG
123
+ puts "[SSLconnect] Client Certificates"
124
+ puts "= CERT ="
125
+ # puts @ctx.cert.methods.sort
126
+ puts ctx.cert.display
127
+ puts "---"
128
+ puts "= KEY ="
129
+ puts ctx.key.display
130
+ puts "---"
131
+ end
132
+ end
133
+
134
+ @socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ctx)
135
+ @socket.sync_close = true
136
+
137
+ @socket.connect
138
+ @socket.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
139
+ puts "[SSLconnect]: #{@socket.state}" if $DEBUG
140
+ return socket
141
+ rescue => bang
142
+ if current_prefs[:ssl_cipher].nil?
143
+ puts "[SSLconnect] ... gr#!..*peep*.. "
144
+ puts bang
145
+ puts bang.backtrace if $DEBUG
146
+ end
147
+ end
148
+ end
149
+
150
+ # SSLProxyConnect
151
+ # return SSLSocket, ResponseHeader of ConnectionSetup
152
+ # On error SSLSocket is nil
153
+ def sslProxyConnect( prefs )
154
+ begin
155
+ tcp_socket = nil
156
+ response_header = []
157
+
158
+ request = @request.copy
159
+
160
+ # timeout(6) do
161
+
162
+ tcp_socket = TCPSocket.new( @proxy.host, @proxy.port)
163
+ tcp_socket.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
164
+ tcp_socket.sync = true
165
+
166
+ # setup request
167
+ dummy = "CONNECT #{request.host}:#{request.port} HTTP/1.0\r\n"
168
+ request.shift
169
+ request.unshift dummy
170
+
171
+ request.removeHeader("Proxy-Connection")
172
+ request.removeHeader("Connection")
173
+ request.removeHeader("Content-Length")
174
+ request.removeBody()
175
+ request.addHeader("Proxy-Connection", "Keep-Alive")
176
+ request.addHeader("Pragma", "no-cache")
177
+
178
+ # puts "=== sslProxyConnect ==="
179
+ # puts request
180
+
181
+ if proxy.has_login?
182
+ case proxy.auth_type
183
+ when AUTH_TYPE_NTLM
184
+
185
+ t1 = Watobo::NTLM::Message::Type1.new()
186
+ msg = "NTLM " + t1.encode64
187
+ request.addHeader("Proxy-Authorization", msg)
188
+
189
+ if $DEBUG
190
+ puts "============= PROXY NTLM: T1 ======================="
191
+ puts request
192
+ puts "---"
193
+ end
194
+ data = request.join + "\r\n"
195
+
196
+ tcp_socket.print data
197
+ # puts "-----------------"
198
+ cl = 0
199
+ ntlm_challenge = nil
200
+ while (line = tcp_socket.gets)
201
+ response_header.push line
202
+ puts line if $DEBUG
203
+ if line =~ /^HTTP\/\d\.\d (\d+) (.*)/ then
204
+ rcode = $1.to_i
205
+ rmsg = $2
206
+ end
207
+ if line =~ /^Proxy-Authenticate: (NTLM) (.+)\r\n/
208
+ ntlm_challenge = $2
209
+ end
210
+ if line =~ /^Content-Length: (\d*)/i
211
+ cl = $1.to_i
212
+ end
213
+ break if line.strip.empty?
214
+ end
215
+
216
+
217
+ if cl > 0
218
+ Watobo::HTTPSocket.read_body(tcp_socket) { |d|
219
+ # puts d
220
+ }
221
+ end
222
+
223
+ if rcode == 200 # Ok
224
+ puts "* seems proxy doesn't require authentication"
225
+ socket = sslConnect(tcp_socket, prefs)
226
+ return socket, response_header
227
+ end
228
+
229
+ return socket, response_header if ntlm_challenge.nil? or ntlm_challenge == ""
230
+
231
+ t2 = Watobo::NTLM::Message.decode64(ntlm_challenge)
232
+ t3 = t2.response( { :user => proxy.username,
233
+ :password => proxy.password,
234
+ :domain => proxy.domain },
235
+ { :workstation => proxy.workstation, :ntlmv2 => true } )
236
+ request.removeHeader("Proxy-Authorization")
237
+
238
+ msg = "NTLM " + t3.encode64
239
+ request.addHeader("Proxy-Authorization", msg)
240
+
241
+ data = request.join + "\r\n"
242
+ if $DEBUG
243
+ puts "============= T3 ======================="
244
+ puts data
245
+ puts "---"
246
+ end
247
+
248
+ tcp_socket.print data
249
+ # puts "-----------------"
250
+
251
+ response_header = []
252
+ rcode = 0
253
+ response_header = read_header(@socket)
254
+ rcode = response_header.status
255
+ if rcode =~/^200/ # Ok
256
+ puts "[ProxyAuth-NTLM] Authorization Successful" if $DEBUG
257
+ socket = sslConnect(tcp_socket, prefs)
258
+ return socket, response_header
259
+ elsif rcode =~ /^407/ # ProxyAuthentication Required
260
+ # if rcode is still 407 authentication didn't work -> break
261
+ msg = "NTLM-Authentication failed!"
262
+ puts "[ProxyAuth-NTLM] #{msg}" if $DEBUG
263
+ return nil, msg
264
+ else
265
+ puts "[SSLconnect] NTLM Authentication"
266
+ puts "> #{rcode} <"
267
+ return nil, response_header
268
+ end
269
+ end
270
+ end # END OF PROXY AUTH
271
+
272
+ # Start ProxyConnect Without Authentication
273
+ data = request.join + "\r\n"
274
+ tcp_socket.print data
275
+ # puts "-----------------"
276
+
277
+ response_header = []
278
+ response_header = readHTTPHeader(@socket)
279
+ rcode = response_header.status
280
+ if rcode =~ /^200/ # Ok
281
+ # puts "* proxy connection successfull"
282
+ elsif rcode =~ /^407/ # ProxyAuthentication Required
283
+ # if rcode is still 407 authentication didn't work -> break
284
+
285
+ else
286
+ puts "[SSLconnect] Response Status"
287
+ puts "> #{rcode} <"
288
+ end
289
+
290
+ socket = sslConnect(@socket, prefs)
291
+ return socket, response_header
292
+ rescue => bang
293
+ puts bang
294
+ return nil, error_response(bang)
295
+ end
296
+ # return nil, nil
297
+ end
298
+
299
+ # proxyAuthNTLM
300
+ # returns: ResponseHeaders
301
+ def proxyAuthNTLM()
302
+
303
+ request = @request.copy
304
+
305
+
306
+ request.removeHeader("Proxy-Authorization")
307
+ request.removeHeader("Proxy-Connection")
308
+
309
+ response_header = []
310
+
311
+ ntlm_challenge = nil
312
+ t1 = Watobo::NTLM::Message::Type1.new()
313
+ msg = "NTLM " + t1.encode64
314
+
315
+ request.addHeader("Proxy-Authorization", msg)
316
+ request.addHeader("Proxy-Connection", "Keep-Alive")
317
+
318
+ # puts "============= T1 ======================="
319
+ # puts auth_request
320
+ data = request.join + "\r\n"
321
+
322
+ @socket.print data
323
+ # puts "-----------------"
324
+ response_header = readHTTPHeader(@socket)
325
+ rcode = nil
326
+ rmsg = nil
327
+ ntlm_challenge = nil
328
+ clen = 0
329
+ response_header.each do |line|
330
+ # puts line
331
+ if line =~ /^HTTP\/\d\.\d (\d+) (.*)/ then
332
+ rcode = $1.to_i
333
+ rmsg = $2
334
+ end
335
+ if line =~ /^Proxy-Authenticate: (NTLM) (.+)\r\n/
336
+ ntlm_challenge = $2
337
+ end
338
+ if line =~ /^Content-Length: (\d{1,})\r\n/
339
+ clen = $1.to_i
340
+ end
341
+ break if line.strip.empty?
342
+ end
343
+
344
+ #puts "* reading #{clen} bytes"
345
+
346
+ if rcode == 407 # ProxyAuthentication Required
347
+ return response_header if ntlm_challenge.nil? or ntlm_challenge == ""
348
+ else
349
+ puts "* no proxy authentication required!"
350
+ return response_header
351
+ end
352
+
353
+ Watobo::HTTPSocket.read_body(@socket, :max_bytes => clen){ |d|
354
+ #puts d
355
+ }
356
+
357
+ t2 = Watobo::NTLM::Message.decode64(ntlm_challenge)
358
+ t3 = t2.response({:user => proxy.username, :password => proxy.password, :workstation => proxy.workstation, :domain => proxy.domain}, {:ntlmv2 => true})
359
+ request.removeHeader("Proxy-Authorization")
360
+ # request.removeHeader("Proxy-Connection")
361
+
362
+ # request.addHeader("Proxy-Connection", "Close")
363
+ # request.addHeader("Pragma", "no-cache")
364
+ msg = "NTLM " + t3.encode64
365
+ request.addHeader("Proxy-Authorization", msg)
366
+ # puts "============= T3 ======================="
367
+ # puts request
368
+ # puts "------------------------"
369
+ data = request.join + "\r\n"
370
+ @socket.print data
371
+
372
+ response_header = readHTTPHeader(@socket)
373
+ response_header.each do |line|
374
+ # puts line
375
+ if line =~ /^HTTP\/\d\.\d (\d+) (.*)/ then
376
+ rcode = $1.to_i
377
+ rmsg = $2
378
+ end
379
+ if line =~ /^Proxy-Authenticate: (NTLM) (.+)\r\n/
380
+ ntlm_challenge = $2
381
+ end
382
+ if line =~ /^Content-Length: (\d{1,})\r\n/
383
+ clen = $1.to_i
384
+ end
385
+ break if line.strip.empty?
386
+ end
387
+ # Watobo::HTTPSocket.read_body(tcp_socket, :max_bytes => clen){ |d|
388
+ #puts d
389
+ # }
390
+ return response_header
391
+ end
392
+
393
+ #
394
+ # doProxyAuth
395
+ #
396
+ def doProxyAuth()
397
+ # puts "DO PROXY AUTH"
398
+ # puts proxy.to_yaml
399
+ response_headers = nil
400
+ case @proxy.auth_type
401
+ when AUTH_TYPE_NTLM
402
+ return proxyAuthNTLM()
403
+
404
+ end # END OF NTLM
405
+
406
+ end
407
+
408
+
409
+ end
410
+ end
411
+ end