---
# System prepended metadata

title: SR06 projet Protection

---

# SR06 projet Protection

Code Téva-Thomas machines
sr06p045
924TQrLl5btk

Code Clement-Madeleine machines:

sr06p038
52LcnGCeLTfZ



Sujet rappels : 

- La zone LAN correspond au réseau interne de l'entreprise et contient la machine virtuelle appelée vm-lan 
- La zone INTERNET correspond au réseau externe et contient la machine virtuelle vm-int (client web) 
- La zone WEB est une zone de confiance intermédiaire, qui contient la machine virtuelle vm-web (serveur web)
- La zone SQL est une seconde zone de confiance intermédiaire, qui contient la machine virtuelle vm_sql (base de données)


![](https://hackmd.io/_uploads/r1kOsGC43.jpg)



# 1. Création des machines virtuelles et des réseaux

- on créée les 5 machines virtuelles vm-lan, vm-int, vm-web et vm-sql et vm-router


### Adresses IP VMs:

On affiche chaque adresse IP  trouvée en fonction des interfaces.

```
    hostname -I
```

**Pour Téva et Thomas**

#### - vm-sql

- 192.168.59.2/24 ens19
- 172.23.4.13 ens18

#### - vm-lan

- 192.168.56.2/24 ens19
- 172.23.3.139 ens18

#### - vm-int

- 192.168.57.2/24 ens19
- 172.23.4.161 ens18

#### - vm-web

- 192.168.58.2/24 ens19
- 172.23.3.240 ens18

#### - vm-router

- 192.168.56.254/24 ens19
- 192.168.58.254/24 ens20
- 192.168.57.254/24 ens21
- 192.168.59.254/24 ens22
- 172.23.4.54 ens18



**Pour Madeleine et Clément**


#### - vm-sql

- 192.168.59.2/24 ens19
- 172.23.3.216 ens18

#### - vm-lan

- 192.168.56.2/24 ens19
- 172.23.3.154 ens18

#### - vm-int

- 192.168.57.2/24 ens19
- 172.23.4.215 ens18

#### - vm-web

- 192.168.58.2/24 ens19
- 172.23.3.52 ens18

#### - vm-router

- 192.168.56.254/24 ens19
- 192.168.58.254/24 ens20
- 192.168.57.254/24 ens21
- 192.168.59.254/24 ens22
- 172.23.4.118 ens18

### Propriétés des Vms:


### - vm-int

- clone de vm-cli du projet Risque (TO DO: CORRIGER ERREURS module RISQUE)
- doivent disposer d'un client web léger (lynx) et d'un client ssh : vérifier avec commande:

```
    ssh username@adresse_IP   
```

```
    lynx
    g <URL site>  
```

Ces commandes doivent fonctionner pour montrer que lynx et ssh sont bien installés sur le système

### - vm-lan


- clone de vm-cli du projet Risque (TO DO: CORRIGER ERREURS module RISQUE)
- doit disposer d'un client web léger (lynx) et d'un client ssh


### - vm-web

- clone de vm-web du projet du module Risque (TO DO: CORRIGER ERREURS module RISQUE / supprimer tout logiciel inutile)
- doit disposer d'un serveur web et d'une application PHP disponible en deux versions
Verification, si actif retourne "running since":

```
    sudo service apache2 status
```

- applications web doivent chacune proposer un formulaire permettant de réaliser une requête sur la base de données de vm-sql et d'afficher le résultat en retour


### - vm-sql

- clone de vm-web du projet du module Risque (TO DO: CORRIGER ERREURS module RISQUE / supprimer tout logiciel inutile)


- on télécharge maria-db
```
sudo apt install mariadb-server
```

### Créer les réseaux reliant les machines virtuelles conformément à la figure: 

Avec la commande suivante, on met adresse IP de sortie/on indente bien:
```
sudo nano /etc/netplan/00-installer-config.yaml   
```

### - vm-int

![](https://hackmd.io/_uploads/By1kPP0V2.png)


### - vm-sql

![](https://hackmd.io/_uploads/r1fH8vRV2.png)


### - vm-web

![](https://hackmd.io/_uploads/B1OEvwANh.png)


### - vm-lan

![](https://hackmd.io/_uploads/rksAvDRVn.png)

### - vm-router

![](https://hackmd.io/_uploads/HktfOvCNh.png)



## 2. Sécurisation de l'application web


### Création application cloisonné avec Backend: DMZ1 = Tiers application (Web) + DMZ2 = Tiers données (Sql)

- connexion à mariadb: avec mdp etu

```
sudo mysql -u root -p
```

- création de la BDD
```
CREATE DATABASE users;

USE users;

CREATE TABLE customers(
    id INT(11) NOT NULL AUTO_INCREMENT,
    nom VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    telephone VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

- Ajouter des données : 

```SQL=
INSERT INTO customers (nom, password, telephone) VALUES
('John Doe', 'pass123', '1234567890'),
('Jane Smith', 'password123', '9876543210'),
('Michael Johnson', 'secret', '5555555555'),
('Alice Johnson', 'qwerty', '9999999999'),
('David Wilson', 'abcdef', '1111111111');
```

![](https://hackmd.io/_uploads/SJVxARwr2.png)


- Voir les table de la BDD et les infos rentrées dans la base : 

```
SHOW TABLES;
SELECT * FROM customers;
```


- ajout d'un user droit lecture : 

```
CREATE USER 'sr06p038'@'%' IDENTIFIED BY 'B7y27cVNz5uD';
GRANT ALL ON users.* TO  'sr06p038'@'%';

```

- Autoriser les connexions à distance : 

```
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
bind-adresses=127.0.0.1   devient   bind-adresses=0.0.0.0
sudo service mysql restart
```

- Se connecter via terminal au compte sr06p038

```
sudo mysql -u sr06p038  -h 192.168.59.2 -p
```

- Injection sql sur le site pas sécurisé depuis vm-lan par exemple: Montrer que ce n'est pas sécurisé

```
lynx 192.168.58.2:80/index_secur.php
```

```
nom: a' or 1=1; -- '
mot de passe: fahflez (n'importe quoi)
```

### rôle des trois tiers sont les suivants :
- Tiers présentation :
Il est constitué d'une page web et d'une page de style, utilisables par un client web léger depuis vm-lan et vm-int (faire simple).
Ces pages sont stockées sur vm-web et accédées via le serveur Apache de vm-web.
La page web propose à l'utilisateur un formulaire de saisie qui permettra de faire une requête dans la base de données et d'afficher les résultats de la requête.
- Tiers application :
C'est une application écrite en PHP, stockée sur vm-web et appelée depuis le tiers présentation.
Elle est en charge de réaliser les requêtes correspondant aux demandes exprimées par l'utilisateur via le formulaire du tiers présentation.
- Tiers gestion des données :
Il est constitué des tables SQL stockées sur vm-sql et gérées via MariaDB. Ces tables sont interrogées par le tiers applicatif


### Application:
 
L'application est disponible en deux versions afin de mettre en exergue des failles et de les corriger.
Ces deux versions sont accessibles via des URL différentes sur vm-web pour les besoins des tests.
La première version n'inclut aucune sécurité. La seconde version inclut les sécurisations recommandées.

https://www.php.net/manual/fr/security.database.sql-injection.php

### Application:
 
- Installer les paquets php-codesniffer et nikto. Configurer un utilisateur dédié pour restreindre l'utilisation des commandes de ces paquets (telles que phpcs et nikto).
```
sudo apt install php-codesniffer
```
```
sudo apt install nikto
```

utilisarteur phpcs (mdp: phpcs) a utiliser pour phpcs et nikto:
```
sudo adduser phpcs
# Adding user `phpcs' ...
# Adding new group `phpcs' (1002) ...
# Adding new user `phpcs' (1002) with group `phpcs' ...
# Creating home directory `/home/phpcs' ...
# Copying files from `/etc/skel' ...

sudo visudo
# raouter la ligne :
phpcs ALL=(ALL) NOPASSWD: /usr/bin/phpcs, /usr/bin/phpcbf

sudo chown phpcs /usr/bin/phpc*
sudo chgrp phpcs /usr/bin/phpc*
sudo chmod 700 /usr/bin/phpc*

sudo chown phpcs /usr/bin/nikto
sudo chgrp phpcs /usr/bin/nikto
sudo chmod 700 /usr/bin/nikto
```



- Utiliser phpcs sur vm-web afin d'analyser les deux versions de l'application.

```
phpcs /var/www/html/index.php
phpcs /var/www/html/index_secur.php
```

Si il y a des erreurs qui peuvent être corrigés : 
```
sudo phpcbf /var/www/html/<file>
```

- Utiliser nikto sur vm-web et depuis vm-lan afin d'analyser les deux versions de l'application.

sur vm-web : 

```
su phpcs
```

```
nikto -h 192.168.58.2
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP:          192.168.58.2
+ Target Hostname:    192.168.58.2
+ Target Port:        80
+ Start Time:         2023-05-22 13:59:44 (GMT0)
---------------------------------------------------------------------------
+ Server: Apache/2.4.41 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ DEBUG HTTP verb may show server debugging information. See http://msdn.microsoft.com/en-us/library/e8z01xdh%28VS.80%29.aspx for details.
+ OSVDB-561: /server-status: This reveals Apache information. Comment out appropriate line in httpd.conf or restrict access to allowed hosts.
+ 6544 items checked: 0 error(s) and 3 item(s) reported on remote host
+ End Time:           2023-05-22 13:59:59 (GMT0) (15 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
```

sur vm-lan : 
```
nikto -h ns1.servweb.test
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP:          192.168.58.2
+ Target Hostname:    ns1.servweb.test
+ Target Port:        80
+ Start Time:         2023-05-22 14:00:13 (GMT0)
---------------------------------------------------------------------------
+ Server: Apache/2.4.41 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ DEBUG HTTP verb may show server debugging information. See http://msdn.microsoft.com/en-us/library/e8z01xdh%28VS.80%29.aspx for details.
+ 6544 items checked: 0 error(s) and 2 item(s) reported on remote host
+ End Time:           2023-05-22 14:00:34 (GMT0) (21 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
```

# 3. Configuration du routage et du filtrage : ==Iptables==

- Chose à faire pour sauvegarder les iptables : 
```
sudo apt-get install iptables-persistent
```
- A chaque fois que vous voulez sauvegarder les iptables 

```
sudo iptables-save -f /etc/iptables/rules.v4
```
Si vous ne sauvegardez pas, les modifs seront perdues au redémarrage


## Configurer les vm de sorte à autoriser les connexion suivantes via vm-routeur 

## Les routes 

- Il faut créer une route qui passe par le routeur dans /etc/netplan/00-installer-config.yaml

Ne pas oubliez la commande après chaque modification : 
```
sudo netplan apply
```

Voir image dans 1. pour les routes


## Configuration des règles du pare-feu 

POUR TOUTES LES VMS SAUF VM-INT qui a TOUT En ACCEPT:

```
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD DROP
```


Liste : 

- vm-lan peut contacter vm-web et vm-sql (service web et ssh)
- vm_int peut contacter vm-web (service web uniquement) via
- vm_web peut contacter vm-sql (accès à la base de données)


### sur vm-lan : 

```
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```
```
sudo iptables -A INPUT -i ens18 -j DROP
```
```
sudo iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT -m state --state ESTABLISHED
```
```
sudo iptables -A OUTPUT -o ens18 -j DROP
```

### Sur vm-web et vm-sql (les vms sont accessibles en ssh depuis vm-lan sur ens19) : 


```
sudo iptables -A INPUT -i ens18 -j DROP
```
```
sudo iptables -A OUTPUT -o ens18 -j DROP
```



### Sur vm-router :

FORWARD

```
http LAN to WEB

sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.58.2 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.58.2 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

ssh LAN to WEB
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.58.2 -p tcp --dport 22 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.58.2 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Udp domain LAN to WEB
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.58.2 -p udp --dport 53 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.58.2 -p udp --sport 53 -j ACCEPT

Ssh LAN to sql
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.59.2 -p tcp --dport 22 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.59.2 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Int to web 

sudo iptables -A FORWARD -s 192.168.57.2 -d 192.168.58.2 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.57.2 -s 192.168.58.2 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Web to sql 

sudo iptables -A FORWARD -s 192.168.58.2 -d 192.168.59.2 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.58.2 -s 192.168.59.2 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

Udp domain int to WEB
sudo iptables -A FORWARD -s 192.168.57.2 -d 192.168.58.2 -p udp --dport 53 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.57.2 -s 192.168.58.2 -p udp --sport 53 -j ACCEPT
```


### Sur vm-Sql 


```
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```
```
sudo iptables -A INPUT -i ens18 -j DROP
```


### Sur vm-Int

Aucune règle : tout en ACCEPT de base


### Configurer les vm de sorte à autoriser les connexion suivantes via vm-routeur :

- Aucune connexion ne peut atteindre vm-lan ;

```
 sudo iptables -P FORWARD DROP
 sudo iptables -A FORWARD -o ens19 -d 192.168.56.0/24 -j DROP
```

- Aucune connexion depuis vm-int ne peut atteindre vm-sql (DMZ).

Normalement pas besoin car on a tout refusé avec drop avant

```
sudo iptables -A FORWARD -i ens21 -s 192.168.57.0/24 -j DROP
```


## 4. Serveur DNS (pour Gi4+)
= retrouver le serveur web de la DMZ via son nom et non son adresse IP

- Ajouter un serveur DNS dans la DMZ WEB
- Configurer le DNS de sorte que le serveur web puisse être retrouvé grâce à son nom 
- Adapter les règles de filtrage de manière à ce que le trafic DNS (UDP port 53) puisse être opérationnel, tout en gardant une politique par défaut de filtrage complet.

https://www.tutos.eu/3446
 installation de Bind 
```
sudo apt install bind9
```
dans /etc/bind/named.conf.options : 
```
options {
    directory "/var/cache/bind";
    dnssec-validation auto;
    listen-on-v6 { ::1; };
};


```

dans /etc/bind/named.conf.local : 
```
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "servweb.test" {
    type master;
    file "/etc/bind/db.servweb.test";
};
```
dans /etc/bind/db.servweb.test
```
; Zone file for servweb.test
$TTL 1h
@   IN  SOA ns1.servweb.test. admin.servweb.test. (
        2023052101  ; Serial
        1h          ; Refresh
        15m         ; Retry
        1w          ; Expire
        1h          ; Minimum TTL
    )

@      IN  NS  ns1.servweb.test.
ns1    IN  A   192.168.58.2


```


la commande:  nslookup ns1.servweb.test
```
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	ns1.servweb.test
Address: 192.168.58.2

```

dig ns1.servweb.test
```
; <<>> DiG 9.16.1-Ubuntu <<>> ns1.servweb.test
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62862
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;ns1.servweb.test.		IN	A

;; ANSWER SECTION:
ns1.servweb.test.	3404	IN	A	192.168.58.2

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun May 21 10:51:02 UTC 2023
;; MSG SIZE  rcvd: 61
```



## Tests pendant PRESENTATION
Rappels
vm-lan peut contacter vm-web et vm-sql (service web et ssh)
vm_int peut contacter vm-web (service web uniquement) 
vm_web peut contacter vm-sql (accès à la base de données)

Voir iptables :
```
sudo iptables -vL
```

- Tester le fonctionnement de l'application web depuis vm-lan et depuis vm-int.

TEST : depuis vm-lan ->vm-web : 
```
lynx 192.168.58.2:80 
```

```
lynx ns1.servweb.test
```

TEST : depuis vm-int ->vm-web : 
```
lynx 192.168.58.2:80 
```

```
lynx ns1.servweb.test
```

- Tester les connexions ssh depuis vm-lan vers vm-web et vm-sql.
 
TEST ssh: depuis Vm-lan -> Vm-sql 

```
ssh etu@192.168.59.2
```

TEST ssh: depuis Vm-lan -> Vm-web

```
ssh etu@192.168.58.2
```


- Tester les interdictions décrites ci-dessus

Aucune connexion ne peut atteindre vm-lan : 
```
ssh etu@192.168.56.2
```
: ne fonctionne pas 

```
ping 192.168.56.2
```
: ne fonctionne pas 

Aucune connexion depuis vm-int ne peut atteindre vm-sql (DMZ) : 

```
ssh etu@192.168.59.2
```