# 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**