![[Archives] Exécuter un script bash « as root » via php](https://le-guide-du-secops.fr/wp-content/uploads/2020/06/CCqOOKwUgAEs8cE.png)
[Archives] Exécuter un script bash « as root » via php
Cet article va vous permettre de découvrir comment exécuter des scripts bash demandant une élévation des privilèges par l’intermédiaire de PHP.
Table des matières
De quoi avons-nous besoin ?
Bien que cela me parait évident, il faut pour ce tutoriel avoir le paquet « sudo
» installé : apt install sudo
(Il n’est pas présent de base sur toutes les distributions).
Nous allons utiliser la commande visudo
pour pouvoir éditer le fichier sudoers. Ce dernier fournit un coffre-fort pour éditer le fichier /etc/sudoers. Le fichier sudoers détermine exactement « qui » peut exécuter des commandes. Il contrôle également les commandes qu’un utilisateur peut exécuter. Plus particulièrement pour notre objectif, il identifie si vous avez besoin d’un mot de passe pour des commandes particulières ou non.
Comment ajuster le fichier sudoers avec visudo ?
Les exemples suivants supposent que votre utilisateur Apache est www-data (par défaut).
– La mauvaise façon (rapide, mais pas du tout recommandé pour un serveur en production)
Exécuter la ligne de commande suivante :
sudo visudo -f /etc/sudoers.d/myOverrides
Ajoutez la ligne suivante :
www-data ALL = (ALL) NOPASSWD: ALL
Encore une fois, évitez cette méthode à tout prix dans un environnement de production ! C’est une mauvaise idée, car cela crée une faille de sécurité, qui pourrait être utilisée par un attaquant pour réaliser une tentative d’élévation de privilèges. Le cas échéant il pourrait exécuter n’importe quel fichier/ligne de commande sur votre serveur en tant que root. Imaginez les dégâts …
– La meilleure façon
Créez un script shell qui exécute les commandes au nom de l’utilisateur www-data.
Le but de ce petit script va être d’afficher le statut de mysql.
nano /path/to/myscript/statusMysql.sh
!/bin/bash
# Avoir le service MySQL sur votre serveur avant d’effectuer cette action
systemctl status mysql
Ajoutez la ligne suivante pour empêcher www-data de se voir demander un mot de passe lorsque vous essayez d’exécuter un script shell spécifique.
sudo visudo -f /etc/sudoers.d/myOverrides
www-data ALL = (ALL) NOPASSWD: /path/to/myscript/statusMysql.sh
Cette manière de procédé est bien plus sécuritaire, en effet comme le montre l’instruction ci-dessus, l’utilisateur www-data est autorisé a exécuter seulement le script : statusMysql.sh, et pas n’importe quelle commande ou script comme dans l’exemple précédent. (a chaque nouveau script, il faudra modifier le fichier /etc/sudoers.d/myOverrides, et ajouter le chemin absolut vers le nouveau script.)
Exemple de mon script PHP /var/www/html/test.php
exécutant le script statusMysql.sh :
<? php
echo shell_exec ("sudo /path/to/my/script/statusMysql.sh");
?>
Avant de se rendre sur la page http://ip/test.php, nous devons executer la commande suivante :
chown www-data:www-data /var/www/html/test.php
Cet commande ci-dessus est très importante, sans celle-ci, votre script retournera une page blanche, car le script n’aura pas été exécuté.
Note : statusMysql.sh, devra être propriétaire de root ou de www-data, pour pouvoir être exécuté, et disposer de droits d’exécutions (cf commande chmod).
chown www-data:www-data /path/to/my/script/statusMysql.sh
Je pars du principe que mon script php sera localisé à la racine de mon serveur WEB. http://votre-ip/test.php

Cet exemple est simpliste, mais imaginez la possibilité que cela vous donne, pour exécuter d’autres scripts shell / commandes par l’intermédiaire d’une interface WEB…
À bientôt 🙂
Brlndtech