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.
- data/bin/watobo_gui.rb +39 -0
- data/certificates/cert.pem +19 -0
- data/certificates/privkey.pem +15 -0
- data/certificates/watobo_dh.key +5 -0
- data/config/datastore.yml +5 -0
- data/config/forwarding_proxy.yml +12 -0
- data/config/general.yml +4 -0
- data/config/gui.yml +23 -0
- data/config/interceptor.yml +16 -0
- data/config/scan_policy.yml +13 -0
- data/config/scanner.yml +34 -0
- data/icons/Add.ico +0 -0
- data/icons/Add_24x24.ico +0 -0
- data/icons/Bandwidth.ico +0 -0
- data/icons/Bandwidth_24x24.ico +0 -0
- data/icons/Mr. Bomb.ico +0 -0
- data/icons/Mr. Bomb_16x16.ico +0 -0
- data/icons/Mr. Bomb_24x24.ico +0 -0
- data/icons/Orange Ball.ico +0 -0
- data/icons/Orange Ball_16x16.ico +0 -0
- data/icons/Orange Ball_24x24.ico +0 -0
- data/icons/Pause.ico +0 -0
- data/icons/Play.ico +0 -0
- data/icons/Play_24x24.ico +0 -0
- data/icons/Red Ball.ico +0 -0
- data/icons/Red Ball_16x16.ico +0 -0
- data/icons/Red Ball_24x24.ico +0 -0
- data/icons/Run.ico +0 -0
- data/icons/Stop.ico +0 -0
- data/icons/Stop_24x24.ico +0 -0
- data/icons/Terminal.ico +0 -0
- data/icons/Transfer.ico +0 -0
- data/icons/Transfer_16x16.ico +0 -0
- data/icons/User.ico +0 -0
- data/icons/User_16x16.ico +0 -0
- data/icons/User_24x24.ico +0 -0
- data/icons/Web Browser.ico +0 -0
- data/icons/Web Browser_16x16.ico +0 -0
- data/icons/Write Document.ico +0 -0
- data/icons/Yellow Ball.ico +0 -0
- data/icons/Yellow Ball_16x16.ico +0 -0
- data/icons/Yellow Ball_24x24.ico +0 -0
- data/icons/advanced.ico +0 -0
- data/icons/advanced_16x16.ico +0 -0
- data/icons/advanced_24x24.ico +0 -0
- data/icons/applications.ico +0 -0
- data/icons/applications_16x16.ico +0 -0
- data/icons/applications_24x24.ico +0 -0
- data/icons/browser_16x16.ico +0 -0
- data/icons/browser_24x24.ico +0 -0
- data/icons/burn.ico +0 -0
- data/icons/burn_16x16.ico +0 -0
- data/icons/burn_24x24.ico +0 -0
- data/icons/calculator.ico +0 -0
- data/icons/calculator_24x24.ico +0 -0
- data/icons/cb_checked.ico +0 -0
- data/icons/cb_checked_orange.ico +0 -0
- data/icons/cb_unchecked.ico +0 -0
- data/icons/coin_24x24.ico +0 -0
- data/icons/conversation.ico +0 -0
- data/icons/conversation_24x24.ico +0 -0
- data/icons/engine.ico +0 -0
- data/icons/filter.ico +0 -0
- data/icons/folder.ico +0 -0
- data/icons/folder_16x16.ico +0 -0
- data/icons/fuzzer_16x16.ico +0 -0
- data/icons/fuzzer_24x24.ico +0 -0
- data/icons/go-down_16x16.png +0 -0
- data/icons/go-up_16x16.png +0 -0
- data/icons/help.ico +0 -0
- data/icons/help_16x16.ico +0 -0
- data/icons/help_24x24.ico +0 -0
- data/icons/iChat.ico +0 -0
- data/icons/iChat_16x16.ico +0 -0
- data/icons/iChat_24x24.ico +0 -0
- data/icons/icons.txt +3 -0
- data/icons/info.ico +0 -0
- data/icons/info_16x16.ico +0 -0
- data/icons/info_24x24.ico +0 -0
- data/icons/interceptor_24x24.ico +0 -0
- data/icons/lock.ico +0 -0
- data/icons/lock_12x12.ico +0 -0
- data/icons/lock_16x16.ico +0 -0
- data/icons/monitor.ico +0 -0
- data/icons/plugin.ico +0 -0
- data/icons/plugin_24x24.ico +0 -0
- data/icons/scan_16x16.png +0 -0
- data/icons/send.ico +0 -0
- data/icons/server.ico +0 -0
- data/icons/server_16x16.ico +0 -0
- data/icons/siberas_logo_x24.gif +0 -0
- data/icons/tag_blue_32x32.ico +0 -0
- data/icons/watobo-48x48.png +0 -0
- data/icons/watobo-logo.png +0 -0
- data/icons/watobo.ico +0 -0
- data/lib/watobo/adapters/data_store.rb +38 -0
- data/lib/watobo/adapters/file/file_store.rb +211 -0
- data/lib/watobo/adapters/session_store.rb +27 -0
- data/lib/watobo/adapters.rb +26 -0
- data/lib/watobo/config.rb +143 -0
- data/lib/watobo/constants.rb +92 -0
- data/lib/watobo/core/active_check.rb +404 -0
- data/lib/watobo/core/cookie.rb +69 -0
- data/lib/watobo/core/fuzz_gen.rb +160 -0
- data/lib/watobo/core/http_socket.rb +142 -0
- data/lib/watobo/core/interceptor.rb +729 -0
- data/lib/watobo/core/passive_check.rb +141 -0
- data/lib/watobo/core/project.rb +1058 -0
- data/lib/watobo/core/scanner.rb +396 -0
- data/lib/watobo/core/session.rb +1320 -0
- data/lib/watobo/core/simple_ca.rb +393 -0
- data/lib/watobo/core.rb +34 -0
- data/lib/watobo/defaults.rb +40 -0
- data/lib/watobo/external/diff/lcs/array.rb +42 -0
- data/lib/watobo/external/diff/lcs/block.rb +72 -0
- data/lib/watobo/external/diff/lcs/callbacks.rb +343 -0
- data/lib/watobo/external/diff/lcs/change.rb +190 -0
- data/lib/watobo/external/diff/lcs/hunk.rb +279 -0
- data/lib/watobo/external/diff/lcs/ldiff.rb +247 -0
- data/lib/watobo/external/diff/lcs/string.rb +40 -0
- data/lib/watobo/external/diff/lcs.rb +1124 -0
- data/lib/watobo/external/ntlm/ntlm.rb +797 -0
- data/lib/watobo/externals.rb +28 -0
- data/lib/watobo/framework/create_project.rb +55 -0
- data/lib/watobo/framework/init.rb +149 -0
- data/lib/watobo/framework/init_modules.rb +116 -0
- data/lib/watobo/framework/license_text.rb +50 -0
- data/lib/watobo/framework.rb +26 -0
- data/lib/watobo/gui/about_watobo.rb +68 -0
- data/lib/watobo/gui/browser_preview.rb +460 -0
- data/lib/watobo/gui/certificate_dialog.rb +132 -0
- data/lib/watobo/gui/chat_diff.rb +415 -0
- data/lib/watobo/gui/chatviewer_frame.rb +427 -0
- data/lib/watobo/gui/checkboxtree.rb +221 -0
- data/lib/watobo/gui/checks_policy_frame.rb +123 -0
- data/lib/watobo/gui/client_cert_dialog.rb +227 -0
- data/lib/watobo/gui/confirm_scan_dialog.rb +67 -0
- data/lib/watobo/gui/conversation_table.rb +386 -0
- data/lib/watobo/gui/conversation_table_ctrl.rb +175 -0
- data/lib/watobo/gui/csrf_token_dialog.rb +446 -0
- data/lib/watobo/gui/dashboard.rb +341 -0
- data/lib/watobo/gui/define_scope_frame.rb +380 -0
- data/lib/watobo/gui/edit_comment.rb +70 -0
- data/lib/watobo/gui/edit_scope_dialog.rb +69 -0
- data/lib/watobo/gui/finding_info.rb +212 -0
- data/lib/watobo/gui/findings_tree.rb +459 -0
- data/lib/watobo/gui/full_scan_dialog.rb +269 -0
- data/lib/watobo/gui/fuzzer_gui.rb +1522 -0
- data/lib/watobo/gui/hex_viewer.rb +106 -0
- data/lib/watobo/gui/interceptor_gui.rb +994 -0
- data/lib/watobo/gui/interceptor_settings_dialog.rb +201 -0
- data/lib/watobo/gui/log_viewer.rb +97 -0
- data/lib/watobo/gui/login_wizzard.rb +301 -0
- data/lib/watobo/gui/main_window.rb +1815 -0
- data/lib/watobo/gui/manual_request_editor.rb +1105 -0
- data/lib/watobo/gui/master_pw_dialog.rb +142 -0
- data/lib/watobo/gui/password_policy_dialog.rb +98 -0
- data/lib/watobo/gui/plugin/base.rb +82 -0
- data/lib/watobo/gui/plugin_board.rb +95 -0
- data/lib/watobo/gui/preferences_dialog.rb +116 -0
- data/lib/watobo/gui/progress_window.rb +102 -0
- data/lib/watobo/gui/project_wizzard.rb +369 -0
- data/lib/watobo/gui/proxy_dialog.rb +550 -0
- data/lib/watobo/gui/quick_scan_dialog.rb +242 -0
- data/lib/watobo/gui/request_editor.rb +480 -0
- data/lib/watobo/gui/save_chat_dialog.rb +158 -0
- data/lib/watobo/gui/scanner_settings_dialog.rb +360 -0
- data/lib/watobo/gui/select_chat_dialog.rb +169 -0
- data/lib/watobo/gui/session_management_dialog.rb +688 -0
- data/lib/watobo/gui/sites_tree.rb +347 -0
- data/lib/watobo/gui/status_bar.rb +88 -0
- data/lib/watobo/gui/table_editor.rb +445 -0
- data/lib/watobo/gui/tagless_viewer.rb +62 -0
- data/lib/watobo/gui/templates/plugin.rb +80 -0
- data/lib/watobo/gui/templates/plugin2.rb +103 -0
- data/lib/watobo/gui/text_viewer.rb +247 -0
- data/lib/watobo/gui/transcoder_window.rb +215 -0
- data/lib/watobo/gui/utils/gui_utils.rb +129 -0
- data/lib/watobo/gui/utils/init_icons.rb +106 -0
- data/lib/watobo/gui/utils/load_icons.rb +54 -0
- data/lib/watobo/gui/utils/load_plugins.rb +94 -0
- data/lib/watobo/gui/utils/master_password.rb +90 -0
- data/lib/watobo/gui/utils/save_default_settings.rb +99 -0
- data/lib/watobo/gui/utils/save_project_settings.rb +21 -0
- data/lib/watobo/gui/utils/save_proxy_settings.rb +45 -0
- data/lib/watobo/gui/utils/save_session_settings.rb +21 -0
- data/lib/watobo/gui/utils/session_history.rb +134 -0
- data/lib/watobo/gui/workspace_dialog.rb +89 -0
- data/lib/watobo/gui/www_auth_dialog.rb +348 -0
- data/lib/watobo/gui/xml_viewer_frame.rb +114 -0
- data/lib/watobo/gui.rb +139 -0
- data/lib/watobo/mixins/httpparser.rb +664 -0
- data/lib/watobo/mixins/request_parser.rb +210 -0
- data/lib/watobo/mixins/shapers.rb +345 -0
- data/lib/watobo/mixins/transcoders.rb +88 -0
- data/lib/watobo/mixins.rb +32 -0
- data/lib/watobo/utils/check_regex.rb +36 -0
- data/lib/watobo/utils/copy_object.rb +29 -0
- data/lib/watobo/utils/crypto.rb +74 -0
- data/lib/watobo/utils/expand_range.rb +45 -0
- data/lib/watobo/utils/file_management.rb +73 -0
- data/lib/watobo/utils/load_chat.rb +219 -0
- data/lib/watobo/utils/load_icon.rb +47 -0
- data/lib/watobo/utils/print_debug.rb +34 -0
- data/lib/watobo/utils/response_hash.rb +143 -0
- data/lib/watobo/utils/secure_eval.rb +57 -0
- data/lib/watobo/utils/text2request.rb +96 -0
- data/lib/watobo/utils.rb +32 -0
- data/lib/watobo.rb +76 -0
- data/modules/active/Apache/mod_status.rb +123 -0
- data/modules/active/Flash/crossdomain.rb +102 -0
- data/modules/active/directories/dirwalker.rb +89 -0
- data/modules/active/discovery/fileextensions.rb +151 -0
- data/modules/active/discovery/http_methods.rb +135 -0
- data/modules/active/domino/domino_db.lst +164 -0
- data/modules/active/domino/domino_db.rb +128 -0
- data/modules/active/fileinclusion/lfi_simple.rb +134 -0
- data/modules/active/jboss/jboss_basic.rb +119 -0
- data/modules/active/sap/business_objects.rb +73 -0
- data/modules/active/sap/its_commands.rb +101 -0
- data/modules/active/sap/its_service_parameter.rb +105 -0
- data/modules/active/sap/its_services.rb +103 -0
- data/modules/active/sap/its_xss.rb +98 -0
- data/modules/active/sqlinjection/sql_boolean.rb +262 -0
- data/modules/active/sqlinjection/sqli_simple.rb +205 -0
- data/modules/active/xss/xss_simple.rb +179 -0
- data/modules/passive/cookie_options.rb +97 -0
- data/modules/passive/cookie_xss.rb +85 -0
- data/modules/passive/detect_code.rb +89 -0
- data/modules/passive/detect_fileupload.rb +80 -0
- data/modules/passive/detect_infrastructure.rb +98 -0
- data/modules/passive/detect_one_time_tokens.rb +86 -0
- data/modules/passive/dirindexing.rb +81 -0
- data/modules/passive/disclosure_emails.rb +82 -0
- data/modules/passive/disclosure_ipaddr.rb +87 -0
- data/modules/passive/filename_as_parameter.rb +85 -0
- data/modules/passive/form_spotter.rb +75 -0
- data/modules/passive/hotspots.rb +86 -0
- data/modules/passive/in_script_parameter.rb +92 -0
- data/modules/passive/multiple_server_headers.rb +98 -0
- data/modules/passive/possible_login.rb +134 -0
- data/modules/passive/redirect_url.rb +88 -0
- data/modules/passive/redirectionz.rb +96 -0
- data/modules/passive/xss_dom.rb +91 -0
- data/plugins/catalog/catalog.ico +0 -0
- data/plugins/catalog/catalog.rb +726 -0
- data/plugins/catalog/db_tests +6483 -0
- data/plugins/catalog/db_variables +29 -0
- data/plugins/filefinder/dbs/hbci.db +12 -0
- data/plugins/filefinder/filefinder.rb +602 -0
- data/plugins/sslchecker/cli/sslchecker_cli.rb +21 -0
- data/plugins/sslchecker/gui/cipher_table.rb +260 -0
- data/plugins/sslchecker/gui/gui.rb +245 -0
- data/plugins/sslchecker/gui/sslchecker.rb +26 -0
- data/plugins/sslchecker/icons/green_16x16.ico +0 -0
- data/plugins/sslchecker/icons/grey_16x16.ico +0 -0
- data/plugins/sslchecker/icons/red_16x16.ico +0 -0
- data/plugins/sslchecker/icons/sslchecker.ico +0 -0
- data/plugins/sslchecker/lib/check.rb +117 -0
- 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
|