Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
Je veux exécuter ma_commande
en root, je peux utiliser différents moyens. Mais tous ne se valent pas.
Voici les différentes méthodes que nous allons comparer:
root
depuis le TTY ([Ctrl]+[Alt]+[F1]/[F2]/etc. puis entrer ma_commande
su
puis entrer ma_commande
su -c “ma_commande”
su -l
puis entrer ma_commande
su -l -c “ma_commande”
sudo ma_commande
sudo -s
puis entrer ma_commande
sudo -i ma_commande
sudo -i
puis entrer ma_commande
Lorsque l'on utilise su
sans spécifier d'utilisateur, c'est implicitement les droits de root que l'on cherche à obtenir. Et c'est également le mot de passe de l'utilisateur root qui nous est demandé.
Dans certains cas, l'utilisateur root s'est vu désactiver son mot de passe (c'est le cas par défaut sous ubuntu, ou sous debian si l'on laisse le mot de passe root vide lors de l'installation). Dans ce cas, on ne peut ni se connecter en root depuis le TTY, ni taper utiliser une des méthodes su
ci-dessus.
Lorsque l'on utilise sudo
, c'est (sauf si vous vous êtes amusés à configurer votre fichier /etc/sudoers
différemment) le mot de passe de l'utilisateur courant qui est demandé.
Sous debian, par défaut, seuls les utilisateurs membres du groupe sudo
sont autoriser à utiliser la commande sudo
pour obtenir les droits root.
En particulier, si vous avez installé Debian sans mettre de mot de passe root, le premier utilisateur que vous avez créé a été ajouté automatiquement au groupe sudo
et a donc le droit d'utiliser la commande.
sudo
. Attention cependant à ne pas scier la branche sur laquelle vous êtes assis !
Une première différence entre ces différentes commandes est que certaines ouvrent un shell en tant que root, alors que d'autres se contentent d'exécuter une seule commande avec les droits root puis vous ramènent dans votre shell utilisateur.
Les méthodes suivantes vous ouvrent un shell, dans lequel vous pouvez taper autant de commande que vous voulez, qui seront exécutées avec les droits root:
root
depuis le TTY ([Ctrl]+[Alt]+[F1]/[F2]/etc. puis entrer ma_commande
su
puis entrer ma_commande
su -l
puis entrer ma_commande
sudo -s
puis entrer ma_commande
sudo -i
puis entrer ma_commande
Alors que les commandes suivantes ne permettent que d'exécuter une commande à la fois :
su -c “ma_commande”
su -l -c “ma_commande”
sudo ma_commande
sudo -i ma_commande
Outre les droits d'exécution d'un programme, un point que l'on néglige souvent ou que l'on oublie de mentionner, c'est l'importance des variables d'environnement et du dossier de travail.
Afin de savoir depuis quel dossier seront exécutées les différentes commandes, faisons un test avec pwd
, qui est une commande affichant le dossier courant (print work directory). Et avant de lancer les commandes, nous allons nous placer dans /tmp
avec cd
Méthode utilisée | pwd |
connexion root depuis le TTY + ma_commande | /root |
su + ma_commande | /tmp |
su -c “ma_commande” | /tmp |
su -l + ma_commande | /root |
su -l -c “ma_commande” | /root |
sudo ma_commande | /tmp |
sudo -s + ma_commande | /tmp |
sudo -i ma_commande | /root |
sudo -i + ma_commande | /root |
/root
, ce qui n'est pas forcément ce que vous voulez et peut-être dangereux, alors que certaines vous laissent dans le dossier courant, ce qui n'est pas forcément ce que vous voulez et peut-être dangereux… aussi
Le PATH
est une variable d'environnement très importante. C'est une liste de dossiers séparés par des :
. Lorsque vous tapez une commande dans le terminal, par exemple rm
, le shell va chercher dans les dossiers du PATH un par un, pour voir s'ils contiennent un binaire exécutable rm
. C'est le fichier du premier dossier (de gauche à droite) qui sera sélectionné.
En revanche, si aucun des dossiers du PATH ne contient rm
, le shell renverra l'erreur suivante :
rm: Aucun fichier ou dossier de ce type
Vous pouvez tester en ouvrant un nouveau terminal et en tapant
PATH="" rm /tmp/un-fichier-qui-nexiste-pas
Tout ceci serait inconséquent si root et utilisateurs avaient le même PATH. Mais ce n'est pas le cas.
Le PATH d'un utilisateur est habituellement: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
, parfois on trouve également $HOME/.local/bin
ou $HOME/bin
.
Le PATH de root est: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
On voit que par exemple /sbin
n'est pas dans le PATH de l'utilisateur, alors que /usr/games
n'est pas dans le PATH de root.
Ainsi, ip
renverra une erreur dans le shell de l'utilisateur, alors que /sbin/ip
l'exécutera sans problème.
Si un programme s'attend à être exécuté en root avec un PATH de root, alors il ne fonctionnera pas si le PATH n'est pas celui de root.
En remplaçant ma_commande
par sh -c 'printf %s\\n $PATH'
, vous pouvez obtenir les différents PATH.
Méthode utilisée | $PATH |
connexion root depuis le TTY + ma_commande | celui de root |
su + ma_commande | celui de l'utilisateur |
su -c “ma_commande” | celui de l'utilisateur |
su -l + ma_commande | celui de root |
su -l -c “ma_commande” | celui de root |
sudo ma_commande | celui de root |
sudo -s + ma_commande | celui de root |
sudo -i ma_commande | celui de root |
sudo -i + ma_commande | celui de root |
su
ou su -c
, sauf si l'on ne veut pas exécuter de commande propre à root.
Pour vous rendre compte des différences entre les environnements des différentes commandes, je vous invite à taper la commande « env » via les différentes méthodes ci-dessus.
Pour synthétiser:
Méthode utilisée | env |
connexion root depuis le TTY + ma_commande | celui de root |
su + ma_commande | celui de l'utilisateur |
su -c “ma_commande” | celui de l'utilisateur |
su -l + ma_commande | celui de root + morceaux de celui de l'utilisateur |
su -l -c “ma_commande” | celui de root + morceaux de celui de l'utilisateur |
sudo ma_commande | celui de root + morceaux de celui de l'utilisateur |
sudo -s + ma_commande | celui de root + morceaux de celui de l'utilisateur |
sudo -i ma_commande | celui de root + morceaux de celui de l'utilisateur |
sudo -i + ma_commande | celui de root + morceaux de celui de l'utilisateur |
Voici en exemple ce que j'ai chez moi…
==> su <== (gros bazar) ==> sudo <== COLORTERM=rxvt-xpm DISPLAY=:0 HOME=/root LANG=fr_FR.utf8 LC_ALL=fr_FR.utf8 LOGNAME=root 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:mi=00: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:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=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:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=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:*.webp=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:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=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:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: MAIL=/var/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash ==> sudo -i <== COLORTERM=rxvt-xpm DISPLAY=:0 HOME=/root LANG=fr_FR.utf8 LC_ALL=fr_FR.utf8 LOGNAME=root 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:mi=00: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:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=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:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=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:*.webp=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:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=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:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: MAIL=/var/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/root ==> sudo -s <== COLORTERM=rxvt-xpm DISPLAY=:0 HOME=/root LANG=fr_FR.utf8 LC_ALL=fr_FR.utf8 LOGNAME=root 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:mi=00: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:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=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:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=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:*.webp=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:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=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:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: MAIL=/var/mail/root OLDPWD=/tmp PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ==> su -l <== HOME=/root LANG=fr_FR.UTF-8 LOGNAME=root MAIL=/var/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/root SHELL=/bin/bash SHLVL=1 TERM=screen-256color USER=root
Vous remarquerez de subtiles différences entre chacun des environnements.
Lorsque qu'on souhaite prendre le contrôle d'une machine, on vise bien souvent les droits root, mais pas nécessairement. Qui plus est, il est en général nécessaire de d'abord obtenir un shell utilisateur en guise d'étape intermédiaire.
Si l'on utilise sudo, un attaquant ayant obtenu le mot de passe utilisateur pourra immédiatement devenir root.
Si l'on n'utilise pas sudo, un attaquant ayant obtenu le mot de passe utilisateur devra encore obtenir le mot de passe root, ou trouver un moyen de leurrer l'utilisateur pour l'obtenir. Inversement, si l'attaquant a un accès physique à la machine, il lui suffira d'obtenir le pass root directement, sans avoir à trouver le pass utilisateur.
Reste qu'en fait, la différence n'est pas si importante que ça. En effet, une fois le mot de passe utilisateur obtenu, il est aisé d'effacer tous ses fichiers, ou de les chiffrer, ou de les récupérer, ou de rajouter des « pièges » pour récupérer ce que l'utilisateur écrit au clavier.