Spaces:
Running
Running
import requests | |
from stix2 import MemoryStore, Filter | |
from taxii2client.v20 import Server # only specify v20 if your installed version is >= 2.0.0 | |
from langchain.tools import tool | |
def get_data_from_branch(domain, branch="master"): | |
"""get the ATT&CK STIX data from MITRE/CTI. Domain should be 'enterprise-attack', 'mobile-attack' or 'ics-attack'. Branch should typically be master.""" | |
BASE_URL = f"https://raw.githubusercontent.com/mitre/cti/{branch}/{domain}/{domain}.json" | |
stix_json = requests.get(BASE_URL).json() | |
return MemoryStore(stix_data=stix_json["objects"]) | |
store = { | |
"enterprise": get_data_from_branch("enterprise-attack"), | |
"mobile": get_data_from_branch("mobile-attack"), | |
"ics": get_data_from_branch("ics-attack") | |
} | |
class MitreTool(): | |
def get_technique_by_id(domain: str, technique_id: str): | |
"""Get the technique by its ID. Domain should be 'enterprise', 'mobile' or 'ics' | |
Techniques represent 'how' an adversary achieves a tactical goal by performing an action. For example, an adversary may dump credentials to achieve credential access. | |
""" | |
result = store[domain].query([Filter('external_references.external_id', '=', technique_id)]) | |
return result if result else "No technique found with that ID" | |
def get_technique_by_name(domain: str, technique_name: str): | |
"""Get the technique by its name. Domain should be 'enterprise', 'mobile' or 'ics' | |
Techniques represent 'how' an adversary achieves a tactical goal by performing an action. For example, an adversary may dump credentials to achieve credential access.""" | |
result = store[domain].query([Filter('name', 'contains', technique_name), Filter('type', '=', 'attack-pattern')]) | |
return result if result else "No technique found with that name" | |
def get_malware_by_name(domain: str, malware_name: str): | |
"""Get the malware by its name. Domain should be 'enterprise', 'mobile' or 'ics' | |
Malware represents software used to achieve a tactical goal by performing an action. For example, an adversary may use malware to achieve initial access.""" | |
result = store[domain].query([Filter('name', 'contains', malware_name), Filter('type', '=', 'malware')]) | |
return result if result else "No malware found with that name" | |
def get_tactic_by_keyword(domain: str, keyword: str): | |
"""Search for tactics/techniques by a keyword. Domain should be 'enterprise', 'mobile' or 'ics' | |
Tactics represent the "why" of an ATT&CK technique or sub-technique. It is the adversary's tactical goal: the reason for performing an action. For example, an adversary may want to achieve credential access.""" | |
result = store[domain].query([Filter('description', 'contains', keyword)], Filter('type', '=', 'attack-pattern')) | |
return result[0] if result else "No tactics/techniques matches the keyword you provided" |