GTFOBins : Evitez les erreurs de configuration dangereuses sous Linux
Sommaire
I. Présentation
Dans cet article, nous allons découvrir le site GTFOBins, une base de connaissance qui référence de nombreux binaires légitimes pouvant être associés à des erreurs de configuration qui permettent de contourner les stratégies locales de sécurité sur un système Linux.
SUID, configuration sudo ou encore capabilities, la configuration d’un système Linux regorge de fonctionnalités à double tranchant. Celles-ci peuvent être des mesures de sécurité permettant d’accorder des droits privilégiés de manière limitée à un utilisateur, mais aussi des portes d’entrée ou vecteur de compromission lorsqu’elles sont mal configurées.
Le projet GTFOBins référence un grand nombre de binaires qui, lorsqu’ils sont utilisés par l’intermédiaire de ces mécanismes d’élévation de privilège, peuvent être utilisés pour contourner les limitations des privilèges accordés. Ces contournements visent la plupart du temps des actions comme :
- Lire des fichiers sensibles au-delà de ce qu’il est normalement permis de faire ;
- Écrire dans des fichiers pour modifier un script privilégié, une configuration ou une directive de sécurité ;
- Télécharger des outils, scripts ou fichiers sur le système ;
- Exfiltrer des données sensibles du système vers un serveur contrôlé par l’attaquant ;
- Obtenir un accès interactif distant ou local (shell) en tant qu’utilisateur privilégié, ce qui permet ensuite de s’affranchir de toutes les restrictions initialement imposées ;
- Etc.
Dans les faits, les contournements et abus des mécanismes d’élévation partielle de privilèges sont tellement connus qu’ils possèdent leur propre TTP. Ils font souvent partie des premières opérations menées par un attaquant suite à son premier accès sur le système :
- MITRE ATT&CK : TT1548.001 - Abuse Elevation Control Mechanism: Setuid and Setgid
- MITRE ATT&CK : T1548.003 - Abuse Elevation Control Mechanism: Sudo and Sudo Caching
II. GTFOBins : Un dépôt GitHub et un site web
A. Comment utiliser GTFOBins ?
GTFOBins est donc une sorte de grande base de connaissances qui référence des fonctions et binaires légitimes des systèmes Linux dont l’utilisation peut être détournée pour élever ses privilèges de façon durable, créer un moyen de persistance ou réaliser n’importe quelle action en tant qu’utilisateur privilégié.
Attention, les binaires qui y sont référencés ne contiennent pas de vulnérabilité et les techniques proposées ne sont pas des codes d’exploitation. L’idée est simplement de profiter de leurs possibilités et options pour faire plus que ce qui a été initialement autorisé.
Pour mieux comprendre, commençons par découvrir cette base de connaissances, on peut se rendre sur le dépôt GitHub de GTFOBins :
- Dépôt Github GTFOBins : https://github.com/GTFOBins/GTFOBins.github.io
Il est aussi possible d’utiliser l’application web https://gtfobins.github.io/, qui a l’avantage de proposer un système de recherche plutôt efficace :
Depuis l’interface web, nous pouvons rapidement voir une barre de recherche ainsi que différents filtres. Vous pouvez rechercher des fonctions ou binaires, et filtrer le résultat avec les cases à cocher au-dessus :
Dans cet exemple, je recherche les possibilités d’abus de la commande "find" via "sudo". Nous allons voir dans la suite de cet article, ce que signifie le résultat obtenu.
B. Pourquoi utiliser GTFOBins ?
Les informations présentes dans cette base de connaissances peuvent être utiles dans de nombreux contextes :
- Pour les acteurs de la cybersécurité offensive (pentester, Red Team, mais aussi cyberattaquant), cette base de connaissances permet d’obtenir rapidement des commandes utilisables dans des configurations spécifiques. L’idée est de référencer les techniques d’élévation de privilèges ou de mauvais usage des permissions et binaires référencés.
- Pour les acteurs de la cybersécurité défensive (administrateur système, Blue team, ingénieur sécurité, développeurs, analyse SOC), cette base de connaissances permet de s’informer rapidement sur ce qu’il faut éviter de faire, les permissions dangereuses qu’il ne faut pas accorder, et les binaires qu’il vaut mieux laisser tranquilles.
Dans tous les cas, il s’agit d’informations très importantes pour assurer la sécurité d’un système Linux. Vous verrez que certaines techniques référencées dans GTFOBins sont tout à fait étonnantes.
Dans le cadre d’une analyse forensic, de réponse à incident ou de threat hunting, connaître les abus possibles des commandes et binaires Linux permet de rapidement détecter les cas où l’attaquant les a effectivement utilisés à des fins malveillantes.
Après tout, qui a-t-il de dangereux à autoriser l’utilisation de la commande "find" via "sudo" en tant que "root", celle-ci ne permet-elle pas de faire simplement de la recherche dans les noms de fichiers ?
C’est ce que nous allons voir par la suite.
III. Pour mieux comprendre, quelques exemples
Pour ces trois mécanismes (SUID, sudo et capabilities), l’idée est d’accorder des droits précis ou ponctuels pour éviter d’avoir à utiliser l’ensemble des permissions de l’utilisateur "root". Cependant, les binaires ont tous des fonctionnalités diverses et variées, celles-ci permettent parfois de profiter d’un contexte de privilèges élevés pour effectuer des actions différentes que celles que l’on pensait initialement accorder.
Ce sont l'ensemble de ces cas de figure que GTFOBins va référencer, voyons à présent quelques exemples.
A. Sudo : quels sont les risques ?
Sudo est une commande qui “permet à un administrateur système de déléguer l'autorité pour donner à certains utilisateurs (ou groupes d'utilisateurs) la possibilité d'exécuter certaines (ou toutes) commandes en tant que root ou un autre utilisateur tout en fournissant un traçage des commandes et de leurs arguments.” (Source).
Il s’agit donc d’un mécanisme permettant d’accorder des dérogations limitées et contrôlées d’élévation de privilège aux utilisateurs choisis et pour des commandes choisies. Sa configuration est gérée via le fichier "/etc/sudoers".
Pour en apprendre plus sur l’utilisation légitime de la commande sudo, je vous oriente vers notre article sur ce sujet :
Supposons maintenant que, sur notre système Linux, nous ayons une règle sudo qui permet à l'utilisateur "admin_linux" d'exécuter la commande "find" en tant que "root". En pratique, cette règle pourrait ressembler à ceci :
# Contenu du fichier /etc/sudoers
admin_linux ALL=(ALL) /usr/bin/find
Ici, nous pouvons rechercher dans GTFOBins s’il existe des abus possibles de ce contexte :
Visiblement oui, lorsque nous avons la possibilité de l’utiliser via "sudo" en tant que "root", nous pouvons utilisateur la commande "find" pour :
- Obtenir un shell complet en tant que "root" :
# Exploitation de find via sudo pour avoir un shell interactif
sudo find . -exec /bin/sh \; -quit
- Écrire dans n’importe quel fichier du système avec les droits de l’utilisateur "root" :
# Exploitation de find via sudo écrire dans un fichier
LFILE=file_to_write
sudo find / -fprintf "$FILE" DATA -quit
Initialement, la commande "find" est utilisée pour recherche des fichiers ou des dossiers au sein d’un système. En permettant son utilisation en tant que "root" via la commande "sudo", on vise sûrement le fait que l’utilisateur pourra également chercher et lister des fichiers privilégiés, mais sûrement pas écrire à l’intérieur ou obtenir un shell complet. Voilà ce que la base de connaissances GTFOBins permet de comprendre.
B. Abuser des permissions setuid
Le SUID (Set User ID) est une permission spéciale attribuée à un exécutable. Un fichier exécuté avec le bit SUID permet à un utilisateur, quel qu’il soit, de l'exécuter avec les privilèges du propriétaire du fichier.
Par exemple : le programme "/usr/bin/passwd" possède la permission SUID pour permettre aux utilisateurs de changer leur mot de passe eux-mêmes, ce qui modifie de fait le contenu du fichier système "/etc/shadow". Ce qui n’est normalement pas possible sans les permissions "root".
Les cas les plus classiques d’utilisation malveillante des permissions SUID sont le cas des programmes non conçus ou mal conçus pour ce cas de figure. On peut, par exemple, découvrir fréquemment des programmes non standards, développés pour une entreprise ou un contexte bien précis, qui utilisent cette permission (ces cas de figure ne sont pas couverts par GTFOBins). Il est aussi possible de tomber sur des permissions SUID accordées à des binaires légitimes qui n’ont pas du tout été conçus pour cela.
Dans la plupart des cas légitimes, les programmes qui sont nativement conçus pour fonctionner avec SUID possèdent des fonctions de contrôle strictes qui permettent d’empêcher tout abus du programme en question pour exécuter des tâches autres que celles prévues.
Dans ces cas-là, le fait d’abuser des permissions SUID d’un programme légitimement conçu pour les utiliser constitue un exploit. Citons, en exemple, la CVE-2021-4034 (PwnKit) : Une vulnérabilité dans "pkexec", un outil de "Polkit" permettant d'exécuter des commandes en tant qu'un autre utilisateur, y compris "root". Une mauvaise gestion des arguments permet à un utilisateur local d'exécuter du code arbitraire avec des privilèges "root".
Pour illustrer l’utilisation de GTFOBins, prenons, en exemple, le cas de l’ajout du SUID au binaire "wget". Celui permet d’effectuer des requêtes web en ligne de commande. Cependant, il n’a pas été conçu pour fonctionner avec le SUID et ne possède pas forcément les garde-fous nécessaires dans son code. Pour l’exemple, j’ajoute le SUID au binaire "wget" :
┌──(root㉿kali-it-connect)-[/opt]
└─# ls -al /usr/bin/nmap
-rwxr-xr-x 1 root root 2866736 Nov 2 2023 /usr/bin/wget
┌──(root㉿kali-it-connect)-[/opt]
└─# chmod +s /usr/bin/wget
┌──(root㉿kali-it-connect)-[/opt]
└─# ls -al /usr/bin/nmap
-rwsr-sr-x 1 root root 2866736 Nov 2 2023 /usr/bin/wget
Nous pouvons ensuite rechercher dans GTFObins les cas d’exploitation de wget dans un contexte de SUID :
Nous découvrons qu’il est possible d’obtenir un shell interactif en tant que "root" via "wget", ce qui n’est pas du tout ce que l’on souhaite faire lorsque l’on ajoute le SUID à un tel binaire.
Cette suite de commandes crée un script temporaire et l'utilise avec l'option "--use-askpass" de "wget" :
- TF=$(mktemp) : Crée un fichier temporaire et stocke son chemin dans la variable "TF".
- chmod +x $TF : Rend ce fichier temporaire exécutable.
- echo -e '#!/bin/sh -p\n/bin/sh -p 1>&0' >$TF : Écrit un script shell dans le fichier temporaire. Ce script exécute "/bin/sh" avec l'option -p pour préserver les privilèges SUID.
- ./wget --use-askpass=$TF 0 : Exécute "wget" avec l'option "--use-askpass", qui utilise le script temporaire pour fournir des informations d'authentification.
Voici l’exploitation en question :
# Exploitation du SUID de wget pour obtenir un shell interactif
$ TF=$(mktemp)
$ chmod +x $TF
$ echo -e '#!/bin/sh -p\n/bin/sh -p 1>&0' >$TF
$ /usr/bin/wget --use-askpass=$TF 0
# whoami
root
Cet exemple vous permet de constater qu’un binaire tout à fait inoffensif peut être utilisé à des fins malveillantes et inattendues via ces mécanismes d’élévation de privilèges.
C. Le risque des capabilities
Les capabilities sous Linux sont des attributs de sécurité qui permettent de donner des privilèges spécifiques à des processus sans leur accorder tous les droits "root". Elles décomposent les privilèges "root" traditionnels en unités plus petites et assignables individuellement, réduisant ainsi la surface d'attaque et limitant les risques. Par exemple, la capability "CAP_NET_RAW" permet à un programme d'envoyer des paquets réseau bruts sans avoir besoin de tous les privilèges "root". Cela permet une gestion plus granulaire des permissions et renforce la sécurité du système.
Par exemple, tous les utilisateurs d’un système Linux peuvent utiliser la commande "ping" sans élever leurs privilèges. Cette commande envoie des paquets ICMP, ce qui en temps normal nécessite des droits privilégiés. Cependant, le binaire "ping" possède la capability "CAP_NET_RAW" pour envoyer des paquets réseau sans nécessiter les privilèges complets de "root".
Vous pouvez constater la présence de cette capability via la commande "getcap" :
# Lister les capabilities du binaire ping
$ getcap /usr/bin/ping
/usr/bin/ping cap_net_raw=ep
Les risques liés à certaines capabilities lorsqu’elles sont accordées à des binaires sont là aussi l’abus de certaines d’entre elles pour réaliser plus de choses que prévu... La plupart des cas référencés dans la base de connaissances GTFOBins incriminent la capabilities "CAP_SETUID" :
GTFOBins nous explique que si "python3" dispose de la capabilities "CAP_SETUID", alors l’utilisateur pourra élever ses privilèges durablement sur le système en utilisant la fonction "os_setuid" bien que l’exécutable "python3" n’ait pas la permission spéciale SUID :
Ici, "os.setuid(0)" permet de changer l'UID (User ID) du processus en 0. L'UID 0 correspond à l'utilisateur "root", donc cette commande donne les privilèges "root" au processus Python en cours, ce qui est possible, car il a la capability "CAP_SETUID".
Voici une liste non exhaustive d’autres capabilities pouvant avoir des impacts en termes de sécurité sur un OS Linux :
- CAP_SYS_ADMIN : Cette capacité est extrêmement puissante et permet de faire presque tout sur le système, y compris le montage de systèmes de fichiers, la manipulation de namespaces, et bien plus.
- CAP_SYS_PTRACE : Permet de tracer (debugger) d'autres processus. Cela peut être utilisé pour intercepter des communications ou extraire des informations sensibles de la mémoire d'autres processus.
- CAP_NET_ADMIN : Donne des privilèges administratifs sur les réseaux, tels que la configuration des interfaces réseau, la modification des tables de routage, etc.
- CAP_NET_RAW : Permet de créer des sockets raw, ce qui est nécessaire pour envoyer et recevoir des paquets réseau de bas niveau.
- Etc.
IV. Se protéger des configurations dangereuses
Vous l’aurez compris, il existe un très grand nombre de configurations dangereuses relatives à SUID, sudo et aux capabilities. En date d’écriture de cet article, GTFOBins référence plus de 390 binaires pouvant être concernés par des abus d’utilisation quand ils sont utilisés avec ces mécanismes d’élévation de privilèges. Et, tous sont des binaires légitimes à la base !
Pour protéger vos systèmes Linux de ces mauvaises configurations, la première chose à faire est bien sûr de les connaître ou de savoir où chercher lorsque l’on a un doute. C’est chose à présent puisque vous connaissez GTFOBins.
Il faut ensuite effectuer une revue de configuration de vos serveurs, de vérifier concrètement si ces configurations dangereuses sont présentes ou non. Voici quelques astuces rapides pour récupérer les éléments nécessaires :
Vous pourrez identifier les directives "sudo" en place sur un système en listant le contenu du fichier "/etc/sudoers", et aussi les fichiers contenus dans le dossier "/etc/sudoers.d" (et tout autre dossier mentionné après la directive "include") :
# Lister la configuration sudo d’un système
cat /etc/sudoers
# Récupérer les dossiers supplémentaires de configuration sudo
cat /etc/sudoers | grep -E "^@includ"
Vous pourrez ensuite lister la totalité des fichiers du système possédant la permission spéciale setUID via la commande suivante :
# Lister les binaires SUID du système
find / -perm -4000 -exec ls -ldb {} \; 2>/dev/null
Enfin, vous pourrez identifier les binaires possédants des capabilities via une commande telle que celle-ci :
# Lister les capabilities des binaires d’un système
find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \;
Cette commande utilise "find" pour lister les fichiers des répertoires indiqués, puis utilise la commande "getcap" sur ces fichiers. La sortie pourra alors ressembler à cela :
Pour chaque fichier, directive ou permission découverts ici, vous devrez vérifier si leur présence est utile et légitime. Vous devrez aussi surtout regarder si le binaire utilisé est présent dans la base de connaissances GTFOBins et le supprimer si c’est le cas, ou accepter le risque qu’il puisse être utilisé dans le cas d’un abus ou d’une élévation de privilège.
V. Conclusion
GTFOBins est assurément une ressource à connaître, quel que soit le métier que l’on exerce en cybersécurité, développement ou administrateur système. Il s’agit d’une base de connaissances communautaire et en constante évolution qui vous aidera à mieux protéger vos systèmes des abus et élévation de privilèges.
Il faut aussi savoir que plusieurs outils de recherche de vulnérabilités ou de vérification de configuration se reposent en grande partie sur GTFOBins pour identifier rapidement et de manière automatisée des défauts à ce sujet. Si vous envisagez d’utiliser ces outils automatisés, pensez bien à jeter un œil à leur code avant exécution en production !
Merci ça met déjà arriver de faire des sudo cibler ça me permettra de faire attention au abus