!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !BBBBBBBBBB!!RRRRRRRRRR!!!!!!!!@!!!!!!III!!NNN!!!!!NNN! !!BBBBBBBBBB!!RRRRRRRRRR!!!!!!@@@!!!!!!!!!!NNNN!!!!NN!! !!!BB!!!!BBB!!!RR!!!!RRR!!!!!@@!@@!!!!III!!NN!N!!!!NN!! -- { http://www.brainfaktor.org } -- !!!BB!!!!BBB!!!RR!!!!RRR!!!!@@!!!@@!!!III!!NN!NN!!!NN!! !!BBBBBBBBB!!!RRRRRRRRR!!!@@@@@!@@@@@!III!!NN!!NN!!NN!! Enjoy ! !!BBBBBBBBB!!!RRRRRRRRR!!!@@@@@@@@@@@!III!!NN!!NN!!NN!! !!!BB!!!!BBB!!!RR!!!!RR!!!!@@!!!!!@@!!III!!NN!!!NN!NN!! irc.worldnet.net !!!BB!!!!BBB!!!RR!!!!RR!!!!@@!!!!!@@!!III!!NN!!!!N!NN!! #brainfaktor !!BBBBBBBBBB!!RRRR!!!RRR!!!@@!!!!!@@!!III!!NN!!!!NNNN!! !BBBBBBBBBB!!RRRRRR!!RRRR!@@@@!!!@@@@!III!NNN!!!!!NNN!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !FFFFFFFFFFF!!!!!!@!!!!!!KKKK!!!!KKK!TTTTTTTTTT!!!OOOOO!!!RRRRRRRRRR!!! nn nn !!FFFFFFFFFF!!!!!@@@!!!!!!KKK!!!KKK!!TTTTTTTTTT!!OOOOOOO!!!RRRRRRRRRR!! \ \ / / !!!FF!!!!!!F!!!!@@!@@!!!!!!KK!!KK!!!!T!!!TT!!!T!OO!!!!!OO!!!RR!!!!RRR!! ___ !!!FF!!F!!!!!!!@@!!!@@!!!!!KK!KK!!!!!!!!!TT!!!!!OO!!!!!OO!!!RR!!!!RRR!! /___\__ !!FFFFFF!!!!!@@@@@!@@@@@!!!KKKK!!!!!!!!!!TT!!!!!OO!!!!!OO!!!RRRRRRRR!!! ( @ @ ) !!FFFFFF!!!!!@@@@@@@@@@@!!!KKKK!!!!!!!!!!TT!!!!!OO!!!!!OO!!!RRRRRRRR!!! \ ° / !!!FF!!F!!!!!!@@!!!!!@@!!!!KK!KK!!!!!!!!!TT!!!!!OO!!!!!OO!!!RR!!!!RR!!! \=/ !!!FF!!!!!!!!!@@!!!!!@@!!!!KK!!KK!!!!!!!!TT!!!!!OO!!!!!OO!!!RR!!!!RR!!! / / \ \ !!FFFF!!!!!!!!@@!!!!!@@!!!KKK!!!KKK!!!!!TTTT!!!!!OOOOOOO!!!RRRR!!!RRR!! uu uu !FFFFFF!!!!!!@@@@!!!@@@@!KKKK!!!!KKK!!!TTTTTT!!!!!OOOOO!!!RRRRRR!!RRRR! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !EEEEEEEEEEE!!!!ZZZZZZZZZZ!!!!III!!!NNN!!!!!!NN!!!EEEEEEEEEEE!! !!EEEEEEEEEEE!!!ZZZZZZZZZZ!!!!!!!!!!NNNN!!!!!NN!!!!EEEEEEEEEEE! !!!EE!!!!!!!!!!!!!!!!!!ZZZ!!!!III!!!NN!N!!!!!NN!!!!!EE!!!!!!!!! !!!EE!!!!!!!!!!!!!!!!!ZZZ!!!!!III!!!NN!NN!!!!NN!!!!!EE!!!!!!!!! !!!EEEEEEE!!!!!!!!!!!ZZZ!!!!!!III!!!NN!!NN!!!NN!!!!!EEEEEEE!!!! !!!EEEEEEE!!!!!!!!!!ZZZ!!!!!!!III!!!NN!!NN!!!NN!!!!!EEEEEEE!!!! !!!EE!!!!!!!!!!!!!!ZZZ!!!!!!!!III!!!NN!!!NN!!NN!!!!!EE!!!!!!!!! !!!EE!!!!!!!!!!!!!ZZZ!!!!!!!!!III!!!NN!!!!N!!NN!!!!!EE!!!!!!!!! !!EEEEEEEEEEE!!!!ZZZZZZZZZZZ!!III!!!NN!!!!NNNNN!!!!EEEEEEEEEEE! !EEEEEEEEEEE!!!!!ZZZZZZZZZZZ!!III!!!NN!!!!!NNNN!!!EEEEEEEEEEE!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Editeur > agonn (root@brainfaktor.org) Redacteurs > agonn (root@brainfaktor.org slugg (slugger@ifrance.com) Questions, articles > la crew (zine@brainfaktor.org) -=-=-=-=-=-=-=-=-=-==-[ EDITO ]-=-=-=-=-=-=-=-=-=-=-=- Salut a tous, j'ai le plaisir de vous annoncer la sortie du premier numero de BFZ ! Ce zine est orienté h/p/c/v/a et maintenu par la BrAinfAktor crew (brainfaktor.org). Notre objectif n'est pas de prouver que nous sommes des l33t mais bel et bien d'essayer de faire évoluer la scène francaise. Voilà, premier edito pour moi et je vais en profiter pour passer un coup de gueule... Un coup de gueule contre notre cher gouvernement Raffarin III qui, non content d'enrichir les riches et d'appauvrir de plus en plus les pauvres, se permet de nous voter une loi qui est destinée a CENSURER l'internet. Je parle bien entendu de la loi LCEN dont je m'etonne qu'il n'y ait pas eu plus de réactions que ca dans l'underground. Pourtant, un des articles devrait nous inquiéter: "Art. 323-3-1. Le fait, sans motif légitime, d'importer, de détenir, d'offrir, de céder ou de mettre à disposition un équipement, un instrument, un programme informatique ou toute donnée connus ou specialement adaptés pour commettre une ou plusieurs des infractions prévues par les articles 323-1 à 323-3 est puni des peines prévues respectivement pour l'infraction elle-meme ou pour l'infraction la plus severement reprimée." Comme vous le voyez, selon cet article, nous n'avons pas le droit de diffuser, d'écrire ou même de posséder (!) des codes sources, programmes, articles.. sur le h/p/c/v/a a moins bien sur que nous ayons un "motif légitime".. Bref c'est du n'importe quoi. Je suis donc dans l'illégalité en écrivant ce zine car je présume que partager son savoir ne fait pas parti des motifs légitimes definis par cette loi.. J'espère qu'on attendra pas 2008 pour se révolter sinon ce sera déjà trop tard, chacun de nos faits et gestes sera surveillé par Big Brother et a chaque faux pas >> PRISON.. Et j'exagère a peine.. Bref, la révolution sera numérique ou ne le sera pas. agonn -=-=-=-=-=-=-=-=-=-==-[ SOMMAIRE ]-=-=-=-=-=-=-=-=-=-=-=- # Titre Auteur Taille 1.1 : La conscience d'un Hacker The Mentor 3.6 ko 1.2 : Scène? agonn 3.6 ko 1.3 : A phreaking overview agonn 4.7 ko 1.4 : Backdoors demystified agonn 5.6 ko 1.5 : Programmation reseau agonn 11.2 ko 1.6 : Cryptologie slugg 31.3 ko 1.7 : UndergroundZ links N/A / -=-=-=-=-=-=-=-=-=-==-[ LET'S GO ]-=-=-=-=-=-=-=-=-=-=-=- -------------------------------------------------------- BFZ#1/ La conscience d'un Hacker The Mentor -------------------------------------------------------- Un autre s'est fait prendre aujourd'hui, c'est partout dans les journaux. "Scandale: Un adolescent arreté pour crime informatique", "Arrestation d'un 'hacker' après le piratage d'une banque"... Satanés gosses, tous les mêmes. Mais avez vous, dans votre psychologie en trois piece et votre profil technocratique de 1950, un jour pensé à regarder le monde derriere les yeux d'un hacker? Ne vous etes vous jamais demandé ce qui l'avait fait agir, quelles forces l'avaient modelé? Je suis un hacker, entrez dans mon monde... Le mien est un monde qui commence avec l'école... Je suis plus astucieux que la pluspart des autres enfants, les conneries qu'ils m'apprennent me lassent... Je suis au collège ou au lycée. J'ai écouté les professeurs expliquer pour la quizieme fois comment réduire une fraction. Je l'ai compris. "Non Mme Dubois, je ne peux pas montrer mon travail. Je l'ai fait dans ma tête" Satané gosses. Il l'a certainnement copié. Tous les mêmes. J'ai fait une découverte aujourd'hui. J'ai trouvé un ordinateur. Attends une minute, c'est cool. Ca fait ce que je veux. Si ca fait une erreur, c'est parce que je me suis planté. Pas parce qu'il ne m'aime pas... Ni parce qu'il se sent menacé par moi... Ni parce qu'il pense que je suis petit filoux... Ni parce qu'il n'aime pas enseigner et qu'il ne devrait pas être là... Satan‚s gosses. Tout ce qu'il fait c'est jouer. Tous les mêmes. Et alors c'est arrivé... une porte s'est ouverte sur le monde... Se pr‚cipitant a travers la ligne telephonique comme de l'héroine dans les veines d'un accro, une impulsion electronique est envoyée, on recherche un refuge a l'incompetence quotidienne... un serveur est trouvé. Vous vous repetez que nous sommes tous pareils... On a été nourri a la petite cuillere de bouffe pour bébé a l'école quand on avait faim d'un steak... Les fragments de viande que l'on nous a laissé êtaient pré-machés et sans gout. On a été dominés par des sadiques ou ignorés par des apathiques. Les seuls qui avaient des choses a nous apprendre trouvèrent des élèves volontaires, mais ceux ci sont comme des gouttes dans le desert. C'est notre monde maintenant... Le monde de l'electron et de l'interrupteur, la beauté du baud. Nous utilisons un service déja existant, sans payer ce qui pourrait être bon marché si ce n'était pas la propriété de gloutons profiteurs, et vous nous appelez criminels. Nous explorons... et vous nous appelez criminels. Nous recherchons la connaissance... et vous nous appelez criminels. Nous existons sans couleur de peau, sans nationalité, sans dogme religieux... et vous nous appelez criminels. Vous construisez des bombes atomiques, vous financez les guerres, vous ne punissez pas les patrons de la mafia aux riches avocats, vous assassinez et trichez, vous manipulez et nous mentez en essayant de nous faire croire que c'est pour notre propre bien être, et nous sommes encore des criminels. Oui, je suis un criminel. Mon crime est celui de la curiosité. Mon crime est celui de juger les gens par ce qu'ils pensent et dise, pas selon leur apparence. Mon crime est de vous surpasser, quelque chose que vous ne me pardonnerez jamais. Je suis un hacker, et ceci est mon manifeste. Vous pouvez arreter cet individu, mais vous ne pouvez pas tous nous arreter... aprŠs tout, nous sommes tous les mêmes. +++The Mentor+++ -------------------------------------------------------- BFZ#1/ Scène? agonn -------------------------------------------------------- La scène est-elle morte? Voilà la question que je me pose... Depuis la mort de Madchat, j'ai l'impression que la scene s'est évanouie.. Quand je parle de la scene, je parle bien sur de veritables groupes innovants et inventifs, prets a partager leur savoir et a CONSTRUIRE l'underground. Je ne compte donc pas tous ces pseudos-hackers membres de l'IHC ou toute autre organisations là juste pour la fame... Et pourtant, ce sont ces même groupes que les newbies croient être la scene, et bien NON!! Regardez aux USA, là bas, leur scene est vraiment dévelopée: beaucoup de releases, des ezines qui pullulent, des nouveaux groupes tous les mois.. et pourtant, ils n'ont pas vraiment d'organisation particulière mais cet ensemble fonctionne. En france c'est pas pareil.. Il ya bien sur des teams vraiment douées (niveau technique) mais qui ne rendent public quasiment rien et qui preferent rester cachées dans leur coin.. On pourrait dire que EUX representent la scene, mais non, la scene c'est avant tout un ensemble d'organismes INDEPENDANTS mais SOLIDAIRES entre eux, la scene c'est la diffusion du savoir au plus grand nombre, c'est la scene qui se doit de respecter la liberté d'expression et d'opinion sur le net (en faisant face par exemple a la LEN ou aux brevets logiciels), la scene se doit de s'autoreguler et de ne pas se laisser mourir.. Heureusement, on assiste de plus en plus a une recrudescence de teams véritablement fortes au niveau technique mais qui ont aussi une ethique et une vraie conscience de ce qu'est l'underground.. agonn root@brainfaktor.org/agonn@linuxmail.org -------------------------------------------------------- BFZ#1/ A phreaking overview agonn -------------------------------------------------------- Tout d'abord, je tiens a signaler que ce texte ne vous apprendra en aucun cas des nouvelles techniques de phreaking, il traite juste des différentes techniques actuellement connues... Pour commencer, je vais vous parler des techniques dites de "soft phreak": elles regroupent le hack de PABX (pour phoner gratos), le hack de vmb (pour faire des conferences telephoniques par ex..) et le scanning de numeros verts (qui correspondent justement a des PABX ou VMB) Un PABX (Private Automatic Branch eXchanger) est un central telephonique gérant les appels entrant et sortant. Il permet par exemple a un employé de telephoner vers l'exterieur a partir de son bureau en donnant un numero d'user et un mot de passe au central. Chaque employé dispose également d'une boite vocale (VMB= Voice mail box). Les PABX sont souvent accessibles par un numero vert (appel gratuit). Pour les numeros verts, vous pouvez les scanner a la main (plutot chiant mais bon) ou avec un logiciel comme TONELOC. Un fois le numero trouvé, il suffit donc de le composer et de voir si ca correspond bien a une VMB. Là ya plusieurs solutions, soit ya quelqu'un qui décroche et dans ce cas là vous l'envoyer chier, soit vous tombez sur un répondeur automatique (Souvent c'est bon signe) soit on vous demande un mot de passe (BINGO !!!) . Donc, si vous tombez sur le repondeur, essayer d'appuyez sur les touches "0","#","1","9","*" de votre phone et si c'est bien un PABX, vous accedez a un menu vous permettant d'acceder a votre boite vocale, de laisser un message ou de composer un numero et c'est gagné ! sinon bah.. vous avez plus qu'a retourner scanner. Si vous tombez sur une identification de mot de passe, ca va etre plus dur, d'abord essayer les mots de passe par défaut du genre "1234","0000","9876".. et si ca marche pas.. bah vous essayez plusieurs combinaisons, et si ca marche vraiment pas vous laissez tomber (vous en trouverez d'autres ;)). Ah oui, souvent, vous etes déconnecté au bout de 3 tentatives et votre appel est loggé sur la machine donc faites gaffe.. Une fois que vous avez gagné l'acces a votre VMB, vous pouvez demander a vos potes de vous laisser un message dessus, vous pouvez organiser des conferences telephonique a plusieurs (mais essayez quand même de prendre un poste qui n'est pas déjà occupé par un employé)... Si vous voulez plus de détails a propos des VMB, je vous rapporte aux excellents articles de NoRoute, NoWay etc.. (notamment pour les commandes a l'interieur de la vmb..) Ensuite ya le "hard phreak" qui comprend toutes les techniques de boxing, qui sont de simples montages electroniques permettant de ne pas payer la communication telephonique, de laisser son voisin la payer ou encore d'electrocuter son interlocuteur (là je garantis rien).. les boxes sont representées selon un nom de couleurs, par exemple beige box, black box, red box pour ne citer que les plus connues.. Malheureusement pour nous, la plupart de ces boxs ne fonctionnent qu'aux Etats-Unis et même si certaines techniques marchent chez nous, je conseille vraiment pas de les utiliser, FT ayant renforcé la sécurité de leur reseau, c'est vraiment hyper trace (a moins de beige boxer sur une cabine telephonique..) Enfin il y a le hack de GSM qui en est encore a ses balbutiements en France mais qui se développe assez rapidement (on en reparlera surement dans un prochain numero).. Il ya aussi le wardriving (pour squatter les spots WiFi >> acces internet gratuit) qui peut être sympa a utiliser si vous habitez dans les grandes villes :) Voilà pour la partie phreaking de cette issue, c'est un peu bref mais ca vous donne le sommaire des prochains numeros :) Ah oui! j'ai aussi entendu parler d'une rumeur selon quoi on pourrait telephoner gratos grace a son portable et a une cabine telephoniques, il suffirait d'appeler le numero de la cabine avec son portable (le telephone n'etant pas décroché donc), de raccrocher avec le portable et ensuite de décrocher le telephon ete on aurait la ligne.. Je sais plus ou j'ai vu ca mais si vous avez plus d'infos mailez moi.. BONUS: LE MATOS DU PARFAIT PETIT PHREACKER: -Toujours avoir une beige box en permanence sur soi (ca peut toujours servir..) -Un pied de biche (pour defoncer les bornes FT) -Un logiciel de wardriving du genre WarLinux (http://sf.net/warlinux/) -Un bon scanner de numeros verts (par ex TONELOC dispo sur le site) -Une bonne paire de couilles (se faire chopper par un flic a 1h du mat en train de defoncer une borne FT je dois dire que c'est pas très marrant..) -Une cagoule si vous phreaker la nuit (comme ca le flic vous reconnaitra pas..) agonn root@brainfaktor.org/agonn@linuxmail.org -------------------------------------------------------- BFZ#1/ Backdoors demystified agonn -------------------------------------------------------- Pour commencer cet article, je vais tenter de vous expliquer ce qu'est une backdoor (du point de vue technique) et a quoi elle sert.Nous verrons ensuite les différents types de backdoors existantes et enfin, je vous donnerais des codes sources de backdoor (dossier src/) relativement simples que j'essayerais de commenter au maximum. So, what is a backdoor? Une backdoor est un programme utilisé afin de récupérer un accès root sur un serveur. Quand un pirate réussi a devenir root sur un serveur, il met généralement en place une backdoor qui lui servira a reprendre l'acces quand il le souhaitera. Les fonctions principales d'une backdoor sont de réussir a reprendre l'acces root le plus vite possible en laisser lemoins de traces possibles (en utilisant un log cleaner integré au programme par exemple) et en faisant attention de ne pas se faire repérer par l'administrateur de la machine cible. Pour cela, le pirate va chercher plusieurs "failles" dans le systeme ce qui lui permet de toujours avoir un acces même si l'administrateur réussit a détecter la backdoor. Voilà pour le principe, maintenant, voyons voir les différents types de backdoor existantes, leur descriptions et leur effets sur un serveur vulnérable (ceci est une liste non exhaustive): /etc/passwd Backdoor -------------------- Cette methode consiste a cracker un mot de passe se situant dans le fichier /etc/passwd/ ou a ajouter une ligne dans ce fichier nous permettant de nous logger en tant qu'user "legal" du systeme. Cette technique est peu utilisée car souvent la premiere chose qu'un administrateur fait lorsque sont systeme a été attaqué est de vérifier ce fichier. A ne pas conseiller donc. Rhosts Backdoor --------------- Cette backdoor consiste a exploiter le systeme d'authentification Rlogin et RSH. Il suffit de modifier le fichier $HOME/.rhosts en y ajoutant un ligne "+ +" ce qui a pour effet que n'importe qui peut se logger a distance sans avoir besoin de fournir de mot de passe, ce qui peut etre un inconvenient car n'importe quel crasher qui aura repéré la faille pourra se connecter aussi (NOTE: Pour eviter ce probleme, il suffit de ne mettre qu'un seul "+" dans le .rhosts mais vous ne pourrez vous logger qu'en local..). Encore une fois, c'est une des premieres choses que l'administrateur verifie. Il suffirait dans ce cas de développer un systeme de client/serveur qui permettrait d'ajouter cette ligne lorsque le pirate se connecte au serveur de la backdoor, il n'aurait alors plus qu'a effacer la ligne une fois le controle repris.. mais ceci sera développé plus loin. Bootblock backdoor ------------------ Cette technique consiste a insérer une sorte de virus dans le secteur de boot du systeme. Cette technique peut s'avérer très efficace car les administrateurs ne possèdent souvent pas d'outils pour verifier le secteur de boot mais elle est aussi très complexe a mettre en oeuvre. Shell SUID backdoor ------------------- Coniste a rendre un shell (/bin/bash par exemple) suid root, c'est a dire qu'un user qui utilisera ce shell aura les privileges root lors de son execution. Il suffit pour cela de copier le shell vers un autre fichier qui representera notre shell suid (ex: cp /bin/bash /bin/shellsuid ) et de le rendre suid root en tappant "chmod 7555 /bin/shellsuid". Il suffit ensuite d'executer notre "faux" shell pour avoir les privileges root. LKM (Loadable Kernel Modules) ----------------------------- Les LKM sont utilisés par le kernel pour lui rajouter ou expandre ses fonctionnalités (modifier les appels systeme par exemple.. :)). Ces modules sont chargés dynamiquement, c'est a dire qu'ils ne necessitent aucune compilation du kernel pour fonctionner ! Ils sont la plupart du temps utilisés pour les drivers de materiel. Seul le root peut les installer (normal..). Pour forcer le systeme a charger un module, tappez ceci dans votre term (vous devez etre root): #insmod module.o Pour voir la liste des modules en execution: #lsmod Module Size Used by Tainted: PF nvidia 1672832 10 (autoclean) snd 40868 4 [snd-seq-oss snd-seq-midi-event snd-seq snd-pcm-oss snd-mixer-oss snd-via82xx snd-ac97-codec snd-pcm snd-timer snd-mpu401-uart snd-rawmidi snd-seq-device] cdrom 31648 0 [sr_mod ide-cd] floppy 55132 0 module 1 0 Vous pouvez egalement enlever vos modules avec: #rmmod module Module Size Used by Tainted: PF nvidia 1672832 10 (autoclean) snd 40868 4 [snd-seq-oss snd-seq-midi-event snd-seq snd-pcm-oss snd-mixer-oss snd-via82xx snd-ac97-codec snd-pcm snd-timer snd-mpu401-uart snd-rawmidi snd-seq-device] cdrom 31648 0 [sr_mod ide-cd] floppy 55132 0 Bien sur il existe des methodes pour cacher ce module :) Vous voyez ou je veux en venir? Eh oui, on peut tout simplement installer une backdoor dans le kernel sans que l'admin sans apercoive (le module etant invisible). Pour l'aspect programmation c'est un peu plus dur mais pas insurmontable (a voir dans un prochain article) TCP Backdoor ------------ Une TCP Backdoor agit comme un serveur sur la cible. Nous pouvons alors nous y connecter via telnet ou un client specifique. On peut également l'associer a un LKM pour cacher le processus ou cacher l'executable.. Quand le serveur est activée, il agit alors comme une backdoor "normale" (ajout de .rhost, de comptes utilisateurs..) et vous n'avez plus qu'a faire disparaitre les logs et a relancer l'executable :) -------------------------------------------------------- BFZ#1/ Programmation reseau agonn -------------------------------------------------------- I - Introduction ================ Ce document est basé sur la traduction de "BASIC C Socket Programming In Unix For Newbie by Bracaman". Je donc vais vous apprendre a creer des applications reseau pour UNIX. Avant toute chose, je tiens a dire que ce paper pose juste les BASES de la programmation reseau, il serait utopique de vouloir tout expliquer a ce sujet. Nous allons donc voir ensemble les différentes fonctions et structures utiles a la programmation de sockets et nous allons construire un serveur et un client très basique. Let's go! II - Les Structures =================== En programmation de socket, les structures servent a stocker les informations a propos des adresses. Notre premiere structure est la struct sockaddr qui stocke les informations sur le socket: struct sockaddr{ unsigned short sa_family; /* address family */ char sa_data[14]; /* 14 bytes of protocol address */ }; Mais il y a une autre structure qui peut vous aider a referencer les elements du socket: struct sockaddr_in { short int sin_family; /* Address family */ unsigned short int sin_port; /* Port */ struct in_addr sin_addr; /* Internet Address */ unsigned char sin_zero[8]; /* Same size as struct sockaddr */ }; La structure hosetnt sert a obtenir des informatuions a propos de l'host, elle se définit comme suit: struct hostent { char *h_name; /* Official name of host. */ char **h_aliases; /* Alias list. */ int h_addrtype; /* Host address type. */ int h_length; /* Length of address. */ char **h_addr_list; /* List of addresses from name server. */ #define h_addr h_addr_list[0] /* Address, for backward compatibility. */ }; Ca peut paraitre compliqué a certains mais au fur et a mesure vous apprendrez a vous servir et a comprendre ces structures. III - Adresses IP ================== Je vais parler ici de différentes fonctions servant a manipuler les adresse IP. inet_addr() qui convertit une adresse IP en un unsigned long: dest.sin_addr.s_addr = inet_addr("127.0.0.1"); inet_ntoa() convertit un string d'adresse IP en long: char *IP; ip = inet_ntoa(dest.sin_addr); printf("l'adresse est: %s\n", ip); IV - Les Fonctions ================== On passe au plus interessant.. Je vais ici vous présenter les différentes fonctions utiles pour programmer des sockets. Je mets egalement la syntaxe avec les header pour vous faciliter la tache. Pour voir ces fonctions en action, vous pouvez passer aux codes sources du client et du serveur... 1 - socket() ============ #include #include int socket(int domain,int type,int protocol); La fonction socket() sert a.. définir un socket. Elle retourne -1 en cas d'erreur Voila, passons aux arguments: domain = AF_INET pour utiliser le protocole internet, on ne s'occupera pas des autres types car ils ne sont pratiquement jamais utilisés.. type = SOCK_STREAM pour utiliser les stream sockets (qui utilisent le protocole TCP) ou SOCK_DGRAM pour les datagram sockets (qui utilisent UDP) protocol = On le le met a 0 2 - bind() ========== #include #include int bind(int fd, struct sockaddr *my_addr,int addrlen); La fonction bind() est utilisée pour associer un socket a un port. Elle retourne -1 en cas d'erreur. Arguments: fd = Le descripteur de socket retourné par socket() my_addr = un pointeur pour la structure sockaddr addrlen = sizeof(struct sockaddr) 3 - connect() ============= #include #include int connect(int fd, struct sockaddr *serv_addr, int addrlen); La fonction socket() est utilisée pour connecter une adresse IP a un port défini. Elle retourne -1 en cas d'erreur. Arguments: fd = Le desrcipteur de socket retourné par socket() serv_addr = Un pointeur pour la structure sockaddr qui contient l'adresse IP de destination et le port addrlen = sizeof(struct sockaddr) 4 - listen() ============ #include #include int listen(int fd,int backlog); listen() est utilisée pour attendre une connection. Avant cela, vous devez appeler la fonction bind() pour définir le port a écouter et après avoir appelé listen(), vous devez appeler accept() pour accepter les connections entrantes. listen() retourne -1 en cas d'erreur Arguments: fd = Le descripteur de socket retourné par socket() backlog = Le nombre de connections autorisées 5 - accept() ============ #include int accept(int fd, void *addr, int *addrlen); Utilisé pour accepter une connection (comme par hasard..). Retourne -1 en cas d'erreur. Arguments: fd = Le descripteur de socket retourné par l'appel a listen() addr = Un pointeur pour la struct sockaddr_in où vous pouvez déterminer quel host vous appelle depuis quel port. addrlen = La taille de la struct sockaddr_in 6 - send() ========== int send(int fd,const void *msg,int len,int flags); Transmet des données. Retourne -1 en cas d'erreur. Arguments: fd = Le descripteur de socket où vous voulez envoyer des données msg = Pointeur vers les données que vous voulez envoyer len = la taille des données que vous voulez transmettre (en bits) flags = 0 7 - recv() ========== int recv(int fd, void *buf, int len, unsigned int flags); Recoit les données. Retourne -1 en cas d'erreur. Arguments: fd = le descripteur de socket dans le lequel lire les données buf = le buffer où lire les données len = la taille de données maximum du buffer flags = 0 8 - sendto() ============ int sendto(int fd,const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); Même fonction que send() mais avec 2 arguments en plus. Sert seulement pour les datagram sockets non connectés. Retourne -1 en cas d'erreur. Arguments: fd, msg, len ,flags = Pareil que send() to = Un pointeur pour la struct sockaddr tolen = sizeof(struct sockaddr) 9 - recvfrom() ============== int recvfrom(int fd,void *buf, int len, unsigned int flags struct sockaddr *from, int *fromlen); La même chose que recv() pour les datagram sockets non connectés. Retourne -1 en cas d'erreur. Arguments: fd, buf, len, flags = Pareil que recv() from = Pointeur pour la struct sockaddr dromlen = sizeof(struct sockaddr) 10 - close() ============ close(fd) Ferme la connection. 11 - gethostname() ================== #include int gethostname(char *hostname, size_t size); gethostname() sert a trouver le nom d'une machine locale. Arguments: hostname = Un pointeur vers un array qui contient hostname size = La taille de l'array hostname (en bytes) V - Codes Sources ================= Quelques exemples de ce qu'on peut faire avec les sockets :) <----------- CUT HERE --------------------------------------------> */ serveur.c $gcc serveur.c -o serveur Code by Bracaman */ #include #include #include #include #define PORT 3455 /* Le port que nous allons utiliser */ #define BACKLOG 2 /* L enombre de connections autorisées */ main() { int fd, fd2; /* descripteurs de socket */ struct sockaddr_in server; /* informations sur le serveur */ struct sockaddr_in client; /* informations sur le client */ int sin_size; if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ /* Si socket() est egal -1 : erreur */ printf("socket() error\n"); exit(-1); } /* Si pas d'erreur notre socket est créé */ server.sin_family = AF_INET; server.sin_port = htons(PORT); /* Convertit notre port */ server.sin_addr.s_addr = INADDR_ANY; /* INADDR_ANY définit votre adresse IP */ bzero(&(server.sin_zero),8); /* On met a zero le reste de la structure */ if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){ /* On appelle bind() */ printf("bind() error\n"); exit(-1); } if(listen(fd,BACKLOG) == -1){ /* On appelle listen() */ printf("listen() error\n"); exit(-1); } while(1){ sin_size=sizeof(struct sockaddr_in); if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* On appelle accept() */ printf("accept() error\n"); exit(-1); } printf("You got a connection from %s\n",inet_ntoa(client.sin_addr) ); /* On nous donne l'IP du client */ send(fd2,"Welcome to my server.\n",22,0); /* On lui envoie un message de bienvenue */ close(fd2); /* close fd2 */ } } <----------- CUT HERE ---------------------------------------------------> <----------- CUT HERE ---------------------------------------------------> */ client.c $gcc client.c -o client Code by Bracaman */ #include #include #include #include #include /* Pour struct hostent */ #define PORT 3550 /* Port */ #define MAXDATASIZE 100 /* Nombre maximum de bits de données */ int main(int argc, char *argv[]) { int fd, numbytes; /* descripteur de socket */ char buf[MAXDATASIZE]; /* Le buffer qui va stocker le texte recu */ struct hostent *he; /* Structure qui prend les informations sur l'host */ struct sockaddr_in server; /* Informations sur l'adresse du serveur */ if (argc !=2) { /* Notre programme a besoin de 2 arguments */ printf("Usage: %s \n",argv[0]); exit(-1); } if ((he=gethostbyname(argv[1]))==NULL){ /* appel a gethostbyname() */ printf("gethostbyname() error\n"); exit(-1); } if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){ /* creation du socket */ printf("socket() error\n"); exit(-1); } server.sin_family = AF_INET; server.sin_port = htons(PORT); /* Conversion */ server.sin_addr = *((struct in_addr *)he->h_addr); /*he->h_addr passe les infos sur he a "h_addr" */ bzero(&(server.sin_zero),8); if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1){ /* on appelle connect() */ printf("connect() error\n"); exit(-1); } if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1){ /* on appelle recv() */ printf("recv() error\n"); exit(-1); } buf[numbytes]='\0'; printf("Server Message: %s\n",buf); /* On recoit le message du serveur */ close(fd); /* Ferme la connection */ } <------------ CUT HERE --------------------------------------------------------------> VI - Outro ========== Voilà, j'espère que vous en saurez un peu plus sur la programmation reseau (même si ce n'est pas super complet..). Si vous voulez d'autres codes sources, j'en ai mit un dans le dossier /src, c'est en fait le code d'une backdoor TCP qui fait office de serveur :) Je rappelle que cet article est basé sur "BASIC C Socket Programming In Unix For Newbies by Bracaman", vous pouvez lui écrire a BracaMan@clix.pt. Enjoy ! agonn < root@brainfaktor.org > -------------------------------------------------------- BFZ#1/ Cryptologie slugg -------------------------------------------------------- CCCC RRRRR YY YY PPPPP TTTTTT OOOO LL OOOO GGGG II EEEEEE CCCCCC RR RR YY YY PP PP TTTTTT OOOOOO LL OOOOOO GGGGGG EEEEEE CC CC RR RR YY YY PP PP TT OO OO LL OO OO GG GG II EE CC RRRRR YYYY PPPPP TT OO OO LL OO OO GG II EEEE CC RR RR YY PP TT OO OO LL OO OO GG II EEEE CC CC RR RR YY PP TT OO OO LL OO OO GG GGG II EE CCCCCC RR RR YY PP TT OOOOOO LLLLLL OOOOOO GG G G II EEEEEE CCCC RR RR YY PP TT OOOO LLLLLL OOOO GGG G II EEEEEE 1. INTRODUCTION **************** La cryptologie est LA science du message secret. Elle se partage en deux parties, la CRYPTOGRAPHIE, qui est l'etude des techniques destines a assurer la confidentialite, l'integrite, et l'authentification des donnees, et la CRYPTANALYSE, qui consiste a casser ces techniques cryptographiques. On va donc voir comment proteger ses donnees en les chiffrant (avec des systemes de chiffrement classiques), et voir comment on peut casser ces chiffrages. On essaiera ensuite de creer une application en C, qui pourrai simplifier tout ce shlimblick, dans certains cas seulement, j'vais pas vous macher tout le boulot non plus :-). Enfin je tenai a dire qu'a l'heure ou les libertes numeriques (s'il y avait que celles la) ne cessent de reculer (en France en tout cas), il devient indispensable de s'interesser a ce domaine (qui plus est, fort interessant). Treve de bavardarge... LET's GO !! 2. TABLE DES MATIERES ****************** 1. Introduction 2. Table des matieres 3. Chiffrement par transposition 3.1. Transposition simple 3.2. Variantes 3.3. Cryptanalyse 4. Chiffrement par substitution 4.1 Substitution monoalphabetique 4.1.1. La substitution monoalphabetique decalee : CESAR 4.1.2. Cryptanalyse d un systeme monoalphabetique 4.2 Substitution polyalphabetique 4.2.1 Le chiffre de Vigenere 4.2.2 Cryptanalyse du chiffre de Vigenere 5. Epilogue 6. Annexe 3. LE CHIFFREMENT PAR TRANSPOSITION ************************************ Le chiffrement par transposition consiste a melanger les lettres de votre message, en utilisant un principe mathematique de permutation : 3.1.Transposition simple ======================== On ecrit le message horizontalement dans une grille predefinie (appelee matrice), puis on retrouve le message crypte en lisant la grille verticalement. Pour decrypter il suffit de realiser le procede inverse. Texte en clair : CECI EST UN EXEMPLE DE TRANSPOSITION SIMPLE PAR COLONNE utilisant une matrice [7;7]. (7 colonnes, 7 lignes) _______________ |C|E|C|I|E|S|T| |U|N|E|X|E|M|P| |L|E|D|E|T|R|A| |N|S|P|O|S|I|T| |I|O|N|S|I|M|P| |L|E|P|A|R|C|O| |L|O|N|N|E| Texte crypte : CULNILLENESOEOCEDPNPNIXEOSANEETSIRESMRIMCTPATPO ==> La cle est une matrice [7;7] 3.2.Variantes ============= Ici on commence par choisir un MOT CLE. Celui-ci doit avoir autant de lettres qu'il y a de colonnes dans notre matrice, ni plus, ni moins. De plus le mot cle ne doit surtout pas contenir 2 fois la meme lettre. Ensuite on attribue a chaque lettre du mot cle, un numero de sequence, commancant a 1 et finissant au nombre de lettre composant notre mot cle. On obtient les numeros de sequence en partant de la gauche vers la droite, et en donnant l'ordre d'apparition dans l'alphabet. Ceci fait on peut maintenant placer notre message dans la matrice, toujours horizontalement,et on lit le message crypte verticalement en suivant le numero de sequence : Notre mot cle est : CRYPTO L'ordre d'apparition dans l'alphabet est : COPRTY Texte clair : CECI EST UNE VARIANTE AVEC UN MOT CLE Matrice [6;5] C R Y P T O 1 4 6 3 5 2 _____________ |C|E|C|I|E|S| |T|U|N|E|E|X| |E|M|P|L|E|D| |E|V|A|R|I|A| |N|T|E|A|V|E| |C|U|N|M|O|T| |C|L|E| Texte crypte : ==> La cle est une matrice [6;5]transposition CRYPTO Il existe plusieurs variantes pour ameliorer la confidentialite du texte chiffre : une rotation de la grille, un ajout de lettres inutiles, etc... 3.3.Cryptanalyse du chiffrement par transposition ================================================= Un chiffrement par transposition est rarement utilise seul; il est plus souvent utilise avant ou apres un autres algorithme de cryptage. De plus, une simple analyse de frequence des caracteres(cf plus bas) est inutile, puisque les lettres avant le chiffrage sont les memes qu apres. Le nombre de possibilites augmentant avec le nombre de lettre, je vous recommande de vous armer de votre patience pour TOUTE cryptanalyse, meme avec un ordinateur puissant : ici, pour un message de "n" lettres, il y a : n!=1*2*...*(n-1)*n possibilites. Donc, le plus simple serait de retrouver le nombre de colonnes que comprend la matrice, en cherchant a prendre qu une lettre sur 2 (sur 3, sur 4,....sur 7 dans notre premier cas). Regardons ce que ca donne avec la matrice : _______________ |C|E|C|I|E|S|T| |U|N|E|X|E|M|P| |L|E|D|E|T|R|A| |N|S|P|O|S|I|T| |I|O|N|S|I|M|P| |L|E|P|A|R|C|O| |L|O|N|N|E| Texte crypte : Culnill Enesoeo Cedpnpn Ixeosan Eetsire Smrimc Tpatpo J'ai decoupe en 7 blocs, pour bien reperer les colonnes. Vous remarquerez que les premieres lettres de chaque block nous donne le debut de notre texte non chiffre. Arrivee au dernier block, on recommence en s interessant a la 2e lettres de chaque block, puis a la troisieme, et ainsi de suite. Cette methode marche tres bien, avec un petit nombre de caractere, et dans le cas d'une transposition simple. 4. LE CHIFFREMENT PAR SUBSTITUTION *********************************** Le principe de substitution consiste a remplacer un ou plusieurs caracteres par d'autres caracteres. Contrairement au chiffrement par transposition, la substitution change (totalement ou partiellement) les lettres et peut dans certains cas utiliser d autres symboles, ou alphabets. Il existe plusieurs procedes de substitution, nous n'en verrons que deux : la substitution monoalphabetique (dite simple) et la substitution polyalphabetique. 4.1.La substitution monoalphabetique ===================================== La substitution monoalphabetique se dit simple puisqu'il suffit d'attribuer a un alphabet clair un equivalent chiffre,cet alphabet chiffre sera conserve tout au long du processus de chiffrement. Ce type de chiffrement est tres peu sur. On retrouve dans cette categorie, les alphabet desordonne, ou reversible, le carre de polybe, le chiffre de "CESAR" que nous allons etudier. 4.1.1. La substitution monoalphabetique par décalage ---------------------------------------------------- "Le chiffre de CESAR" consiste a choisir une lettre (la cle) qui definira le decalage a effectuer a l ensemble du texte clair (Modulo 26 pour que ca boucle correctement). CLAIR A B C D E F G H I J K L M N O P Q R S T U V W X Y Z +1 B C D E F G H I J K L M N O P Q R S T U V W X Y Z A +2 C D E F G H I J K L M N O P Q R S T U V W X Y Z A B +3 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +23 X Y Z A B C D E F G H I J K L M N O P Q R S T U V W +24 Y Z A B C D E F G H I J K L M N O P Q R S T U V W X +25 Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Par exemple, en prennant comme decalage (cle) +2, le texte clair : "La substitution monoalphabetique est simple" devient "Nc uwduvkvwvkqp oqpqcnrjcdgvkswg guv ukorng" Pour dechiffre, il faut faire le decalage OPPOSE (le signe change), c'est a dire -2. Qui a dit que la crypto etait compliquee ? Bon maintenant on va essayer d'automatiser tout ca avec un petit code. -------------8<-------------cut-------------8<-----------------cut-------------8<------------- #include #include #define TAILLE 100 /* modifie ici pour un texte de plus de 100 caracteres */ int main (int argc , char **argv) { int i , cle ; char mode [6] ; /* mode encode ou decode */ char entree[TAILLE] ; /* texte entree par l utilisateur */ char sortie[TAILLE] ; /* texte sortie apres modification */ if(argc < 4) { printf("aide : %s <\"texte\"> ",argv[0]) ; exit(0); } strcpy(entree, argv[1]) ; strcpy(mode, argv[3]) ; cle = atoi(argv[2]) ; if ((mode[0] == 'E') || (mode[0] == 'e')) { for(i=0 ; ica veut pas dire grand chose, on passe a V=A SH ZBIZAPABAPVU TVUVHSWOHILAPXBL LZA ZPTWSL ==>ca veut rien dire non plus, On continu avec v=S, puis v=I, puis v=T, jusqu a ce qu on trouve : avec v=T ==>JACKPOT, on trouve une phrase qui signifie quelque chose : LA SUBSTITUTION MONOALPHABETIQUE EST SIMPLE (le texte clair). L'analyse de frequence est plus performante avec les gros textes. Vous avez compris ? Passons au code : -------------8<-------------cut-------------8<-----------------cut-------------8<------------- #include #include #define alpha 26 #define TAILLE 100 /* modifie ici pour un texte de plus de 100 caracteres */ void init(void); /* initialisation */ char caractere[alpha][2] ; char texte[TAILLE] ; /* texte a analyser */ int compte[alpha] ; /* pour compter les differentes lettres */ float pourcent[alpha] ; /* pour calculer le pourcentage */ int total = 0 ; /* nombre total de caractere dans le texte */ int main(int argc, char **argv) { int i, j ; init() ; if(argc < 2) { printf("aide : %s <\"texte\"> ",argv[0]) ; exit(0) ; } strcpy(texte, argv[1]) ; for (i=0 ; i>> http://www.brainfaktor.org Le site de la crew. reposito, forum, newsletter.. >>> http://www.madchat.org Le bon vieux chat >>> http://la-cave.homelinux.com Plein de bonnes docs sur le phreaking >>> http://abyssal.homelinux.org Le site a groar, beaucoup de docs >>> http://lsdp.net/~lotfree/ Land of the free mag >>> http://ouah.org Excellent site ! >>> http://hyatus.newffr.com (voir aussi newffr.com) Reposito, forum.. >>> http://miaouw.c0m.st Orienté anar, cyberpunk.. -=-=-=-=-=-=-=-=-=-==-[ Zi End ]-=-=-=-=-=-=-=-=-=-=-=- Voilà, c'est la fin de ce premier numero. Si vous avez des articles que vous voulez voir publié dans BFZ, ecrivez a zine@brainfaktor.org. On accepte tous types d'articles, ca peut aller du truc super technique a de la philo etc... A bientôt pour la 2eme issue ! Le Staff - EOF -