MITRE ATT&CK to źródło wiedzy o taktykach i technikach adwersarzy. Jest wspólnym językiem domenowym w świecie cyberbezpieczeństwa. Każda organizacja jest inna, korzysta z innych systemów operacyjnych i interesuje się nią inna grupa adwersarzy. W artykule wykorzystamy popularną Python’ową bibliotekę pandas i zrobimy prosty notebook.
Psst! Link do repo na samym dole.
MITRE ATT&CK? Po co mi to?
Budżet nie jest z gumy, tak samo jak zasoby ludzkie, sprzętowe, przepustowość sieci i miejsce na naszym SIEM’ie. Musimy więc mądrze wybrać źródła danych które chcemy zbierać. Tak się składa, iż w MITRE znajdziemy zdefiniowane źródła danych i ich komponenty. Opisany tu sposób to nienajgorszy załącznik do wniosku, czemu potrzebujemy tylu agentów i takich eventów Sysmona .
A dlaczego pandas?
Bo jest to popularna biblioteka do transformacji i analizy danych. Co prawda wolę Sparka/PySparka… ale tym razem nie chciało mi się wyciągać armaty na wróbla. Ten artykuł to zachęta do skorzystania z narzędzi analitycznych innych niż interfejs białkowy i lewy przycisk myszki.
Źródło
MITRE to nie tylko strona internetowa, ale również narzędzia analityczne i repozytoria na GitHub. Skorzystamy z mappingu technika – data component (link).
Dane wejściowe
Każda organizacja jest inna. Załóżmy, iż wynik naszych obliczeń będzie liczony na podstawie platform oraz technik. Platformy to systemy z których korzystamy. Zestawienie najważniejszych technik powinien dostarczyć zespół CTI. Poniższe techniki to losowy zbiór.
my_platforms = ['Windows', 'Linux','Network'] # or None my_techniques = ['T1204', 'T1053', 'T1543', 'T1134' ,'T1112','T1110','T1003', 'T1135', 'T1046'] # or NonePobranie i wczytanie danych do pandas
import pandas as pd import yaml import requests url = "https://raw.githubusercontent.com/mitre-attack/attack-datasources/main/docs/techniques_to_components_mapping.yaml" response = requests.get(url) mapping = yaml.safe_load(response.content) df = pd.DataFrame(mapping)Jest też dostępna wersja w CSV, ale jakoś YAML bardziej do mnie przemawia. Pobieramy, deserializujemy i tworzymy DataFrame.
Eksplozja platform
Kolumna platform to tablica, co nie jest specjalnie wygodne. Rozbijmy ją na osobny wiersze.
df = df.explode('platform')Filtrowanie
if my_platforms: df = df.where(df["platform"].isin(my_platforms)).dropna() if my_techniques: df = df.where(df['technique_id'].isin(my_techniques)).dropna()if jakbyśmy nie chcieli definiować my_platforms lub my_techniques. Pod koniec zobaczymy jaki będzie wynik dla wszystkich technik, dla platform Windows, Linux i Network.
Pivot
Czas na tabelę przestawną. Naszym celem jest zestawienie technik i komponentów i zliczenie ich wystąpień. Komórki bez wartości wypełnimy zerami.
df_pivoted = pd.pivot_table(df, values="technique_id",index="technique", columns ="data_component", aggfunc='count', fill_value=0)WYNIKI!
Czerwony kolor dla wartości większych niż 0 pozwoli nam “na oko” oszacować które źródło danych da nam większe pokrycie. Na screenie poniżej wyróżnia się Command Execution, czyli warto rozważyć zbieranie zdarzeń 4688, Sysmon 1,~/.bash_history itp.
df_pivoted.style.applymap(lambda x: "background-color: red" if x>0 else "background-color: white")Dla wylosowanego zestawu technik najważniejsze trzy źródła to wykonania komend, tworzenie procesów i wywołania systemowe (np. Sysmon 19-21). Jak to wygląda dla wszystkich technik (dla wybranych platform?)…
Podsumowanie
Powyższy przykład to nie jest rocket science, a mimo to pozwala lepiej zrozumieć potrzebny i wprowadzić odrobinę podejścia data-driven / intelligence-driven. Dodatkowo, jeżeli powtarzasz jakeś czynności już N’ty raz, może warto to zautomatyzować .
Repozytorium
https://github.com/zorteran/top-10-mitre-data-sources-with-pandas