TP sysres IMA5 2021/2022 G1 : Différence entre versions
(→Configuration serveur DNS) |
(→Chiffrement de données) |
||
(50 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 260 : | Ligne 260 : | ||
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 | 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 <code>193.48.57.174</code> à <code>10.60.100.174</code> | + | Enfin, on configure le routeur de sorte à amener toutes les trames à destination de <code>193.48.57.174</code> à <code>10.60.100.174</code>. |
− | = | + | == 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 == | ||
+ | |||
+ | [[Fichier:Kronenbourg-apache.png|thumb|right|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> | ||
+ | |||
+ | <nowiki>*Click!* 🔒</nowiki> | ||
+ | |||
+ | = Tests d'intrusion = | ||
==WEP== | ==WEP== | ||
Nous allons procéder à un cassage de clef WEP d'un point d'accès Wi-Fi. | Nous allons procéder à un cassage de clef WEP d'un point d'accès Wi-Fi. | ||
Ligne 289 : | Ligne 459 : | ||
On lance ensuite l'algorithme de craquage : | On lance ensuite l'algorithme de craquage : | ||
− | aircrack-ng -b 04:DA:D2:9C:50:50 | + | aircrack-ng -b 04:DA:D2:9C:50:50 output*.cap |
+ | |||
+ | On obtient ensuite la clef : | ||
+ | [[Fichier:clef_craquage_wep_kronenbourg.jpg|800px]] | ||
==WPA-PSK== | ==WPA-PSK== | ||
Ligne 310 : | Ligne 483 : | ||
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 : | 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 : | ||
− | [[Fichier:aircrack_jdelabre.jpg| | + | [[Fichier:aircrack_jdelabre.jpg|800px]] |
+ | |||
+ | == 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 %} | ||
+ | <nowiki>{{ item.key }}</nowiki> | ||
+ | {% 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. |
Version actuelle datée du 13 janvier 2022 à 09:30
Sommaire
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.
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
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
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 :
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.