Trouver un mot de passe root MySQL oublié dans l'historique du shell
Le défi
Vous avez un shell en tant qu'utilisateur 'deploy' sur un serveur de build. L'ancien admin a lancé une commande de base de données et a laissé le mot de passe root directement sur la ligne de commande. Consultez l'historique du shell, trouvez cette commande et soumettez le mot de passe root de la base.
Ce que tu vas apprendre
- Utiliser la commande history pour consulter les commandes passées d'un utilisateur
- Reconnaître que les mots de passe passés en ligne avec -p sont stockés en clair dans l'historique
- Extraire le mot de passe qui suit -p sans espace
- Expliquer pourquoi les secrets passés en ligne de commande persistent longtemps après l'exécution de la commande
- Appliquer des méthodes plus sûres pour s'authentifier à MySQL sans mot de passe en ligne de commande
Compétences testées
Prérequis
- Être à l'aise avec l'exécution de la commande history dans un shell
- Savoir que mysql -p<password> transmet un mot de passe sur la ligne de commande
Comment ça marche
Les shells interactifs conservent une trace de ce qui a été tapé. Bash écrit chaque commande dans ~/.bash_history, et la commande interne history affiche cette liste. Cette fonctionnalité est censée vous éviter de retaper des commandes, mais elle a un effet de bord : tout ce que vous passez en argument, y compris un mot de passe, est enregistré tel quel et reste présent longtemps après la fin de la commande.
Le coupable classique est le client MySQL. Écrire mysql -uroot -pR00t!Db_2026 shop transmet le mot de passe au programme sur la ligne de commande. Il n'y a pas d'espace entre -p et la valeur, donc tout le jeton constitue l'identifiant. Cette ligne se retrouve désormais dans le fichier d'historique, lisible par quiconque opère ensuite en tant que cet utilisateur. Plusieurs autres outils présentent le même défaut, ce qui explique que beaucoup avertissent désormais que fournir un mot de passe sur la ligne de commande n'est pas sûr.
Du point de vue d'un attaquant, c'est l'un des gains les moins coûteux disponibles. Pas besoin de lire un fichier de configuration, d'élever ses privilèges ou de casser une quelconque cryptographie : il suffit de lancer history et de lire. Comme sudo est une impasse dans ce scénario, l'historique est exactement le genre d'artefact peu coûteux et à forte valeur qu'un véritable opérateur vérifie en premier après avoir pris pied sur une machine.
Erreurs fréquentes
- Chercher le mot de passe dans des fichiers. Il n'a jamais été écrit dans un fichier ici : la valeur n'est apparue que sur une ligne de commande, donc
historyest le bon outil, pascat. - Se tourner vers sudo.
sudoest une impasse dans ce scénario ; le gain consiste à lire ce qui est déjà lisible, pas à élever ses privilèges. - Se tromper sur le début du mot de passe. La valeur suit
-psans espace :R00t!Db_2026, et non le nom de base de donnéesshopqui vient après. - Supposer que l'historique est effacé. Les opérateurs nettoient rarement leur historique ; la ligne survit généralement jusqu'à ce que quelqu'un l'efface volontairement.
Comment s'en protéger
La cause profonde est de placer un secret sur une ligne de commande, quel qu'il soit. Des pratiques plus sûres gardent le mot de passe hors de la liste des processus et du fichier d'historique :
- Utilisez
mysql -uroot -psans valeur pour que le client demande le mot de passe de manière interactive : il n'est alors jamais tapé comme argument. - Stockez les identifiants dans un fichier
~/.my.cnfprotégé avecchmod 600, ou utilisezmysql_config_editorpour les conserver dans un chemin de connexion chiffré. - Préférez une authentification par socket ou par jeton pour éviter d'avoir besoin d'un mot de passe statique lors des requêtes courantes.
- Effacez régulièrement l'historique sensible et définissez
HISTCONTROL=ignorespacepour empêcher les commandes contenant des secrets d'entrer dans le fichier d'historique.
Si un mot de passe est apparu dans l'historique ou dans une liste de processus, considérez-le comme compromis et changez-le : effacer l'historique après coup n'annule pas une lecture qui a peut-être déjà eu lieu.