- Protection d'un LAN d'attaques "macflooding"
- Learning switch et injection de trames
- Initialisez la machine pour H1
- Initialiser la machine H2
- Initialisez la machine H3
- Fonctionnement normal d'un switch
- Injection de trames sur le réseau
- Attaque du MAC flooding
- Attaque du LAN par macflooding
- Protection du LAN
- Port Security --- Trunk
- Port Security --- Access Port
- Configuration interface GigabitEthernet 0/0
- Configuration interface GigabitEthernet 0/1
- Configuration interface GigabitEthernet 0/2
- Test du bon fonctionnement de Port Security
lang: fr-CH
\newpage
Protection d'un LAN d'attaques "macflooding"
Learning switch et injection de trames
Initialisez la machine pour H1
dhclient -v mgmt0
apt update
apt -y --no-install-recommends install git python3-pip python-is-python3 tcpreplay
pip3 install scapy
git clone https://gitedu.hesge.ch/hoerdt-public/sendether
cd sendether && chmod 755 sendether.py && cp sendether.py /usr/local/bin
hostnamectl set-hostname H1
ip addr add 10.0.0.1/24 dev eth0
ip link set up dev eth0
ip link set dev eth0 addr 00:00:00:00:00:01
exit
Initialiser la machine H2
hostnamectl set-hostname H2
ip addr add 10.0.0.2/24 dev eth0
ip link set up dev eth0
ip link set dev eth0 addr 00:00:00:00:00:02
exit
Initialisez la machine H3
hostnamectl set-hostname H3
ip addr add 10.0.0.3/24 dev eth0
ip link set up dev eth0
ip link set dev eth0 addr 00:00:00:00:00:03
exit
Fonctionnement normal d'un switch
-
La valeur du
aging-time
de la table MAC de S1 est de 300s (5 min). Cette valeur signifie la quantité de temps dont une adresse MAC sera stocké dans la table MAC. -
La commande
show mac-address-table count
retourne la valeur maximale d'adresses MACs qui peuvent être stockés dans la table MAC ainsi que le nombre d'adresse MAC actuellement dans la table -
- S1 H1, H2, H3
- S2 H1, H2
- S3 H1, H3
- S1
-
ping -c 5 10.0.0.2 && ping -c 5 10.0.0.3
La table est construite MAC grâce au spanning tree protocol (STP). Suite au fait qu'il y ait des paquets ICMP entre H1
- La raison pour laquelle on ne voit pas les messages ICMP entre H1 et H2 sur le lien entre S1 et S3 car les adresses MAC de H1 et H2 ont été ajouté à la table MAC avant que cette table ne soit pleine, par conséquent le trafic entre ces deux hôtes ne sera pas redirigé sur tous les ports ce qui survient en mode fail-open lorsque la table MAC est pleine est qu'une communication est établie entre 2 hôtes qui ne sont pas encore présent dans ladite table.
Injection de trames sur le réseau
-
Suite à l'exécutionde la commande
sendether.py -i eth0 -c 5
, une nouvelle adresse MAC apparait dans les tables MACs des switches S1, S2, S3. -
Le script
sendether.py
génère une nouvelle adresse MAC aléatoire, puis ce script envoi un message ICMP de sorte à ce que les tables MACs des switches S1, S2 et S3 se remplissent avec cette nouvelle adresse MAC aléatoire. -
Suite à cette inversion, les adresses présentent précedemment n'y sont plus dans les tables d'adresses MACs de S1, S2 et S3. La raison pour laquelle cela est le cas est qu'en ayant inversé les adresses
src
etdst
on envoie le paquet à H1 depuis une un hôte possedant une adresse MAC aléatoire.
Attaque du MAC flooding
Installer macof.py et initialiser la machine H1 avec les commandes suivantes
dhclient -v mgmt0
apt update
apt -y --no-install-recommends install git python3-pip python-is-python3 tcpreplay
pip3 install scapy
git clone https://github.com/WhiteWinterWolf/macof.py.git
cd macof.py
chmod 755 macof.py && cp macof.py /usr/local/bin/
hostnamectl set-hostname H1
ip addr add 10.0.0.1/24 dev eth0
ip link set up dev eth0
ip link set dev eth0 addr 00:00:00:00:00:01
exit
La machine H2 sera initialisée avec les commandes suivantes
hostnamectl set-hostname H2
ip addr add 10.0.0.2/24 dev eth0
ip link set up dev eth0
ip link set dev eth0 addr 00:00:00:00:00:02
exit
Et la machine H3
hostnamectl set-hostname H3
ip addr add 10.0.0.3/24 dev eth0
ip link set up dev eth0
ip link set dev eth0 addr 00:00:00:00:00:03
exit
Attaque du LAN par macflooding
- Une attaque par "macflooding" consiste à remplir la mémoire CAM (Content Addressable Memory) des switches en remplissant la table des adresses MACs jusqu'à ce qu'il n'y ait plus de place pour stocker de nouvelles adresses MACs.
Dès que la table MAC d'un des switches est pleine, il passera en mode "fail-open" ce qui signifie que tout trafic qui n'a pas d'entrée dans la CAM sera floodé sur tous les ports associés au VLAN du port d'entrée. Cela implique que tous les switches connecté sur le même VLAN sont vulnérables à ce genre d'attaque.
-
La commande
macof.py -i eth0 -c 8192 -w 1
a été exécuté sur H1. -
Le trafic envoyé depuis H1 sera floodé sur tous les ports du switches auxquels sont connectés les hôtes (e.g. H1-S1, H2-S1 et H3-S1). Cela signifie que le trafic sur tous les liens sera congestionné.
-
L'outil
macof
est utilisé pour effectuer des attaques de types "macflooding". Il genère des adresses MAC aléatoires et par la suite envoie des paquets afin de surcharger les tables MACs des switches.
L'option -c
-- "count" de l'outil macof
spécifie la quantité de paquets
que l'on souhaite envoyé. En ce qui concerne l'argument -w
-- "wait", fait une
attente de la quantité spécifiée en ms entre chaque envoie de paquets.
-
On peut affirmer que le LAN dysfonctionne car la table MAC du switch S1 est pleine. Par conséquent aucune nouvelle entrée ne sera ajoutée et les paquets de ces nouvelles entrées seront floodés sur tous les ports. Le switch passe en mode
fail-open
de que la table MAC d'un switch a atteint sa capacité de stockage maximale d'adresses MAC, en l'occurrence la quantité maximale est de. -
Oui, en théorie il est possible de voir les messages ICMP qui transitent entre H1 et H3 car suite au fait que le switch est passé en mode "fail-open", c'est-à-dire que tous paquets dont la source est une adresse MAC qui n'est pas connu par la table d'adresse MAC du switch, sera copié sur tous les ports.
-
Sur la capture d'écran ci-dessous, on peut effectivement remarquer que le paquet ICMP envoyé depuis H2 à H3 est bien visible sur le lien H1
S1.
- Cela se produit sûrement parce que les paquets seront "droppé" après un certain temps donné.
Protection du LAN
Port Security --- Trunk
Switch#
Switch#conf t
Switch(config)#interface type slot/port // Selects the LAN port to configure
Switch(config-if)#switchport // Configures the port as a Layer 2 port
Switch(config-if)#switchport trunk encapsulation {is1 | dot1q} // Configures the
// encapsulation, which configures the Layer 2 switching port as either an ISL or
// 802.1Q trunk
Switch(config-if)#switchport mode trunk // Configures the port to trunk unconditionally
Switch(config-if)#switchport nonegotiate // Configures the trunk not to use DTP
Switch(config-if)#switchport port-security maximum n_addresses vlan {vlan_ID | vlan_range}
// Enables port security on trunk and sets the maximum number of secure MAC addresses for the
// port (default 1).
Switch(config-if)#no switchport port-security // Disables port security on trunk
Switch(config-if)#do show port-security interface type slot/port | include Port
Security // Verifies the configuration
où type slot/port
est ex.: GigabitEthernet 0/0
Port Security --- Access Port
Switch#
Switch#conf t
Switch(config)#interface type slot/port // Selects the LAN port to configure
Switch(config-if)#switchport // Configures the port as a Layer 2 port
Switch(config-if)#switchport mode access // Configures the port as a Layer 2 access
// port
Switch(config-if)#switchport port-security // Enables port-security on access port
Switch(config-if)#switchport port-security maximum n_addresses vlan {vlan_ID | vlan_range}
// Enables port security on trunk and sets the maximum number of secure MAC addresses for the
// port (default 1).
Switch(config-if)#no switchport port-security // Disables port security on trunk
Switch(config-if)#do show port-security interface type slot/port | include Port
Security // Verifies the configuration
où type slot/port
est ex.: GigabitEthernet 0/0
Configuration interface GigabitEthernet 0/0
Switch#
Switch#conf t
Switch(config)#interface GigabitEthernet 0/0
Switch(config-if)#switchport
Switch(config-if)#switchport trunk encapsulation dot1q
Switch(config-if)#switchport mode trunk
Switch(config-if)#switchport nonegotiate
Switch(config-if)#switchport port-security maximum 8
Switch(config-if)#switchport port-security violation shutdown
Switch(config-if)#switchport port-security aging time 1
Switch(config-if)#no shutdown
============= Config checks =============
Switch(config-if)#do show port-security interface GigabitEthernet 0/0 | include Port Security
Switch(config-if)#do show port-security interface GigabitEthernet 0/0 | include Maximum
Switch(config-if)#do show port-security interface GigabitEthernet 0/0 | include shutdown
Switch#show port-security interface GigabitEthernet 0/0
=========================================
Configuration interface GigabitEthernet 0/1
Switch#
Switch#conf t
Switch(config)#interface GigabitEthernet 0/1
Switch(config-if)#switchport
Switch(config-if)#switchport mode access
Switch(config-if)#switchport port-security
Switch(config-if)#switchport port-security maximum 8
Switch(config-if)#switchport port-security violation shutdown
Switch(config-if)#switchport port-security aging time 1
Switch(config-if)#no shutdown
============= Config checks =============
Switch(config-if)#do show port-security interface GigabitEthernet 0/1 | include Port Security
Switch(config-if)#do show port-security interface GigabitEthernet 0/1 | include Maximum
Switch(config-if)#do show port-security interface GigabitEthernet 0/1 | include shutdown
Switch#show port-security interface GigabitEthernet 0/1
=========================================
Configuration interface GigabitEthernet 0/2
Switch#
Switch#conf t
Switch(config)#interface GigabitEthernet 0/2
Switch(config-if)#switchport
Switch(config-if)#switchport mode access
Switch(config-if)#switchport port-security
Switch(config-if)#switchport port-security maximum 8
Switch(config-if)#switchport port-security violation shutdown
Switch(config-if)#switchport port-security aging time 1
Switch(config-if)#no shutdown
============= Config checks =============
Switch(config-if)#do show port-security interface GigabitEthernet 0/2 | include Port Security
Switch(config-if)#do show port-security interface GigabitEthernet 0/2 | include Maximum
Switch(config-if)#do show port-security interface GigabitEthernet 0/2 | include shutdown
Switch#show port-security interface GigabitEthernet 0/2
=========================================
Test du bon fonctionnement de Port Security
-
-
show port-security interface GigabitEthernet 0/0
affiche la configuration du port security sur l'interface GigabitEthernet 0/0. -
show port-security
affiche les interfaces sur lesquelles port security a été configuré ainsi que le nombre d'infractions qui ont eu lieu. -
show interfaces status
affiche le statut des interfaces disponibles sur le switch (si elles sont connectées ou pas).
-
Suite à la violation de sécurité provoquée sur S1 grâce à l'outil sendether.py
on remarque que les commandes enumérées ci-dessus reflètent bien cet évenemment.
La commande show interfaces status
affiche que le statut de l'interface GigabitEthernet 0/0
est passé de connected
à err-disabled
.
Au moment de la violation, les notifications "d'infractions" se sont bien affichées sur la console ce qui signifie que notre configuration au niveau du mode de "violation" est correcte.
*Oct 7 11:51:06.732: %PM-4-ERR_DISABLE: psecure-violation error detected on Gi0/0, putting Gi0/0 in err-disable state
*Oct 7 11:51:06.736: %PORT_SECURITY-2-PSECURE_VIOLATION: Security violation occurred, caused by MAC address 0087.fdc9.7121 on port GigabitEthernet0/0.
*Oct 7 11:51:06.736: %PORT_SECURITY-2-PSECURE_VIOLATION_VLAN: Security violation on port GigabitEthernet0/0 due to MAC address 0087.fdc9.7121 on VLAN 1
*Oct 7 11:51:07.732: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to down
*Oct 7 11:51:08.735: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to down
La commande show port-security
affiche le nombre d'adresses MAC "secure" qui
correspond au nombre maximal qu'on a configuré (8). On remarque aussi que la
valeur de "SecurityViolation" s'est incrémentée et est passée à 1.
En ce qui concerne la commande show port-security interface GigabitEthernet 0/0
,
elle reflète la "violation" qui s'est produite en mettant à jour la valeur du
compteur "SecurityViolation".
- Le risque d'une réactivation automatique est que l'attaque lancée reprendra son effet s'il n'a pas été arrête entre-temps par la personne malveillante. L'inconvénient est qu'il est possible de mettre "hors-service" tous les ports d'un switch si diverses attaques ont été lancées sur tous les ports ce qui rendrait le switch inutilisable et "hors-service". A mon avis, il faudrait pouvoir instaurer un méchanisme qui surveillerai la fréquence à laquelle les paquets arrivent sur le switch. C'est un des rares facteurs grâce auquel à mon avis il est encore possible de discerner du trafic normal et repérer une attaque car les paquets seront envoyés à une cadence constante.