# LPIC303-S2 ## hardening grub & filesystems Grub2 est un système de management du boot d'un PC. **Pourquoi doit-on durcir Grub2 ?** Le Grub peut être utilisé pour modifier beaucoup de paramètres, il est donc difficile de laisser ça ouvert et non sécurisé. **UEFI, késako ?** UEFI (Unified Extensible Firmware Interface)est une sorte de système d'exploitation miniature qui démarre immédiatement après le démarrage de la carte mère de l'ordinateur et de ses composants matériels correspondants. Elle permet de charger un programme de démarrage spécial (appelé "bootloader") dans la mémoire. **SecureBoot et Linux, c'est possible ?** Les distribution qui dispose du loader Shim signé avec la clé de Microsoft Partner’s. Normalement c’est le cas pour Ubuntu, LinuxMint, OpenSuse et généralement les distributions connexe. Donc oui mais pas sur toutes les distribution linux. **Protegez grub2 en utilisant un mot de passe (hint : grub2-mkpasswd-pbkdf2 )** ``` # Pour Ubuntu grub-mkpasswd-pbkdf2 sudo nano /etc/grub.d/00_header # A la fin du fichier copier ce qui suit # En remplaçant le hash par ce qui a été récupéré avec grub-mkpasswd-pbkdf2 # Admin -> nom d'utilisateur peut etre changé cat << EOF set superusers="admin" password_pbkdf2 admin HASH EOF # Fin du nano sudo update-grub # On peut reboot ``` **PBKDF2, c'est quoi ?** PBKDF2 (Password-Based Key Derivation Function 2) sont des fonctions de dérivation de clés avec un coût de calcul glissant, utilisées pour réduire les vulnérabilités des attaques par force brute. **Est-ce suffisant de protéger grub avec un mot de passe ? Indiquez quel type d'attaque cela permets d'éviter** L'attaque en question est due à la possibilité d'éditer le GRUB au démarrage de la machine, et ce, sans mot de passe. **Trouvez une méthode pour contourner le mot de passe grub et d'accéder au système de fichier** Avec un OS Linux Live, nous pouvons monter la partition où se trouve le fichier de configuration GRUB. Nous ouvrons le fichier grub.cfg avec un éditeur de texte, puis nous allons supprimer les lignes "set superusers" et "password" ou "password_pbkdf2". Le mot de passe GRUB est enlevé, nous pouvons redémarrer l'ordinateur. **Quelles sont les différentes méthodes pour chiffrer un disque dur système sous linux ? Expliquez les avantages et les inconvénients de chaque méthode** LUKS, pour Linux Unified Key Setup, est le standard associé au noyau Linux pour le chiffrement de disque créé par Clemens Fruhwirth. DM-Crypt Logical Volume Manager -> Rien à voir avec le chiffrement de disque https://wiki.archlinux.org/title/Data-at-rest_encryption **Détaillez les commandes bas niveau et la méthode choisie pour l'installation d'un linux avec chiffrement du disque** **Le chiffrement est-il suffisant ?** Si le chiffrement est robuste, c'est suffisant. ## usbguard et services **En utilisant systemd, listez les services actifs sur la machine (hint : systemctl list-units) (second hint : pensez a regarder les options que vous pouvez passer à la commande)** ``` kali@kali:~$ systemctl list-units --type=service --state=active UNIT LOAD ACTIVE SUB DESCRIPTION binfmt-support.service loaded active exited Enable support for additional executable binary formats colord.service loaded active running Manage, Install and Generate Color Profiles cron.service loaded active running Regular background program processing daemon dbus.service loaded active running D-Bus System Message Bus getty@tty1.service loaded active running Getty on tty1 haveged.service loaded active running Entropy Daemon based on the HAVEGE algorithm ifupdown-pre.service loaded active exited Helper to synchronize boot up for ifupdown keyboard-setup.service loaded active exited Set the console keyboard layout kmod-static-nodes.service loaded active exited Create list of static device nodes for the current kernel lightdm.service loaded active running Light Display Manager ModemManager.service loaded active running Modem Manager networking.service loaded active exited Raise network interfaces NetworkManager.service loaded active running Network Manager plymouth-quit-wait.service loaded active exited Hold until boot process finishes up plymouth-read-write.service loaded active exited Tell Plymouth To Write Out Runtime Data plymouth-start.service loaded active exited Show Plymouth Boot Screen polkit.service loaded active running Authorization Manager rsyslog.service loaded active running System Logging Service rtkit-daemon.service loaded active running RealtimeKit Scheduling Policy Service stunnel4.service loaded active exited LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons) systemd-journal-flush.service loaded active exited Flush Journal to Persistent Storage systemd-journald.service loaded active running Journal Service systemd-logind.service loaded active running User Login Management systemd-modules-load.service loaded active exited Load Kernel Modules systemd-random-seed.service loaded active exited Load/Save Random Seed systemd-remount-fs.service loaded active exited Remount Root and Kernel File Systems systemd-sysctl.service loaded active exited Apply Kernel Variables systemd-sysusers.service loaded active exited Create System Users systemd-tmpfiles-setup-dev.service loaded active exited Create Static Device Nodes in /dev systemd-tmpfiles-setup.service loaded active exited Create Volatile Files and Directories systemd-udev-trigger.service loaded active exited Coldplug All udev Devices systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files systemd-update-utmp.service loaded active exited Update UTMP about System Boot/Shutdown systemd-user-sessions.service loaded active exited Permit User Sessions udisks2.service loaded active running Disk Manager unattended-upgrades.service loaded active running Unattended Upgrades Shutdown upower.service loaded active running Daemon for power management user-runtime-dir@1000.service loaded active exited User Runtime Directory /run/user/1000 user@1000.service loaded active running User Manager for UID 1000 vboxadd.service loaded active exited vboxadd.service virtualbox-guest-utils.service loaded active running Virtualbox guest utils LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 41 loaded units listed. ``` **Pour chaque service, identifiez quel role il a** Cf colonne "Description" de la commande ci-dessus. **Lancez un Linux (ou une nouvelle session) sans interface graphique. Refaites l'étape 1. Expliquez la différence** **Arretez un service inutile (par exemple, avahi) en utilisant systemctl** ``` systemctl avahi stop ``` **Désactivez un service inutile, en utilisant systemctl. Vérifiez qu'il ne se lance bien pas au démarrage** Lister les différents services lancés au démarrage ``` root@kali:~# service --status-all ``` Désactiver un service au démarage ``` root@kali:~# systemctl disable name_service ``` **A quoi sert usbguard ?** USBGuard fournit une protection du système contre les périphériques USB intrusifs en implémentant des capacités de base de liste blanche et de liste noire basées sur les attributs du périphérique. **Pour se protéger de quel type d'attaque ?** Pour se protéger des attaques par Bad UDB (ruber ducky par exemple) **Est-ce vraiment efficace ?** Oui car seul les USBs connu peuvent être utilisé par l'ordinateur, c'est à l'utilisateur de décider de l'élégibilité des clés / périphérique branché. **Configurez usbguard pour fonctionner avec les périphériques usb que vous avez de branché** ``` root@kali:~# apt install usbguard root@kali:~# usbguard generate-policy > /etc/usbguard/rules.conf root@kali:~# systemctl start usbguard.service root@kali:~# systemctl enable usbguard.service # pour ajouter root@kali:~# usbguard à chaque démarage root@kali:~# usbguard allow-device 6 # autorisé un device root@kali:~# usbguard block-device 6 # bloquer un device root@kali:~# lsusb # trouver le device Bus 001 Device 004: ID 80ee:0021 VirtualBox USB Tablet Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub root@kali:~# ``` > Testez en branchant un autre periphérique usb ## sysconf **Quelle est la différence entre sysctl et sysconf ?** * Sysconf permet de déterminer la valeur actuelle d'une limite ou d'une option configurable du système. * Sysctl permet de visualiser et modifier les paramètres du noyau au moment de l'exécution. **Quel type d'information peut-on récupérer avec sysctl ? Comment peut-on récupérer l'information autrement ?** **Listez toutes les informations disponibles en utilisant sysctl** ``` root@kali:~# sysctl -a ``` **Groupez les différentes informations en catégories. Lesquels vous semblent les plus importantes ?** Beaucoup trop de paramètres : ``` root@kali:~# sysctl -a > res.txt root@kali:~# wc -l res.txt 1074 res.txt ``` **Modifiez un paramètre peu important (le nom de domaine par exemple)** **Modifiez le même paramètre, mais assurez-vous que la modification soit persistente au reboot** **C'est quoi l'ASLR ?** L’address space layout randomization (ASLR) est une technique qui permet de placer de façon aléatoire les zones de données dans la mémoire virtuelle. **C'est pour se protéger de quel type d'attaque ?** L'ASLR permet de limiter les effets des attaques de type dépassement de tampon. **Verifiez, en utilisant sysctl, que l'ASLR est bien actif sur votre machine** **Que fait la commande "ldd" ?** La commande ‘ldd’ avec un nom de fichier exécutable imprime les objets partagés (bibliothèques partagées) requis pour le programme ou objet partagé mit en paramètre. **Utilisez cette commande pour illustrer le fonctionnement de l'ASLR** ``` kali@kali:/root$ sudo ldd a.out linux-vdso.so.1 (0x00007ffd5938b000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbb5efea000) /lib64/ld-linux-x86-64.so.2 (0x00007fbb5f1d5000) kali@kali:/root$ sudo ldd a.out linux-vdso.so.1 (0x00007ffc0b9a4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc99b9b9000) /lib64/ld-linux-x86-64.so.2 (0x00007fc99bba4000) ``` **Désactivez l'ASLR. Voyez-vous une différence avec le retour de la commande ldd ? Si oui, expliquez là** ``` kali@kali:/root$ sudo sysctl -w kernel.randomize_va_space=0 kernel.randomize_va_space = 0 kali@kali:/root$ sudo ldd a.out linux-vdso.so.1 (0x00007ffff7fd0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7de1000) /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd2000) kali@kali:/root$ sudo ldd a.out linux-vdso.so.1 (0x00007ffff7fd0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7de1000) /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd2000) ``` On peut alors voir que les adresses mémoire ne change pas elles restent toujours les même contrairement à la question précédente. **Ecrivez un petit programme en C affichant l'adresse d'une fonction (hint : pointeur de fonction)** **Testez le programme. Que pensez-vous du résultat ? S'il y a un problème, comment le corriger ?** **C'est quoi le NX bit ?** **W^X, késako ?** **Quel type d'attaque cela permet de se protéger ?** **En utilisant dmesg, vérifiez que votre machine est protégée** **Quelle est la différence entre PaX et NX ?** **Quelle est la différence entre grsecurity et PaX ?** **Peut-on utiliser PaX et grsecurity actuellement ?** **Existe-t-il des solutions alternatives ?** ## capabilities & chroot **C'est quoi une capacité ? (capability)** **Le boulot n'est-il pas déjà fait par suid ? Expliquez pourquoi** **Listez les différentes capabilities de disponible et groupez les** **Récupérez des capabilities de différents binaires de votre système, dans "/usr/bin" et dans "/sbin/"** **En utilisant capsh, lancez un processus nécessitant des droits root ordinairement et définissez les capabilities necessaires pour l'execution du processus ( hint : ptrace ou nc)** **À quoi sert le chroot ?** **Créez un dossier avec le minimum pour lancer un shell bash**