lancer un bash avec php-apache

lancer un bash avec php-apache - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 10-09-2016 à 15:33:23    

:hello: tout le monde j'ai besoin de votre aide.
 
Je voudrais lancer un bash depuis une page php.
 
J'ai pour l'instant fait un bash juste pour faire des essais, le voici :

Code :
  1. #!/bin/bash
  2. echo 'azerty'
  3. mount /dev/sdb1 /mnt/cle


 
Je l'ai placé à la racine /test_bash.sh avec les attributs 777 pour les essais.
 
Voilà mon php :

Code :
  1. <?php
  2. $output = shell_exec('/test_bash.sh 2>&1');
  3. echo "<pre>";
  4. print_r($output);
  5. echo "</pre>";
  6. ?>


 
Le fichier /etc/sudoers :

Code :
  1. root ALL=(ALL:ALL) ALL
  2. www-data ALL = (root) NOPASSWD: /test_bash.sh


 
Et le résultat de :

Code :
  1. azerty
  2. mount: only root can do that


 
Impossible de lancer mon bash.
 
Comment y parvenir ?
 
Merci pour votre aide.

Reply

Marsh Posté le 10-09-2016 à 15:33:23   

Reply

Marsh Posté le 10-09-2016 à 19:27:48    

"sudo /test_bash.sh" peut-être ?


---------------
The Mystery of the Bloomfield Bridge
Reply

Marsh Posté le 10-09-2016 à 20:05:18    

J'ai reussi
 
Reste à sécuriser.
 
/etc/sudoers :
 

Code :
  1. www-data ALL=NOPASSWD: /save_rsync.sh start
  2. www-data ALL=NOPASSWD: /maj_rsync.sh start


 
1er fichier php dans  /var/www/administrateur/sauvegarder.php :
 

Code :
  1. <?php
  2. $output = exec('sudo /save_rsync.sh start');
  3. echo "<pre>";
  4. print_r($output);
  5. echo "</pre>";
  6. ?>


 
2e fichier php dans  /var/www/administrateur/maj.php
 

Code :
  1. <?php
  2. $output = exec('sudo /maj_rsync.sh start');
  3. echo "<pre>";
  4. print_r($output);
  5. echo "</pre>";
  6. ?>


 
1er fichier bash dans /save_rsync.sh avec attributs 770
 

Code :
  1. #!/bin/bash
  2. # Demander le montage de la clé USB.
  3. source /monter_cle.sh
  4. if [ `grep -c "/mnt/cle" /etc/mtab` -eq 0 ]
  5. then
  6.  echo "La clé n'est pas montée"
  7. else
  8.  nom_dossier=$( date +%d_%m_%y-%Hh%M )_maison
  9.  rsync -a /var/www/ /mnt/cle/sauvegarde/$nom_dossier
  10.  mkdir /mnt/cle/sauvegarde/$nom_dossier/_
  11.  USER="root"
  12.  PASS="*****"
  13.  HOST="localhost"
  14.  BASE_SQL="maintenance"
  15.  mysqldump --opt -h$HOST -u$USER -p$PASS $BASE_SQL > /mnt/cle/sauvegarde/$nom_dossier/_/maintenance.sql
  16.  USER="root"
  17.  PASS="*****"
  18.  HOST="localhost"
  19.  BASE_SQL="td"
  20.  mysqldump --opt -h$HOST -u$USER -p$PASS $BASE_SQL > /mnt/cle/sauvegarde/$nom_dossier/_/td.sql
  21.  # Demander le démontage de la clé USB.
  22.  source /demonter_cle.sh
  23. fi


 
2e fichier bash dans /maj_rsync.sh avec attributs 770
 

Code :
  1. #!/bin/bash
  2. # Demander le montage de la clé USB.
  3. source /monter_cle.sh
  4. # Tester si la clé est montée. Si la clé n'est pas montée retourne 0.
  5. if [ `grep -c "/mnt/cle" /etc/mtab` -eq 0 ]
  6. then
  7.  echo "    /!\ Echec la clé n'est pas montée."
  8. else
  9.  # Aller dans le dossier sauvegarde de la clé USB.
  10.  cd /mnt/cle/sauvegarde
  11.  # Création de la variable dossier_save.
  12.  # dossier_save = dernier dossier modifié.
  13.  dossier_save=$(ls -1t | head -1)
  14.  echo $dossier_save
  15.  # Mise à jour de /var/www/
  16.  rsync -a --exclude '_/' --delete-after /mnt/cle/sauvegarde/$dossier_save/ /var/www
  17.  # Mise à jour de la base données.
  18.  USER="root"
  19.  PASS="*****"
  20.  HOST="localhost"
  21.  BASE_SQL="maintenance"
  22.  # Vider les tables.
  23.  mysqldump -u$USER -p$PASS --add-drop-database --add-drop-table --no-data $BASE_SQL > /root/bash/dumpfile.sql
  24.  mysql -u$USER -p$PASS $BASE_SQL < /root/bash/dumpfile.sql
  25.  # Mettre la base de données à jour
  26.  mysql -h$HOST -u$USER -p$PASS $BASE_SQL < $dossier_save/_/maintenance.sql
  27.  # Mise à jour de la base données.
  28.  USER="root"
  29.  PASS="*****"
  30.  HOST="localhost"
  31.  BASE_SQL="td"
  32.  # Vider les tables.
  33.  mysqldump -u$USER -p$PASS --add-drop-database --add-drop-table --no-data $BASE_SQL > /root/bash/dumpfile.sql
  34.  mysql -u$USER -p$PASS $BASE_SQL < /root/bash/dumpfile.sql
  35.  # Mettre la base de données à jour
  36.  mysql -h$HOST -u$USER -p$PASS $BASE_SQL < $dossier_save/_/td.sql
  37.  # Demander le démontage de la clé USB.
  38.  source /demonter_cle.sh
  39. fi

Reply

Marsh Posté le 10-09-2016 à 21:22:52    

Si ton script est modifiable par ton utilisateur, alors il n'y a aucune sécurisation, tu viens de donner l'autorisation de lancer toutes les commandes du monde en root, puisque rien n'empêche d'éditer le script et de mettre toutes les commandes qu'il veut dedans.
 
Tes scripts devraient appartenir à l'utilisateur root, avec des droits en 755.
 
Edit : Vu que tu as des mdp dans ton script, plutot root + groupe auquel appartient ton user, et droits en 750, ou, mieux, tu n'autorises pas à lancer le script entier via sudo mais juste les commandes qui en ont besoin (genre mount et umount).


Message édité par ccp6128 le 11-09-2016 à 17:43:30
Reply

Marsh Posté le 12-09-2016 à 09:13:03    

+1  
PHP ne devrait pas lancer de script shell, question de sécurité de base.
 
Après question stupide : pourquoi un script shell ?
De quoi as-tu besoin qui doivent se lancer à partir de ton PHP ?


---------------
#TeamNoBidouille || Come to the Dark Side, we have cookies || Mangez 5 fruits et légumes par an ! || Le digital, c'est les doigts
Reply

Marsh Posté le 12-09-2016 à 13:52:50    

Idem qu'au dessus, lancer un shell, sous root, depuis le compte du serveur web, c'est extrêmement dangereux.
 
Si tu n'as pas de besoin de réactivité énorme, le mieux serait a mon avis de passer par un traitement asynchrone : ton appli PHP dépose un flag dans un dossier quelconque de l'arborescence web (ou si tu as une base de données, un demande dans l'une des tables), et tu as un cron root (ou autre user avec sudo) qui tourne toutes les X secondes/minutes qui traite les demandes en attente.
 
Si tu as besoin de travailler en mode synchrone par contre, c'est plus compliqué. La seule solution que je vois comme ça, c'est de passer par un daemon qui tourne sous un user autre, et qui contrôle ce qui est demandé pour le déclencher via sudo. Ça évite que ton serveur web ait un droit sudo, mais tu restera vulnérable à certaines attaques :(

Reply

Marsh Posté le 12-09-2016 à 14:04:38    

c'est quoi le risque exactement à lancer un script en root avec sudo depuis l'utilisateur d'apache ? (sans avoir les droits d'écriture sur le script)


---------------
The Mystery of the Bloomfield Bridge
Reply

Marsh Posté le 12-09-2016 à 14:31:11    

Ivy gu a écrit :

c'est quoi le risque exactement à lancer un script en root avec sudo depuis l'utilisateur d'apache ? (sans avoir les droits d'écriture sur le script)


Ben ton contexte d'éxécution obtient l'élévation des privilèges root.
Du coup une attaque pouvant injecter du code (par exemple) le lancera avec les droits root.
Ce sera open bar pour lui.


---------------
#TeamNoBidouille || Come to the Dark Side, we have cookies || Mangez 5 fruits et légumes par an ! || Le digital, c'est les doigts
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed