MI-LXC utilise LXC pour simuler un environnement de type Internet. J'utilise cet environnement pour des travaux pratiques (infosec) (intrusion, firewall, IDS, etc.). La faible empreinte mémoire de LXC combinée aux images différentielles permet de l'exécuter sur du matériel modeste.
Il est basé sur le principe de l'infrastructure en tant que code : ces scripts génèrent de manière programmatique l'environnement cible.
Exemple de travaux pratiques utilisant cet environnement :
- Intrusion scenario (adapté à MI-LXC v1.4.0)
- Firewall / Segmentation réseau (adapté à MI-LXC v2.0.0)
- IDS (adapté à MI-LXC v1.4.0)
- CA / HTTPS (adapté à MI-LXC v1.4.0)
- DNS (adapté à MI-LXC v1.4.2)
- Mail (adapté à MI-LXC v1.4.2)
- LDAP (adapté à MI-LXC v1.4.1)
- HTTP / Apache (adapté à MI-LXC v2.0.0)
- Découverte MI-LXC (adapté à MI-LXC v2.0.0)
- MitM / ARP spoofing (par Sébastien Mériot)
- Crypto (par Sébastien Mériot)
- HTTP Proxy (par Sébastien Mériot)
- DFIR 1 / DFIR 2 (par Sébastien Mériot)
Il existe également un tutoriel pas à pas et une vidéo de présentation.
Fonctionnalités :
- Les conteneurs fonctionnent avec les dernières versions de Debian Bullseye ou Alpine Linux.
- Le principe de l'infrastructure en tant que code permet une gestion, un déploiement et une évolution faciles dans le temps.
- L'infrastructure est construite par les utilisateurs finaux sur leur propre PC.
- Chaque conteneur a également accès à l'Internet réel (pour l'installation de logiciels).
- Les conteneurs fournissent un accès shell ainsi qu'une interface X11.
Le réseau d'exemple est composé de :
- quelques transit/ISP routés par BGP pour simuler un réseau central.
- une racine DNS alternative, permettant de résoudre les TLD réels + un TLD personnalisé ".milxc" (le registre .milxc est maintenu au sein de MI-LXC)
- quelques clients ISP résidentiels (le pirate et un PC aléatoire), utilisant les adresses de courrier @isp-a.milxc
- une organisation cible, possédant son propre numéro d'AS, exécutant des services classiques (HTTP, courrier, DNS, filer, NIS, clients, etc.) pour le domaine target.milxc.
- Une autorité de certification (MICA) prête pour ACME (style Let's Encrypt).
Quelques éléments que vous pouvez faire et observer :
- Vous pouvez http
dmz.target.milxc
depuisisp-a-hacker
. Les paquets passeront par le cœur du réseau BGP, où vous devriez être en mesure de les observer ou de modifier les routes. - Vous pouvez interroger l'entrée DNS
smtp.target.milxc
depuisisp-a-hacker
.isp-a-hacker
demandera au résolveur deisp-a-infra
, qui résoudra récursivement à partir de la racine DNSns-root-o
, puis dereg-milxc
et enfin detarget-dmz
. - Vous pouvez envoyer un email de
hacker@isp-a.milxc
(ou une autre fausse adresse...), en utilisant claws-mail surisp-a-hacker
, àcommercial@target.milxc
, qui peut être lu en utilisant claws-mail surtarget-commercial
(avec des sessions X11 dans les deux conteneurs).
La numérotation de type "IANA" (numéros d'AS, espace IP, TLD) est décrite dans doc/MI-IANA.fr.txt. Actuellement, aucune cryptographie n'est déployée nulle part (pas de HTTPS, pas d'IMAPS, pas de DNSSEC, etc.). Cela sera probablement ajouté à un moment donné, mais en attendant, le déploiement fait partie du travail attendu des étudiants.
Des détails plus précis sur ce qui est installé et configuré sur les hôtes se trouvent dans doc/DETAILS.fr.md.
Vous pouvez soit :
- Télécharger la [dernière version de VirtualBox VM prête à fonctionner] (https://github.com/flesueur/mi-lxc/releases/latest). Connectez-vous avec root/root, MI-LXC est alors déjà installé et provisionné dans
/root/mi-lxc/
(c'est-à-dire que vous pouvez directement./mi-lxc.py start
, pas besoin de./mi-lxc.py create
). - Créez une VirtualBox VM en utilisant Vagrant. Connectez-vous avec root/root, MI-LXC est alors déjà installé et provisionné dans
/root/mi-lxc/
(i.e., vous pouvez directement./mi-lxc.py start
, pas besoin de./mi-lxc.py create
). - Installer directement sur votre système hôte Linux
Le script mi-lxc.py
génère et utilise les conteneurs (en tant que root, puisqu'il manipule les ponts et les commandes lxc, plus d'informations à ce sujet ici). Il s'utilise sous la forme ./mi-lxc.py <commande>
, avec les commandes suivantes :
Commande | Description |
---|---|
create [name] |
Crée le conteneur [name], par défaut crée tous les conteneurs |
renet |
Reconfigure le réseau de tous les conteneurs |
destroy [name] |
Détruit le conteneur [name], par défaut tous les conteneurs |
destroymaster |
Détruit tous les conteneurs masters |
updatemaster |
Met à jour tous les conteneurs masters |
start |
Démarre l'infrastructure générée |
stop |
Arrête l'infrastructure générée |
attach [user@]<name> [command] |
Attache un terminal sur <name> en tant que [user](par défaut root) et exécute [command](par défaut un shell interactif) |
display [user@]<name> |
Affiche un bureau graphique sur <name> en tant que [user](par défaut debian) |
print |
Affiche la topologie configurée |
(<arguments> sont obligatoires et [arguments] sont optionnels) |
Il y a également un tutoriel pas à pas.
- Manipulation des conteneurs LXC (pas encore d'utilisation non privilégiée de LXC)
- Gestion des ponts ethernet virtuels avec
brctl
,ifconfig
etiptables
(dans mi-lxc.py:createBridges() et mi-lxc.py:deleteBridges(), autour de ligne 324) - Augmentation de fs.inotify.max_queued_events, fs.inotify.max_user_instances et fs.inotify.max_user_watches par
sysctl
(in mi-lxc.py:increaseInotify(), environ ligne 278)
Ce n'est pas idéal mais c'est actuellement nécessaire. Une issue est ouverte sur le sujet mais ce n'est pas prévu actuellement.
L'espace d'adressage est expliqué dans MI-IANA.fr.txt et la topologie globale est définie dans global.json. Elle décrit :
- les maîtres, dans le sous-dossier
masters/
(actuellement un Debian Buster et un Alpine Linux) - des groupes d'hôtes, typiquement des AS interconnectés avec BGP.
Les groupes d'hôtes sont décrits à travers :
- des modèles de groupes dans
templates/groups/<groupname>/local.json
, qui fournit typiquement un modèle de groupeas-bgp
pour configurer un AS. - enrichi de spécifications locales dans
groups/<groupname>/local.json
.
Enfin, les hôtes sont décrits et fournis à travers :
- des modèles d'hôtes dans
templates/hosts/<family>/<template>/provision.sh
, qui fournissent généralement des modèles pour les routeurs BGP, les serveurs de messagerie, les clients de messagerie, ... - des scripts spécifiques pour un hôte donné dans
groups/<groupname>/<hostname>/provision.sh
.
Pour l'étendre, vous pouvez soit étendre un AS existant (typiquement, Target), soit créer un nouvel AS. Dans ce deuxième cas, vous pouvez dupliquer Target et le connecter à un opérateur de transit sous un nouveau numéro d'AS (toute la configuration relative à BGP est spécifiée dans global.json
).
Ce processus est décrit dans le tutoriel pas à pas.
Ce logiciel est sous licence AGPLv3 : vous pouvez le réutiliser librement à condition d'écrire que vous l'utilisez et de redistribuer vos modifications. Des licences spéciales avec (encore) plus de libertés pour les activités d'enseignement public peuvent être discutées.