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.
Files changed (55) hide show
  1. data/.gitignore +9 -0
  2. data/.yardopts +6 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +57 -0
  5. data/README.md +180 -0
  6. data/Rakefile +33 -0
  7. data/bin/fidius-evasiondb +111 -0
  8. data/evasion-db.gemspec +37 -0
  9. data/lib/db/db-install.rb +103 -0
  10. data/lib/db/migrations/001_create_packets.rb +18 -0
  11. data/lib/db/migrations/002_create_idmef_events.rb +23 -0
  12. data/lib/db/migrations/003_create_attack_modules.rb +14 -0
  13. data/lib/db/migrations/004_create_attack_options.rb +14 -0
  14. data/lib/db/migrations/005_create_attack_payloads.rb +13 -0
  15. data/lib/evasion-db/base.rb +80 -0
  16. data/lib/evasion-db/idmef-fetchers/fetchers.rb +67 -0
  17. data/lib/evasion-db/idmef-fetchers/prelude-db/fetcher.rb +8 -0
  18. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/additional_data.rb +16 -0
  19. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/address.rb +8 -0
  20. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/alert.rb +46 -0
  21. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/analyzer.rb +18 -0
  22. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/classification.rb +10 -0
  23. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/connection.rb +10 -0
  24. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/detect_time.rb +10 -0
  25. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/impact.rb +19 -0
  26. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/prelude_event.rb +120 -0
  27. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/models/service.rb +10 -0
  28. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/patches/postgres_patch.rb +12 -0
  29. data/lib/evasion-db/idmef-fetchers/prelude-db/lib/prelude_event_fetcher.rb +67 -0
  30. data/lib/evasion-db/idmef-fetchers/test-fetcher/fetcher.rb +6 -0
  31. data/lib/evasion-db/idmef-fetchers/test-fetcher/lib/test_fetcher.rb +19 -0
  32. data/lib/evasion-db/knowledge/attack_module.rb +41 -0
  33. data/lib/evasion-db/knowledge/attack_option.rb +12 -0
  34. data/lib/evasion-db/knowledge/attack_payload.rb +13 -0
  35. data/lib/evasion-db/knowledge/connection.rb +7 -0
  36. data/lib/evasion-db/knowledge/idmef_event.rb +21 -0
  37. data/lib/evasion-db/knowledge/packet.rb +17 -0
  38. data/lib/evasion-db/knowledge.rb +128 -0
  39. data/lib/evasion-db/log_matches_helper.rb +43 -0
  40. data/lib/evasion-db/recorders/msf-recorder/lib/msf-recorder.rb +78 -0
  41. data/lib/evasion-db/recorders/msf-recorder/recorder.rb +6 -0
  42. data/lib/evasion-db/recorders/recorders.rb +61 -0
  43. data/lib/evasion-db/version.rb +5 -0
  44. data/lib/fidius-evasiondb.rb +27 -0
  45. data/lib/msf-plugins/database.yml.example +24 -0
  46. data/lib/msf-plugins/evasiondb.rb +378 -0
  47. data/test/config/database.yml +11 -0
  48. data/test/config/prelude.sql +439 -0
  49. data/test/helper.rb +50 -0
  50. data/test/preludedb_helper.rb +70 -0
  51. data/test/test_fetchers.rb +34 -0
  52. data/test/test_knowledge.rb +102 -0
  53. data/test/test_preludedb.rb +41 -0
  54. data/test/test_recorders.rb +115 -0
  55. 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,8 @@
1
+ $logger.debug "prelude-db"
2
+ FIDIUS::EvasionDB.fetcher "PreludeDB" do
3
+ $logger.debug "prelude-db do"
4
+ install do
5
+ require (File.join File.dirname(__FILE__), 'lib', 'prelude_event_fetcher.rb')
6
+ self.extend FIDIUS::EvasionDB::PreludeEventFetcher
7
+ end
8
+ end
@@ -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,8 @@
1
+ module FIDIUS
2
+ module PreludeDB
3
+ # Wrapper for Prelude_Address table
4
+ class Address < FIDIUS::PreludeDB::Connection
5
+ set_table_name "Prelude_Address"
6
+ end
7
+ end
8
+ 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
+ module PreludeDB
3
+ # Wrapper for Prelude_Classification table
4
+ class Classification < FIDIUS::PreludeDB::Connection
5
+ def self.table_name
6
+ "Prelude_Classification"
7
+ end
8
+ end
9
+ end
10
+ 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,10 @@
1
+ module FIDIUS
2
+ module PreludeDB
3
+ # Wrapper for Prelude_DetectTime table
4
+ class DetectTime < FIDIUS::PreludeDB::Connection
5
+ def self.table_name
6
+ "Prelude_DetectTime"
7
+ end
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,10 @@
1
+ module FIDIUS
2
+ module PreludeDB
3
+ # Wrapper for Prelude_Service table
4
+ class Service < FIDIUS::PreludeDB::Connection
5
+ def self.table_name
6
+ "Prelude_Service"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ # This class is a patch to make postgres play nice
4
+ class PostgreSQLAdapter < AbstractAdapter
5
+ # will fix quotation bug
6
+ def quote_table_name(name)
7
+ return name
8
+ end
9
+ end
10
+ end
11
+ end
12
+
@@ -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,6 @@
1
+ FIDIUS::EvasionDB.fetcher "TestFetcher" do
2
+ install do
3
+ require (File.join File.dirname(__FILE__), 'lib', 'test_fetcher.rb')
4
+ self.extend FIDIUS::EvasionDB::TestFetcher
5
+ end
6
+ end
@@ -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,7 @@
1
+ module FIDIUS::EvasionDB::Knowledge
2
+ # base class for knowledge db.
3
+ # it is handy to establish connection for all models at once
4
+ class Connection < ActiveRecord::Base
5
+
6
+ end
7
+ 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