fidius-evasiondb 0.0.1
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/.gitignore +9 -0
- data/.yardopts +6 -0
- data/Gemfile +5 -0
- data/LICENSE +57 -0
- data/README.md +180 -0
- data/Rakefile +33 -0
- data/bin/fidius-evasiondb +111 -0
- data/evasion-db.gemspec +37 -0
- data/lib/db/db-install.rb +103 -0
- data/lib/db/migrations/001_create_packets.rb +18 -0
- data/lib/db/migrations/002_create_idmef_events.rb +23 -0
- data/lib/db/migrations/003_create_attack_modules.rb +14 -0
- data/lib/db/migrations/004_create_attack_options.rb +14 -0
- data/lib/db/migrations/005_create_attack_payloads.rb +13 -0
- data/lib/evasion-db/base.rb +80 -0
- data/lib/evasion-db/idmef-fetchers/fetchers.rb +67 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/fetcher.rb +8 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/additional_data.rb +16 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/address.rb +8 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/alert.rb +46 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/analyzer.rb +18 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/classification.rb +10 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/connection.rb +10 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/detect_time.rb +10 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/impact.rb +19 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/prelude_event.rb +120 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/service.rb +10 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/patches/postgres_patch.rb +12 -0
- data/lib/evasion-db/idmef-fetchers/prelude-db/lib/prelude_event_fetcher.rb +67 -0
- data/lib/evasion-db/idmef-fetchers/test-fetcher/fetcher.rb +6 -0
- data/lib/evasion-db/idmef-fetchers/test-fetcher/lib/test_fetcher.rb +19 -0
- data/lib/evasion-db/knowledge/attack_module.rb +41 -0
- data/lib/evasion-db/knowledge/attack_option.rb +12 -0
- data/lib/evasion-db/knowledge/attack_payload.rb +13 -0
- data/lib/evasion-db/knowledge/connection.rb +7 -0
- data/lib/evasion-db/knowledge/idmef_event.rb +21 -0
- data/lib/evasion-db/knowledge/packet.rb +17 -0
- data/lib/evasion-db/knowledge.rb +128 -0
- data/lib/evasion-db/log_matches_helper.rb +43 -0
- data/lib/evasion-db/recorders/msf-recorder/lib/msf-recorder.rb +78 -0
- data/lib/evasion-db/recorders/msf-recorder/recorder.rb +6 -0
- data/lib/evasion-db/recorders/recorders.rb +61 -0
- data/lib/evasion-db/version.rb +5 -0
- data/lib/fidius-evasiondb.rb +27 -0
- data/lib/msf-plugins/database.yml.example +24 -0
- data/lib/msf-plugins/evasiondb.rb +378 -0
- data/test/config/database.yml +11 -0
- data/test/config/prelude.sql +439 -0
- data/test/helper.rb +50 -0
- data/test/preludedb_helper.rb +70 -0
- data/test/test_fetchers.rb +34 -0
- data/test/test_knowledge.rb +102 -0
- data/test/test_preludedb.rb +41 -0
- data/test/test_recorders.rb +115 -0
- metadata +238 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
# Author:: FIDIUS (mailto:grp-fidius@tzi.de)
|
2
|
+
# License:: Distributes under the same terms as fidius-evasiondb Gem
|
3
|
+
module FIDIUS
|
4
|
+
# EvasionDB is a knowledge database which provides information about idmef-events which are
|
5
|
+
# thrown by an ids like prelude. You can use this gem in two ways.
|
6
|
+
# One way is to generate knowledge via running exploits whithin metasploit. The other way is
|
7
|
+
# require this gem and query existing knowledge estimate how loud an exploit might be.
|
8
|
+
#
|
9
|
+
module EvasionDB
|
10
|
+
# stores content of configuration yml
|
11
|
+
@@yml_config = nil
|
12
|
+
@@current_fetcher = nil
|
13
|
+
@@current_recorder = nil
|
14
|
+
|
15
|
+
# Configures EvasionDB.
|
16
|
+
#
|
17
|
+
# @param [String] path to an yml-file containing db-connection settings for ids_db and evasion_db
|
18
|
+
# sample config can be created with 'fidius-evasiondb -e'
|
19
|
+
def self.config(yml_file)
|
20
|
+
if yml_file.class == String
|
21
|
+
raise "#{yml_file} does not exist" unless File.exists? File.expand_path(yml_file)
|
22
|
+
@@yml_config = YAML.load(File.read(yml_file))
|
23
|
+
evasion_db = @@yml_config['evasion_db']
|
24
|
+
elsif yml_file.class == Hash
|
25
|
+
# also react on connection settings given as hash
|
26
|
+
evasion_db = yml_file
|
27
|
+
else
|
28
|
+
raise "please input string or hash"
|
29
|
+
end
|
30
|
+
unless evasion_db
|
31
|
+
raise "no evasion_db part found in file"
|
32
|
+
else
|
33
|
+
#self.load_db_adapter(evasion_db['adapter'])
|
34
|
+
FIDIUS::EvasionDB::Knowledge::Connection.establish_connection evasion_db
|
35
|
+
FIDIUS::EvasionDB::Knowledge::Connection.connection
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Use a given recorder. Recorders are used to log packets while an exploit is running.
|
40
|
+
# Currently there is only the msf-recorder available. Use it by setting FIDIUS::EvasionDB.use_recorder "Msf-Recorder"
|
41
|
+
#
|
42
|
+
# @param [String] recordername
|
43
|
+
# @raise RuntimeError if recorder not found
|
44
|
+
def self.use_recoder(recorder_name)
|
45
|
+
raise "not configured. use FIDIUS::EvasionDB.config first" unless @@yml_config
|
46
|
+
@@current_recorder = Recorder.by_name(recorder_name)
|
47
|
+
raise "recorder #{recorder_name} not found" unless @@current_recorder
|
48
|
+
end
|
49
|
+
|
50
|
+
# Use a given fetcher. Fetchers are used to fetch idmef-events after an exploit is finished.
|
51
|
+
# Currently there is only the Prelude-Fetcher available. Use it by setting FIDIUS::EvasionDB.use_fetcher "PreludeDB"
|
52
|
+
#
|
53
|
+
# @param [String] fetcher_name
|
54
|
+
# @raise RuntimeError if fetcher not found
|
55
|
+
def self.use_fetcher(fetcher_name)
|
56
|
+
raise "not configured. use FIDIUS::EvasionDB.config first" unless @@yml_config
|
57
|
+
@@current_fetcher = Fetcher.by_name(fetcher_name)
|
58
|
+
@@current_fetcher.config(@@yml_config)
|
59
|
+
raise "fetcher #{recorder_name} not found" unless @@current_fetcher
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the current recorder
|
63
|
+
#
|
64
|
+
# @see #use_recorder
|
65
|
+
# @raise RuntimeError if recorder was not set
|
66
|
+
def self.current_recorder
|
67
|
+
raise "no recorder set. Use FIDIUS::EvasionDB.use_recorder" unless @@current_recorder
|
68
|
+
@@current_recorder
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns the current recorder
|
72
|
+
#
|
73
|
+
# @see #use_fetcher
|
74
|
+
# @raise RuntimeError if fetcher was not set
|
75
|
+
def self.current_fetcher
|
76
|
+
raise "no fetcher set. Use FIDIUS::EvasionDB.use_fetcher" unless @@current_fetcher
|
77
|
+
@@current_fetcher
|
78
|
+
end
|
79
|
+
end# module EvasionDB
|
80
|
+
end# module FIDIUS
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module EvasionDB
|
3
|
+
def self.fetcher(name,&block)
|
4
|
+
FIDIUS::EvasionDB::Fetcher.new(name,&block)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.install_fetchers
|
8
|
+
$logger.debug "installing fetchers"
|
9
|
+
FIDIUS::EvasionDB::Fetcher.all.each do |fetcher|
|
10
|
+
fetcher.run_install
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# A Fetcher is used to fetch events from an ids
|
15
|
+
class Fetcher
|
16
|
+
@@fetchers = []
|
17
|
+
attr_accessor :name
|
18
|
+
attr_accessor :local_ip
|
19
|
+
|
20
|
+
def initialize(name,&block)
|
21
|
+
self.instance_eval(&block)
|
22
|
+
@local_ip = nil
|
23
|
+
@name = name
|
24
|
+
@@fetchers << self
|
25
|
+
end
|
26
|
+
|
27
|
+
def install(&block)
|
28
|
+
$logger.debug "setting installblock"
|
29
|
+
@install = block
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_install
|
33
|
+
raise "no install block given" unless @install
|
34
|
+
$logger.debug "run install of #{@name}"
|
35
|
+
@install.call
|
36
|
+
end
|
37
|
+
|
38
|
+
def config(conf)
|
39
|
+
raise "overwrite this"
|
40
|
+
end
|
41
|
+
|
42
|
+
def begin_record
|
43
|
+
raise "overwrite this"
|
44
|
+
end
|
45
|
+
|
46
|
+
def fetch_events
|
47
|
+
raise "overwrite this"
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.all
|
51
|
+
@@fetchers
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.by_name(name)
|
55
|
+
self.all.each do |fetcher|
|
56
|
+
return fetcher if fetcher.name == name
|
57
|
+
end
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Dir[File.join(File.dirname(__FILE__), "*/fetcher.rb")].each{|fetch_require|
|
65
|
+
$logger.debug "load #{fetch_require}"
|
66
|
+
require fetch_require
|
67
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module PreludeDB
|
3
|
+
# Wrapper for Prelude_AddionalData table
|
4
|
+
class AdditionalData < FIDIUS::PreludeDB::Connection
|
5
|
+
set_table_name "Prelude_AdditionalData"
|
6
|
+
def self.columns() @columns ||= []; end
|
7
|
+
def self.column(name, sql_type=nil, default=nil,null=true)
|
8
|
+
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s,default,sql_type.to_s,null)
|
9
|
+
end
|
10
|
+
|
11
|
+
column :_message_ident, :bigint
|
12
|
+
column :meaning, :string
|
13
|
+
column :data, :longblob
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module PreludeDB
|
3
|
+
|
4
|
+
# Wrapper for Prelude_Alert table
|
5
|
+
class Alert < FIDIUS::PreludeDB::Connection
|
6
|
+
has_one :detect_time, :class_name => 'DetectTime', :foreign_key => :_message_ident, :primary_key => :_ident
|
7
|
+
has_one :source_address, :class_name => 'Address', :foreign_key => :_message_ident, :primary_key => :_ident, :conditions => [ "Prelude_Address._parent_type = 'S'" ]
|
8
|
+
has_one :dest_address, :class_name => 'Address', :foreign_key => :_message_ident, :primary_key => :_ident, :conditions => [ "Prelude_Address._parent_type = 'T'" ]
|
9
|
+
has_one :source_port, :class_name => 'Service', :foreign_key => :_message_ident, :primary_key => :_ident, :conditions => [ "Prelude_Service._parent_type = 'S'" ]
|
10
|
+
has_one :dest_port, :class_name => 'Service', :foreign_key => :_message_ident, :primary_key => :_ident, :conditions => [ "Prelude_Service._parent_type = 'T'" ]
|
11
|
+
has_one :classification, :class_name => 'Classification', :foreign_key => :_message_ident, :primary_key => :_ident
|
12
|
+
has_one :analyzer, :class_name => 'Analyzer', :foreign_key => :_message_ident, :primary_key => :_ident
|
13
|
+
has_one :impact, :class_name => 'Impact', :foreign_key => :_message_ident, :primary_key => :_ident
|
14
|
+
has_one :payload, :class_name => 'AdditionalData', :foreign_key => :_message_ident, :primary_key => :_ident, :conditions=>["Prelude_AdditionalData.meaning='payload'"]
|
15
|
+
set_primary_key :_ident
|
16
|
+
|
17
|
+
def self.table_name
|
18
|
+
"Prelude_Alert"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.total_entries
|
22
|
+
sql = connection();
|
23
|
+
sql.begin_db_transaction
|
24
|
+
value = sql.execute("SELECT count(*) FROM Prelude_Alert;").fetch_row;
|
25
|
+
sql.commit_db_transaction
|
26
|
+
value[0].to_i;
|
27
|
+
end
|
28
|
+
|
29
|
+
def source_ip
|
30
|
+
source_address.address
|
31
|
+
end
|
32
|
+
|
33
|
+
def dest_ip
|
34
|
+
dest_address.address
|
35
|
+
end
|
36
|
+
|
37
|
+
def severity
|
38
|
+
return impact.severity
|
39
|
+
end
|
40
|
+
|
41
|
+
def payload_data
|
42
|
+
payload.data if payload != nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module PreludeDB
|
3
|
+
# Wrapper for Prelude_Analyzer table
|
4
|
+
class Analyzer < FIDIUS::PreludeDB::Connection
|
5
|
+
def self.columns() @columns ||= []; end
|
6
|
+
def self.column(name, sql_type=nil, default=nil,null=true)
|
7
|
+
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s,default,sql_type.to_s,null)
|
8
|
+
end
|
9
|
+
column :model, :string
|
10
|
+
column :name, :string
|
11
|
+
column :_message_ident, :bigint
|
12
|
+
|
13
|
+
def self.table_name
|
14
|
+
"Prelude_Analyzer"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
# This module provides active-record wrappers for an existing preludemanager database.
|
3
|
+
module PreludeDB
|
4
|
+
# Base class for all other PreludeManager Models.
|
5
|
+
# It is handy for establishing connection for all models
|
6
|
+
class Connection < ActiveRecord::Base
|
7
|
+
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module PreludeDB
|
3
|
+
# Wrapper for Prelude_Impact table
|
4
|
+
class Impact < FIDIUS::PreludeDB::Connection
|
5
|
+
def self.columns() @columns ||= []; end
|
6
|
+
def self.column(name, sql_type=nil, default=nil,null=true)
|
7
|
+
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s,default,sql_type.to_s,null)
|
8
|
+
end
|
9
|
+
|
10
|
+
column :description, :string
|
11
|
+
column :severity, :string
|
12
|
+
column :_message_ident, :bigint
|
13
|
+
|
14
|
+
def self.table_name
|
15
|
+
"Prelude_Impact"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module PreludeDB
|
3
|
+
# Represents an IDMEF-Event which is distributed over multiple tables in PreludeManager
|
4
|
+
class PreludeEvent < FIDIUS::PreludeDB::Connection
|
5
|
+
has_many :annotated_events
|
6
|
+
def self.columns() @columns ||= []; end
|
7
|
+
def self.column(name, sql_type=nil, default=nil,null=true)
|
8
|
+
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s,default,sql_type.to_s,null)
|
9
|
+
end
|
10
|
+
|
11
|
+
@prelude_alert = nil
|
12
|
+
|
13
|
+
def initialize(prelude_alert)
|
14
|
+
@prelude_alert = prelude_alert
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.find_by_sql(query)
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.total_entries(options = nil)
|
22
|
+
return Alert.total_entries
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.find(*args)
|
26
|
+
if args[0].is_a? Numeric
|
27
|
+
a = Alert.find(:all, :conditions => [ "_ident = ?", args[0] ])
|
28
|
+
return PreludeEvent.new a.first
|
29
|
+
else
|
30
|
+
case args[0]
|
31
|
+
when :all
|
32
|
+
if args[1]
|
33
|
+
if(args[1][:conditions] == nil)
|
34
|
+
args[1] = args[1].merge({:joins => [:detect_time,]})
|
35
|
+
args[1] = args[1].merge({:order => 'time DESC'})
|
36
|
+
end
|
37
|
+
end
|
38
|
+
a = Alert.find(*args)
|
39
|
+
result = Array.new
|
40
|
+
a.each do |pa|
|
41
|
+
result.push PreludeEvent.new pa
|
42
|
+
end
|
43
|
+
return result
|
44
|
+
when :first
|
45
|
+
a = Alert.first
|
46
|
+
return PreludeEvent.new a
|
47
|
+
when :last
|
48
|
+
a = Alert.last
|
49
|
+
return PreludeEvent.new a
|
50
|
+
else
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def source_ip
|
57
|
+
return @prelude_alert.source_ip unless @prelude_alert.nil?
|
58
|
+
return "No Ref"
|
59
|
+
end
|
60
|
+
|
61
|
+
def dest_ip
|
62
|
+
return @prelude_alert.dest_ip unless @prelude_alert.nil?
|
63
|
+
return "No Ref"
|
64
|
+
end
|
65
|
+
|
66
|
+
def source_port
|
67
|
+
return @prelude_alert.source_port.port unless @prelude_alert.nil?
|
68
|
+
return "No Ref"
|
69
|
+
end
|
70
|
+
|
71
|
+
def dest_port
|
72
|
+
return @prelude_alert.dest_port.port unless @prelude_alert.nil?
|
73
|
+
return "No Ref"
|
74
|
+
end
|
75
|
+
|
76
|
+
def payload
|
77
|
+
return @prelude_alert.payload_data unless @prelude_alert.nil?
|
78
|
+
end
|
79
|
+
|
80
|
+
def detect_time
|
81
|
+
return @prelude_alert.detect_time.time unless @prelude_alert.nil?
|
82
|
+
return "No Ref"
|
83
|
+
end
|
84
|
+
def text
|
85
|
+
return @prelude_alert.classification.text unless @prelude_alert.nil?
|
86
|
+
return "No Ref"
|
87
|
+
end
|
88
|
+
def severity
|
89
|
+
return @prelude_alert.severity unless @prelude_alert.nil?
|
90
|
+
return "No Ref"
|
91
|
+
end
|
92
|
+
def analyzer_model
|
93
|
+
return @prelude_alert.analyzer.name.to_s unless @prelude_alert.nil?
|
94
|
+
return "No Ref"
|
95
|
+
end
|
96
|
+
|
97
|
+
def id
|
98
|
+
return @prelude_alert._ident unless @prelude_alert.nil?
|
99
|
+
return "No Ref"
|
100
|
+
end
|
101
|
+
|
102
|
+
def inspect
|
103
|
+
begin
|
104
|
+
return "PreludeEvent id: "+id.to_s+", source_ip: "+source_ip+" dest_ip: "+dest_ip+" severity: "+severity+" text: "+text+" analyzer_model: "+analyzer_model+" detect_time: "+detect_time.to_s+""
|
105
|
+
rescue
|
106
|
+
puts $!.message+":"+$!.backtrace.to_s
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
"#{text}: #{source_ip}:#{source_port} -> #{dest_ip}:#{dest_port}"
|
112
|
+
end
|
113
|
+
|
114
|
+
def messageid
|
115
|
+
return @prelude_alert.messageid unless @prelude_alert.nil?
|
116
|
+
return "No Ref"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module EvasionDB
|
3
|
+
module PreludeEventFetcher
|
4
|
+
def config(conf)
|
5
|
+
$logger.debug "INIT PRELUDE EVENT FETCHER"
|
6
|
+
ids_db = conf['ids_db']
|
7
|
+
raise "no ids_db part found" unless ids_db
|
8
|
+
FIDIUS::PreludeDB::Connection.establish_connection ids_db
|
9
|
+
connection = FIDIUS::PreludeDB::Connection.connection
|
10
|
+
$logger.debug "connection is: #{connection}"
|
11
|
+
require (File.join File.dirname(__FILE__), 'patches', 'postgres_patch.rb')
|
12
|
+
end
|
13
|
+
|
14
|
+
def begin_record
|
15
|
+
a = FIDIUS::PreludeDB::Alert.find(:first,:joins => [:detect_time],:order=>"time DESC")
|
16
|
+
last_event = FIDIUS::PreludeDB::PreludeEvent.new(a)
|
17
|
+
@start_time = last_event.detect_time
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_events
|
21
|
+
raise "please begin_record before fetching" if @start_time == nil
|
22
|
+
res = Array.new
|
23
|
+
sleep 3
|
24
|
+
$logger.debug "alert.find(:all,:joins=>[:detect_time],time > #{@start_time})"
|
25
|
+
events = FIDIUS::PreludeDB::Alert.find(:all,:joins => [:detect_time],:order=>"time DESC",:conditions=>["time > :d",{:d => @start_time}])
|
26
|
+
$logger.debug "found #{events.size} events"
|
27
|
+
events.each do |event|
|
28
|
+
ev = FIDIUS::PreludeDB::PreludeEvent.new(event)
|
29
|
+
$logger.debug "Event #{ev.source_ip} -> #{ev.dest_ip} local_ip:#{@local_ip}"
|
30
|
+
if @local_ip
|
31
|
+
if (ev.source_ip == @local_ip || ev.dest_ip == @local_ip)
|
32
|
+
$logger.debug "adding #{ev.inspect} to events "
|
33
|
+
res << ev
|
34
|
+
end
|
35
|
+
else
|
36
|
+
$logger.debug "adding #{ev.inspect} to events "
|
37
|
+
res << ev
|
38
|
+
end
|
39
|
+
end
|
40
|
+
return res
|
41
|
+
end
|
42
|
+
|
43
|
+
def fetch_events(module_instance=nil)
|
44
|
+
result = []
|
45
|
+
events = get_events
|
46
|
+
events.each do |event|
|
47
|
+
idmef_event = FIDIUS::EvasionDB::Knowledge::IdmefEvent.create(:payload=>event.payload,:detect_time=>event.detect_time,
|
48
|
+
:dest_ip=>event.dest_ip,:src_ip=>event.source_ip,
|
49
|
+
:dest_port=>event.dest_port,:src_port=>event.source_port,
|
50
|
+
:text=>event.text,:severity=>event.severity,
|
51
|
+
:analyzer_model=>event.analyzer_model,:ident=>event.id)
|
52
|
+
result << idmef_event
|
53
|
+
end
|
54
|
+
return result
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
require (File.join File.dirname(__FILE__), 'models', 'connection.rb')
|
62
|
+
|
63
|
+
Dir.glob(File.join File.dirname(__FILE__), 'models', '*.rb') do |rb|
|
64
|
+
$logger.debug "loading #{rb}"
|
65
|
+
require rb
|
66
|
+
end
|
67
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module FIDIUS
|
2
|
+
module EvasionDB
|
3
|
+
# This module is only a sample how a custom fetcher could be implemented.
|
4
|
+
module TestFetcher
|
5
|
+
def config(conf)
|
6
|
+
$logger.debug "INIT Test FETCHER"
|
7
|
+
end
|
8
|
+
|
9
|
+
def begin_record
|
10
|
+
$logger.debug "test-fetcher begin record"
|
11
|
+
end
|
12
|
+
|
13
|
+
def fetch_events(*args)
|
14
|
+
$logger.debug "test-fetcher get events"
|
15
|
+
return []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
module FIDIUS::EvasionDB::Knowledge
|
3
|
+
# Represents an Attack
|
4
|
+
# in metasploit this would be exploits or auxiliaries
|
5
|
+
class AttackModule < FIDIUS::EvasionDB::Knowledge::Connection
|
6
|
+
has_many :idmef_events, :dependent=>:destroy
|
7
|
+
has_many :packets, :dependent=>:destroy
|
8
|
+
has_many :attack_options, :dependent=>:destroy
|
9
|
+
has_one :attack_payload, :dependent=>:destroy
|
10
|
+
|
11
|
+
def self.table_name
|
12
|
+
"attack_modules"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_or_create_by_name_and_options(name,options)
|
16
|
+
hash = Digest::MD5.hexdigest(options.to_s)
|
17
|
+
attack_module = self.find_or_create_by_name_and_options_hash(name,hash)
|
18
|
+
if attack_module.attack_options.size == 0
|
19
|
+
attack_module.options_hash = hash
|
20
|
+
$logger.debug "PAYLOAD: #{options['PAYLOAD']}"
|
21
|
+
attack_module.attack_payload = AttackPayload.new(:name=>options["Payload"]) if options["Payload"]
|
22
|
+
options.each do |k,v|
|
23
|
+
attack_module.attack_options << AttackOption.new(:option_key=>k,:option_value=>v)
|
24
|
+
end
|
25
|
+
attack_module.save
|
26
|
+
end
|
27
|
+
attack_module
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_option(k,v)
|
31
|
+
attack_options.find_by_option_key_and_option_value(k,v) != nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def has_options(options = {})
|
35
|
+
options.each do |k,v|
|
36
|
+
return false if !self.has_option(k,v)
|
37
|
+
end
|
38
|
+
true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module FIDIUS::EvasionDB::Knowledge
|
2
|
+
# every AttackModule can have multiple options
|
3
|
+
# these are key value pairs which are represented by this class
|
4
|
+
class AttackOption < FIDIUS::EvasionDB::Knowledge::Connection
|
5
|
+
belongs_to :attack_module
|
6
|
+
|
7
|
+
def self.table_name
|
8
|
+
"attack_options"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FIDIUS::EvasionDB::Knowledge
|
2
|
+
# everey attack can have a payload.
|
3
|
+
# in metasploit this could be meterpreter
|
4
|
+
class AttackPayload < FIDIUS::EvasionDB::Knowledge::Connection
|
5
|
+
belongs_to :attack_module
|
6
|
+
has_many :packets
|
7
|
+
has_many :idmef_events
|
8
|
+
|
9
|
+
def self.table_name
|
10
|
+
"attack_payloads"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module FIDIUS::EvasionDB::Knowledge
|
2
|
+
# model for local store generated idmef events and relate them to an executed attack
|
3
|
+
class IdmefEvent < FIDIUS::EvasionDB::Knowledge::Connection
|
4
|
+
belongs_to :attack_module
|
5
|
+
belongs_to :attack_payload
|
6
|
+
|
7
|
+
def self.table_name
|
8
|
+
"idmef_events"
|
9
|
+
end
|
10
|
+
|
11
|
+
def payload
|
12
|
+
return [] if self[:payload] == nil
|
13
|
+
self[:payload]
|
14
|
+
end
|
15
|
+
|
16
|
+
def payload_size
|
17
|
+
return self[:payload].size if self[:payload]
|
18
|
+
return 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module FIDIUS::EvasionDB::Knowledge
|
2
|
+
# every attack module sends multiple packets which are stored within this model
|
3
|
+
class Packet < FIDIUS::EvasionDB::Knowledge::Connection
|
4
|
+
belongs_to :attack_module
|
5
|
+
belongs_to :attack_payload
|
6
|
+
|
7
|
+
def self.table_name
|
8
|
+
"packets"
|
9
|
+
end
|
10
|
+
|
11
|
+
def payload
|
12
|
+
return [] if self[:payload] == nil
|
13
|
+
self[:payload]
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|