je suis racine. Comprendre l'élévation des privilèges du système d'exploitation Linux

J'ai passé le premier trimestre 2020 à préparer l'examen OSCP. La recherche d’informations sur Google et de nombreuses tentatives « aveugles » occupaient tout mon temps libre. Il était particulièrement difficile de comprendre les mécanismes permettant d'augmenter les privilèges. Le cours PWK accorde une grande attention à ce sujet, mais le matériel pédagogique n'est jamais suffisant. Il existe de nombreux manuels sur Internet contenant des commandes utiles, mais je ne suis pas fan de suivre aveuglément les recommandations sans comprendre à quoi cela mènera.

J'aimerais partager avec vous ce que j'ai appris lors de la préparation et de la réussite de l'examen (y compris des incursions périodiques dans Hack The Box). J'ai ressenti un fort sentiment de gratitude pour chaque information qui m'a aidé à parcourir le chemin Try Harder de manière plus consciente, il est maintenant temps pour moi de redonner à la communauté.

Je souhaite vous donner un manuel sur la façon d'augmenter les privilèges sous OS Linux, qui comprend une analyse des vecteurs les plus courants et des fonctionnalités associées qui vous seront certainement utiles. Souvent, les mécanismes d'augmentation des privilèges eux-mêmes sont assez simples et des difficultés surviennent lors de la structuration et de l'analyse des informations. Par conséquent, j'ai décidé de commencer par une « visite guidée », puis d'examiner chaque vecteur dans un article séparé. J'espère que je vous ferai gagner du temps pour étudier le sujet.

je suis racine. Comprendre l'élévation des privilèges du système d'exploitation Linux

Alors pourquoi l’élévation des privilèges est-elle même possible en 2020 si les méthodes sont connues depuis très longtemps ? En fait, si l'utilisateur gère correctement le système, il ne sera vraiment pas possible d'y augmenter les privilèges. Le principal problème mondial qui donne naissance à de telles opportunités est configuration non sécurisée. La présence de versions logicielles obsolètes contenant des vulnérabilités dans le système constitue également un cas particulier de configuration non sécurisée.

Élévation de privilèges via une configuration non sécurisée

Tout d’abord, parlons de la configuration non sécurisée. Commençons par Les professionnels de l'informatique utilisent souvent des manuels et des ressources comme stackoverflow, dont beaucoup contiennent des commandes et des configurations dangereuses. Un exemple frappant est nouvelles que le code le plus copié depuis stackoverflow contenait une erreur. Un administrateur expérimenté verra le montant, mais c'est dans un monde idéal. Même des professionnels compétents charge de travail accrue capable de commettre des erreurs. Imaginez qu'un administrateur prépare et coordonne la documentation pour le prochain appel d'offres, tout en se plongeant dans la nouvelle technologie qui doit être mise en œuvre au cours du prochain trimestre, tout en résolvant périodiquement les problèmes d'assistance aux utilisateurs. Ensuite, il est chargé de configurer rapidement quelques machines virtuelles et d'y déployer des services. Selon vous, quelle est la probabilité que l'administrateur ne remarque tout simplement pas le montant ? Ensuite, les spécialistes changent, mais les béquilles restent, tandis que les entreprises s'efforcent toujours de minimiser les coûts, y compris pour le personnel informatique.

Pseudo-shell et jailbreak

Le shell système obtenu lors de la phase d'exploitation est souvent limité, surtout si vous l'avez obtenu en piratant un utilisateur du serveur Web. Par exemple, les restrictions du shell peuvent vous empêcher d'exécuter la commande sudo, produisant une erreur :

sudo: no tty present and no askpass program specified

Une fois que vous disposez d'un shell, je vous recommande de créer un terminal à part entière, par exemple en utilisant Python.

python -c 'import pty;pty.spawn("/bin/bash")'

Vous vous demanderez peut-être : « Pourquoi ai-je besoin de mille commandes si je peux en utiliser une, par exemple, pour transférer des fichiers ? » Le fait est que les systèmes sont configurés différemment : un hôte donné peut ne pas avoir installé Python, mais peut avoir Perl. La compétence consiste à être capable de faire des choses familières dans le système sans outils familiers. Une liste complète des fonctionnalités peut être trouvée ici.

Un shell à faible privilège peut être obtenu en utilisant équipes 1 и équipes 2 (étonnamment même GIMP).

Afficher l'historique des commandes

Linux collecte un historique de toutes les commandes exécutées dans un fichier ~ / .bash_history. Si le serveur est activement utilisé et que son historique n'est pas effacé, il existe une forte probabilité de trouver des informations d'identification dans ce fichier. Effacer l’historique n’est tout simplement pas pratique. Si l'administrateur est obligé de sélectionner des commandes à dix étages via , bien entendu, il lui sera plus pratique d'appeler cette commande depuis l'historique que de la saisir à nouveau. De plus, beaucoup de gens ne connaissent pas ce « hack ». S'il existe des shells alternatifs comme Zsh ou Fish dans le système, ils ont leur propre histoire. Pour afficher l'historique des commandes dans n'importe quel shell, tapez simplement l'historique des commandes.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Il existe un hébergement mutualisé, dans lequel le serveur est utilisé pour héberger plusieurs sites Internet. Généralement, avec cette configuration, chaque ressource possède son propre utilisateur avec un répertoire personnel distinct et un hôte virtuel. Ainsi, s'il est mal configuré, vous pouvez trouver le fichier .bash_history dans le répertoire racine de la ressource Web.

Recherche de mots de passe dans le système de fichiers et attaques sur les systèmes adjacents

Les fichiers de configuration de divers services peuvent être lisibles par votre utilisateur actuel. Vous y trouverez des informations d'identification en texte clair - des mots de passe pour accéder à une base de données ou à des services associés. Le même mot de passe peut être utilisé à la fois pour accéder à la base de données et pour autoriser l'utilisateur root (gestion des informations d'identification).
Il arrive que les identifiants trouvés appartiennent à des services sur d'autres hôtes. Développer une attaque contre une infrastructure via un hôte compromis n’est pas pire que d’exploiter d’autres hôtes. Les systèmes adjacents peuvent également être trouvés en recherchant les adresses IP dans le système de fichiers.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

Si l'hébergeur compromis dispose d'une application web accessible depuis Internet, il est préférable d'exclure ses logs de la recherche d'adresses IP. Il est peu probable que les adresses des utilisateurs de ressources d'Internet nous soient utiles, mais les adresses du réseau interne (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) et où ils vont, à en juger par les journaux , peut être intéressant.

Sudo

La commande sudo donne à l'utilisateur la possibilité d'exécuter une commande dans le contexte racine en utilisant son propre mot de passe ou sans utiliser de mot de passe du tout. De nombreuses opérations sous Linux nécessitent les privilèges root, mais exécuter en tant que root est considéré comme une très mauvaise pratique. Au lieu de cela, il est préférable d'appliquer une autorisation sélective pour exécuter des commandes dans le contexte racine. Cependant, de nombreux outils Linux, y compris les outils standards comme vi, peuvent être utilisés pour élever les privilèges de manière légitime. Pour trouver une méthode adaptée, je vous recommande de chercher ici.

La première chose que vous devez faire lorsque vous accédez au système est d’exécuter la commande sudo -l. Il affichera l'autorisation d'utiliser la commande sudo. Si un utilisateur sans mot de passe est obtenu (comme Apache ou www-data), le vecteur d'élévation de privilèges via sudo est peu probable. Lors de l'utilisation de sudo, le système demandera un mot de passe. Vous ne pourrez pas non plus définir de mot de passe à l'aide de la commande passwd ; elle demandera le mot de passe actuel de l'utilisateur. Mais si sudo est toujours disponible, vous devez essentiellement rechercher :

  • n'importe quel interprète, n'importe qui peut générer un shell (PHP, Python, Perl) ;
  • tous les éditeurs de texte (vim, vi, nano) ;
  • tous les téléspectateurs (moins, plus) ;
  • toutes les possibilités de travailler avec le système de fichiers (cp, mv) ;
  • Outils qui ont une sortie en bash, interactive ou sous forme de commande exécutable (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Il existe de nombreux manuels sur Internet qui conseillent de collecter toutes les commandes suid/sgid, mais un article rare donne des détails sur ce qu'il faut faire avec ces programmes. Des options pour élever les privilèges qui ne prennent pas en compte l'utilisation d'exploits peuvent être trouvées ici. En outre, un certain nombre de fichiers exécutables présentent des vulnérabilités spécifiques à la version du système d'exploitation, par exemple.

Dans un monde idéal, vous exécuteriez tous les packages installés via au moins searchsploit. En pratique, cela devrait être fait avec les programmes les plus populaires tels que sudo. Il y a aussi toujours la possibilité d'utiliser et de soutenir le développement d'outils automatisés qui mettront en évidence des fichiers exécutables intéressants, du point de vue de l'élévation des privilèges, avec les bits suid/sgid définis. Je donnerai une liste de ces outils dans la section correspondante de l'article.

Scripts inscriptibles exécutés par Cron ou Init dans le contexte de Root

Les tâches Cron peuvent être exécutées dans différents contextes utilisateur, y compris root. Si une tâche périodique est configurée avec un lien vers un fichier exécutable et que vous pouvez l'écrire, elle peut facilement être remplacée par une tâche malveillante et une élévation de privilèges peut être effectuée. Cependant, par défaut, les fichiers contenant des tâches cron sont lisibles par n'importe quel utilisateur.

ls -la /etc/cron.d  # show cron jobs 

La situation est similaire avec init. La différence est que les tâches dans cron sont exécutées périodiquement et dans init - au démarrage du système. L'opération nécessitera un redémarrage du système et certains services risquent de ne pas démarrer (s'ils n'ont pas été enregistrés au démarrage).

ls -la /etc/init.d/  # show init scripts 

Vous pouvez également rechercher des fichiers accessibles en écriture par n'importe quel utilisateur.

find / -perm -2 -type f 2>/dev/null # find world writable files

La méthode est assez connue ; les administrateurs système expérimentés utilisent avec précaution la commande chmod. Cependant, sur Internet, la grande majorité des manuels décrivent la définition de droits maximaux. L'approche « faites en sorte que cela fonctionne » des administrateurs système inexpérimentés crée en principe des opportunités d'élévation des privilèges. Si possible, il est préférable de rechercher dans l'historique des commandes une utilisation dangereuse de chmod.

chmod +w /path 
chmod 777 /path

Obtenir un accès au shell pour d'autres utilisateurs

Nous regardons la liste des utilisateurs dans /etc/passwd. Nous faisons attention à ceux qui ont une coquille. Vous pouvez brutaliser ces utilisateurs - il est possible que grâce à l'utilisateur résultant, il soit finalement possible d'augmenter les privilèges.

Pour améliorer la sécurité, je vous recommande de toujours respecter le principe du moindre privilège. Il est également logique de consacrer du temps à vérifier les configurations dangereuses qui pourraient persister après le dépannage - c'est le « devoir technique » de l'administrateur système.

Code auto-écrit

Il vaut la peine d'examiner de près les fichiers exécutables dans le répertoire personnel de l'utilisateur et du serveur Web (/var/www/, sauf indication contraire). Ces fichiers peuvent s'avérer être une solution totalement dangereuse et contenir des béquilles incroyables. Bien sûr, si vous avez une sorte de framework dans le répertoire du serveur Web, cela n'a aucun sens d'y rechercher un jour zéro dans le cadre d'un pentest, mais il est recommandé de rechercher et d'étudier les modifications, plugins et composants personnalisés.

Pour augmenter la sécurité, il est préférable, si possible, d'éviter d'utiliser des informations d'identification dans des scripts auto-écrits, ainsi que des fonctionnalités potentiellement dangereuses, telles que la lecture de /etc/shadow ou la manipulation d'id_rsa.

Élévation des privilèges grâce à l’exploitation des vulnérabilités

Avant de tenter d'élever les privilèges par l'exploitation, il est important de comprendre transférer des fichiers vers l'hôte cible. En plus des outils habituels comme ssh, ftp, http (wget, curl), il existe tout un "zoo" de possibilités.

Pour améliorer la sécurité du système, mettez-le régulièrement à jour avec la dernière version écurie versions, et essayez également d'utiliser des distributions conçues pour Enterprise. Sinon, c'est rare mais il existe des situations où une mise à niveau appropriée rend le système inutilisable.

Exploiter les services exécutés dans le contexte de l'utilisateur root

Certains services Linux s'exécutent en tant que root. Ils peuvent être trouvés en utilisant la commande ps aux | racine grep. Dans ce cas, le service peut ne pas être annoncé sur Internet et être disponible localement. S'il dispose d'exploits publics, ils peuvent être utilisés en toute sécurité : un crash du service en cas de panne est bien moins critique qu'un crash du système d'exploitation.

ps -aux | grep root # Linux

Le cas le plus réussi peut être considéré comme le fonctionnement d'un service piraté dans le contexte de l'utilisateur root. Le fonctionnement du service SMB donne un accès privilégié au SYSTÈME sur les systèmes Windows (par exemple, via ms17-010). Cependant, cela n'est pas courant sur les systèmes Linux, vous pouvez donc passer beaucoup de temps à élever vos privilèges.

Exploiter les vulnérabilités du noyau Linux

C'est le dernier chemin à emprunter. Une opération infructueuse peut entraîner un crash du système et, en cas de redémarrage, certains services (y compris ceux par lesquels le shell initial a été obtenu) peuvent ne pas démarrer. Il arrive que l'administrateur ait simplement oublié d'utiliser la commande systemctl activate. De plus, cela provoquera beaucoup d'insatisfaction à l'égard de votre travail si l'opération n'a pas été convenue.
Si vous décidez d'utiliser les codes sources d'exploitdb, assurez-vous de lire les commentaires au début du script. Entre autres choses, il indique généralement comment compiler correctement un exploit donné. Si vous êtes trop paresseux ou si vous avez dû le faire « hier » en raison des délais, vous pouvez rechercher des référentiels avec des exploits déjà compilés, par exemple. Cependant, vous devez comprendre que dans ce cas, vous obtiendrez un cochon dans un sac. D’un autre côté, si un programmeur comprenait au moindre octet le fonctionnement d’un ordinateur et les logiciels qu’il utilise, il n’écrirait pas une seule ligne de code de toute sa vie.

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasploit

Afin d'attraper et de gérer la connexion, il est toujours préférable d'utiliser le module exploit/multi/handler. L'essentiel est de définir la charge utile correcte, par exemple generic/shell/reverse_tcp ou generic/shell/bind_tcp. Le shell produit par Metasploit peut être mis à niveau vers Meterpreter à l'aide du module post/multi/manage/shell_to_meterpreter. Avec Meterpreter, vous pouvez automatiser le processus post-exploitation. Par exemple, le module post/multi/recon/local_exploit_suggester vérifie la plateforme, l'architecture et les entités requises pour l'exploitation et suggère des modules Metasploit pour élever les privilèges sur le système cible. Grâce à Meterpreter, augmenter les privilèges revient parfois à lancer le module requis, mais pirater sans comprendre ce qui se passe sous le capot n'est pas « vrai » (il faut quand même rédiger un rapport).

Outils

Les outils d'automatisation de la collecte d'informations locales vous feront économiser beaucoup d'efforts et de temps, mais à eux seuls, ils ne sont pas en mesure d'identifier pleinement le chemin vers l'élévation des privilèges, notamment en cas d'exploitation des vulnérabilités du noyau. Les outils d'automatisation exécuteront toutes les commandes nécessaires pour vous permettre de collecter des informations sur le système, mais il est également important de pouvoir analyser données reçues. J'espère que mon article vous sera utile à cet égard. Bien sûr, il existe bien plus d'outils que ceux que je vais énumérer ci-dessous, mais ils font tous à peu près la même chose - c'est plutôt une question de goût.

Pois Lin

Un Tula assez récent, le premier commit remonte à janvier 2019. Mon outil préféré en ce moment. Le fait est qu’il met en évidence les vecteurs d’élévation de privilèges les plus intéressants. D'accord, il est plus pratique d'obtenir une expertise à ce niveau que d'analyser des données brutes monolithiques.

LinEnum

Mon deuxième outil préféré, il collecte et organise également les données obtenues à la suite d’un dénombrement local.

linux-exploit-suggester (1,2)

Cet exploit analysera le système pour trouver des conditions d’exploitation appropriées. En fait, il fera le travail identique au module Metasploit local_exploit_suggester, mais proposera des liens vers les codes sources exploit-db plutôt que vers les modules Metasploit.

Linuxprivchecker

Ce script collectera et organisera en sections une grande quantité d'informations qui peuvent être utiles pour former un vecteur d'augmentation des privilèges.

Une autre fois, j'entrerai dans les détails élévation des privilèges dans le système d'exploitation Linux via suid/sgid.

Source: habr.com

Ajouter un commentaire