Collect All Functions#


This project comes with functions that collect all STIX objects from all ATT&CK Matrices at once. These functions help collect more with less API call requests.

Import ATTACK API Client#

from attackcti import attack_client

Import Extra Libraries#

from pandas import *
import json

import logging
logging.getLogger('taxii2client').setLevel(logging.CRITICAL)
pandas.__version__
'1.3.5'

Initialize ATT&CK Client Variable#

lift = attack_client()

Get All Techniques#

We can extract all STIX objects of type attack-pattern (technique) across all ATT&CK matrices.

  • By default, this function removes deprecated and revoked techniques. If you want to keep those techniques in the results, you can run the function with the parameter skip_revoked_deprecated=False.

  • By default, this function also includes all techniques and sub-techniques. If you want to only get techniques that are not sub-techniques, you can run the function with the parameter include_subtechniques=False.

techniques = lift.get_techniques()
print("Number of Techniques in ATT&CK")
len(techniques)
Number of Techniques in ATT&CK
736

By default, the data returned by the available functions in the attackcti library is of type stix2. However, if you want to interact with libraries such as Pandas, it needs to be of type dict

all_techniques = []
for t in techniques:
    all_techniques.append(json.loads(t.serialize()))
df = pandas.json_normalize(all_techniques)
df.reindex(['created','name', 'x_mitre_data_sources', 'x_mitre_platforms'], axis=1)[0:5]
created name x_mitre_data_sources x_mitre_platforms
0 2021-10-12T20:02:31.866Z Resource Forking [File: File Creation, Process: Process Creatio... [macOS]
1 2021-10-08T14:06:28.212Z Downgrade Attack [Command: Command Execution, Process: Process ... [Windows, Linux, macOS]
2 2021-10-05T21:26:15.081Z Login Items [Process: Process Creation, File: File Modific... [macOS]
3 2021-10-05T01:15:06.293Z Reflective Code Loading [Script: Script Execution, Process: OS API Exe... [macOS, Linux, Windows]
4 2021-10-01T17:58:26.445Z Cloud Storage Object Discovery [Cloud Storage: Cloud Storage Enumeration, Clo... [IaaS]

We can now access the schema of the dataframe

list(df)
['type',
 'id',
 'created_by_ref',
 'created',
 'modified',
 'name',
 'description',
 'kill_chain_phases',
 'external_references',
 'object_marking_refs',
 'x_mitre_contributors',
 'x_mitre_data_sources',
 'x_mitre_defense_bypassed',
 'x_mitre_detection',
 'x_mitre_is_subtechnique',
 'x_mitre_permissions_required',
 'x_mitre_platforms',
 'x_mitre_version',
 'x_mitre_remote_support',
 'x_mitre_system_requirements',
 'x_mitre_network_requirements',
 'x_mitre_effective_permissions',
 'x_mitre_impact_type',
 'x_mitre_tactic_type',
 'x_mitre_old_attack_id']

Showing one technique example:

techniques[0]
AttackPattern(type='attack-pattern', id='attack-pattern--b22e5153-ac28-4cc6-865c-2054e36285cb', created_by_ref='identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5', created='2021-10-12T20:02:31.866Z', modified='2021-10-16T01:50:40.276Z', name='Resource Forking', description='Adversaries may abuse resource forks to hide malicious code or executables to evade detection and bypass security applications. A resource fork provides applications a structured way to store resources such as thumbnail images, menu definitions, icons, dialog boxes, and code.(Citation: macOS Hierarchical File System Overview) Usage of a resource fork is identifiable when displaying a file’s extended attributes, using <code>ls -l@</code> or <code>xattr -l</code> commands. Resource forks have been deprecated and replaced with the application bundle structure. Non-localized resources are placed at the top level directory of an application bundle, while localized resources are placed in the <code>/Resources</code> folder.(Citation: Resource and Data Forks)(Citation: ELC Extended Attributes)\n\nAdversaries can use resource forks to hide malicious data that may otherwise be stored directly in files. Adversaries can execute content with an attached resource fork, at a specified offset, that is moved to an executable location then invoked. Resource fork content may also be obfuscated/encrypted until execution.(Citation: sentinellabs resource named fork 2020)(Citation: tau bundlore erika noerenberg 2020)', kill_chain_phases=[KillChainPhase(kill_chain_name='mitre-attack', phase_name='defense-evasion')], revoked=False, external_references=[ExternalReference(source_name='mitre-attack', url='https://attack.mitre.org/techniques/T1564/009', external_id='T1564.009'), ExternalReference(source_name='macOS Hierarchical File System Overview', description='Tenon. (n.d.). Retrieved October 12, 2021.', url='http://tenon.com/products/codebuilder/User_Guide/6_File_Systems.html#anchor520553'), ExternalReference(source_name='Resource and Data Forks', description='Flylib. (n.d.). Identifying Resource and Data Forks. Retrieved October 12, 2021.', url='https://flylib.com/books/en/4.395.1.192/1/'), ExternalReference(source_name='ELC Extended Attributes', description="Howard Oakley. (2020, October 24). There's more to files than data: Extended Attributes. Retrieved October 12, 2021.", url='https://eclecticlight.co/2020/10/24/theres-more-to-files-than-data-extended-attributes/'), ExternalReference(source_name='sentinellabs resource named fork 2020', description='Phil Stokes. (2020, November 5). Resourceful macOS Malware Hides in Named Fork. Retrieved October 12, 2021.', url='https://www.sentinelone.com/labs/resourceful-macos-malware-hides-in-named-fork/'), ExternalReference(source_name='tau bundlore erika noerenberg 2020', description='Erika Noerenberg. (2020, June 29). TAU Threat Analysis: Bundlore (macOS) mm-install-macos. Retrieved October 12, 2021.', url='https://blogs.vmware.com/security/2020/06/tau-threat-analysis-bundlore-macos-mm-install-macos.html')], object_marking_refs=['marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168'], x_mitre_contributors=['Jaron Bradley @jbradley89', 'Ivan Sinyakov'], x_mitre_data_sources=['File: File Creation', 'Process: Process Creation', 'File: File Metadata', 'Command: Command Execution'], x_mitre_defense_bypassed=['Notarization; Gatekeeper'], x_mitre_detection='Identify files with the <code>com.apple.ResourceFork</code> extended attribute and large data amounts stored in resource forks. \n\nMonitor command-line activity leveraging the use of resource forks, especially those immediately followed by potentially malicious activity such as creating network connections. ', x_mitre_is_subtechnique=True, x_mitre_permissions_required=['User'], x_mitre_platforms=['macOS'], x_mitre_version='1.0')

Enrich Techniques Data Sources#

As you might already know, the ATT&CK data model now represents data sources as objects. However, when retrieving techniques from ATT&CK TAXII server, their data sources section only includes data sources and data components names. Therefore, we created a parameter that you can use with the get_techniques() function to enrich the data sources section of each technique. The parameter enrich_data_sources is set to False by default.

techniques = lift.get_techniques(enrich_data_sources=True)

This function returns a list of techniques with the x_mitre_data_sources attribute as a list of STIX objects representing data sources with their respective data components depending on the technique’s detection context.

for ds in techniques[0]['x_mitre_data_sources']:
    for dc in ds['data_components']:
        print(ds['name'], '-', dc['name'])
Command - Command Execution
File - File Metadata
File - File Creation
Process - Process Creation
techniques[0]['x_mitre_data_sources'][0]
{'object_marking_refs': ['marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168'],
 'modified': '2021-11-10T09:30:48.694Z',
 'name': 'Command',
 'created_by_ref': 'identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5',
 'type': 'x-mitre-data-source',
 'id': 'x-mitre-data-source--73691708-ffb5-4e29-906d-f485f6fa7089',
 'description': 'A directive given to a computer program, acting as an interpreter of some kind, in order to perform a specific task(Citation: Confluence Linux Command  Line)(Citation: Audit OSX)',
 'created': '2021-10-20T15:05:19.273Z',
 'external_references': [{'url': 'https://attack.mitre.org/datasources/DS0017',
   'external_id': 'DS0017',
   'source_name': 'mitre-attack'},
  {'url': 'https://confluence.atlassian.com/confkb/how-to-enable-command-line-audit-logging-in-linux-956166545.html',
   'description': 'Confluence Support. (2021, September 8). How to enable command line audit logging in linux. Retrieved September 23, 2021.',
   'source_name': 'Confluence Linux Command  Line'},
  {'url': 'https://www.scip.ch/en/?labs.20150108',
   'description': 'Gagliardi, R. (n.d.). Audit in a OS X System. Retrieved September 23, 2021.',
   'source_name': 'Audit OSX'}],
 'x_mitre_version': '1.0',
 'x_mitre_platforms': ['Windows', 'Linux', 'macOS', 'Network', 'Containers'],
 'x_mitre_collection_layers': ['Host', 'Container'],
 'x_mitre_contributors': ['Austin Clark',
  'Center for Threat-Informed Defense (CTID)'],
 'data_components': [{'object_marking_refs': ['marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168'],
   'modified': '2021-10-20T15:05:19.273Z',
   'id': 'x-mitre-data-component--685f917a-e95e-4ba0-ade1-c7d354dae6e0',
   'description': 'Invoking a computer program directive to perform a specific task (ex: Windows EID 4688 of cmd.exe showing command-line parameters, ~/.bash_history, or ~/.zsh_history)',
   'created_by_ref': 'identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5',
   'name': 'Command Execution',
   'created': '2021-10-20T15:05:19.273Z',
   'type': 'x-mitre-data-component',
   'x_mitre_version': '1.0',
   'x_mitre_data_source_ref': 'x-mitre-data-source--73691708-ffb5-4e29-906d-f485f6fa7089'}]}

Get All Groups#

We can also extract all the available groups across all ATT&CK matrices at once.

groups = lift.get_groups()
print("Number of Groups in ATT&CK")
len(groups)
Number of Groups in ATT&CK
131
groups_list = []
for t in groups:
    groups_list.append(json.loads(t.serialize()))
df = pandas.json_normalize(groups_list)
df[0:4]
type id created_by_ref created modified name description aliases external_references object_marking_refs x_mitre_contributors x_mitre_version
0 intrusion-set intrusion-set--35d1b3be-49d4-42f1-aaa6-ef159c8... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-10-01T01:57:31.229Z 2021-10-15T18:47:18.824Z TeamTNT [TeamTNT](https://attack.mitre.org/groups/G013... [TeamTNT] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Will Thomas, Cyjax] 1.0
1 intrusion-set intrusion-set--39d6890e-7f23-4474-b8ef-e7b0343... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-09-29T15:10:19.236Z 2021-10-15T15:16:47.329Z Andariel [Andariel](https://attack.mitre.org/groups/G01... [Andariel, Silent Chollima] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Kyoung-ju Kwak (S2W)] 1.0
2 intrusion-set intrusion-set--6566aac9-dad8-4332-ae73-20c23ba... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-09-28T17:41:12.950Z 2021-10-25T14:28:10.337Z Ferocious Kitten [Ferocious Kitten](https://attack.mitre.org/gr... [Ferocious Kitten] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Pooja Natarajan, NEC Corporation India, Manik... 1.0
3 intrusion-set intrusion-set--e5603ea8-4c36-40e7-b7af-a077d24... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-09-24T21:41:34.797Z 2021-10-16T02:06:06.404Z IndigoZebra [IndigoZebra](https://attack.mitre.org/groups/... [IndigoZebra] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Pooja Natarajan, NEC Corporation India, Yoshi... 1.0

Get All Software#

We can extract all Enterprise, Mobile and ICS (Software Malware & Tools)

software = lift.get_software()
print("Number of Software in ATT&CK")
len(software)
Number of Software in ATT&CK
641
software_list = []
for t in software:
    software_list.append(json.loads(t.serialize()))
df = pandas.json_normalize(software_list)
df[0:4]
type id created_by_ref created modified name description labels external_references object_marking_refs x_mitre_aliases x_mitre_contributors x_mitre_platforms x_mitre_version x_mitre_old_attack_id
0 tool tool--f91162cc-1686-4ff8-8115-bf3f61a4cc7a identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-09-14T21:45:30.280Z 2021-09-21T18:03:13.205Z Wevtutil [Wevtutil](https://attack.mitre.org/software/S... [tool] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Wevtutil] [Viren Chaudhari, Qualys, Harshal Tupsamudre, ... [Windows] 1.0 NaN
1 tool tool--11f8d7eb-1927-4806-9267-3a11d4d4d6be identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-07-30T15:43:17.770Z 2021-10-15T15:49:25.284Z Sliver [Sliver](https://attack.mitre.org/software/S06... [tool] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Sliver] [Achute Sharma, Keysight, Ayan Saha, Keysight] [Windows, Linux, macOS] 1.0 NaN
2 tool tool--80c815bb-b24a-4b9c-9d73-ff4c075a278d identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-03-19T13:11:50.666Z 2021-04-26T22:35:19.315Z Out1 [Out1](https://attack.mitre.org/software/S0594... [tool] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [Out1] NaN [Windows] 1.0 NaN
3 tool tool--03c6e0ea-96d3-4b23-9afb-05055663cf4b identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-03-18T14:57:34.628Z 2021-04-25T23:30:38.375Z RemoteUtilities [RemoteUtilities](https://attack.mitre.org/sof... [tool] [{'source_name': 'mitre-attack', 'url': 'https... [marking-definition--fa42a846-8d90-4e51-bc29-7... [RemoteUtilities] NaN [Windows] 1.0 NaN

Get All Relationships#

We can also get all relationships from all ATT&CK matrices with one API request.

relationships = lift.get_relationships()
print("Number of Relationships in ATT&CK")
len(relationships)
Number of Relationships in ATT&CK
15752
relations_list = []
for t in relationships:
    relations_list.append(json.loads(t.serialize()))
df = pandas.json_normalize(relations_list)
df[0:4]
type id created_by_ref created modified relationship_type source_ref target_ref object_marking_refs description external_references
0 relationship relationship--9567076b-2a77-43e4-befd-19556def... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-11-10T09:30:48.753Z 2021-11-10T09:30:48.753Z detects x-mitre-data-component--3d20385b-24ef-40e1-9f5... attack-pattern--910906dd-8c0a-475a-9cc1-5e029e... [marking-definition--fa42a846-8d90-4e51-bc29-7... NaN NaN
1 relationship relationship--79fa693d-38b2-4730-8602-1f72eef5... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-11-10T09:30:48.753Z 2021-11-10T09:30:48.753Z detects x-mitre-data-component--9ce98c86-8d30-4043-ba5... attack-pattern--60d0c01d-e2bf-49dd-a453-f8a9c9... [marking-definition--fa42a846-8d90-4e51-bc29-7... NaN NaN
2 relationship relationship--ed1c4fff-998f-499d-8a00-cfdee554... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-11-10T09:30:48.753Z 2021-11-10T09:30:48.753Z detects x-mitre-data-component--9bde2f9d-a695-4344-bfa... attack-pattern--2959d63f-73fd-46a1-abd2-109d7d... [marking-definition--fa42a846-8d90-4e51-bc29-7... NaN NaN
3 relationship relationship--41c0352d-b377-4fe9-8c3a-67b78a9a... identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5 2021-11-10T09:30:48.753Z 2021-11-10T09:30:48.753Z detects x-mitre-data-component--c0a4a086-cc20-4e1e-b7c... attack-pattern--6836813e-8ec8-4375-b459-abb388... [marking-definition--fa42a846-8d90-4e51-bc29-7... NaN NaN

Get All Data Sources#

Now that data sources are part of the ATT&CK data model as objects, we can retrieve all that information at once.

data_sources = lift.get_data_sources()
print("Number of Data Sources in ATT&CK")
len(data_sources)
Number of Data Sources in ATT&CK
38
data_sources[0]
{'object_marking_refs': ['marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168'],
 'modified': '2021-10-20T15:05:19.275Z',
 'name': 'Internet Scan',
 'created_by_ref': 'identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5',
 'type': 'x-mitre-data-source',
 'id': 'x-mitre-data-source--38fe306c-bdec-4f3d-8521-b72dd32dbd17',
 'description': 'Information obtained (commonly via active network traffic probes or web crawling) regarding various types of resources and servers connected to the public Internet',
 'created': '2021-10-20T15:05:19.275Z',
 'external_references': [{'url': 'https://attack.mitre.org/datasources/DS0035',
   'external_id': 'DS0035',
   'source_name': 'mitre-attack'}],
 'x_mitre_version': '1.0',
 'x_mitre_platforms': ['PRE'],
 'x_mitre_collection_layers': ['OSINT'],
 'x_mitre_contributors': []}

Get All Data Components#

Now that data components are also part of the ATT&CK data model as objects, we can retrieve all that information at once.

data_components = lift.get_data_components()
print("Number of data components in ATT&CK")
len(data_components)
Number of data components in ATT&CK
109
data_components[0]
{'object_marking_refs': ['marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168'],
 'modified': '2021-10-20T15:05:19.275Z',
 'id': 'x-mitre-data-component--cc150ad8-ecfa-4340-9aaa-d21165873bd4',
 'description': 'Logged domain name system (DNS) data highlighting timelines of domain to IP address resolutions (ex: passive DNS)',
 'created_by_ref': 'identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5',
 'name': 'Passive DNS',
 'created': '2021-10-20T15:05:19.275Z',
 'type': 'x-mitre-data-component',
 'x_mitre_version': '1.0',
 'x_mitre_data_source_ref': 'x-mitre-data-source--dd75f457-8dc0-4a24-9ae5-4b61c33af866'}