more fixes

This commit is contained in:
clr2of8
2020-05-08 02:02:37 -06:00
parent f9033fd1bf
commit 216751d0a7
3 changed files with 30 additions and 11 deletions
+26 -8
View File
@@ -62,7 +62,7 @@ class AtomicRedTeam
end
end
def validate_atomic_yaml!(yaml, used_guids_file)
def validate_atomic_yaml!(yaml, used_guids_file, unique_guid_array)
raise("YAML file has no elements") if yaml.nil?
raise('`attack_technique` element is required') unless yaml.has_key?('attack_technique')
@@ -81,8 +81,10 @@ class AtomicRedTeam
if atomic.has_key?('auto_generated_guid')
guid = atomic["auto_generated_guid"].to_s
raise("`atomic_tests[#{i}].auto_generated_guid` element must be unique") unless is_unique_guid(guid, used_guids_file)
raise("`atomic_tests[#{i}].auto_generated_guid` element not a proper guid") unless /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/.match(guid)
raise("`atomic_tests[#{i}].auto_generated_guid` element must be unique") unless !unique_guid_array.include?(guid)
unique_guid_array << guid
add_guid_to_used_guid_file(guid, used_guids_file)
end
raise("`atomic_tests[#{i}].description` element is required") unless atomic.has_key?('description')
@@ -150,30 +152,46 @@ class AtomicRedTeam
end
end
def record_used_guids!(yaml, used_guids_file)
return unless !yaml.nil?
yaml['atomic_tests'].each_with_index do |atomic, i|
next unless atomic.has_key?('auto_generated_guid')
guid = atomic["auto_generated_guid"].to_s
add_guid_to_used_guid_file(guid, used_guids_file)
end
end
def generate_guids_for_yaml!(path, used_guids_file)
text = File.read(path)
guid = get_unique_guid(used_guids_file)
# add the "auto_generated_guid:" element after the "- name:" element if it isn't already there
text.gsub!(/(?i)(^([ \t]*-[ \t]*)name:.*$(?!\s*auto_generated_guid))/) { |m| "#{$1}\n#{$2.gsub(/-/," ")}auto_generated_guid:"}
# fill the "auto_generated_guid:" element in if it doesn't contain a guid
text.gsub!(/(?i)^([ \t]*auto_generated_guid:)(?!([ \t]*[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12})).*$/) { |m| "#{$1} #{get_unique_guid(used_guids_file)}"}
text.gsub!(/(?i)^([ \t]*auto_generated_guid:)(?!([ \t]*[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12})).*$/) { |m| "#{$1} #{get_unique_guid!(used_guids_file)}"}
File.open(path, "w") { |file| file << text }
end
def get_unique_guid(used_guids_file)
# generates a unique guid and records the guid as having been used by writing it to the used_guids_file
def get_unique_guid!(used_guids_file)
new_guid = ''
20.times do |i| # if it takes more than 20 tries to get a unique guid, there must be something else going on
new_guid = SecureRandom.uuid
break unless !is_unique_guid(new_guid, used_guids_file)
end
# add this new unique guid to the used guids file
open(used_guids_file, 'a') { |f|
f.puts new_guid unless new_guid == ''
}
add_guid_to_used_guid_file(new_guid, used_guids_file)
return new_guid
end
# add guid to used guid file if it is the proper format and is not already in the file. raises an exception if guid isn't valid
def add_guid_to_used_guid_file(guid, used_guids_file)
open(used_guids_file, 'a') { |f|
raise("`atomic_tests[#{i}].executor.command` element is required") unless /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/ =~ guid
f.puts guid unless !is_unique_guid(guid, used_guids_file)
}
end
def is_unique_guid(guid, used_guids_file)
return !File.foreach(used_guids_file).grep(/#{guid}/).any?
end
+2 -1
View File
@@ -12,7 +12,8 @@ fails = []
ATOMIC_RED_TEAM.atomic_test_paths.each do |path|
begin
print "Generating guids #{path}..."
YAML.load_file(path)
ATOMIC_RED_TEAM.record_used_guids!(YAML.load_file(path), USED_GUIDS_FILE)
AtomicRedTeam.new.generate_guids_for_yaml!(path, USED_GUIDS_FILE)
oks << path
+2 -2
View File
@@ -9,12 +9,12 @@ USED_GUIDS_FILE = "#{File.dirname(File.dirname(__FILE__))}/atomics/used_guids.tx
oks = []
fails = []
unique_guid_array = []
ATOMIC_RED_TEAM.atomic_test_paths.each do |path|
begin
print "Validating #{path}..."
YAML.load_file(path)
AtomicRedTeam.new.validate_atomic_yaml!(YAML.load_file(path), USED_GUIDS_FILE)
AtomicRedTeam.new.validate_atomic_yaml!(YAML.load_file(path), USED_GUIDS_FILE, unique_guid_array)
oks << path
puts "OK"