Nous avons couvert et expliqué CVE-2023-4911 Looney Tunables qui affecte principalement toutes les distributions Linux et permet à un attaquant d'élever les privilèges vers root. La vulnérabilité affecte le chargeur dynamique de la bibliothèque GNU C, connu sous le nom de ld.so, lors du traitement de la variable d'environnement GLIBC_TUNABLES. Ce problème pourrait permettre à un attaquant local d'utiliser des variables d'environnement GLIBC_TUNABLES conçues de manière malveillante lors du lancement de fichiers binaires avec l'autorisation SUID pour exécuter du code avec des privilèges élevés. Nous avons utilisé une configuration de laboratoire spécifiquement pour essayer cet exploit en utilisant EssayezHackMe.
LD.SO : L'éditeur de liens/chargeur dynamique
Chaque fois que vous exécutez un fichier ELF qui dépend de bibliothèques partagées (.donc
fichiers), le système d'exploitation devra charger ces bibliothèques et les lier à votre exécutable afin que toutes les fonctions partagées soient disponibles pour votre programme lors de son exécution. Dans Linux systèmes, ceci est normalement géré par ld.so
, un exécutable préemballé dans le cadre du glibc
bibliothèque.
Chaque exécutable ELF contient une section nommée .interp
, où l'emplacement de son chargeur requis est spécifié afin que le système d'exploitation sache quel chargeur spécifique utiliser.
Exploitation de la vulnérabilité CVE-2023-4911
Nous approfondirons la phase d'exploitation en utilisant ce qui suit PoC.
- Configuration des variables d'environnement
L'exploit crée différents tableaux (ligne 41), qui seront utilisés plus tard pour stocker lesGLIBC_TUNABLES
variables d'environnement et déclencher le débordement de tampon dans la glibc lors de l'exécution du programme. - Création de variables d'environnement
remplisseur
: Cette variable est créée pour compléter la section lecture-écriture du chargeur. Il est rempli d'une longue séquence de caractères « F » (« F »). (lignes 17-23)
kv
: Cette variable est la charge utile qui déclenchera le débordement de tampon. Il est rempli d'une longue séquence de caractères « A » (« A »). (lignes 27-33)
remplisseur2
: Semblable à filler, cette variable est utilisée pour éliminer les portions supplémentaires. Il est également rempli d'une séquence de caractères « F ». (lignes 37-43)
dt_rpath
: Cette variable est utilisée pour créer une valeur spécifique-0x14ULL
pour écraser les régions de mémoire dans le processus d'exploitation. (lignes 47-53) Toutes ces variables seront copiées dans leenvp
tableau, qui contient des variables d’environnement. - Armement
La charge utile dansGLIBC_TUNABLES
fait ce qui suit sur ld.so : il écrase un segment de la pile avec un index pointant vers une chaîne avec"
comme son contenu. L'intention ici est de manipuler la pile de sorte que l'index pointe vers une adresse mémoire spécifique où le caractère " (un guillemet double) est stocké. La pile est une région de mémoire utilisée pour stocker les variables locales et les informations sur les appels de fonction pendant l'exécution du programme. Pour ajouter à la complexité de l'exploit, les systèmes d'exploitation modernes randomisent l'emplacement de la pile, ce qui rend difficile la prédiction de l'emplacement de l'index en mémoire. - Exploitation:
L'exploit utilise une approche par essais et erreurs pour tenir compte du caractère aléatoire de l'emplacement de la pile. Il exécute le programme à plusieurs reprises (le fork et l'exécute) jusqu'à ce qu'il ait de la chance et que l'adresse fixe0x7ffdfffff030
correspond à l'adresse où l'index de la pile pointe vers « . Cela manipule efficacement le chemin de recherche de la bibliothèque pour pointer vers le répertoire nommé"
qui contiendra une version malveillante delib6.so
.
Le processus de génération du fauxlibc6.so
consiste à copier libc6.so mais à remplacer le__libc_start_main
fonctionner avec un shellcode personnalisé qui faitsetuid(0) + setgid(0) + exec('/bin/sh')
. Vous pouvez trouver le script Python pour cela ici.
Le programme entre dans une boucle dans laquelle il bifurque un processus enfant : dans le processus enfant, il tente d'exécuter/usr/bin/su
avec--aide
. Si le processus enfant prend plus d'une seconde, il suppose qu'il revient d'un shell, indiquant un exploit potentiel réussi.
Atténuation CVE-2023-4911
Si vous ne pouvez pas patcher, suivez les instructions ce lien pour l'atténuation
Correction CVE-2023-4911
Appliquer des correctifs à votre système est le meilleur et le seul moyen de remédier à ce problème.
Réponses de la salle
/root/root.txt
?Vidéo pas à pas