Linux Privilege Escalation
Informations système
Infos OS
Commençons par acquérir des connaissances sur le système d'exploitation en cours d'exécution
Chemin
Si vous avez des permissions d'écriture sur n'importe quel dossier à l'intérieur de la variable PATH
, vous pourriez être en mesure de détourner certaines bibliothèques ou binaires :
Informations sur l'environnement
Des informations intéressantes, des mots de passe ou des clés API dans les variables d'environnement ?
Exploits du noyau
Vérifiez la version du noyau et s'il existe une faille qui peut être utilisée pour escalader les privilèges
Vous pouvez trouver une bonne liste de noyaux vulnérables et certains exploits déjà compilés ici : https://github.com/lucyoa/kernel-exploits et exploitdb sploits. D'autres sites où vous pouvez trouver des exploits compilés : https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Pour extraire toutes les versions de noyaux vulnérables à partir de ce site web, vous pouvez faire :
Les outils qui pourraient aider à rechercher des exploits du noyau sont :
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (exécuter DANS la victime, vérifie uniquement les exploits pour le noyau 2.x)
Toujours rechercher la version du noyau sur Google, peut-être que votre version du noyau est mentionnée dans un exploit du noyau et alors vous serez sûr que cet exploit est valide.
CVE-2016-5195 (DirtyCow)
Élévation de privilèges Linux - Noyau Linux <= 3.19.0-73.8
Version de Sudo
Basé sur les versions vulnérables de sudo qui apparaissent dans :
Vous pouvez vérifier si la version de sudo est vulnérable en utilisant cette commande grep.
sudo < v1.28
De @sickrov
Échec de la vérification de la signature Dmesg
Consultez la boîte smasher2 de HTB pour un exemple de la manière dont cette vulnérabilité pourrait être exploitée
Plus d'énumération du système
Enumérer les défenses possibles
AppArmor
Grsecurity
Grsecurity est un ensemble de patches pour le noyau Linux qui améliore la sécurité en ajoutant des fonctionnalités telles que RBAC (Role-Based Access Control), des protections contre les attaques de type "stack smashing" et des mécanismes de prévention de l'escalade de privilèges.
PaX
PaX est un patch noyau Linux qui implémente diverses fonctionnalités de sécurité, y compris l'exécution aléatoire de la pile (ASLR), la protection de l'espace utilisateur (Uderflow) et d'autres mécanismes de protection contre les attaques de débordement de tampon.
Execshield
Execshield est une fonctionnalité de sécurité du noyau Linux qui vise à protéger contre les attaques de débordement de tampon en rendant les zones de mémoire non exécutables. Cela aide à prévenir l'exécution de code malveillant stocké dans des zones de mémoire vulnérables.
SElinux
SELinux (Security-Enhanced Linux) est un mécanisme de contrôle d'accès obligatoire (MAC) pour Linux qui met en œuvre des politiques de sécurité renforcées pour renforcer la sécurité du système en limitant les privilèges des utilisateurs et des processus.
ASLR
Address Space Layout Randomization (ASLR) is a security feature that randomizes the memory addresses used by system processes. This helps prevent attackers from predicting memory addresses and executing attacks such as buffer overflows.
Évasion de Docker
Si vous êtes à l'intérieur d'un conteneur Docker, vous pouvez essayer de vous échapper :
Docker SecurityLecteurs
Vérifiez ce qui est monté et démonté, où et pourquoi. Si quelque chose est démonté, vous pourriez essayer de le monter et vérifier les informations privées.
Logiciels utiles
Énumérer les binaires utiles
Également, vérifiez si un compilateur est installé. Cela est utile si vous avez besoin d'utiliser une certaine exploitation du noyau, car il est recommandé de le compiler sur la machine où vous allez l'utiliser (ou sur une similaire).
Logiciels Vulnérables Installés
Vérifiez la version des packages et services installés. Il se peut qu'il y ait une ancienne version de Nagios (par exemple) qui pourrait être exploitée pour escalader les privilèges... Il est recommandé de vérifier manuellement la version des logiciels installés les plus suspects.
Si vous avez un accès SSH à la machine, vous pouvez également utiliser openVAS pour vérifier si des logiciels obsolètes et vulnérables sont installés à l'intérieur de la machine.
Notez que ces commandes afficheront beaucoup d'informations qui seront principalement inutiles, il est donc recommandé d'utiliser des applications telles que OpenVAS ou similaires qui vérifieront si une version de logiciel installée est vulnérable à des exploits connus
Processus
Jetez un œil aux processus en cours d'exécution et vérifiez si un processus a plus de privilèges qu'il ne le devrait (peut-être un tomcat exécuté par root ?)
Vérifiez toujours s'il y a des débogueurs electron/cef/chromium en cours d'exécution, vous pourriez les exploiter pour escalader les privilèges. Linpeas les détecte en vérifiant le paramètre --inspect
dans la ligne de commande du processus.
Vérifiez également vos privilèges sur les binaires des processus, peut-être pouvez-vous en écraser un.
Surveillance des processus
Vous pouvez utiliser des outils comme pspy pour surveiller les processus. Cela peut être très utile pour identifier les processus vulnérables exécutés fréquemment ou lorsque certains critères sont remplis.
Mémoire des processus
Certains services d'un serveur enregistrent des identifiants en clair dans la mémoire. Normalement, vous aurez besoin de privilèges root pour lire la mémoire des processus appartenant à d'autres utilisateurs, donc cela est généralement plus utile lorsque vous êtes déjà root et que vous souhaitez découvrir d'autres identifiants. Cependant, rappelez-vous que en tant qu'utilisateur régulier, vous pouvez lire la mémoire des processus que vous possédez.
Notez qu'actuellement la plupart des machines n'autorisent pas ptrace par défaut, ce qui signifie que vous ne pouvez pas extraire les processus appartenant à votre utilisateur non privilégié.
Le fichier /proc/sys/kernel/yama/ptrace_scope contrôle l'accessibilité de ptrace :
kernel.yama.ptrace_scope = 0 : tous les processus peuvent être débogués, tant qu'ils ont le même uid. C'est la manière classique dont ptrace fonctionnait.
kernel.yama.ptrace_scope = 1 : seul un processus parent peut être débogué.
kernel.yama.ptrace_scope = 2 : Seuls les administrateurs peuvent utiliser ptrace, car cela nécessite la capacité CAP_SYS_PTRACE.
kernel.yama.ptrace_scope = 3 : Aucun processus ne peut être suivi avec ptrace. Une fois défini, un redémarrage est nécessaire pour réactiver le suivi.
GDB
Si vous avez accès à la mémoire d'un service FTP (par exemple), vous pourriez obtenir le tas (Heap) et rechercher à l'intérieur ses identifiants.
Script GDB
/proc/$pid/maps & /proc/$pid/mem
Pour un ID de processus donné, maps montre comment la mémoire est cartographiée dans l'espace d'adressage virtuel de ce processus; il montre également les permissions de chaque région cartographiée. Le fichier pseudo mem expose la mémoire des processus eux-mêmes. À partir du fichier maps, nous savons quelles régions de mémoire sont lisibles et leurs décalages. Nous utilisons ces informations pour chercher dans le fichier mem et extraire toutes les régions lisibles dans un fichier.
/dev/mem
/dev/mem
fournit un accès à la mémoire physique du système, pas à la mémoire virtuelle. L'espace d'adressage virtuel du noyau peut être accédé en utilisant /dev/kmem.
En général, /dev/mem
n'est lisible que par l'utilisateur root et le groupe kmem.
ProcDump pour linux
ProcDump est une réinterprétation pour Linux de l'outil classique ProcDump de la suite d'outils Sysinternals pour Windows. Trouvez-le sur https://github.com/Sysinternals/ProcDump-for-Linux
Outils
Pour vider la mémoire d'un processus, vous pourriez utiliser :
https://github.com/hajzer/bash-memory-dump (root) - _Vous pouvez supprimer manuellement les exigences de root et vider le processus détenu par vous
Script A.5 de https://www.delaat.net/rp/2016-2017/p97/report.pdf (root est requis)
Identifiants depuis la mémoire du processus
Exemple manuel
Si vous constatez que le processus d'authentification est en cours d'exécution :
Vous pouvez vider le processus (voir les sections précédentes pour trouver différentes façons de vider la mémoire d'un processus) et rechercher des informations d'identification à l'intérieur de la mémoire :
mimipenguin
L'outil https://github.com/huntergregal/mimipenguin va voler les informations d'identification en texte clair de la mémoire et de certains fichiers bien connus. Il nécessite des privilèges root pour fonctionner correctement.
Fonctionnalité | Nom du processus |
---|---|
Mot de passe GDM (Kali Desktop, Debian Desktop) | gdm-password |
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
LightDM (Ubuntu Desktop) | lightdm |
VSFTPd (Connexions FTP actives) | vsftpd |
Apache2 (Sessions HTTP Basic Auth actives) | apache2 |
OpenSSH (Sessions SSH actives - Utilisation de Sudo) | sshd: |
Search Regexes/truffleproc
Tâches planifiées/Cron
Vérifiez si une tâche planifiée est vulnérable. Peut-être pouvez-vous profiter d'un script exécuté par root (vulnérabilité de joker ? peut modifier des fichiers utilisés par root ? utiliser des liens symboliques ? créer des fichiers spécifiques dans le répertoire utilisé par root ?).
Chemin de Cron
Par exemple, à l'intérieur de /etc/crontab, vous pouvez trouver le CHEMIN : CHEMIN=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Remarquez comment l'utilisateur "user" a des privilèges d'écriture sur /home/user)
Si à l'intérieur de cette crontab l'utilisateur root essaie d'exécuter une commande ou un script sans définir le chemin. Par exemple : * * * * root overwrite.sh Ensuite, vous pouvez obtenir un shell root en utilisant :
Cron en utilisant un script avec un joker (Injection de joker)
Si un script est exécuté par root et contient un "*" dans une commande, vous pourriez exploiter cela pour provoquer des actions inattendues (comme une élévation de privilèges). Exemple :
Si l'astérisque est précédé d'un chemin comme /some/path/* , il n'est pas vulnérable (même ./* ne l'est pas).
Consultez la page suivante pour plus de techniques d'exploitation des astérisques :
Wildcards Spare tricksÉcrasement de script Cron et lien symbolique
Si vous pouvez modifier un script cron exécuté par root, vous pouvez obtenir un shell très facilement :
Si le script exécuté par root utilise un répertoire sur lequel vous avez un accès complet, il pourrait être utile de supprimer ce dossier et de créer un lien symbolique vers un autre dossier contenant un script contrôlé par vous.
Tâches cron fréquentes
Vous pouvez surveiller les processus pour rechercher ceux qui sont exécutés toutes les 1, 2 ou 5 minutes. Vous pourriez en profiter pour escalader les privilèges.
Par exemple, pour surveiller toutes les 0,1s pendant 1 minute, trier par les commandes les moins exécutées et supprimer les commandes les plus exécutées, vous pouvez faire :
Vous pouvez également utiliser pspy (cela surveillera et listera chaque processus qui démarre).
Tâches cron invisibles
Il est possible de créer une tâche cron en ajoutant un retour chariot après un commentaire (sans caractère de nouvelle ligne), et la tâche cron fonctionnera. Exemple (notez le caractère de retour chariot) :
Services
Fichiers .service inscriptibles
Vérifiez si vous pouvez écrire un fichier .service
, si c'est le cas, vous pourriez le modifier pour qu'il exécute votre backdoor lorsque le service est démarré, redémarré ou arrêté (vous devrez peut-être attendre le redémarrage de la machine).
Par exemple, créez votre backdoor à l'intérieur du fichier .service avec ExecStart=/tmp/script.sh
Binaires de service inscriptibles
Gardez à l'esprit que si vous avez des permissions d'écriture sur les binaires exécutés par les services, vous pouvez les modifier pour y ajouter des backdoors afin qu'elles soient exécutées lorsque les services sont relancés.
Chemins relatifs de systemd PATH
Vous pouvez voir le PATH utilisé par systemd avec:
Si vous constatez que vous pouvez écrire dans l'un des dossiers du chemin, vous pourriez être en mesure de escalader les privilèges. Vous devez rechercher les fichiers de configuration de service utilisant des chemins relatifs tels que :
Ensuite, créez un exécutable avec le même nom que le binaire du chemin relatif à l'intérieur du dossier du chemin systemd où vous pouvez écrire, et lorsque le service est appelé à exécuter l'action vulnérable (Démarrer, Arrêter, Recharger), votre porte dérobée sera exécutée (les utilisateurs non privilégiés ne peuvent généralement pas démarrer/arrêter les services mais vérifiez si vous pouvez utiliser sudo -l
).
Apprenez-en plus sur les services avec man systemd.service
.
Minuteries
Les minuteries sont des fichiers d'unité systemd dont le nom se termine par **.timer**
qui contrôlent les fichiers ou événements **.service**
. Les minuteries peuvent être utilisées comme une alternative à cron car elles prennent en charge les événements de temps calendrier et les événements de temps monotone et peuvent être exécutées de manière asynchrone.
Vous pouvez énumérer toutes les minuteries avec:
Timers inscriptibles
Si vous pouvez modifier un timer, vous pouvez le faire exécuter certains existants de systemd.unit (comme un .service
ou un .target
)
Dans la documentation, vous pouvez lire ce qu'est l'Unité :
L'unité à activer lorsque ce minuteur s'écoule. L'argument est un nom d'unité, dont le suffixe n'est pas ".timer". Si non spécifié, cette valeur est par défaut un service qui a le même nom que l'unité du minuteur, à l'exception du suffixe. (Voir ci-dessus.) Il est recommandé que le nom de l'unité activée et le nom de l'unité du minuteur soient nommés de manière identique, à l'exception du suffixe.
Par conséquent, pour abuser de cette autorisation, vous auriez besoin de :
Trouver une unité systemd (comme un fichier
.service
) qui exécute un binaire inscriptibleTrouver une unité systemd qui exécute un chemin relatif et pour lequel vous avez des privilèges d'écriture sur le chemin systemd (pour vous faire passer pour cet exécutable)
En savoir plus sur les minuteurs avec man systemd.timer
.
Activation du minuteur
Pour activer un minuteur, vous avez besoin de privilèges root et d'exécuter :
Notez que le timer est activé en créant un lien symbolique vers celui-ci sur /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Sockets
Les sockets Unix Domain (UDS) permettent la communication entre processus sur les mêmes machines ou sur des machines différentes dans des modèles client-serveur. Ils utilisent des fichiers de descripteurs Unix standard pour la communication inter-ordinateurs et sont configurés à travers des fichiers .socket
.
Les sockets peuvent être configurés en utilisant des fichiers .socket
.
Apprenez-en davantage sur les sockets avec man systemd.socket
. À l'intérieur de ce fichier, plusieurs paramètres intéressants peuvent être configurés :
ListenStream
,ListenDatagram
,ListenSequentialPacket
,ListenFIFO
,ListenSpecial
,ListenNetlink
,ListenMessageQueue
,ListenUSBFunction
: Ces options sont différentes mais un résumé est utilisé pour indiquer où il va écouter le socket (le chemin du fichier de socket AF_UNIX, l'adresse IPv4/6 et/ou le numéro de port à écouter, etc.)Accept
: Prend un argument booléen. Si true, une instance de service est lancée pour chaque connexion entrante et seul le socket de connexion est transmis à celle-ci. Si false, tous les sockets d'écoute eux-mêmes sont transmis à l'unité de service démarrée, et une seule unité de service est lancée pour toutes les connexions. Cette valeur est ignorée pour les sockets de datagrammes et les FIFO où une seule unité de service gère inconditionnellement tout le trafic entrant. Par défaut à false. Pour des raisons de performance, il est recommandé d'écrire de nouveaux démons uniquement de manière adaptée àAccept=no
.ExecStartPre
,ExecStartPost
: Prend une ou plusieurs lignes de commande, qui sont exécutées avant ou après que les sockets/FIFOs d'écoute soient créés et liés, respectivement. Le premier jeton de la ligne de commande doit être un nom de fichier absolu, suivi des arguments pour le processus.ExecStopPre
,ExecStopPost
: Commandes supplémentaires qui sont exécutées avant ou après que les sockets/FIFOs d'écoute soient fermés et supprimés, respectivement.Service
: Spécifie le nom de l'unité de service à activer sur le trafic entrant. Ce paramètre n'est autorisé que pour les sockets avec Accept=no. Par défaut, il s'agit du service portant le même nom que le socket (avec le suffixe remplacé). Dans la plupart des cas, il ne devrait pas être nécessaire d'utiliser cette option.
Fichiers .socket inscriptibles
Si vous trouvez un fichier .socket
inscriptible, vous pouvez ajouter au début de la section [Socket]
quelque chose comme : ExecStartPre=/home/kali/sys/backdoor
et la porte dérobée sera exécutée avant la création du socket. Par conséquent, vous devrez probablement attendre que la machine redémarre.
Notez que le système doit utiliser cette configuration de fichier de socket ou la porte dérobée ne sera pas exécutée
Sockets inscriptibles
Si vous identifiez un socket inscriptible (nous parlons maintenant de Sockets Unix et non des fichiers de configuration .socket
), alors vous pouvez communiquer avec ce socket et peut-être exploiter une vulnérabilité.
Énumérer les Sockets Unix
Connexion brute
Exemple d'exploitation :
Socket Command InjectionSockets HTTP
Notez qu'il peut y avoir des sockets en écoute pour les requêtes HTTP (Je ne parle pas des fichiers .socket mais des fichiers agissant comme des sockets Unix). Vous pouvez vérifier cela avec :
Socket HTTP Réponse
Si le socket répond avec une requête HTTP, alors vous pouvez communiquer avec lui et peut-être exploiter une vulnérabilité.
Socket Docker inscriptible
Le socket Docker, souvent situé à /var/run/docker.sock
, est un fichier critique qui doit être sécurisé. Par défaut, il est inscriptible par l'utilisateur root
et les membres du groupe docker
. Avoir un accès en écriture à ce socket peut entraîner une élévation de privilèges. Voici un aperçu de comment cela peut être fait et des méthodes alternatives si le CLI Docker n'est pas disponible.
Élévation de privilèges avec le CLI Docker
Si vous avez un accès en écriture au socket Docker, vous pouvez élever les privilèges en utilisant les commandes suivantes:
Ces commandes vous permettent d'exécuter un conteneur avec un accès de niveau root au système de fichiers de l'hôte.
Utilisation directe de l'API Docker
Dans les cas où le CLI Docker n'est pas disponible, le socket Docker peut toujours être manipulé en utilisant l'API Docker et des commandes curl
.
Lister les images Docker : Récupérer la liste des images disponibles.
Créer un conteneur : Envoyer une requête pour créer un conteneur qui monte le répertoire racine du système hôte.
Démarrer le conteneur nouvellement créé :
Se connecter au conteneur : Utiliser
socat
pour établir une connexion avec le conteneur, permettant l'exécution de commandes à l'intérieur.
Après avoir configuré la connexion socat
, vous pouvez exécuter des commandes directement dans le conteneur avec un accès de niveau root au système de fichiers de l'hôte.
Autres
Notez que si vous avez des autorisations d'écriture sur le socket Docker parce que vous êtes dans le groupe docker
, vous avez d'autres moyens d'escalader les privilèges. Si l' API Docker écoute sur un port, vous pouvez également compromettre.
Consultez d'autres moyens de contourner Docker ou de l'exploiter pour escalader les privilèges dans :
Docker SecurityEscalade de privilèges Containerd (ctr)
Si vous constatez que vous pouvez utiliser la commande ctr
, lisez la page suivante car vous pourriez l'exploiter pour escalader les privilèges :
Escalade de privilèges RunC
Si vous constatez que vous pouvez utiliser la commande runc
, lisez la page suivante car vous pourriez l'exploiter pour escalader les privilèges :
D-Bus
D-Bus est un système sophistiqué de communication inter-processus (IPC) qui permet aux applications d'interagir et de partager des données de manière efficace. Conçu pour le système Linux moderne, il offre un cadre robuste pour différents types de communication d'application.
Le système est polyvalent, prenant en charge une IPC de base qui améliore l'échange de données entre les processus, rappelant les sockets de domaine UNIX améliorés. De plus, il aide à diffuser des événements ou des signaux, favorisant une intégration transparente entre les composants du système. Par exemple, un signal d'un démon Bluetooth concernant un appel entrant peut inciter un lecteur de musique à se mettre en sourdine, améliorant ainsi l'expérience utilisateur. De plus, D-Bus prend en charge un système d'objet distant, simplifiant les demandes de service et les invocations de méthode entre les applications, rationalisant des processus traditionnellement complexes.
D-Bus fonctionne sur un modèle autoriser/refuser, gérant les autorisations de message (appels de méthode, émissions de signaux, etc.) en fonction de l'effet cumulatif des règles de stratégie correspondantes. Ces politiques spécifient les interactions avec le bus, permettant potentiellement une escalade de privilèges grâce à l'exploitation de ces autorisations.
Un exemple de cette politique dans /etc/dbus-1/system.d/wpa_supplicant.conf
est fourni, détaillant les autorisations pour l'utilisateur root de posséder, d'envoyer et de recevoir des messages de fi.w1.wpa_supplicant1
.
Les politiques sans utilisateur ou groupe spécifié s'appliquent universellement, tandis que les politiques de contexte "par défaut" s'appliquent à tous ceux qui ne sont pas couverts par d'autres politiques spécifiques.
Apprenez à énumérer et exploiter une communication D-Bus ici :
D-Bus Enumeration & Command Injection Privilege EscalationRéseau
Il est toujours intéressant d'énumérer le réseau et de déterminer la position de la machine.
Énumération générique
Ports ouverts
Vérifiez toujours les services réseau en cours d'exécution sur la machine avec lesquels vous n'avez pas pu interagir avant d'y accéder :
Sniffing
Vérifiez si vous pouvez renifler le trafic. Si vous le pouvez, vous pourriez être en mesure de récupérer des informations d'identification.
Utilisateurs
Énumération Générique
Vérifiez qui vous êtes, quels privilèges vous avez, quels utilisateurs sont dans les systèmes, lesquels peuvent se connecter et lesquels ont des privilèges root :
Grand UID
Certaines versions de Linux étaient affectées par un bug qui permettait aux utilisateurs avec un UID > INT_MAX d'escalader les privilèges. Plus d'informations: ici, ici et ici.
Exploitez-le en utilisant: systemd-run -t /bin/bash
Groupes
Vérifiez si vous êtes membre d'un groupe qui pourrait vous accorder des privilèges root:
Interesting Groups - Linux PrivescPresse-papiers
Vérifiez si quelque chose d'intéressant se trouve dans le presse-papiers (si possible)
Politique de mot de passe
Mots de passe connus
Si vous connaissez un mot de passe de l'environnement, essayez de vous connecter en tant que chaque utilisateur en utilisant le mot de passe.
Su Brute
Si vous ne vous souciez pas de faire beaucoup de bruit et que les binaires su
et timeout
sont présents sur l'ordinateur, vous pouvez essayer de forcer l'utilisateur en utilisant su-bruteforce.
Linpeas avec le paramètre -a
essaie également de forcer les utilisateurs.
Abus de PATH inscriptible
$PATH
Si vous découvrez que vous pouvez écrire à l'intérieur de certains dossiers du $PATH, vous pourriez être en mesure d'escalader les privilèges en créant une porte dérobée à l'intérieur du dossier inscriptible avec le nom d'une commande qui va être exécutée par un utilisateur différent (idéalement root) et qui n'est pas chargée à partir d'un dossier situé précédemment à votre dossier inscriptible dans $PATH.
SUDO et SUID
Vous pourriez être autorisé à exécuter une commande en utilisant sudo ou ils pourraient avoir le bit suid. Vérifiez en utilisant :
Certains commandes inattendues vous permettent de lire et/ou écrire des fichiers ou même d'exécuter une commande. Par exemple:
NOPASSWD
La configuration Sudo pourrait permettre à un utilisateur d'exécuter une commande avec les privilèges d'un autre utilisateur sans connaître le mot de passe.
Dans cet exemple, l'utilisateur demo
peut exécuter vim
en tant que root
, il est maintenant trivial d'obtenir un shell en ajoutant une clé ssh dans le répertoire root ou en appelant sh
.
SETENV
Cette directive permet à l'utilisateur de définir une variable d'environnement lors de l'exécution de quelque chose :
Cet exemple, basé sur la machine HTB Admirer, était vulnérable au piratage de PYTHONPATH pour charger une bibliothèque python arbitraire lors de l'exécution du script en tant que root:
Contournement de l'exécution Sudo en contournant les chemins
Sautez pour lire d'autres fichiers ou utilisez des liens symboliques. Par exemple dans le fichier sudoers : hacker10 ALL= (root) /bin/less /var/log/*
Si un joker est utilisé (*), c'est encore plus facile :
Contremesures: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Commande Sudo/binaire SUID sans chemin de commande
Si la permission sudo est accordée à une seule commande sans spécifier le chemin: hacker10 ALL= (root) less, vous pouvez l'exploiter en modifiant la variable PATH
Cette technique peut également être utilisée si un binaire suid exécute une autre commande sans spécifier le chemin d'accès à celle-ci (vérifiez toujours avec strings le contenu d'un binaire SUID suspect).
Exemples de charges utiles à exécuter.
Binaire SUID avec chemin d'accès de commande
Si le binaire suid exécute une autre commande en spécifiant le chemin d'accès, alors vous pouvez essayer d'exporter une fonction nommée comme la commande que le fichier suid appelle.
Par exemple, si un binaire suid appelle /usr/sbin/service apache2 start, vous devez essayer de créer la fonction et de l'exporter :
Ensuite, lorsque vous appelez le binaire suid, cette fonction sera exécutée
LD_PRELOAD & LD_LIBRARY_PATH
La variable d'environnement LD_PRELOAD est utilisée pour spécifier une ou plusieurs bibliothèques partagées (.so files) à charger par le chargeur avant toutes les autres, y compris la bibliothèque C standard (libc.so
). Ce processus est connu sous le nom de préchargement d'une bibliothèque.
Cependant, pour maintenir la sécurité du système et empêcher cette fonctionnalité d'être exploitée, en particulier avec des exécutables suid/sgid, le système impose certaines conditions :
Le chargeur ignore LD_PRELOAD pour les exécutables où l'identifiant utilisateur réel (ruid) ne correspond pas à l'identifiant utilisateur effectif (euid).
Pour les exécutables avec suid/sgid, seules les bibliothèques dans des chemins standard qui sont également suid/sgid sont préchargées.
Une élévation de privilèges peut se produire si vous avez la capacité d'exécuter des commandes avec sudo
et que la sortie de sudo -l
inclut l'instruction env_keep+=LD_PRELOAD. Cette configuration permet à la variable d'environnement LD_PRELOAD de persister et d'être reconnue même lorsque les commandes sont exécutées avec sudo
, ce qui peut potentiellement conduire à l'exécution de code arbitraire avec des privilèges élevés.
Enregistrez sous /tmp/pe.c
Ensuite, compilez-le en utilisant :
Enfin, escaladez les privilèges en exécutant
Une élévation de privilèges similaire peut être exploitée si l'attaquant contrôle la variable d'environnement LD_LIBRARY_PATH car il contrôle le chemin où les bibliothèques vont être recherchées.
Binaire SUID - Injection de .so
Lorsque vous rencontrez un binaire avec des permissions SUID qui semblent inhabituelles, il est bon de vérifier s'il charge correctement les fichiers .so. Cela peut être vérifié en exécutant la commande suivante :
Par exemple, rencontrer une erreur comme "open(“/chemin/vers/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (Aucun fichier ou dossier de ce type)" suggère un potentiel d'exploitation.
Pour exploiter cela, on procéderait en créant un fichier C, disons "/chemin/vers/.config/libcalc.c", contenant le code suivant:
Ce code, une fois compilé et exécuté, vise à élever les privilèges en manipulant les autorisations de fichiers et en exécutant un shell avec des privilèges élevés.
Compilez le fichier C ci-dessus en un fichier objet partagé (.so) avec :
Enfin, l'exécution du binaire SUID affecté devrait déclencher l'exploit, permettant une compromission potentielle du système.
Détournement d'objet partagé
Maintenant que nous avons trouvé un binaire SUID chargeant une bibliothèque à partir d'un dossier où nous pouvons écrire, créons la bibliothèque dans ce dossier avec le nom nécessaire:
Si vous obtenez une erreur telle que
Cela signifie que la bibliothèque que vous avez générée doit avoir une fonction appelée a_function_name
.
GTFOBins
GTFOBins est une liste organisée de binaires Unix pouvant être exploités par un attaquant pour contourner les restrictions de sécurité locales. GTFOArgs est similaire mais pour les cas où vous ne pouvez injecter que des arguments dans une commande.
Le projet recueille les fonctions légitimes des binaires Unix qui peuvent être abusées pour s'échapper des shells restreints, escalader ou maintenir des privilèges élevés, transférer des fichiers, générer des shells bind et reverse, et faciliter d'autres tâches de post-exploitation.
gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'
FallOfSudo
Si vous pouvez accéder à sudo -l
, vous pouvez utiliser l'outil FallOfSudo pour vérifier s'il trouve comment exploiter une règle sudo quelconque.
Réutilisation des jetons Sudo
Dans les cas où vous avez un accès sudo mais pas le mot de passe, vous pouvez escalader les privilèges en attendant l'exécution d'une commande sudo puis en détournant le jeton de session.
Conditions requises pour escalader les privilèges :
Vous avez déjà un shell en tant qu'utilisateur "sampleuser"
"sampleuser" a utilisé
sudo
pour exécuter quelque chose dans les 15 dernières minutes (par défaut, c'est la durée du jeton sudo qui nous permet d'utilisersudo
sans saisir de mot de passe)cat /proc/sys/kernel/yama/ptrace_scope
est à 0gdb
est accessible (vous devez pouvoir le télécharger)
(Vous pouvez temporairement activer ptrace_scope
avec echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ou le modifier définitivement dans /etc/sysctl.d/10-ptrace.conf
en définissant kernel.yama.ptrace_scope = 0
)
Si toutes ces conditions sont remplies, vous pouvez escalader les privilèges en utilisant : https://github.com/nongiach/sudo_inject
La première exploitation (
exploit.sh
) créera le binaireactivate_sudo_token
dans /tmp. Vous pouvez l'utiliser pour activer le jeton sudo dans votre session (vous n'obtiendrez pas automatiquement un shell root, faitessudo su
) :
Le deuxième exploit (
exploit_v2.sh
) créera un shell sh dans /tmp possédé par root avec setuid
Le troisième exploit (
exploit_v3.sh
) va créer un fichier sudoers qui rend les jetons sudo éternels et permet à tous les utilisateurs d'utiliser sudo
/var/run/sudo/ts/<Nom d'utilisateur>
Si vous avez des permissions d'écriture dans le dossier ou sur l'un des fichiers créés à l'intérieur du dossier, vous pouvez utiliser le binaire write_sudo_token pour créer un jeton sudo pour un utilisateur et un PID. Par exemple, si vous pouvez écraser le fichier /var/run/sudo/ts/sampleuser et que vous avez un shell en tant qu'utilisateur avec le PID 1234, vous pouvez obtenir des privilèges sudo sans avoir besoin de connaître le mot de passe en faisant :
/etc/sudoers, /etc/sudoers.d
Le fichier /etc/sudoers
et les fichiers à l'intérieur de /etc/sudoers.d
configurent qui peut utiliser sudo
et comment. Ces fichiers par défaut ne peuvent être lus que par l'utilisateur root et le groupe root.
Si vous pouvez lire ce fichier, vous pourriez être en mesure d'obtenir des informations intéressantes, et si vous pouvez écrire dans n'importe quel fichier, vous pourrez escalader les privilèges.
Si vous pouvez écrire, vous pouvez abuser de cette permission.
Une autre façon d'abuser de ces autorisations :
DOAS
Il existe des alternatives au binaire sudo
telles que doas
pour OpenBSD, n'oubliez pas de vérifier sa configuration dans /etc/doas.conf
Détournement de Sudo
Si vous savez qu'un utilisateur se connecte généralement à une machine et utilise sudo
pour escalader les privilèges et que vous avez un shell dans ce contexte utilisateur, vous pouvez créer un nouvel exécutable sudo qui exécutera votre code en tant que root, puis la commande de l'utilisateur. Ensuite, modifiez le $PATH du contexte utilisateur (par exemple en ajoutant le nouveau chemin dans .bash_profile) de sorte que lorsque l'utilisateur exécute sudo, votre exécutable sudo soit exécuté.
Notez que si l'utilisateur utilise un shell différent (pas bash), vous devrez modifier d'autres fichiers pour ajouter le nouveau chemin. Par exemple, sudo-piggyback modifie ~/.bashrc
, ~/.zshrc
, ~/.bash_profile
. Vous pouvez trouver un autre exemple dans bashdoor.py
Ou exécuter quelque chose comme:
Bibliothèque partagée
ld.so
Le fichier /etc/ld.so.conf
indique d'où proviennent les fichiers de configurations chargés. En général, ce fichier contient le chemin suivant : include /etc/ld.so.conf.d/*.conf
Cela signifie que les fichiers de configuration de /etc/ld.so.conf.d/*.conf
seront lus. Ces fichiers de configuration indiquent d'autres dossiers où les bibliothèques seront recherchées. Par exemple, le contenu de /etc/ld.so.conf.d/libc.conf
est /usr/local/lib
. Cela signifie que le système recherchera des bibliothèques à l'intérieur de /usr/local/lib
.
Si, pour une raison quelconque, un utilisateur a des permissions d'écriture sur l'un des chemins indiqués : /etc/ld.so.conf
, /etc/ld.so.conf.d/
, n'importe quel fichier à l'intérieur de /etc/ld.so.conf.d/
ou n'importe quel dossier dans le fichier de configuration à l'intérieur de /etc/ld.so.conf.d/*.conf
, il pourrait être en mesure d'escalader ses privilèges.
Consultez comment exploiter cette mauvaise configuration sur la page suivante :
RPATH
En copiant la librairie dans /var/tmp/flag15/
, elle sera utilisée par le programme à cet endroit tel que spécifié dans la variable RPATH
.
Ensuite, créez une bibliothèque malveillante dans /var/tmp
avec gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
Capacités
Les capacités Linux fournissent un sous-ensemble des privilèges root disponibles à un processus. Cela divise efficacement les privilèges root en unités plus petites et distinctes. Chacune de ces unités peut ensuite être accordée indépendamment aux processus. De cette manière, l'ensemble complet des privilèges est réduit, réduisant les risques d'exploitation. Consultez la page suivante pour en savoir plus sur les capacités et comment les abuser:
Linux CapabilitiesAutorisations de répertoire
Dans un répertoire, le bit "exécution" implique que l'utilisateur concerné peut faire un "cd" dans le dossier. Le bit "lecture" implique que l'utilisateur peut lister les fichiers, et le bit "écriture" implique que l'utilisateur peut supprimer et créer de nouveaux fichiers.
ACL
Les listes de contrôle d'accès (ACL) représentent la couche secondaire des autorisations discrétionnaires, capables de remplacer les autorisations traditionnelles ugo/rwx. Ces autorisations améliorent le contrôle de l'accès aux fichiers ou répertoires en permettant ou en refusant des droits à des utilisateurs spécifiques qui ne sont pas les propriétaires ou ne font pas partie du groupe. Ce niveau de granularité garantit une gestion de l'accès plus précise. Vous trouverez plus de détails ici.
Donnez à l'utilisateur "kali" des autorisations de lecture et d'écriture sur un fichier :
Obtenir des fichiers avec des ACL spécifiques du système :
Sessions de shell ouvertes
Dans les anciennes versions, vous pouvez détourner une session de shell d'un autre utilisateur (root). Dans les nouvelles versions, vous pourrez vous connecter uniquement aux sessions de votre propre utilisateur. Cependant, vous pourriez trouver des informations intéressantes à l'intérieur de la session.
Détournement de sessions screen
Lister les sessions screen
Attacher à une session
Capture de sessions tmux
C'était un problème avec les anciennes versions de tmux. Je n'ai pas pu capturer une session tmux (v2.1) créée par root en tant qu'utilisateur non privilégié.
Lister les sessions tmux
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-742df294b508deead65eeb0da2e9280b6fbaf295%252Fimage%2520%28131%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=d76e4b74&sv=1)
Attacher à une session
Vérifiez Valentine box from HTB pour un exemple.
SSH
Debian OpenSSL PRNG Prévisible - CVE-2008-0166
Toutes les clés SSL et SSH générées sur les systèmes basés sur Debian (Ubuntu, Kubuntu, etc) entre septembre 2006 et le 13 mai 2008 peuvent être affectées par ce bogue. Ce bogue est causé lors de la création d'une nouvelle clé ssh dans ces OS, car seules 32 768 variations étaient possibles. Cela signifie que toutes les possibilités peuvent être calculées et en ayant la clé publique ssh, vous pouvez rechercher la clé privée correspondante. Vous pouvez trouver les possibilités calculées ici: https://github.com/g0tmi1k/debian-ssh
Valeurs de configuration SSH intéressantes
PasswordAuthentication: Spécifie si l'authentification par mot de passe est autorisée. Par défaut, c'est
no
.PubkeyAuthentication: Spécifie si l'authentification par clé publique est autorisée. Par défaut, c'est
yes
.PermitEmptyPasswords: Lorsque l'authentification par mot de passe est autorisée, spécifie si le serveur autorise la connexion aux comptes avec des chaînes de mot de passe vides. Par défaut, c'est
no
.
PermitRootLogin
Spécifie si root peut se connecter en utilisant ssh, par défaut c'est no
. Les valeurs possibles sont:
yes
: root peut se connecter en utilisant un mot de passe et une clé privéewithout-password
ouprohibit-password
: root peut uniquement se connecter avec une clé privéeforced-commands-only
: Root peut se connecter uniquement en utilisant une clé privée et si les options de commandes sont spécifiéesno
: non
AuthorizedKeysFile
Spécifie les fichiers contenant les clés publiques pouvant être utilisées pour l'authentification de l'utilisateur. Il peut contenir des jetons comme %h
, qui seront remplacés par le répertoire personnel. Vous pouvez indiquer des chemins absolus (commençant par /
) ou des chemins relatifs à partir du répertoire personnel de l'utilisateur. Par exemple:
Cette configuration indiquera que si vous essayez de vous connecter avec la clé privée de l'utilisateur "nomutilisateurtest", ssh va comparer la clé publique de votre clé avec celles situées dans /home/nomutilisateurtest/.ssh/authorized_keys
et /home/nomutilisateurtest/access
ForwardAgent/AllowAgentForwarding
Le transfert d'agent SSH vous permet d'utiliser vos clés SSH locales au lieu de laisser des clés (sans phrase secrète !) assises sur votre serveur. Ainsi, vous pourrez sauter via ssh vers un hôte et à partir de là sauter vers un autre hôte en utilisant la clé située dans votre hôte initial.
Vous devez définir cette option dans $HOME/.ssh.config
comme ceci:
Notez que si Host
est *
chaque fois que l'utilisateur saute sur une machine différente, cet hôte pourra accéder aux clés (ce qui pose un problème de sécurité).
Le fichier /etc/ssh_config
peut remplacer ces options et autoriser ou refuser cette configuration.
Le fichier /etc/sshd_config
peut autoriser ou interdire le transfert de l'agent ssh avec le mot-clé AllowAgentForwarding
(par défaut, c'est autorisé).
Si vous constatez que l'Agent Forward est configuré dans un environnement, lisez la page suivante car vous pourriez l'exploiter pour escalader les privilèges :
SSH Forward Agent exploitationFichiers intéressants
Fichiers de profils
Le fichier /etc/profile
et les fichiers sous /etc/profile.d/
sont des scripts qui s'exécutent lorsque l'utilisateur lance un nouveau shell. Par conséquent, si vous pouvez écrire ou modifier l'un d'entre eux, vous pouvez escalader les privilèges.
Si un script de profil étrange est trouvé, vous devriez le vérifier pour des détails sensibles.
Fichiers Passwd/Shadow
Selon le système d'exploitation, les fichiers /etc/passwd
et /etc/shadow
peuvent avoir un nom différent ou il peut y avoir une sauvegarde. Par conséquent, il est recommandé de trouver tous ces fichiers et de vérifier si vous pouvez les lire pour voir s'il y a des hachages à l'intérieur des fichiers :
Dans certaines occasions, vous pouvez trouver des hachages de mots de passe à l'intérieur du fichier /etc/passwd
(ou équivalent)
/etc/passwd inscriptible
Tout d'abord, générer un mot de passe avec l'une des commandes suivantes.
Ensuite, ajoutez l'utilisateur hacker
et ajoutez le mot de passe généré.
Par exemple : hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Vous pouvez maintenant utiliser la commande su
avec hacker:hacker
Alternativement, vous pouvez utiliser les lignes suivantes pour ajouter un utilisateur factice sans mot de passe. AVERTISSEMENT : vous pourriez compromettre la sécurité actuelle de la machine.
NOTE: Sur les plateformes BSD, /etc/passwd
se trouve à /etc/pwd.db
et /etc/master.passwd
, et /etc/shadow
est renommé en /etc/spwd.db
.
Vous devriez vérifier si vous pouvez écrire dans certains fichiers sensibles. Par exemple, pouvez-vous écrire dans un fichier de configuration de service?
Par exemple, si la machine exécute un serveur tomcat et que vous pouvez modifier le fichier de configuration du service Tomcat à l'intérieur de /etc/systemd/, alors vous pouvez modifier les lignes :
Votre porte dérobée sera exécutée la prochaine fois que tomcat est démarré.
Vérifier les dossiers
Les dossiers suivants peuvent contenir des sauvegardes ou des informations intéressantes : /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Vous ne pourrez probablement pas lire le dernier, mais essayez)
Emplacement inhabituel/Fichiers possédés
Fichiers modifiés dans les dernières minutes
Fichiers de base de données Sqlite
Fichiers *_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml
Fichiers cachés
Scripts/Binaires dans le PATH
Fichiers Web
Sauvegardes
Fichiers connus contenant des mots de passe
Lisez le code de linPEAS, il recherche plusieurs fichiers possibles pouvant contenir des mots de passe. Un autre outil intéressant que vous pouvez utiliser à cet effet est : LaZagne qui est une application open source utilisée pour récupérer de nombreux mots de passe stockés sur un ordinateur local pour Windows, Linux & Mac.
Journaux
Si vous pouvez lire des journaux, vous pourriez trouver des informations intéressantes/confidentielles à l'intérieur. Plus le journal est étrange, plus il sera intéressant (probablement). De plus, certains journaux d'audit "mal" configurés (avec des portes dérobées ?) pourraient vous permettre d'enregistrer des mots de passe à l'intérieur des journaux d'audit comme expliqué dans cet article : https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
Pour lire les journaux du groupe adm sera vraiment utile.
Fichiers Shell
Recherche générique de mots de passe/Regex
Vous devriez également vérifier les fichiers contenant le mot "password" dans leur nom ou à l'intérieur du contenu, et vérifier également les adresses IP et les e-mails dans les journaux, ou les regexps de hachages. Je ne vais pas énumérer ici comment faire tout cela, mais si vous êtes intéressé, vous pouvez vérifier les dernières vérifications effectuées par linpeas.
Fichiers inscriptibles
Détournement de bibliothèque Python
Si vous savez d'où un script python va être exécuté et que vous pouvez écrire à l'intérieur de ce dossier ou que vous pouvez modifier les bibliothèques python, vous pouvez modifier la bibliothèque OS et y insérer une porte dérobée (si vous pouvez écrire là où le script python va être exécuté, copiez-collez la bibliothèque os.py).
Pour insérer une porte dérobée dans la bibliothèque, ajoutez simplement à la fin de la bibliothèque os.py la ligne suivante (changez l'IP et le PORT) :
Exploitation de Logrotate
Une vulnérabilité dans logrotate
permet aux utilisateurs ayant des permissions d'écriture sur un fichier journal ou ses répertoires parents de potentiellement obtenir des privilèges élevés. Cela est dû au fait que logrotate
, souvent exécuté en tant que root, peut être manipulé pour exécuter des fichiers arbitraires, notamment dans des répertoires tels que /etc/bash_completion.d/. Il est important de vérifier les permissions non seulement dans /var/log mais aussi dans tout répertoire où la rotation des journaux est appliquée.
Cette vulnérabilité affecte la version 3.18.0
et les versions antérieures de logrotate
Des informations plus détaillées sur la vulnérabilité peuvent être trouvées sur cette page : https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Vous pouvez exploiter cette vulnérabilité avec logrotten.
Cette vulnérabilité est très similaire à CVE-2016-1247 (journaux nginx), donc chaque fois que vous constatez que vous pouvez modifier des journaux, vérifiez qui gère ces journaux et vérifiez si vous pouvez escalader les privilèges en substituant les journaux par des liens symboliques.
/etc/sysconfig/network-scripts/ (Centos/Redhat)
Référence de la vulnérabilité : https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Si, pour une raison quelconque, un utilisateur est capable d'écrire un script ifcf-<quelquechose>
dans /etc/sysconfig/network-scripts ou de ajuster un existant, alors votre système est compromis.
Les scripts réseau, par exemple ifcg-eth0, sont utilisés pour les connexions réseau. Ils ressemblent exactement à des fichiers .INI. Cependant, ils sont ~sourcés~ sur Linux par Network Manager (dispatcher.d).
Dans mon cas, l'attribut NAME=
dans ces scripts réseau n'est pas géré correctement. Si vous avez un espace blanc dans le nom, le système tente d'exécuter la partie après l'espace blanc. Cela signifie que tout ce qui suit le premier espace blanc est exécuté en tant que root.
Par exemple : /etc/sysconfig/network-scripts/ifcfg-1337
init, init.d, systemd et rc.d
Le répertoire /etc/init.d
abrite des scripts pour System V init (SysVinit), le système classique de gestion des services Linux. Il comprend des scripts pour démarrer
, arrêter
, redémarrer
et parfois recharger
des services. Ceux-ci peuvent être exécutés directement ou via des liens symboliques trouvés dans /etc/rc?.d/
. Un chemin alternatif dans les systèmes Redhat est /etc/rc.d/init.d
.
D'autre part, /etc/init
est associé à Upstart, un nouveau gestionnaire de services introduit par Ubuntu, utilisant des fichiers de configuration pour les tâches de gestion des services. Malgré la transition vers Upstart, les scripts SysVinit sont toujours utilisés aux côtés des configurations Upstart en raison d'une couche de compatibilité dans Upstart.
systemd émerge en tant que gestionnaire de démarrage et de services moderne, offrant des fonctionnalités avancées telles que le démarrage de démons à la demande, la gestion des montages automatiques et des instantanés de l'état du système. Il organise les fichiers dans /usr/lib/systemd/
pour les paquets de distribution et /etc/systemd/system/
pour les modifications des administrateurs, rationalisant le processus d'administration système.
Last updated