Pour commencer avec la CLI
Installation
Pour installer M&NTIS CLI dans un virtualenv, utilisez les commandes suivantes :
$ mkdir venv
$ virtualenv venv/
$ source venv/bin/activate
(venv) $ pip install mantis_api_client
(...)
Authentification
Afin d'authentifier la CLI avec la plateforme M&NTIS, utilisez la commande account login
:
$ mantis account login
A web browser should been opened for 'mantis-platform.io'
Waiting callback for 60s
Access granted
Group `amossys` activated
Vous pouvez voir que vous êtes correctement connecté avec :
$ mantis account info
[+] Connected to mantis-platform.io
[+] Username: jde
[+] Email: john.doe@amossys.fr
[+] Group membership: amossys
[+] Scopes: dataset:read, dataset:write, email, groups, offline_access, openid, profile, scenario:run
Accéder aux catalogues de menaces
Deux catalogues de menaces sont disponibles :
- Attaques (TTPs)
- Scénarios (killchains)
Vous pouvez lister le contenu du catalogue d'attaques avec :
$ mantis attack list
[+] Available attacks (90):
[+] NAME - DESCRIPTION
[+] wordpress_tatsubuilder_rce - RCE on Wordpress with Tatsu Builder (T1190)
[+] mimikatz_logonpasswords - Dump Credentials from Memory with Mimikatz (T1003.001)
[+] list_local_process - Discover Local Processes (T1518)
(...)
Et pour lister les scénarios disponibles :
$ mantis scenario list
[+] Available scenarios (6):
[+] aetheris: Starts with a Log4shell attack on a server, then ARP poisoning (...)
Lancer un laboratoire
Si vous souhaitez lancer une attaque dans un laboratoire, par exemple l'attaque list_local_process
, utilisez la commande attack run
:
$ mantis attack run list_local_process
[+] Going to execute attack: list_local_process
Needed argument --scenario_profile, in order to choose the scenario to run
Available scenarios:
[+] windows10
[+] linux
Vous devriez recevoir un message vous indiquant que vous devez sélectionner un des scénarios disponibles, ici soit windows10
soit linux
. Vous pouvez alors utiliser la commande :
$ mantis attack run list_local_process --scenario_profile linux
Voici un journal complet d’une exécution d’attaque. Ce journal affiche l'exécution de chaque étape du scénario (étapes de provisioning, étapes d'activité utilisateur, étapes d'attaque, etc.), et renvoie également l'ID du laboratoire qui peut être utilisé ensuite pour interagir avec celui-ci.
$ mantis attack run list_local_process --scenario_profile linux
[+] Going to execute attack: list_local_process
[+] Scenario lab ID: 2f603ea7-98aa-40dd-8f21-e2ee299a02e9
[+] Notifications:
⚡ 2024-07-25 20:34:27 - Initialization
⚡ 2024-07-25 20:34:27 - Reserve Cyber Range instance
⚡ 2024-07-25 20:34:38 - Start Cyber Range
⚡ 2024-07-25 20:36:09 - Initialize Cyber Range
⚡ 2024-07-25 20:38:18 - Create simulation from topology '/cyber-range-catalog/redteam_topologies/ubuntu'
⚡ 2024-07-25 20:38:18 - Fetch required baseboxes
⚡ 2024-07-25 20:38:37 - Simulation started. You can use the Interactive view.
⚡ 2024-07-25 20:38:38 - Deploying 'os_set_hostname' playbook
⚡ 2024-07-25 20:39:31 - Playing 'operating_system/open_session' activity
⚡ 2024-07-25 20:40:29 - Begin attack 'Deploy an nginx web server'
⚡ 2024-07-25 20:40:31 - Finished attack 'Deploy an nginx web server'
⚡ 2024-07-25 20:40:32 - Begin attack 'Deploys a C&C'
⚡ 2024-07-25 20:40:36 - Finished attack 'Deploys a C&C'
⚡ 2024-07-25 20:40:48 - Playing 'operating_system/activate_payload_linux' activity
⚡ 2024-07-25 20:41:53 - Begin attack 'Discover Local Processes'
(...)
[========================================] in 7:41.1
[+] Scenario ended
Plusieurs types de contenus peuvent être lancés dans un laboratoire. Voici les contenus disponibles :
- Des attaques,
- Des scénarios,
- Des baseboxes,
- Des topologies.
Configuration d'un laboratoire
Lors du lancement d'un laboratoire, vous pouvez le configurer avec l'option --lab_config
qui attend un fichier de configuration YAML comme paramètre.
Voir lab_config pour le contenu précis du fichier.
L'utilisation de la CLI lors du passage d'un fichier YAML est la suivante :
$ mantis attack run list_local_process --scenario_profile linux --lab_config config.yaml
(...)
Dans les sous-chapitres suivants, nous illustrons l’utilisation de la structure de données lab_config
pour contrôler l'exécution du scénario, et pour configurer la défense.
Configuration de l'exécution du scénario
Il existe trois manières de gérer l'exécution d'un scénario :
automatic
: les différentes étapes d'attaque sont exécutées les unes après les autres sans pause (comportement par défaut).step_by_step
: une pause se produit entre chaque étape d'attaque.custom
: une liste d'étapes d'attaque pour lesquelles une pause est requise comme défini dans l'attributstep_waiting_list
.
Un scénario en pause peut nécessiter une action de l'utilisateur pour reprendre (comportement par défaut), ou attendre une durée aléatoire choisie entre deux valeurs (random_waiting_minutes
). Les pauses sont effectuées avant et après l'étape d'attaque.
Afin de reprendre l'exécution d'un scénario, il faut saisir la commande resume
:
$ mantis lab 2f603ea7-98aa-40dd-8f21-e2ee299a02e9 resume
L'exemple suivant exécute un scénario étape par étape, en s'arrêtant avant et après chaque étape :
$ cat config.yaml
---
scenario_execution_mode: "step_by_step"
Cet exemple s'arrête sur l'étape d'attaque « api_control » d'un scénario :
$ cat config.yaml
---
scenario_execution_mode: "custom"
step_waiting_list: ["api_control"]
L'exemple suivant attend entre 1 et 3 minutes avant et après chaque attaque plutôt que d'attendre qu'un utilisateur reprenne le scénario :
$ cat config.yaml
---
random_waiting_minutes: [1, 3]
Configuration de la défense
La collecte des journaux de défense peut être configurée via le champ log_collectors
de la structure de données lab_config
.
L'extrait suivant illustre une structure de données lab_config
utilisée pour configurer la chaîne de collecte de logs Winlogbeat qui émet des journaux vers un agrégateur de journaux logstash. Les journaux sont ensuite stockés dans une base de données Elasticsearch, puis accessibles à un analyste en se connectant à une instance Kibana.
$ cat config_collect.yaml
---
config_name: "config_collect_auditbeat"
log_collectors:
- instance_name: auditbeat
collector_name: auditbeat
collector_type: agent
location:
- location_type: system_type
value: linux
output:
- instance_name: logstash
collector_name: logstash
collector_type: aggregator
- instance_name: logstash
collector_name: logstash
collector_type: aggregator
location:
- location_type: new_node
value: logstash
output:
- instance_name: elasticsearch
collector_name: elasticsearch
collector_type: aggregator
- instance_name: elasticsearch
collector_name: elasticsearch
collector_type: aggregator
location:
- location_type: new_node
value: elasticsearch
- instance_name: kibana
collector_name: kibana
collector_type: visualization
location:
- location_type: new_node
value: kibana
- instance_name: analyst_machine
collector_name: analyst_machine
collector_type: visualization
location:
- location_type: new_node
value: analyst_machine
user_config:
nb_machines: 1
Accéder aux informations d'un laboratoire
Plusieurs commandes associées à un laboratoire sont disponibles avec la CLI, comme le montre le message --help
:
$ mantis lab 2f603ea7-98aa-40dd-8f21-e2ee299a02e9 --help
(...)
info Get information about a lab
api Get API URLs to directly access the lab
topology Get scenario topology on current lab
nodes Get scenario nodes on current lab
assets Get scenario assets on current lab
attack-report Get scenario attack report on current lab
attack-infras Get scenario attack infras on current lab
attack-sessions Get scenario attack sessions on current lab
attack-knowledge Get scenario attack knowledge on current lab
notifications Get scenario notifications on current lab
scenario-run-config Get scenario run config on current lab
get-remote-access Get info for remote access to lab VMs
(...)
Métadonnées d'un laboratoire
Afin de récupérer les métadonnées d'un laboratoire, la commande info
est disponible :
$ mantis lab 2f603ea7-98aa-40dd-8f21-e2ee299a02e9 info
[+] Lab information:
[+] Id: 2f603ea7-98aa-40dd-8f21-e2ee299a02e9
[+] Name: list_local_process
[+] Type: ATTACK
[+] Status: RUNNING
[+] Start time: 2024-07-29 07:29:13
[+] Elapsed time (minutes): 8.01
[+] Created by: jde
Pour plus de détails, voir la documentation de référence : lab info.
Nœuds d'un laboratoire
Pour récupérer les métadonnées des nœuds, utilisez la sous-commande nodes
.
$ mantis lab 2f603ea7-98aa-40dd-8f21-e2ee299a02e9 nodes
Cette sous-commande permet d'afficher les informations sur les nœuds au format JSON avec l'option --json
. Cette option est utile lors de la recherche d'une information avec l'outil jq
:
$ mantis lab 2f603ea7-98aa-40dd-8f21-e2ee299a02e9 nodes --json | jq
[
{
"simulation_id": 1,
"basebox_id": "AMOSSYS/linux/ubuntu_20.04_gnome_chrome_firefox",
"id": 1,
"name": "TARGET",
"node_start_time": "2024-07-29T07:33:07",
"status": "RUNNING",
"nb_proc": 2,
"memory_size": 4096,
"type": "virtual_machine",
"username": "alex",
"password": "123456;!",
"admin_username": "root",
"admin_password": "Beezh35;",
"vnc_port": 5901,
"spice_port": 6901,
"remote_password": "sXi-KRj8wjXtLucCMtPi6zenm8Ph7Y4U",
"active": true,
"roles": [
"client"
],
"network_interfaces": [
{
"mac_address": "00:21:1b:96:1b:14",
"ip_address_runtime": "192.168.33.11",
(...)
}
],
},
(...)
Par exemple, pour lister tous les noms de nœuds, vous pouvez utiliser cette commande :
$ mantis lab cbf18e0c-f870-4048-9e42-413167bcd789 nodes|jq '.[] | .name'
"TARGET"
"Router1"
"switchinternet"
"SwitchMonitoring"
"SwitchGateway"
"RouterGateway"
"PhysicalGateway"
"internetproxy"
"provAgentSimu1"
"logstash"
"nginxserver"
"apicontrol"
Pour plus de détails, voir la documentation de référence : lab nodes.
Accéder au rapport d'attaque
Une fois le scénario terminé (ou pendant l'exécution du scénario), vous pouvez récupérer les informations liées à l'exécution de l'attaque :
$ mantis lab 2f603ea7-98aa-40dd-8f21-e2ee299a02e9 mantis attack-report
(...)
{
"id": 24,
"source_id": 10,
"worker": {
"id": "1518_000_001",
"name": "list_local_process",
"title": "Discover Local Processes",
"title_fr": "Liste les processus locaux",
"description": "Lists all running processes on the local workstation.",
"version": "1.1",
"cve": [],
"stability": "CRASH_SAFE",
"reliability": null,
"side_effect": "",
"killchain_step": "DISCOVERY",
"topics": "attack_session",
"repeatable": true,
"mitre_data": {
"technique": {
"id": "T1518",
"name": "Software Discovery"
},
"subtechnique": {},
"tactics": [
{
"id": "TA0007",
"name": "Discovery"
}
]
},
"attack_mode": "INDIRECT"
},
"status": "success",
"started_date": "2024-07-29T11:25:23+00:00",
"last_update": "2024-07-29T11:25:29+00:00",
"target_nodes": [
{
"node_type": "ATTACK_SESSION",
"node_info": {
"ip": "192.168.33.11",
"type_session": "sh",
"privilege_level": "user",
"session_id": "2101d27b-9870-4af8-b999-dcb642181dbd",
"username": "adurand"
},
"attack_process_graph": [
{
"sh": {
"encoded_command": "cABzACAAYQB4AGMAbwAgAGMAbwBtAG0AYQBuAGQA",
"decoded_command": "ps axco command"
}
}
]
}
],
},
(...)
Pour plus de détails, voir la documentation de référence : attack-report.