Newer
Older
# Protection d'un LAN d'attaques "macflooding"
```bash
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
```
```bash
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
```
```bash
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
```
1. 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.
2. 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
3.
1. S1 $\Rightarrow$ H1, H2, H3
2. S2 $\Rightarrow$ H1, H2
2. S3 $\Rightarrow$ H1, H3
4. ```bash
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 $\leftrightarrow$ H2 et H1 $\leftrightarrow$
H3, le switch racine élu par conséquent sera S1 qui est rélié directement à H1.
5. 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
1. 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.
2. 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.
3. 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` et `dst` on envoie le
paquet à H1 depuis une un hôte possedant une adresse MAC aléatoire.
## Attaque du MAC flooding
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
Installer macof.py et initialiser la machine H1 avec les commandes suivantes
```bash
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
```bash
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
```bash
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
```
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
1. 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.
2. La commande `macof.py -i eth0 -c 8192 -w 1` a été exécuté sur H1.
3. 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é.
4. 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.
5. 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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
maximale d'adresses MAC, en l'occurrence la quantité maximale est de $2^{13} = 8192$
6. 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.
7. 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 $\Rightarrow$ S1.

8. Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.
## Protection du LAN
### Port Security (Trunk)
```CiscoIOS
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)
```CiscoIOS
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 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
```CiscoIOS
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
=========================================
```
### Port Security Violation Mode on a Port