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

Obtenir des notes OSCP

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.

  1. Configuration des variables d'environnement

    L'exploit crée différents tableaux (ligne 41), qui seront utilisés plus tard pour stocker les GLIBC_TUNABLES variables d'environnement et déclencher le débordement de tampon dans la glibc lors de l'exécution du programme.
  2. Création de variables d'environnementremplisseur: 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 le envp tableau, qui contient des variables d’environnement.
  3. Armement

    La charge utile dans GLIBC_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.
  4. 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 fixe 0x7ffdfffff030 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 de lib6.so.
    Le processus de génération du faux libc6.so consiste à copier libc6.so mais à remplacer le __libc_start_main fonctionner avec un shellcode personnalisé qui fait setuid(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

Quelle est la valeur du drapeau dans /root/root.txt?

Vidéo pas à pas

A propos de l'Auteur

Je crée des notes de cybersécurité, des notes de marketing numérique et des cours en ligne. Je fournis également des conseils en marketing numérique, y compris, mais sans s'y limiter, le référencement, les publicités Google et Meta et l'administration CRM.

Voir les Articles