Skip to content
Snippets Groups Projects
02_labo_stp.md 7.34 KiB
Newer Older
iliya's avatar
iliya committed
---
lang: fr
---

\newpage 


# Protection d'un LAN d'attaques sur STP


## Révision STP


### Configuration des machines

S1 : 
```CiscoIOS
conf t
hostname S1
exit
```

S2 : 
```CiscoIOS
conf t
hostname S2
exit
```


S3 : 
```CiscoIOS
conf t
hostname S3
exit
```

### Questions

1. 
Ci-dessous nous pouvons voir la sortie de la commande `show spanning-tree` sur
le Switch S1.

En dessous de l'adresse MAC, il est dit que ce switch (S1) a été élu en tant que
racine.

```CiscoIOS
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769
             Address     0c0c.39d3.0000
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     0c0c.39d3.0000
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time  300 sec
```

L'élection de la racine se fait par l'identifiant du switch le plus faible 
(Bridge ID). C'est un identifiant de 8 octets où 2 octets correspondent à
la valeur du `Bridge Priority` et les 6 autres octets sont l'adresse MAC de l'appareil.

Initialement les switches s'envoient des messages `BPDUs` (Bridge Priority Data Unit)
qui contiennent le `Bridge ID` du switch actuel, celui de la racine actuel ainsi
que la distance (_number of hops_) jusqu'à la racine. Au fur et à mesure les divers
arbres des plus courts chemins vers la racine seront calculés. Dans le cas où la
distance pour deux switches jusqu'à la racine est la même, on assignera la priorité
au switch qui porte la valeur de `Bridge Priority` la plus faible. Les ports qui
ne sont pas sur l'arbre couvrant seront désactivé et conserve uniquement les ports
actifs.

2. La commande `show spanning-tree root` sur le switch S2 nous fourni l'adresse
MAC de la racine ainsi que le coût (distance) vers la racine. Cette commande
nous donne aussi la valeur du _Hello Time_ qui correspond à 2 secondes. Si le
switch ne reçoit pas de BPDU pendant cette durée de temps (timeout de 2 secondes),
l'arbre couvrant sera recalculé.

```CiscoIOS
S2#show spanning-tree root

                                        Root    Hello Max Fwd
Vlan                   Root ID          Cost    Time  Age Dly  Root Port
---------------- -------------------- --------- ----- --- ---  ------------
VLAN0001         32769 0c0c.39d3.0000         4    2   20  15  Gi0/0 
```

3. La raison pour laquelle le champ `Root Port` n'est pas renseigné sur la racine
est que ce champ correspond à l'interface par laquelle passe l'arbre couvrant
jusqu'à la racine. Vu que le "chemin" depuis la racine jusqu'à la racine ne passe
par aucune interface, car il est la racine.



4.
```mermaid
graph TD;
    S1-->S2;
    S1-->S3;
```

L'interface Gi0/2 sur S2 est indiquée en tant que `Altn`. Cette interface est
desactivée (en réalité, elle est marquée comme chemin alternatif vers la racine)
car S3 est relié à la racine par un chemin plus court. Cependant, dans le cas où
ce lien tombe, l'interface Gi0/2 de S2 permettra à S3 de se relier jusqu'à la racine.

iliya's avatar
iliya committed
```CiscoIOS
Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/2               Altn BLK 4         128.3    P2p 
```


5. Afin que le switch S3 devienne la racine, il faut lui assigner une valeur
faible pour le `Bridge Priority`. La commande exécutée est :

```CiscoIOS
S3(config)#spanning-tree vlan 1 priority 0
```
6.
```mermaid
graph TD;
    S3-->S1;
    S3-->S2;
```

À présent, c'est l'interface Gi0/0 sur S2 qui est bloquée. Ceci est le cas, car
cette interface sera utilisée dans le cas où le lien entre S1 et S3 tombe et par
conséquent il servira de chemin pour S1 afin de rejoindre la racine.

```CiscoIOS
Gi0/0               Altn BLK 4         128.1    P2p
```

\newpage

## Attaque de STP avec Yersinia


### Claiming Root STP Role


1.  Commande à exécuter sur H1 :
```sh
ip addr add 10.0.0.1/24 dev eth0 && ip link set up dev eth0
```

Commande à exécuter sur H2 :
```sh
ip addr add 10.0.0.2/24 dev eth0 && ip link set up dev eth0
```

2.  Avec la commande ci-dessous lancez `Yersinia` sur la machine `kali-linux-1`:
```sh
sudo yersinia -I
```
![Interface `Yersinia`](../figs/yersinia_ui.png) 


3. Il est possible d'assez vite remarquer que le _timestamp_ du champ _last seen_
est synchronisé avec le champ _STP Packets_ qui s'incrémente au même moment que
le champ _last seen_ est mis à jour. D'après mon observation ce champ à un retard
de $\approx$ 2 secondes par rapport au temps réel affiché dans le coin en haut
à droite du _TUI_ (Terminal User Interface). Par conséquent, il est possible d'en
déduire que la fréquence d'envoi des _BPDU_ (Bridge Protocol Data Units) de type
"conf" est de $\approx$ 2 secondes.

4. Sur la capture d'écran ci-dessous, on peut les divers types d'attaques proposées :

![Liste des attaques proposées par `Yersinia`](../figs/yersinia_list_attacks.png)

L'attaque du type "_Claiming Root Role_" consiste à initialement "écouter" ce qui
se passe sur le réseau afin d'en déduire quel switch est la racine. Après avoir
déterminé cela, la seconde partie de l'attaque consiste à envoyer des BPDU de type
conf avec une valeur de priorité (_Bridge Priority_) modifiée et **inférieure**
à la valeur actuelle. Pour rappel, la valeur du _Bridge Priority_ est codée sur
2 des 8 octets du champ _Bridge ID_.

\newpage

Ci-dessous, le lecteur trouvera la liste détaillée des modifications faites au
BPDU. [Source: GitHub Yersinia](https://github.com/tomac/yersinia/blob/master/README)
```md
Source MAC: same one as the sniffed BPDU.
Destination MAC: same one as the sniffed BPDU.
Bridge ID: the sniffed one slightly modified to have a lower priority
Root ID: 8000: same as bridge id.
Hello time: same one as the sniffed BPDU.
Forward delay: same one as the sniffed BPDU.
Max age: same one as the sniffed BPDU.
Root pathcost: same one as the sniffed BPDU.
```

5. Démarrez une capture _Wireshark_ entre `kali-linux-1` et S2, puis exécutez
une attaque de type de "Claiming Root Role".

6. La communication entre H1-H2 échoue lors du changement de topologie causé par l'attaque
"Claiming Root Role". Ceci est le cas car pendant le recalcul de la racine le
switches ne savent pas à travers quels ports "forwarder" (en bon français) les
paquets (ICMP en l'occurrence).

![Communication entre H1-H2 tombe suite au changement de topologie](../figs/h1-h2_fail_topology-change_annotated.png)

\newpage

7. 

Sur la capture Wireshark entre `kali-linux-1` et S2 ci-dessous, on peut remarquer
la notification de changement de topologie.

![Capture Wireshark --- Changement de topologie](../figs/wireshark_topology_change.png){width=80%}


Sur la capture d'écran ci-dessous, on remarque qu'en exécutant la commande Cisco
`show spanning-tree root` sur le switch S2, on obtient l'information qui concerne
le port menant vers la racine, en l'occurrence l'interface Gi0/3.

![`show spanning-tree root` sur S2](../figs/s2_route_to_root_annotated.png){width=70%}


Afin de s'assurer que la nouvelle racine est bien la machine `kali-linux-1`, il
nous suffit de regarder sur le schéma du labo est remarquer que l'interface Gi0/3
de S2 est bel et bien reliée à `kali-linux-1` ce qui nous confirme que cette machine
est la nouvelle racine

![Vérification avec le schéma du réseau](../figs/gns3_path_to_root_from_s2.png)