watobo 0.9.8.677

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 (260) hide show
  1. data/bin/watobo_gui.rb +39 -0
  2. data/certificates/cert.pem +19 -0
  3. data/certificates/privkey.pem +15 -0
  4. data/certificates/watobo_dh.key +5 -0
  5. data/config/datastore.yml +5 -0
  6. data/config/forwarding_proxy.yml +12 -0
  7. data/config/general.yml +4 -0
  8. data/config/gui.yml +23 -0
  9. data/config/interceptor.yml +16 -0
  10. data/config/scan_policy.yml +13 -0
  11. data/config/scanner.yml +34 -0
  12. data/icons/Add.ico +0 -0
  13. data/icons/Add_24x24.ico +0 -0
  14. data/icons/Bandwidth.ico +0 -0
  15. data/icons/Bandwidth_24x24.ico +0 -0
  16. data/icons/Mr. Bomb.ico +0 -0
  17. data/icons/Mr. Bomb_16x16.ico +0 -0
  18. data/icons/Mr. Bomb_24x24.ico +0 -0
  19. data/icons/Orange Ball.ico +0 -0
  20. data/icons/Orange Ball_16x16.ico +0 -0
  21. data/icons/Orange Ball_24x24.ico +0 -0
  22. data/icons/Pause.ico +0 -0
  23. data/icons/Play.ico +0 -0
  24. data/icons/Play_24x24.ico +0 -0
  25. data/icons/Red Ball.ico +0 -0
  26. data/icons/Red Ball_16x16.ico +0 -0
  27. data/icons/Red Ball_24x24.ico +0 -0
  28. data/icons/Run.ico +0 -0
  29. data/icons/Stop.ico +0 -0
  30. data/icons/Stop_24x24.ico +0 -0
  31. data/icons/Terminal.ico +0 -0
  32. data/icons/Transfer.ico +0 -0
  33. data/icons/Transfer_16x16.ico +0 -0
  34. data/icons/User.ico +0 -0
  35. data/icons/User_16x16.ico +0 -0
  36. data/icons/User_24x24.ico +0 -0
  37. data/icons/Web Browser.ico +0 -0
  38. data/icons/Web Browser_16x16.ico +0 -0
  39. data/icons/Write Document.ico +0 -0
  40. data/icons/Yellow Ball.ico +0 -0
  41. data/icons/Yellow Ball_16x16.ico +0 -0
  42. data/icons/Yellow Ball_24x24.ico +0 -0
  43. data/icons/advanced.ico +0 -0
  44. data/icons/advanced_16x16.ico +0 -0
  45. data/icons/advanced_24x24.ico +0 -0
  46. data/icons/applications.ico +0 -0
  47. data/icons/applications_16x16.ico +0 -0
  48. data/icons/applications_24x24.ico +0 -0
  49. data/icons/browser_16x16.ico +0 -0
  50. data/icons/browser_24x24.ico +0 -0
  51. data/icons/burn.ico +0 -0
  52. data/icons/burn_16x16.ico +0 -0
  53. data/icons/burn_24x24.ico +0 -0
  54. data/icons/calculator.ico +0 -0
  55. data/icons/calculator_24x24.ico +0 -0
  56. data/icons/cb_checked.ico +0 -0
  57. data/icons/cb_checked_orange.ico +0 -0
  58. data/icons/cb_unchecked.ico +0 -0
  59. data/icons/coin_24x24.ico +0 -0
  60. data/icons/conversation.ico +0 -0
  61. data/icons/conversation_24x24.ico +0 -0
  62. data/icons/engine.ico +0 -0
  63. data/icons/filter.ico +0 -0
  64. data/icons/folder.ico +0 -0
  65. data/icons/folder_16x16.ico +0 -0
  66. data/icons/fuzzer_16x16.ico +0 -0
  67. data/icons/fuzzer_24x24.ico +0 -0
  68. data/icons/go-down_16x16.png +0 -0
  69. data/icons/go-up_16x16.png +0 -0
  70. data/icons/help.ico +0 -0
  71. data/icons/help_16x16.ico +0 -0
  72. data/icons/help_24x24.ico +0 -0
  73. data/icons/iChat.ico +0 -0
  74. data/icons/iChat_16x16.ico +0 -0
  75. data/icons/iChat_24x24.ico +0 -0
  76. data/icons/icons.txt +3 -0
  77. data/icons/info.ico +0 -0
  78. data/icons/info_16x16.ico +0 -0
  79. data/icons/info_24x24.ico +0 -0
  80. data/icons/interceptor_24x24.ico +0 -0
  81. data/icons/lock.ico +0 -0
  82. data/icons/lock_12x12.ico +0 -0
  83. data/icons/lock_16x16.ico +0 -0
  84. data/icons/monitor.ico +0 -0
  85. data/icons/plugin.ico +0 -0
  86. data/icons/plugin_24x24.ico +0 -0
  87. data/icons/scan_16x16.png +0 -0
  88. data/icons/send.ico +0 -0
  89. data/icons/server.ico +0 -0
  90. data/icons/server_16x16.ico +0 -0
  91. data/icons/siberas_logo_x24.gif +0 -0
  92. data/icons/tag_blue_32x32.ico +0 -0
  93. data/icons/watobo-48x48.png +0 -0
  94. data/icons/watobo-logo.png +0 -0
  95. data/icons/watobo.ico +0 -0
  96. data/lib/watobo/adapters/data_store.rb +38 -0
  97. data/lib/watobo/adapters/file/file_store.rb +211 -0
  98. data/lib/watobo/adapters/session_store.rb +27 -0
  99. data/lib/watobo/adapters.rb +26 -0
  100. data/lib/watobo/config.rb +143 -0
  101. data/lib/watobo/constants.rb +92 -0
  102. data/lib/watobo/core/active_check.rb +404 -0
  103. data/lib/watobo/core/cookie.rb +69 -0
  104. data/lib/watobo/core/fuzz_gen.rb +160 -0
  105. data/lib/watobo/core/http_socket.rb +142 -0
  106. data/lib/watobo/core/interceptor.rb +729 -0
  107. data/lib/watobo/core/passive_check.rb +141 -0
  108. data/lib/watobo/core/project.rb +1058 -0
  109. data/lib/watobo/core/scanner.rb +396 -0
  110. data/lib/watobo/core/session.rb +1320 -0
  111. data/lib/watobo/core/simple_ca.rb +393 -0
  112. data/lib/watobo/core.rb +34 -0
  113. data/lib/watobo/defaults.rb +40 -0
  114. data/lib/watobo/external/diff/lcs/array.rb +42 -0
  115. data/lib/watobo/external/diff/lcs/block.rb +72 -0
  116. data/lib/watobo/external/diff/lcs/callbacks.rb +343 -0
  117. data/lib/watobo/external/diff/lcs/change.rb +190 -0
  118. data/lib/watobo/external/diff/lcs/hunk.rb +279 -0
  119. data/lib/watobo/external/diff/lcs/ldiff.rb +247 -0
  120. data/lib/watobo/external/diff/lcs/string.rb +40 -0
  121. data/lib/watobo/external/diff/lcs.rb +1124 -0
  122. data/lib/watobo/external/ntlm/ntlm.rb +797 -0
  123. data/lib/watobo/externals.rb +28 -0
  124. data/lib/watobo/framework/create_project.rb +55 -0
  125. data/lib/watobo/framework/init.rb +149 -0
  126. data/lib/watobo/framework/init_modules.rb +116 -0
  127. data/lib/watobo/framework/license_text.rb +50 -0
  128. data/lib/watobo/framework.rb +26 -0
  129. data/lib/watobo/gui/about_watobo.rb +68 -0
  130. data/lib/watobo/gui/browser_preview.rb +460 -0
  131. data/lib/watobo/gui/certificate_dialog.rb +132 -0
  132. data/lib/watobo/gui/chat_diff.rb +415 -0
  133. data/lib/watobo/gui/chatviewer_frame.rb +427 -0
  134. data/lib/watobo/gui/checkboxtree.rb +221 -0
  135. data/lib/watobo/gui/checks_policy_frame.rb +123 -0
  136. data/lib/watobo/gui/client_cert_dialog.rb +227 -0
  137. data/lib/watobo/gui/confirm_scan_dialog.rb +67 -0
  138. data/lib/watobo/gui/conversation_table.rb +386 -0
  139. data/lib/watobo/gui/conversation_table_ctrl.rb +175 -0
  140. data/lib/watobo/gui/csrf_token_dialog.rb +446 -0
  141. data/lib/watobo/gui/dashboard.rb +341 -0
  142. data/lib/watobo/gui/define_scope_frame.rb +380 -0
  143. data/lib/watobo/gui/edit_comment.rb +70 -0
  144. data/lib/watobo/gui/edit_scope_dialog.rb +69 -0
  145. data/lib/watobo/gui/finding_info.rb +212 -0
  146. data/lib/watobo/gui/findings_tree.rb +459 -0
  147. data/lib/watobo/gui/full_scan_dialog.rb +269 -0
  148. data/lib/watobo/gui/fuzzer_gui.rb +1522 -0
  149. data/lib/watobo/gui/hex_viewer.rb +106 -0
  150. data/lib/watobo/gui/interceptor_gui.rb +994 -0
  151. data/lib/watobo/gui/interceptor_settings_dialog.rb +201 -0
  152. data/lib/watobo/gui/log_viewer.rb +97 -0
  153. data/lib/watobo/gui/login_wizzard.rb +301 -0
  154. data/lib/watobo/gui/main_window.rb +1815 -0
  155. data/lib/watobo/gui/manual_request_editor.rb +1105 -0
  156. data/lib/watobo/gui/master_pw_dialog.rb +142 -0
  157. data/lib/watobo/gui/password_policy_dialog.rb +98 -0
  158. data/lib/watobo/gui/plugin/base.rb +82 -0
  159. data/lib/watobo/gui/plugin_board.rb +95 -0
  160. data/lib/watobo/gui/preferences_dialog.rb +116 -0
  161. data/lib/watobo/gui/progress_window.rb +102 -0
  162. data/lib/watobo/gui/project_wizzard.rb +369 -0
  163. data/lib/watobo/gui/proxy_dialog.rb +550 -0
  164. data/lib/watobo/gui/quick_scan_dialog.rb +242 -0
  165. data/lib/watobo/gui/request_editor.rb +480 -0
  166. data/lib/watobo/gui/save_chat_dialog.rb +158 -0
  167. data/lib/watobo/gui/scanner_settings_dialog.rb +360 -0
  168. data/lib/watobo/gui/select_chat_dialog.rb +169 -0
  169. data/lib/watobo/gui/session_management_dialog.rb +688 -0
  170. data/lib/watobo/gui/sites_tree.rb +347 -0
  171. data/lib/watobo/gui/status_bar.rb +88 -0
  172. data/lib/watobo/gui/table_editor.rb +445 -0
  173. data/lib/watobo/gui/tagless_viewer.rb +62 -0
  174. data/lib/watobo/gui/templates/plugin.rb +80 -0
  175. data/lib/watobo/gui/templates/plugin2.rb +103 -0
  176. data/lib/watobo/gui/text_viewer.rb +247 -0
  177. data/lib/watobo/gui/transcoder_window.rb +215 -0
  178. data/lib/watobo/gui/utils/gui_utils.rb +129 -0
  179. data/lib/watobo/gui/utils/init_icons.rb +106 -0
  180. data/lib/watobo/gui/utils/load_icons.rb +54 -0
  181. data/lib/watobo/gui/utils/load_plugins.rb +94 -0
  182. data/lib/watobo/gui/utils/master_password.rb +90 -0
  183. data/lib/watobo/gui/utils/save_default_settings.rb +99 -0
  184. data/lib/watobo/gui/utils/save_project_settings.rb +21 -0
  185. data/lib/watobo/gui/utils/save_proxy_settings.rb +45 -0
  186. data/lib/watobo/gui/utils/save_session_settings.rb +21 -0
  187. data/lib/watobo/gui/utils/session_history.rb +134 -0
  188. data/lib/watobo/gui/workspace_dialog.rb +89 -0
  189. data/lib/watobo/gui/www_auth_dialog.rb +348 -0
  190. data/lib/watobo/gui/xml_viewer_frame.rb +114 -0
  191. data/lib/watobo/gui.rb +139 -0
  192. data/lib/watobo/mixins/httpparser.rb +664 -0
  193. data/lib/watobo/mixins/request_parser.rb +210 -0
  194. data/lib/watobo/mixins/shapers.rb +345 -0
  195. data/lib/watobo/mixins/transcoders.rb +88 -0
  196. data/lib/watobo/mixins.rb +32 -0
  197. data/lib/watobo/utils/check_regex.rb +36 -0
  198. data/lib/watobo/utils/copy_object.rb +29 -0
  199. data/lib/watobo/utils/crypto.rb +74 -0
  200. data/lib/watobo/utils/expand_range.rb +45 -0
  201. data/lib/watobo/utils/file_management.rb +73 -0
  202. data/lib/watobo/utils/load_chat.rb +219 -0
  203. data/lib/watobo/utils/load_icon.rb +47 -0
  204. data/lib/watobo/utils/print_debug.rb +34 -0
  205. data/lib/watobo/utils/response_hash.rb +143 -0
  206. data/lib/watobo/utils/secure_eval.rb +57 -0
  207. data/lib/watobo/utils/text2request.rb +96 -0
  208. data/lib/watobo/utils.rb +32 -0
  209. data/lib/watobo.rb +76 -0
  210. data/modules/active/Apache/mod_status.rb +123 -0
  211. data/modules/active/Flash/crossdomain.rb +102 -0
  212. data/modules/active/directories/dirwalker.rb +89 -0
  213. data/modules/active/discovery/fileextensions.rb +151 -0
  214. data/modules/active/discovery/http_methods.rb +135 -0
  215. data/modules/active/domino/domino_db.lst +164 -0
  216. data/modules/active/domino/domino_db.rb +128 -0
  217. data/modules/active/fileinclusion/lfi_simple.rb +134 -0
  218. data/modules/active/jboss/jboss_basic.rb +119 -0
  219. data/modules/active/sap/business_objects.rb +73 -0
  220. data/modules/active/sap/its_commands.rb +101 -0
  221. data/modules/active/sap/its_service_parameter.rb +105 -0
  222. data/modules/active/sap/its_services.rb +103 -0
  223. data/modules/active/sap/its_xss.rb +98 -0
  224. data/modules/active/sqlinjection/sql_boolean.rb +262 -0
  225. data/modules/active/sqlinjection/sqli_simple.rb +205 -0
  226. data/modules/active/xss/xss_simple.rb +179 -0
  227. data/modules/passive/cookie_options.rb +97 -0
  228. data/modules/passive/cookie_xss.rb +85 -0
  229. data/modules/passive/detect_code.rb +89 -0
  230. data/modules/passive/detect_fileupload.rb +80 -0
  231. data/modules/passive/detect_infrastructure.rb +98 -0
  232. data/modules/passive/detect_one_time_tokens.rb +86 -0
  233. data/modules/passive/dirindexing.rb +81 -0
  234. data/modules/passive/disclosure_emails.rb +82 -0
  235. data/modules/passive/disclosure_ipaddr.rb +87 -0
  236. data/modules/passive/filename_as_parameter.rb +85 -0
  237. data/modules/passive/form_spotter.rb +75 -0
  238. data/modules/passive/hotspots.rb +86 -0
  239. data/modules/passive/in_script_parameter.rb +92 -0
  240. data/modules/passive/multiple_server_headers.rb +98 -0
  241. data/modules/passive/possible_login.rb +134 -0
  242. data/modules/passive/redirect_url.rb +88 -0
  243. data/modules/passive/redirectionz.rb +96 -0
  244. data/modules/passive/xss_dom.rb +91 -0
  245. data/plugins/catalog/catalog.ico +0 -0
  246. data/plugins/catalog/catalog.rb +726 -0
  247. data/plugins/catalog/db_tests +6483 -0
  248. data/plugins/catalog/db_variables +29 -0
  249. data/plugins/filefinder/dbs/hbci.db +12 -0
  250. data/plugins/filefinder/filefinder.rb +602 -0
  251. data/plugins/sslchecker/cli/sslchecker_cli.rb +21 -0
  252. data/plugins/sslchecker/gui/cipher_table.rb +260 -0
  253. data/plugins/sslchecker/gui/gui.rb +245 -0
  254. data/plugins/sslchecker/gui/sslchecker.rb +26 -0
  255. data/plugins/sslchecker/icons/green_16x16.ico +0 -0
  256. data/plugins/sslchecker/icons/grey_16x16.ico +0 -0
  257. data/plugins/sslchecker/icons/red_16x16.ico +0 -0
  258. data/plugins/sslchecker/icons/sslchecker.ico +0 -0
  259. data/plugins/sslchecker/lib/check.rb +117 -0
  260. metadata +317 -0
@@ -0,0 +1,396 @@
1
+ # .
2
+ # scanner.rb
3
+ #
4
+ # Copyright 2012 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
+ module Watobo
23
+ class Scanner2
24
+
25
+ attr :numTotalChecks
26
+ attr :numChecksPerModule
27
+ attr :progress
28
+
29
+ include Watobo::Constants
30
+ def subscribe(event, &callback)
31
+ (@event_dispatcher_listeners[event] ||= []) << callback
32
+ end
33
+
34
+ def clearEvents(event)
35
+ @event_dispatcher_listener[event].clear
36
+ end
37
+
38
+ def notify(event, *args)
39
+ if @event_dispatcher_listeners[event]
40
+ @event_dispatcher_listeners[event].each do |m|
41
+ m.call(*args) if m.respond_to? :call
42
+ end
43
+ end
44
+ end
45
+
46
+ def running?()
47
+ return true if @status == :running
48
+ return false
49
+ end
50
+
51
+ def stop(reason="undef")
52
+ begin
53
+ notify(:scanner_stopped, reason)
54
+ @status = :stopped
55
+ puts "* stopping #{@check_list.length} active checks"
56
+ @check_list.each do |check|
57
+ check.stop
58
+ end
59
+ rescue => bang
60
+ puts bang
61
+ puts bang.backtrace if $DEBUG
62
+ end
63
+ end
64
+
65
+ def cancel(reason="undef")
66
+ begin
67
+ notify(:scanner_canceled, reason)
68
+ # puts "* cancel active checks" unless @check_list.empty?
69
+ @status = :canceled
70
+ @check_list.each do |check|
71
+ check.kill
72
+ end
73
+ #@active_checks.each do |mod|
74
+ # mod.cancel()
75
+ #end
76
+ rescue => bang
77
+ puts bang
78
+ puts bang.backtrace if $DEBUG
79
+ end
80
+ end
81
+
82
+ def siteAlive?(chat)
83
+ puts chat.class
84
+ site = nil
85
+ host = nil
86
+ port = nil
87
+
88
+ site = chat.request.site
89
+
90
+ return @sites_online[site] if @sites_online.has_key?(site)
91
+
92
+ if @prefs[:proxy].is_a? Hash
93
+ Watobo.print_debug("Using Proxy","#{@prefs[:proxy].to_yaml}") if $DEBUG
94
+ if @prefs[:proxy].has_key?(:name) and @prefs[:proxy].has_key?(:port)
95
+ # unless @prefs[:proxy][:name] == '' then
96
+ puts "* testing proxy:"
97
+ puts "#{@prefs[:proxy][:name]} (#{@prefs[:proxy][:host]}:#{@prefs[:proxy][:port]})"
98
+ # print "* using forwarding proxy #{@project.settings[:proxy]}\r\n"
99
+ use_proxy = true
100
+ host = @prefs[:proxy][:host]
101
+ port = @prefs[:proxy][:port]
102
+ end
103
+ else
104
+ print "* check if site is alive (#{site}) ... "
105
+ host = chat.request.host
106
+ port = chat.request.port
107
+
108
+ end
109
+
110
+ return false if host.nil? or port.nil?
111
+
112
+ begin
113
+ tcp_socket = nil
114
+ # timeout(6) do
115
+
116
+ tcp_socket = TCPSocket.new( host, port)
117
+ tcp_socket.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
118
+ tcp_socket.sync = true
119
+
120
+ socket = tcp_socket
121
+
122
+ if socket.class.to_s =~ /SSLSocket/
123
+ socket.io.shutdown(2)
124
+ else
125
+ socket.shutdown(2)
126
+ end
127
+ socket.close
128
+ print "[OK]\n"
129
+ @sites_online[site] = true
130
+ return true
131
+ rescue Errno::ECONNREFUSED
132
+ p "* connection refused (#{host}:#{port})"
133
+ rescue Errno::ECONNRESET
134
+ puts "* connection reset"
135
+ rescue Errno::EHOSTUNREACH
136
+ p "* host unreachable (#{host}:#{port})"
137
+
138
+ rescue Timeout::Error
139
+ p "* TimeOut (#{host}:#{port})\n"
140
+
141
+ rescue Errno::ETIMEDOUT
142
+ p "* TimeOut (#{host}:#{port})"
143
+
144
+ rescue Errno::ENOTCONN
145
+ puts "!!!ENOTCONN"
146
+ rescue OpenSSL::SSL::SSLError
147
+ p "* ssl error"
148
+ socket = nil
149
+ # puts "!!! SSL-Error"
150
+ print "E"
151
+ rescue => bang
152
+ # puts host
153
+ # puts port
154
+ puts bang
155
+ puts bang.backtrace if $DEBUG
156
+ end
157
+ print "[FALSE]\n"
158
+ @sites_online[site] = false
159
+ return false
160
+ # if @sites_online.has_key?(site) then
161
+ # return @sites_online[site] ? true : false
162
+ # end
163
+
164
+ # if @onlineCheck.isOnline?(chat) then
165
+ # puts "Site #{site} is online"
166
+ # @sites_online[site] = true
167
+ # return true
168
+ # else
169
+ # puts "Site #{site} is offline"
170
+ # @sites_online[site] = false
171
+ # return false
172
+ # end
173
+ end
174
+
175
+ def continue()
176
+ puts "!!! Scan Running !!!"
177
+ @active_checks.each do |mod|
178
+ mod.run()
179
+ end
180
+ @status_running = true
181
+ end
182
+
183
+ def run( check_prefs={} )
184
+ @status_running = true
185
+ @sites_online.clear
186
+ @uniqueRequests = Hash.new
187
+ @status = :running
188
+ @check_list = []
189
+ @login_count = 0
190
+ @max_login_count = 20
191
+
192
+ # counter for fired checks
193
+ checks = 0
194
+ puts "= run scan =" if $DEBUG
195
+ puts check_prefs.to_yaml if $DEBUG
196
+ msg = "\n[Scanner] Starting Scan ..."
197
+ notify(:logger, LOG_INFO, msg )
198
+ puts msg
199
+ #scan_session = Time.now.to_i
200
+
201
+
202
+ @active_checks.uniq.each do |mod|
203
+ check = mod
204
+ #check = mod.new(@prefs[:scan_session], @prefs ) if mod.respond_to? :new
205
+ puts "* subscribe for logout" if $DEBUG
206
+ check.subscribe(:logout) { |m|
207
+ next if @login_count > @max_login_count or @prefs[:auto_login] == false
208
+ if @login_mutex.try_lock
209
+ begin
210
+ m.waitLogin(true)
211
+ Watobo.print_debug("LOGOUT DETECTED") if $DEBUG
212
+ @login_count += 1
213
+ m.runLogin(@prefs[:login_chats])
214
+
215
+ m.waitLogin(false) if m
216
+ rescue => bang
217
+ Watobo.print_debug("Could not relogin") if $DEBUG
218
+ puts bang
219
+ puts bang.backtrace if $DEBUG
220
+ ensure
221
+
222
+ end
223
+ @login_mutex.unlock
224
+ end
225
+
226
+ }
227
+
228
+ puts "* subscribe for :check_finished" if $DEBUG
229
+ check.clearEvents(:check_finished)
230
+ check.subscribe(:check_finished) do |m, request, response|
231
+ # update progress
232
+ @check_count ||= 0
233
+ @check_count += 1
234
+ puts "CheckCount: #{@check_count}" if $DEBUG
235
+ notify( :progress, m )
236
+ unless @prefs[:scanlog_name].nil?
237
+ if @prefs[:session_store].respond_to? :add_scan_log
238
+ chat = Chat.new(request, response, :id => 0, :chat_source => @prefs[:chat_source])
239
+ @prefs[:session_store].add_scan_log(chat, @prefs[:scanlog_name])
240
+ end
241
+ end
242
+ end
243
+
244
+ puts "* subscribe for :new_finding" if $DEBUG
245
+ check.clearEvents(:new_finding)
246
+ check.subscribe(:new_finding) do |f|
247
+ # p "* NEW FINDING"
248
+ # p f.details[:module]
249
+ notify(:new_finding, f)
250
+ end
251
+
252
+ end
253
+
254
+ tlist = []
255
+ @filtered_chat_list.uniq.each do |chat|
256
+ @active_checks.uniq.each do |mod|
257
+ print "---> #{mod.class}"
258
+ # accept Class- and Check-Types
259
+ check = mod
260
+
261
+ # reset check counters and variables
262
+ check.reset()
263
+ if @prefs[:online_check] == false or siteAlive?(chat) then
264
+ @check_list << Thread.new(check, chat, check_prefs){|m, c, p|
265
+ m.run_checks(c,p)
266
+ notify(:logger, LOG_INFO, "finished checks: #{m.class} on chat #{c.id}")
267
+ }
268
+ end
269
+ end
270
+ end
271
+
272
+ @check_list.each {|ct| ct.join }
273
+ puts "*[#{self}] Scan Finished"
274
+ end
275
+
276
+ def initialize(chat_list=[], active_checks=[], passive_checks=[], prefs={})
277
+ # @project = project # needed for centralized session management
278
+
279
+ @numTotalChecks = 0
280
+ @numChecksPerModule = Hash.new
281
+ @chat_list = chat_list
282
+ @active_checks = active_checks
283
+ @passive_checks = passive_checks
284
+
285
+ @login_in_progress = false
286
+ @login_mutex = Mutex.new
287
+ @login_cv = ConditionVariable.new
288
+
289
+ @filtered_chats = []
290
+
291
+ # @thread_list = Hash.new
292
+ @scan_pool = []
293
+ @scan_pool_mutex = Mutex.new
294
+ @scan_pool_cv = ConditionVariable.new
295
+
296
+ @check_list = []
297
+
298
+ @sites_online = Hash.new
299
+ @event_dispatcher_listeners = Hash.new
300
+ @status = :stopped
301
+
302
+ # @onlineCheck = OnlineCheck.new(@project)
303
+ m = "Initializing Scanner ..."
304
+ notify(:logger, LOG_INFO, m)
305
+ puts m
306
+
307
+ @prefs = {
308
+ #:root_path => [],
309
+ #:excluded_chats => [],
310
+ :smart_scan => true,
311
+ :excluded_parms => [],
312
+ #:non_uniq_parms => [],
313
+ :login_chat_ids => [],
314
+ :auto_login => true,
315
+ # :valid_sids => Hash.new,
316
+ :sid_patterns => [],
317
+ :run_passive_checks => false,
318
+ :proxy => '',
319
+ :scanlog_dir => '',
320
+ :scan_session => Digest::MD5.hexdigest(Time.now.to_f.to_s),
321
+ :check_online => true,
322
+ :source => CHAT_SOURCE_UNDEF
323
+ }
324
+
325
+ @prefs.update prefs
326
+ #puts "set up scanner"
327
+ #puts @prefs[:login_chats]
328
+ #puts @prefs[:logout_signatures]
329
+ puts "= create scanner =" if $DEBUG
330
+ puts @prefs.to_yaml if $DEBUG
331
+
332
+ @filtered_chat_list = filteredChats(@chat_list, @prefs)
333
+
334
+ @active_checks.uniq.each do |m|
335
+ puts m.class
336
+ check = m
337
+ check = m.new(:dummy) if check.respond_to? :new
338
+ check.resetCounters()
339
+ # puts "* updating counters for module #{m.info[:check_name]}"
340
+ # puts "* updating #{@chat_list.length} chats"
341
+ @filtered_chat_list.each do |chat|
342
+ print "."
343
+ check.updateCounters(chat, @prefs)
344
+ puts "* [#{chat.id}] CheckCounter: #{check.info[:check_name]} - #{check.numChecks}" if $DEBUG
345
+ end
346
+
347
+ @numTotalChecks += check.numChecks
348
+ cn = check.info[:check_name]
349
+ # puts "+ add check: #{cn}"
350
+ notify(:logger, LOG_INFO, "add check #{cn}")
351
+ @numChecksPerModule[cn] = check.numChecks
352
+ end
353
+ msg = "Scanner Ready!"
354
+ notify(:logger, LOG_INFO, msg)
355
+ puts msg
356
+ end
357
+
358
+ private
359
+
360
+ # Function: filteredChats
361
+ # It's primarily used to reduce the number of requests for the scan.
362
+ # Returns [] of chats which fulfill the requirements.
363
+ # Inputs:
364
+ # - chats: list of chats[]
365
+ # - prefs: :non_unique_parms=>[], :smart_scan=>true|false
366
+ def filteredChats(chats, prefs = {})
367
+ check_ids = Hash.new
368
+ fchats = []
369
+ hstring = ''
370
+ if prefs[:smart_scan] == true then
371
+ chats.each do |chat|
372
+ ps = chat.request.parm_names.sort
373
+ if prefs[:non_unique_parms] and prefs[:non_unique_parms].length > 0 then
374
+ ps.map!{|p|
375
+ if prefs[:non_unique_parms].include?(p) then
376
+ p += chat.request.get_parm_value(p)
377
+ end
378
+ }
379
+ end
380
+
381
+ next if chat.request.site.nil?
382
+ hstring = chat.request.site + chat.request.path + chat.request.file + ps.join
383
+ rhash = Digest::MD5.hexdigest(hstring)
384
+
385
+ next if check_ids.has_key?(rhash)
386
+ # p hstring
387
+ check_ids[rhash] = nil
388
+ fchats.push chat
389
+ end
390
+ else
391
+ fchats = chats
392
+ end
393
+ return fchats
394
+ end
395
+ end
396
+ end