24549e3866
* Initial transfer of atomics to MITRE subtechniques * Add GUIDs back in, attack_technique to string (#1019) * technique to string and add guids back in * technique to string and add guids back in * technique to string and add guids back in * technique to string and add guids back in * Subtechnique transfer T1220-T1546.005 (#1020) * Create T1222.001.yaml * Create T1222.002.yaml * Create T1505.002.yaml * Update T1543.003.yaml * Update AtomicService.cs * Update T1546.005.yaml * Delete T1222.yaml * Update T1482.yaml * Update T1485.yaml * Update T1220.yaml * Update T1489.yaml * Update T1490.yaml * Update T1496.yaml * Update T1505.003.yaml * Update T1505.yaml * Update T1518.001.yaml * Update T1518.yaml * Update T1529.yaml * Update T1543.004.yaml * Update T1546.001.yaml * Update T1546.002.yaml * Update T1546.002.yaml * Update T1546.001.yaml * Update T1543.004.yaml * Update T1543.002.yaml * Update T1543.001.yaml * Update T1518.001.yaml * Update T1546.004.yaml * Update T1546.003.yaml * Update T1531.yaml * Update T1222.001.yaml * Update T1222.002.yaml * Update T1505.002.yaml * Update T1505.003.yaml * Update T1518.001.yaml * Update T1543.001.yaml * Update T1546.005.yaml * Update T1546.004.yaml * Update T1546.003.yaml * Update T1546.002.yaml * Update T1546.001.yaml * Update T1543.004.yaml * Update T1543.003.yaml * Update T1543.002.yaml * added auto_generated_guid 1220 * added T1222.001 auto_generated_guid * Update T1222.002.yaml added auto_generated_guid entries * Update T1482.yaml auto_generated_guid added * Update T1485.yaml added auto_generated_guids * Update T1489.yaml added auto_generated_guids * Update T1490.yaml added auto_generated_guids * Update T1496.yaml added auto_generated_guid * Update T1505.002.yaml added auto_generated_guid from old T1505 same atomic * Update T1505.003.yaml added auto_generated_guid from previous atomic 1100 * Delete T1505.yaml no longer needed, moved to 1505.002 * Update T1518.yaml added auto_generated_guids * Update T1529.yaml added auto_generated_guids * Update T1531.yaml added auto_generated_guids * Update T1543.001.yaml added auto_generated_guid * Update T1543.002.yaml added auto_generated_guid * Update T1543.004.yaml added auto_generated_guid * Update T1546.001.yaml added auto_generated_guid * Update T1546.002.yaml added auto_generated_guid * Update T1546.003.yaml * Update T1546.004.yaml added auto_generated_guid * Update T1546.005.yaml added auto_generated_guid * add guids back in * fix spacing issue * fix spacing * fix spacing Co-authored-by: Carrie Roberts <clr2of8@gmail.com> * Sub-techniques T1053-T1113 - Updates (#1022) * Sub-techniques T1053-T1113 - Updates Updated techniques for sub-techniques. * minor fixes format fixing * Added GUIDs - Added GUIDs back - Fixed typo (T1054) - Fixed attack_technique from an array to a string * Sub-technique updates T1546.008 through T1574.011 (#1024) * sub technique updates * sub technique updates * sub technique updates * Carrie updates (#1017) * updated T1110,12,13 * updated T1114 * updated T1114 * updated T1115 * updated T1119 * updated T1123,24 * updated T1127 * updated T1114 * updated T1127 * updated T1132 * T1134.004 * T1134.004 * updated T1135 * updated T1136 * updated T1137 * updated T1140 * remove depracted T1153 * updated T1176 * updated T1197 * updated T1201 * updated T1202 * updated T1204 * updated T1207 * updated T1216 * updated T1204 * updated T1217 * updated T1218 * updated T1218 * updated T1219 * updated T1218 * attack_technique to string * Subtechnique transfer (#1025) * T1003 review * T1005 manual review changes * T1027.002 sub-technique review * T1027.004 sub-technique review * T1036 sub-technique review * T1037 sub-technique review * T1048 sub-technique review * YAML bugfixes * Adding auto-generated GUIDs back to tests * merging with Mike's PR * Merging with Carrie's PR * fix spacing Co-authored-by: Carrie Roberts <clr2of8@gmail.com> * Subtechnique fix (#1026) * add atomic_tests: element * add atomic_tests: element * more fixes * more fixes * more fixes * sub technique minor fixes 1 (#1027) * fixes * fixes * more fixes * more fixes * display name fix (#1028) * remove some deprecated stuff. reorganize a little (#1031) * Gendocs fix (#1033) * gendocs updates for subtechniques * add folders * ignore auto generated markdown files * remove tmp files * add tmp files * Generate docs from job=validate_atomics_generate_docs branch=subtechnique_transfer * navigator layer v3.0 * Generate docs from job=validate_atomics_generate_docs branch=subtechnique_transfer Co-authored-by: Matt Graeber <60448025+mgraeber-rc@users.noreply.github.com> Co-authored-by: Tsora-Pop <35981510+Tsora-Pop@users.noreply.github.com> Co-authored-by: Michael Haag <mike@redcanary.com> Co-authored-by: CircleCI Atomic Red Team doc generator <email>
116 lines
3.5 KiB
Ruby
Executable File
116 lines
3.5 KiB
Ruby
Executable File
require 'open-uri'
|
|
require 'json'
|
|
|
|
#
|
|
# Attack is an API class that loads information about ATT&CK techniques from MITRE'S ATT&CK
|
|
# STIX representation. It makes it very simple to do common things with ATT&CK.
|
|
#
|
|
class Attack
|
|
#
|
|
# Tactics as presented in the order that the ATT&CK matrics uses
|
|
#
|
|
def ordered_tactics
|
|
[
|
|
'initial-access',
|
|
'execution',
|
|
'persistence',
|
|
'privilege-escalation',
|
|
'defense-evasion',
|
|
'credential-access',
|
|
'discovery',
|
|
'lateral-movement',
|
|
'collection',
|
|
'exfiltration',
|
|
'command-and-control',
|
|
'impact'
|
|
]
|
|
end
|
|
|
|
#
|
|
# Returns the technique identifier (T1234) for a Technique object
|
|
#
|
|
def technique_identifier_for_technique(technique)
|
|
technique.fetch('external_references', []).find do |refs|
|
|
refs['source_name'] == 'mitre-attack'
|
|
end['external_id'].upcase
|
|
end
|
|
|
|
#
|
|
# Returns a Technique object given a technique identifier (T1234)
|
|
#
|
|
def technique_info(technique_id)
|
|
techniques.find do |item|
|
|
item.fetch('external_references', []).find do |references|
|
|
references['external_id'] == technique_id.upcase
|
|
end
|
|
end
|
|
end
|
|
|
|
#
|
|
# Returns the ATT&CK Matrix as a 2D array, in order by `ordered_tactics`
|
|
#
|
|
def ordered_tactic_to_technique_matrix(only_platform: /.*/)
|
|
all_techniques = techniques_by_tactic(only_platform: only_platform)
|
|
|
|
# make an 2d array of our techniques in the order our tactics appear
|
|
all_techniques_in_tactic_order = []
|
|
ordered_tactics.each do |tactic|
|
|
all_techniques_in_tactic_order << all_techniques[tactic]
|
|
end
|
|
|
|
# figure out the max number of techniques any one tactic has
|
|
max_techniques = all_techniques_in_tactic_order.collect(&:count).max
|
|
|
|
# extend each array of techniques to that length
|
|
all_techniques_in_tactic_order.each {|techniques| techniques.concat(Array.new(max_techniques - techniques.count, nil))}
|
|
|
|
# transpose to give us the data in columnar format
|
|
all_techniques_in_tactic_order.transpose
|
|
end
|
|
|
|
#
|
|
# Returns a map of all [ ATT&CK Tactic name ] => [ List of ATT&CK techniques associated with that tactic]
|
|
#
|
|
def techniques_by_tactic(only_platform: /.*/)
|
|
techniques_by_tactic = Hash.new {|h, k| h[k] = []}
|
|
techniques.each do |technique|
|
|
next unless !technique['x_mitre_platforms'].nil?
|
|
next unless technique['x_mitre_platforms'].any? {|platform| platform.downcase =~ only_platform}
|
|
|
|
technique.fetch('kill_chain_phases', []).select {|phase| phase['kill_chain_name'] == 'mitre-attack'}.each do |tactic|
|
|
techniques_by_tactic[tactic.fetch('phase_name')] << technique
|
|
end
|
|
end
|
|
techniques_by_tactic
|
|
end
|
|
|
|
#
|
|
# Returns a list of all ATT&CK techniques
|
|
#
|
|
def techniques
|
|
# pull out the attack pattern objects
|
|
attack_stix.fetch("objects").select do |item|
|
|
item.fetch('type') == 'attack-pattern' && item.fetch('external_references', []).select do |references|
|
|
references['source_name'] == 'mitre-attack'
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
#
|
|
# Returns the complete ATT&CK STIX collection parsed into a Hash
|
|
#
|
|
def attack_stix
|
|
@attack_stix ||= begin
|
|
# load the full attack library
|
|
local_attack_json_to_try = "#{File.dirname(__FILE__)}/enterprise-attack.json"
|
|
if File.exists? local_attack_json_to_try
|
|
JSON.parse File.read(local_attack_json_to_try)
|
|
else
|
|
JSON.parse open('https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json').read
|
|
end
|
|
end
|
|
end
|
|
end
|