Backdoors "faciles" (2/..)
hihihi (15/09/2K)
variable d'environnement PATH
Cinac






      _________
_____/  INTRO  \_________________________________________________
 

Sous Linux il existe des reperes tant pour les utilisateurs que pour les programmes permettant d'avoir un acces facile aux informations essentielles et à quelques paramètrages simples. Par exemple savoir facilement quel est le repertoire home d'un utilisateur logué de manière a recuperer dans son home un fichier de configuration tel que .bashrc par exemple (nous reviendrons sur ce fameux .bashrc ;). Ce sont les variables d'environnement. Je vous parlais de comment connaitre le répertoire home d'un utilisateur, la variable s'appelle ici tout simplement HOME et son contenu est visible de cette maniere:

$echo $HOME
/home/Cinac
$

Il existe tout un tas de variables d'environement pour toutes sortes de choses comme par exemple connaitre le nom de l'OS sur lequel tourne le programme ou connaître la langue de l'utilisateur ou connaître le nom de l'ordinateur ou le nom de la derniere commande qui vient d'être tapé ou encore l'emplacement du fichier d'historique de ces dites commandes. Vous pouvez aussi créer vos propres variables d'environnement pour faire le même office que le presse papier (copie, coller,couper) sous Windows à la différence qu'ici le nombre de presse papier différents est presque illimité :). Si vous voulez voir toutes les variables existantes (que vous les ayez créées ou que le systeme ou un autre utilisateur s'en soit chargé) ayez recours à la commande set.

$set
BASH : /bin/bash
BASH_VERSION : 1.14.7(1)
BROWSER : /usr/bin/netscape
...
$

Prenons maintenant un exemple concret. Imaginons que l'on doive souvent aller dans le repertoire /etc/rc.d/init.d on va procéder comme suit:

#RCD=/etc/rc.d/init.d
#cd /           (là on rescends à la racine)
#cd $RCD        (et hop ça nous fait revenir à /etc/rc.d/init.d)
 

      _______________________
_____/ DANS LE VIF DU SUJET: \____________________________________

Parmi toutes ces variables il y en a une qui va nous intéresser particulierement c'est la variable PATH. Visionnez en le contenu vous allez probablement voir de quoi il sagit (echo $PATH). Cette variable contient un ou plusieurs chemins, tous séparés par ":".

$echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
 

La variable PATH sert de stockage aux chemins d'acces que l'on n'a pas envie de retaper a chaque fois pour executer un programme courament utilisé. Par exemple si vous tapez ls -l vous executez en fait le programme ls qui se trouve dans /bin avec l'option -l. PATH sert à ne pas avoir à taper /bin/ls -l. Et si quand vous tapez ls -l le programme ls s'execute bien c'est bien parce que le chemin /bin se trouve dans PATH. Mais les programmes que vous exécutez sans forcement savoir où ils se trouvent ne se trouvent pas forcement dans /bin, d'où l'interet que la variable PATH contienne plusieurs chemins. Donc si vous retracez la maniere dont un ls s'execute vous vous apercevrez que le systeme va d'abord chercher le programme dans /bin, puis s'il ne le trouve pas il va le chercher dans /sbin, puis dans /usr/bin... jusqu'a ce qu'il le trouve. Et ce dans l'ordre dans lequel il est defini dans PATH. S'il ne le trouve pas il renverra un message d'erreur simple comme quand vous tapez stratx au lieu de startx :)

Bon a present reflechissez a ce qu'il va se passer si vous mettez au debut du PATH un chemin comme /home/Cinac et que dans le repertoire /home/Cinac vous créez un programme appelé ls par exemple :)

On va essayer on verra bien ;p
 

$vi ls.c
  #include <stdio.h>
  #include <unistd.h>
  main ()
  {
    printf("salut :)\n");
    system("/bin/ls");
    return(0);
  }
:wq!
$cc ls.c -o ls
$echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
$ls
rootkit ls ls.c
$PATH=/home/Cinac:$PATH
$echo $PATH
/home/Cinac:/sbin:/bin:/usr/sbin:/usr/bin
$ls
salut :)
rootkit ls ls.c
$

hihihi vous avez vu c'est tres simple et c'est puissant, l'interet n'étant pas de mettre un printf("salut\n"); mais un jeu de commande permettant par exemple de binder un port en listen ou de rajouter une ligne dans l'/etc/shadow ou une autre connerie du genre :) Bon dans l'exemple ci-dessus j'ai rajouté /home/Cinac: au début du PATH mais j'aurais pu juste mettre ".:" au debut du PATH de manière à ce que le premier répertoire dans lequel le systeme va rechercher ls soit le repertoire dans lequel vous étiez quand vous avez tapé ls.

Vous avez du vous demander, tout au long de la demonstration, pourquoi on ne remplacait tout simplement pas le vrai ls, celui qui se trouve dans /bin. Bien on pourrait le faire mais ce n'etait pas le sujet de cet article. Cependant il est clair que d'inclure un jeu de commande dans une source publique (oui on ne va pas refaire son propre ls vu que Linux est open source), de compiler et ensuite de remplacer par l'ancien est une excellente methode mais pourquoi le faire au ls alors qu'on peut le faire au login car il est clair qu'il est toujours utilisé :)
 

      ______________
_____/ CODE SOURCE: \________________________________________

Bon la j'ai pas vraiment pigé pourquoi je voulais mettre des codes sources... Peut-être parce que ce jour là j'avais vraiment envie de coder :) Bref je vous ai fait deux sources, l'une en C, l'autre en perl vous permettant de mettre directement /home/Cinac au début du PATH. Vous allez voir (bah ouais je commente mes sources) que c'est pas aussi simple de le faire dans un programme que dans un shell pour des raisons de changement de stack. Je vous laisse apprecier:

* En C:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <errno.h>

    char contientpath[];
    char contienttout[];
    extern char ** environ;
    int pidd;

    int main(void)
    {
    strcpy(contienttout,"/home/Cinac:");
    strcpy(contientpath,getenv("PATH"));    /*On prends le contenu de PATH*/
    strcat(contienttout,contientpath);      /*On concatene avec /home/Cinac:*/
    setenv("PATH",contienttout,1);          /*On met le tout dans le PATH mais setenv() est*/
                                            /*une buildin donc ca fork et on change de pid*/
    pidd=fork();                            /*Donc on refork pour que PATH soit*/
    if (pidd==0)                            /*pris en compte dans ce shell*/
       {
       execle("/bin/sh","exit",0,environ);  /*Ca c'est pour revenir au premier shell,*/
       }                                    /*celui dans lequel on a changé le PATH*/
    else
       {
       wait(NULL);                          /*On attends la fin du processus père*/
       }
    return(0);
    }
 

* En Perl:
    #!/bin/sh
    PATH=/home/Cinac/:$PATH               #On met dans le nouveau PATH
    exit 1                                 #/home/Cinac: plus l'ancien PATH
 

* En Visual Basic:
   Non je deconne :)
 
 

Vous le voyez maintenant l'intéret de vous mettre au perl maintenant? Ca simplifie bien les choses dans certains cas non? Et l'intéret de vous mettre au vb vous l'avez vu? Ah? Vous non plus? Allez ca viendra ;p
 

      _______________
_____/  CONCLUSION:  \____________________________________________

Linux n'est pas le seul OS incluant l'utilisation du PATH, sous Windows par exemple cette variable existe mais est quand même moins utilisée vu que windows n'est pas OS en ligne de commande comme le sont les *NIX. Mais vous aurez peut-être déja vu l'exemple de certains compilateurs C demandant à leur installation que l'on definisse manuellement une partie du PATH dans l'autoexec.bat (j'ai jamais pigé pourquoi il ne le faisait pas de lui même).

Sous Windows le PATH est defini de la maniere suivante quand il est inclus dans l'autoexec.bat ou dans les autres fichiers systeme. Il est pas censé être autre part que la mais bon vu que même sous Windows l'utilisation détournée du PATH peut aussi servir de backdoor (demarrer, exécuter, winipcfg...)

SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND

Vous voyez que la démarche reste a peu de choses près identique mis à part le SET devant le PATH et le ";" qui remplace le ":" pour la séparation entre les chemins. Hihihi vous allez donc maintenant pouvoir vous le taper en visual basic ce PATH ;)

Vous pouvez maintenant PATHer votre chemin :)
 
 

Coding Is Not A Crime