{"id":83,"date":"2015-12-22T16:52:41","date_gmt":"2015-12-22T15:52:41","guid":{"rendered":"http:\/\/blog.vincentcharles.ovh\/?p=83"},"modified":"2017-01-08T22:05:33","modified_gmt":"2017-01-08T21:05:33","slug":"executer-une-commande-root-via-php","status":"publish","type":"post","link":"https:\/\/blog.vincentcharles.ovh\/index.php\/2015\/12\/22\/executer-une-commande-root-via-php\/","title":{"rendered":"Ex\u00e9cuter une commande root via php"},"content":{"rendered":"<p>Vous me suis retrouv\u00e9 plusieurs fois confront\u00e9 \u00e0 ce probl\u00e8me : comment ex\u00e9cuter une commande \u00ab\u00a0normalement\u00a0\u00bb r\u00e9server \u00e0 l&rsquo;utilisateur <em>root<\/em> (ou un autre) via un script <em>php<\/em>.<\/p>\n<p>Dans quel cas on peut avoir besoin de \u00e7a ? Tout simplement pour administrer un serveur d\u00e9di\u00e9 via une petite interface web toute simple, histoire de ne pas se connecter en SSH \u00e0 chaque fois.<\/p>\n<p><!--more--><\/p>\n<p>Le probl\u00e8me, c&rsquo;est que de nombreuses solutions existent mais beaucoup sont \u00ab\u00a0trop dangereuses\u00a0\u00bb pour pouvoir \u00eatre retenu :<\/p>\n<ul>\n<li>Rendre <em>apache \/ www-data<\/em> propri\u00e9taire du service\/serveur en question (MAUVAIS)<\/li>\n<li>Donner \u00e0 <em>apache \/www-data<\/em> le droit d&rsquo;ex\u00e9cuter des commandes via sudo (BOF BOF)<\/li>\n<li>Utiliser un service syst\u00e8me d\u00e9di\u00e9 \u00e0 cette tache (LOURD pour juste un ou deux services)<\/li>\n<\/ul>\n<p>J&rsquo;ai trouv\u00e9 une autre m\u00e9thode qui me parait plut\u00f4t pas mal point de vue s\u00e9curit\u00e9. Il s&rsquo;agit en fait d&rsquo;utiliser un petit code en C (<em>binary wrapper<\/em>) qui pourra ex\u00e9cuter soit :<\/p>\n<ul>\n<li>La commande ou les commandes qu&rsquo;il contient (donc compil\u00e9s \u00e0 l&rsquo;int\u00e9rieur)<\/li>\n<li>Un script (que l&rsquo;on peut donc modifier) mais qu&rsquo;il faudra prot\u00e9ger en \u00e9criture (pour \u00e9viter aux petits malins de passer d&rsquo;autres commandes \u00e0 travers).<\/li>\n<\/ul>\n<p>Le tout repose sur l&rsquo;utilisation du suid bit pour l&rsquo;attribution d&rsquo;un droit d&rsquo;ex\u00e9cution en tant qu&rsquo;administrateur de la machine (plus d&rsquo;info sur les droits : <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Permissions_UNIX\" target=\"_blank\">Permissions_UNIX<\/a>)<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Etape 1<\/strong><\/span> : On r\u00e9alise le script qui contiendra les actions \u00e0 r\u00e9aliser : <em>php_shell.sh<\/em><\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">#!\/bin\/sh\n\/sbin\/service sshd restart<\/code><\/pre><\/figure>\n<p><span style=\"text-decoration: underline;\"><strong>Etape 2<\/strong><\/span> : On prot\u00e8ge notre script (<em>php_shell.sh<\/em>) pour qu&rsquo;il appartienne \u00e0 <em>root<\/em> et qu&rsquo;il ne soit modifiable que par lui-m\u00eame :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">chown root php_shell.sh\nchmod u=rwx,go=xr php_shell.sh<\/code><\/pre><\/figure>\n<p><span style=\"text-decoration: underline;\"><strong>Etape 3<\/strong><\/span> : En C (pour faire simple, mais on pourrait utiliser un autre langage), on r\u00e9alise le code qui va permettre d&rsquo;ex\u00e9cuter en root nos fonctions contenu dans le <em>php_shell.sh<\/em> :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-c\">#include &lt;stdlib.h&gt;\n  #include &lt;sys\/types.h&gt;\n  #include &lt;unistd.h&gt;\n\n  int\n  main (int argc, char *argv[])\n  {\n     setuid (0);\n\n     \/* WARNING: Only use an absolute path to the script to execute,\n      *          a malicious user might fool the binary and execute\n      *          arbitary commands if not.\n      * *\/\n\n     system (&quot;\/bin\/sh \/path\/to\/php_shell.sh&quot;);\n\n     return 0;\n   }<\/code><\/pre><\/figure>\n<p><span style=\"text-decoration: underline;\"><strong>Etape 4<\/strong> <\/span>: On compile et prot\u00e8ge notre code C (on en profite pour le rendre ex\u00e9cutable bien sur) :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">gcc wrapper.c -o php_root\nchown root php_root\nchmod u=rwx,go=xr,+s php_root<\/code><\/pre><\/figure>\n<p><span style=\"text-decoration: underline;\"><strong>Etape 5<\/strong><\/span> : On utilise la fonction exec de php pour ex\u00e9cuter notre code compil\u00e9 (dans l&rsquo;exemple : <em>php_root<\/em>) comme ceci :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-php\">&lt;?php exec(&#039;.\/php_root&#039;); ?&gt;<\/code><\/pre><\/figure>\n<p>Remarque : le tour est jou\u00e9. Quand apache traitera une page contenant ce code php, il ex\u00e9cutera <em>php_root<\/em> qui accordera des droits <em>root<\/em> aux commandes contenus dans <em>php_shell.sh<\/em>. Attention de bien respecter les limitations (droits) de chacun des fichiers. Cela constituerait une faille de s\u00e9curit\u00e9 b\u00e9ante si tout le monde peut intervenir sur le contenu du <em>php_shell.sh<\/em>. Pour plus de s\u00e9curit\u00e9 (mais moins de flexibilit\u00e9), vous pouvez indiquer directement les commandes dans le code qui sera compil\u00e9 (plus de modification par la suite sans recompiler \u00e0 nouveau le code).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous me suis retrouv\u00e9 plusieurs fois confront\u00e9 \u00e0 ce probl\u00e8me : comment ex\u00e9cuter une commande \u00ab\u00a0normalement\u00a0\u00bb r\u00e9server \u00e0 l&rsquo;utilisateur root (ou un autre) via un script php. Dans quel cas on peut avoir besoin de \u00e7a ? Tout simplement pour administrer un serveur d\u00e9di\u00e9 via une petite interface web toute simple, histoire de ne pas&#8230;<\/p>\n","protected":false},"author":1,"featured_media":85,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,2],"tags":[17],"class_list":["post-83","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial_linux","category-tutorial","tag-niveau_moyen"],"_links":{"self":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/comments?post=83"}],"version-history":[{"count":3,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts\/83\/revisions"}],"predecessor-version":[{"id":203,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts\/83\/revisions\/203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/media\/85"}],"wp:attachment":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/media?parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/categories?post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/tags?post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}