Capabilities
Les Linux capabilities sont un mécanisme de sécurité permettant d’accorder des privilèges fins à des processus sans leur donner l’intégralité des droits du compte root. Plutôt que d’utiliser exclusivement le modèle Unix traditionnel (UID 0 = root), on peut déléguer des droits spécifiques (ex : binding sur des ports basses, montage de systèmes de fichiers) à des exécutables via des capabilities.
🔐 Principe et risques
Les capabilities permettent une approche plus granulaire de la sécurité, mais peuvent être mal utilisées :
Sur-privilegier un binaire (ajouter des capabilities trop larges) augmente la surface d’attaque.
Attribuer des capabilities à des exécutables non isolés (non sandboxés) permet à un attaquant d’exploiter ces droits pour escalader.
Certaines capabilities sont particulièrement dangereuses si elles sont présentes sur des binaires accessibles :
cap_sys_admin— très puissante, couvre de nombreuses opérations système.cap_dac_override— permet de bypasser les contrôles d’accès (lecture/écriture/exécution) sur les fichiers.cap_setuid/cap_setgid— permettent de modifier l’UID/GID effectif d’un processus.
⚙️ Définir une capability
Sur Ubuntu (et autres distributions utilisant libcap), on peut utiliser setcap :
sudo setcap cap_net_bind_service=+ep /usr/bin/vim.basicCe type de commande accorde la capability cap_net_bind_service à l’exécutable écrit en paramètre. Les flags usuels sont expliqués ci-dessous.
🧾 Valeurs et flags utilisés avec setcap
setcap=: définit la valeur (utile pour enlever une capability).+ep: ajoute la capability dans les permitted et effective sets.+ei: ajoute la capability dans les sets effective et inheritable.+p: ajoute la capability uniquement dans le permitted set.
Exemples :
🔎 Liste de capabilities courantes et leur signification
cap_sys_admin
Très large : actions administratives diverses (montage, configuration, etc.).
cap_sys_chroot
Permet de changer le root (chroot).
cap_sys_ptrace
Autorise l’attachement/débogage d’autres processus.
cap_sys_nice
Modifier la priorité des processus.
cap_sys_time
Modifier l’horloge système.
cap_sys_resource
Modifier les limites de ressources (ulimit).
cap_sys_module
Charger / décharger des modules noyau.
cap_net_bind_service
Autorise le binding sur des ports privilégiés (<1024).
cap_setuid
Permet de définir l’UID effectif.
cap_setgid
Permet de définir le GID effectif.
cap_dac_override
Bypass des permissions DAC (lecture/écriture/exécution).
🔍 Énumérer les capabilities sur le système
Pour rechercher les exécutables équipés de capabilities :
La sortie (exemples) peut être de la forme :
🛠️ Exploitation — cas pratique
Si un binaire possède cap_dac_override (ou d’autres capabilities puissantes) et est exécutable par un utilisateur non privilégié, il peut permettre de modifier des fichiers système ou d’accéder à des ressources normalement restreintes.
Pattern d’exploitation (exemple pédagogique) :
Détecter un binaire avec
getcap:
Utiliser le binaire pour éditer un fichier système (ex :
/etc/passwd) :
Ou, en non-interactif (batch), appliquer des modifications via l’entrée standard :
Remarque : cet exemple montre comment, en utilisant
cap_dac_override, on peut modifier/etc/passwdpour supprimer le mot de passe du compteroot(attention aux implications et n’utiliser que dans des environnements de test autorisés).
🧰 Recommandations pour les audits
Lister régulièrement les exécutables avec capabilities (
getcap) lors d’un accès initial.Analyser le besoin opérationnel de chaque capability : pourquoi ce binaire a-t-il été doté de ce droit ?
Préférer des mécanismes sandboxés (namespaces, seccomp) quand une application a besoin d’un droit précis.
Éviter d’attribuer
cap_sys_adminsauf cas très justifiés.Vérifier si la distribution neutralise certains vecteurs (par ex. certains noyaux ou polices de sécurité empêchent l’usage de
LD_PRELOADsur binaires avec capabilities).
🛡️ Mesures d'atténuation
Restreindre l’utilisation de
setcapaux administrateurs.Documenter et inventorier toutes les capabilities déployées.
Appliquer le principe du moindre privilège et retirer les capabilities inutiles.
Utiliser des contrôles d’intégrité (AIDE, tripwire) pour détecter tout changement d’attributs sur les binaires.
📚 Ressources utiles
SSH to 10.129.205.111 (ACADEMY-LLPE-CAP) with user "htb-student" and password "HTB_@cademy_stdnt!"
Escalate the privileges using capabilities and read the flag.txt file in the "/root" directory. Submit its contents as the answer.
Nous nous connectons dans un premier temps à notre cible :
Nous listons alors les capabilities disponibles pour l'utilisateur actuel :
Nous pouvons alors observer la capability cap_dac_override+eip, comme vu dans le cours.
Nous savons donc que le but est d'écrire dans le fichier /etc/passwd afin de retirer le mot de passe assogné à l'utilisteur root :
Nous sommes maintenant root.
Nous pouvons alors afficher le contenu du fichier flag.txt afin d'en récupérer le contenu :
Nous obtenons ainsi le flag attendu :
Last updated