Démarrer Teamviewer en php

Bonjour tout le monde,

Pour info je tourne su un Mint base Debian et non un Debian tout court mais je pense pas que ça change grand chose…

Je suis actuellement sur un petit projet pour effectuer des test matériels en bootant sur des clé USB et une appli web démarre pour lancer les test.

En plus de ça il y aura un bouton TeamViewer pour que l’on puisse prendre accès à distance. Seulement je suis confronté à un problème pour ce bouton.

Quand je me mets en terminal et que je lance teamviewer via un script qui contient tout simplement : “sudo -u bimedia teamviewer” tout marche nickel (je suis à ce moment là loguer avec mon utilisateur clasique). Ensuite lorsque je passe par le php rien ne se passe.

J’ai modifier mon visudo pour donner les droits à l’utilisateur www-data :

Mon code php :

Que ce sois par mon script ou bien par la commande directement j’obtient toujours la même erreur, il veux créer le répertoire /root. Log du apache.error :

mkdir: cannot create directory `/root': Permission denied mkdir: cannot create directory `/root': Permission denied mkdir: cannot create directory `/root': Permission denied mkdir: cannot create directory `/root': Permission denied mkdir: cannot create directory `/root': Permission denied

Si quelqu’un pouvais m’aider je m’arrache les cheveux et je n’arrive pas ^^

Si vous voulez la moindre info n’hésitez pas il y a surement des info que j’ai oublié j’ai le cerveau en compote ^^

Merci par avant !

Il faudrait avoir le code de teamviewer.sh mais en général c’est une question de PATH et de répertoire initial.

Il y a rien d’autre dans mon script, c’est juste que j’avais remarqué que c’est www-data qui lançais la commande et j’ai l’impression qu’il la lance en tant que root chose qu’il ne faut pas car j’ai lus que lancer TV en root ça pose des problème (cas que j’ai vérifier car il utilise wine).

Là j’ vois pas pourquoi il a besoin à un accès à /root en plus…

plutôt que la méthode (crado) sudo avec www-data, je ferais plutôt un petit wrapper en C :

#include "stdio.h"
#include "unistd.h"

// remplacer la valeur UID par celle de l'utilisateur voulu! (commande : id <utilisateur> dans un shell)
#define UID 1000

int main (int argc, char *argv[])
{
        if (setuid(UID)) {
                perror("setuid error! ");
                return 1;
        }
        printf("my uid is : %d\n", getuid());
        execl("/path/complet/vers/exe/teamviewer", "/path/complet/vers/exe/teamviewer", "argument_eventuel_1" , (char *) 0);
        return 0;
}

puis compiler ce ptit truc : gcc -o /usr/local/bin/tv_wrapper tv_wrapper.c

enfin, chown de cet exe avec l’utilisateur “user” qui doit lancer teamviewer, puis ne pas oublier le bit setuid :

chown user:user /usr/local/bin/tv_wrapper chmod 4755 /usr/local/bin/tv_wrapper

à adapter/tester (et dire si ça fonctionne :stuck_out_tongue: )

EDIT: code corrigé (UID était 0 = root)

Dans tous les cas met de toute façon

www-data ALL=(bimedia) NOPASSWD: /var/www/teamviewer.sh car tu introduis sinon une faille béante en autorisant www-data à faire n’importe quoi en root.

Ensuite regardes l’environnement du script, à tout les coups sa variable d’environnement HOME n’est pas définie et au lieu de créer ~/root, il crée /root. Bref compare les environnements dans les deux cas.

[quote=“agentsteel”]plutôt que la méthode (crado) sudo avec www-data, je ferais plutôt un petit wrapper en C :

#include "stdio.h"
#include "unistd.h"
int main (int argc, char *argv[])
{
        if (setuid(0)) {
                perror("setuid bit not set!");
                return 1;
        }
        execl("/path/complet/vers/exe/teamviewer", "/path/complet/vers/exe/teamviewer", "argument_eventuel_1" , (char *) 0);
        return 0;
}

puis compiler ce ptit truc : gcc -o /usr/local/bin/tv_wrapper tv_wrapper.c

enfin, chown de cet exe avec l’utilisateur “user” qui doit lancer teamviewer, puis ne pas oublier le bit setuid :

chown user:user /usr/local/bin/tv_wrapper chmod 4755 /usr/local/bin/tv_wrapper

à adapter/tester (et dire si ça fonctionne :stuck_out_tongue: )[/quote]

Oui mais comment tu le lance depuis l’interface web ? Car c’est le but en faite ^^

Merci fran.b mais www-data à besoin des droit sudo pour passer de nombreuses commandes aussi je devrais rajouter une ligne du style :

PS : Je suis pas un dev pour info je suis plus dans le réseau normalement ^^

Bon rapidement:
1)

www-data ALL=(francois) NOPASSWD: /home/francois/test
dans /etc/sudoers.d/test

/var/www/t.php

[code]

<?php exec("sudo -u francois /home/francois/test",$test); for ($index = 0; $index < count($test); $index++) { echo $test[$index]."
"; } echo "\n"; ?>

[/code]

  1. Exécutions:
    a) Direct sous www-data:

[...] export _='/bin/su' www-data uid=33(www-data) gid=33(www-data) groupes=33(www-data)
b) Exécution par moi

./test export COLORTERM='Terminal' export DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-RHF7efJ8c2,guid=ca885bfc7d4a1e6df6bfba6d00000010' export DESKTOP_SESSION='lightdm-xsession' export DISPLAY=':0.0' export GDMSESSION='lightdm-xsession' export GLADE_CATALOG_PATH=':' export GLADE_MODULE_PATH=':' export GLADE_PIXMAP_PATH=':' export GNOME_KEYRING_CONTROL='/tmp/keyring-OD5IoP' export GNOME_KEYRING_PID='3130' export HOME='/home/francois' export LANG='fr_FR.UTF-8' export LIBGLADE_MODULE_PATH=':' export LOGNAME='francois' export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:' export PATH='/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/sbin:/sbin' export PWD='/home/francois' export SESSION_MANAGER='local/portos:@/tmp/.ICE-unix/3177,unix/portos:/tmp/.ICE-unix/3177' export SHELL='/bin/bash' export SHLVL='1' export SSH_AGENT_PID='3157' export SSH_AUTH_SOCK='/tmp/ssh-ZsafXgSX3139/agent.3139' export TERM='xterm' export USER='francois' export USERNAME='francois' export WINDOWID='44040288' export XAUTHORITY='/home/francois/.Xauthority' export XDG_CONFIG_DIRS='/etc/xdg' export XDG_DATA_DIRS='/usr/local/share:/usr/share' export XDG_MENU_PREFIX='xfce-' export XDG_SEAT_PATH='/org/freedesktop/DisplayManager/Seat0' export XDG_SESSION_COOKIE='bbd486d3448a1144b0c5751300000b7b-1377095674.569320-1805019319' export XDG_SESSION_PATH='/org/freedesktop/DisplayManager/Session0' export _='./test' francois uid=1000(francois) gid=1000(francois) groupes=1000(francois),4(adm),7(lp),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(fuse),105(scanner),108(lpadmin),110(netdev),116(bluetooth),124(vboxusers),125(sambashare),201(powerdev)

c) Exécution par le t.php (localhost/t.php)

export HOME='/home/francois' export LANG='C' export LOGNAME='francois' export MAIL='/var/mail/francois' export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' export PWD='/var/www' export SHELL='/bin/sh' export SUDO_COMMAND='/home/francois/test' export SUDO_GID='33' export SUDO_UID='33' export SUDO_USER='www-data' export TERM='unknown' export USER='francois' export USERNAME='francois' francois uid=1000(francois) gid=1000(francois) groups=1000(francois),4(adm),7(lp),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(fuse),105(scanner),108(lpadmin),110(netdev),116(bluetooth),124(vboxusers),125(sambashare),201(powerdev)(coopier/coller en direct brutal). Ça marche mais l’environnement est différent. Note que $HOME est correct contrairement à ce que je supposais. Encore une fois il faut voir le script que tu lances.

Toutes les commandes faites dans le script «test» seront faites par «francois» et non www-data. Inutile de donner plus de droit à www-data. Par contre il faut blinder le script test mais c’est plus simple. Ne fais pas cette erreur de donner les droits root (via sudo) à celui qui trouve une faille dans ton serveur web.

tu appelles le programme /usr/local/bin/tv_wrapper dans ton shell_exec() php…
logique non? :stuck_out_tongue:

agentsteel: Le pbm est que n’importe qui peut lancer le programme. Quel est l’intérêt de la méthode par rapport à sudo? (mis à part éviter de le paramétrer)

l’intérêt, c’est que c’est plus propre non?

de plus le programme n’étant pas dans l’arborescence du serveur web, ça limite pas mal les problèmes.

(ceci étant dit, j’aimerais bien que l’auteur du topic teste la solution, au moins pour être sûr que ça fonctionne!)

Le fait de le mettre dans l’arborescence est une erreur de TrashHard, ça c’est sûr (dans mon exemple l est dans mon répertoire perso), mais quel est l’avantage d’un wrapper en C avec un bit suid (qui donne les autorisations à tous) par rapport à

sudo -u user pgm?

Parce que pour le code en PHP ça ne change strictement rien, le programme appelé étant ce que l’on veut avec le sudo sans binaire intermédiaire.

Je n’aime pas sudo pour l’administration mais pour des droits précis, c’est impeccable.

Pour moi l’avantage du wrapper en C, c’est quand tu as besoin des droits root, pour pouvoir modifier un fichier de conf, (re)lancer un service, etc…

Mais c’est vrai que sur les machines ou j’utilise cette solution, il n’y a pas d’autre utilisateur régulier unix (autre que moi), ce qui limite les risques :stuck_out_tongue:

D’un autre côté, dans le cas présent, est-ce un problème si “tout le monde” peut lancer teamviewer? J’aime à penser que ce dernier demande un mot de passe pour pouvoir prendre la main sur le poste.

Mais sinon ta solution (avec un seul sudo, et pas 2 ou 3 sudo en cascade) est correcte aussi.

Désolé j’ai pas eu le temps de tester les solutions aujourd’hui j’ai eu trop de boulot et on ma volé ma clé USB avec mon Mint dessus j’ai passé l’aprèm à refaire la clé.

Le fais de mettre plusieurs sudo en cascade c’était pour tester et voir les conf ce qu’il disait de différent, et ça changeais rien du tout.

Je testerais tout ça vendredi je suis en repos demain, mais j’ai peux que le fait de mettre :

Me cause plus de soucis que ça en ressoude, par rapport au autre commande j’ai peur de devoir être obligé de les passer par un sudo, mais j’essayerais.

PS : Niveau sécurité c’est pas un problème, on peux faire un truc dégueulasse ouvert de partout ce n’est pas très gênant (même si c’est mieux de faire un truc propre), l’application ne sera pas ouverte au public et l’OS étant sur une clé USB il sera régulièrement éteint :slightly_smiling:

Je vous tiens au courant dès que je peux faire mes test :wink:

Attention, remplace ici francois (c’est moi) par bimedia et /home/francois/test par /var/www/teamviewer.sh

C’était un exemple sur comment faire.
Cela marche chez moi.

J’ai voulu vérifier mon bout de code, mais problème : je suis sous Wheezy avec php 5.4.x, et le safe_mode a été supprimé de php, du coup comment on peut utiliser shell_exec()?

(désolé je suis un noob en php :075 )

EDIT : tant pis pour le PHP, j’ai fait un petit cgi en bash

#!/bin/bash
echo "Content-type: text/html"
echo
echo

echo "cgi running..."
echo

output=$(/var/www/tmp/a.out)
echo "<PRE>$output</PRE>"
 
exit 0

qui appelle donc l’exécutable “a.out” dont voici le code C :

#include "stdio.h"
#include "unistd.h"


#define UID 1000

int main (int argc, char *argv[])
{
        printf("before setuid(), my uid is : %d\n", getuid());
        if (setuid(UID)) {
                perror("setuid error!");
                return 1;
        }
        else {
                printf("after setuid(), my uid is : %d\n", getuid());
        }
        return 0;
}

si on oublie pas de mettre le bit setuid sur l’exécutable (ce dernier appartenant à root:root), ça fonctionne :
(résultat du CGI dans le navigateur)

[code]
cgi running…

before setuid(), my uid is : 33
after setuid(), my uid is : 1000[/code]

33 correspond à l’uid de www-data (le serveur web)
1000 correspond à l’utilisateur défini dans l’appel à setuid()

Salut les jeunes,

Bon j’ai testé avec le C donc voilà les résultats :
En lançant le tv_wrapper TeamViewer se lance correctement que ce sois en root ou bien en utilisateur bimedia

Par contre quand je tente de le lancer depuis mon php rien ne se passe. Je check mes log php mais rien non plus, Ais-je fais une erreur quelques pars ?

Viduso :

#%sudo ALL=(ALL:ALL) ALL www-data ALL=(bimedia) NOPASSWD: /var/www/tv_wrapper www-data ALL=(ALL) NOPASSWD:ALL

Code php :

Que je le lance en sudo ou en sudo -u ça ne change rien je vous avoue que je ne comprend pas trop j’ai l’impression qu’il ne se lance même pas en faite car en le lançant en terminal c’est Ok

J’essaye de trouver des logs qui m’aiderais un peux plus

[quote]C’était un exemple sur comment faire.
Cela marche chez moi.[/quote]
En faisant quoi ? Un Sheel_exec sur le script .sh qui contient un “sudo -u user teamviewer” ?
Et en mettant le visudo

Merci en tout cas de m’accorder du temps :slightly_smiling:

Le bouton TV est passé en second plan mais je pense que même si je le finis pas je le ferais sur temps perso quand j’aurais commencé la rentré scolaire.

Tu as quelle version de PHP? Si c’est la 5.4.x sous Wheezy regarde mon message plus haut :wink:

Tu as le codz PHP utilisé dans mon message. Je ne vois pas quoi dire de plus.

J’ai essayé avec ton code php mais pas moyen de le lancer, je pense que je doit avoir un problème en amont mais je sais pas où encore exactement…

J’essayerais sur une VM chez moi voir si ça passe mieux, je dois passer cette étape pour le moment pour pouvoir continuer sur le reste de mon projet un peux.

Merci pour tout quand même et je tiens au jus si je trouve quelques chose

J’avais soulevé le fait que les fonctions *exec() de PHP 5.4.x ne fonctionnent plus puisque le safe_mode a été supprimé depuis cette version :stuck_out_tongue: