31-12-2001 - H@CKOFF No26 - * LAst edition? * - °º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø _/ _/ _/_/ _/_/_/ _/ _/ _/_/ _/_/_/_/ _/_/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/_/_/ _/_/_/_/ _/ _/_/ _/ _/ _/_/_/ _/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ / _/ _/ _/ _/ _/_/_/ _/ _/ _/_/ _/ _/ `°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø ________________________________________________________________________ / \ / Bienvenue dans ce Hackoff No 26 LAst édition pour l'annee 2001, une | / edition plutot tardive étant donné qu'elle est a cheval avec 2002, et | / aussi discutable puisque "LAst" et également "FIrst" est son édition... | | Avant le sommaire de ce hackoff, on vous déconseille de taper ce qui suit | | en ligne de commande : dd if=/dev/zero of=/dev/hda | | Au sommaire de ce numero 26 on vous expose a des rayonnements sympatico - | | vocabulesques a variations nympho-excavatoires sans vous enduire de pommade | | pseudo rhedibitoire a effet synapso-ramollissant. Un dossier ouvert entre | | AOL et FDO, des IDS et des hertz, du Gard derniere cuvée, des castors en / | purée, du php bafoué, du jargon expliqué, et 73 fois le caractere "@" / \________________________________________ ______________________________/ \ | \| __________ .,:;>The Crew<;:,. ¯¯¯¯¯¯¯¯¯¯ /¯¯.gArd.¯¯\ / .h3rtz!. \ ____________________________________/ ..misto... \____________________________ ¦§¨©ª«¬-®¯°±²³´µ·¸¹º»¿øØÞþæ¡¢£¤¥ ¦/ ...blured... \§¨©ª«¬-®¯°±²³´µ·¸¹º»¿øØÞþæ¡ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯/ ....courou.... \¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ / .....tobozo..... \ / .....Lansciac..... \ / ......Jericho....... \ ----8<----+-----8<--------8<---------\-8<--+-------8<--- / Ghosts : SniffDoz Frogman \ /------------------------------\ / Guests: Ulysse , Joey, hAl2001 \ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ____________________________________________________________ __________ / TabLe des mAtières : \ / HACK0ff \ |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯| ]-=v0L 26=-[ | [0] Disclaimore tobozo | \ Dec 2001 / | [1] Edito lansciac | ¯¯¯¯¯¯¯¯¯¯ | [2] Aol Protocol tobozo | | [3] Rencontre du Gardieme type Gard | | [4] IDS/LIDS/NIDS/SNORT Hertz | | [5] Loutre VS Castor Brice Berger | | [6] Présentation PHP sécurité tobozo | | [7] Algo de cryptage a base d'echelon Ulysse | | [8] Dossier Jarg[0]n File Lansciac&tobozo | | [9] Phpnuke trou Frogm@n | | [A] Vieille Savate tobozo | | [B] La cigale et la fourmi tobozo | ---------8<-----+--------------8<---------------------8<---------------------8<- ¦ : . _ _______________________ _ -*0*- `^°*;:,.> Ðïsclaïmór3 <.,:;*°^` _____________________________/¯¯¯¯¯¯ By tobozo ¯¯¯¯¯¯\__________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, C'est en se braquant sur des histoires de briques reciproques que se creuse l'ecart equivoque dans notre bric a brac. Les radioHacktifs craquent et se rétractent car hacker et triquer en étant traqué c'est trop cinoque. On n'est pas ventriloques mais juste assez loufoques pour pouvoir bricoler un micro sans pare-chocs braqué sur le frolic. tobozo@madchat.org ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ _______________________ _ -*1*- `^°*;:,.> Ê Ð ï t 0 <.,:;*°^` _____________________________/¯¯ By Lucie Lansciac ¯¯\__________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, A qui profite la guerre ? Subjectivité et absolu... [World War Web, on vous doit plus que du service:80] Je dirai que deux ecoles s'affrontent. Celle qui va tenter de vous prouver par a+b qu'elle a entierement et totalement raison, qu'une savate ne peut etre plus que le morceau de cuir finement cousu, relié à une semelle assez solide pour pouvoir se ballader dans les bois et regarder les arbres tomber sans faire de bruit. L'autre me direz vous? Surement la demonstration par l'absurde ou peut être la méthode shadok ou encore la méthode échelon, le broyage verbeux de gros dictionnaires comportant des mots que seuls eux et leurs géniteurs sont en mesure de comprendre, à la condition sine qua non d'un test de paternité validé et non pas l'adoption enarquiale usuelle ne révélant en général que peu de vérité, tel shakespeare en faux seigneur, mais vrai rustre et critique qu'il était. A qui ne profite pas la guerre? [guerre non-profit] A mes chaussures, à mon lacet defait, à mon cd foiré, à mon téléphone portable dont la carte SIM est hs, au carré qui ne sera jamais un cercle, à Pythagore qui est mort, aux jumelles qui sont mortes, à l'agenda de 1984, à un windows 3.11 sans réseau, à l'imprimante sans papier, aux sans papiers avec certificat, aux certificats bidons, aux bidonvilles créé, aux villes en deuil, au deuil sans mort, aux sacs plastiques non recyclabes, à la môle occidentale, au port usb qui ne sera jamais parallele, à la rfc 1042, à la pommade numéro 75 610, au 3 rue de l'impasse. La liste est sans nulle doute immensément longue, et il serait injurieux de vouloir la dresser, pouvant de ce fait vouloir limiter l'intellect et l'imagination que chacun possède. Devant cette sentence ainsi faite, il ne nous reste plus grand choix que de nous plier à l'autre côté. [guerre benefits] Au 3 rue de l'impasse qui sera bientôt rebatisée au nom de l'inconnu, à la pommade numéro 75 610 qui servira son producteur dans les soins qu'elle apportera aux blessés, à la rfc 1042 qui va connaître un complément de cryptage intéressant, au port usb qui dans un soucis de reconnaissance instantanée fera disparaître un port parallèle depuis longtemps usé, à la môle occidentale à qui ont préfère un chacal bien cuit, aux sacs plastiques non recyclables car on augmente le prix du pétrole, aux deuils sans mort, car l'espoir réside, aux villes en deuil car la vengeance est leur, aux bidonvilles qui vont être reconstruits, à l'agenda de 1984 qui prend son repos au sein de 2002, aux jumelles qui sont mortes car emblême elles demeurent, à Pythagore qui est théorisé dans n'importe quelle cible, au cercle qui ne sera jamais carré, au fondeur qui pour la peine réalisera ma puce SIM, un nouveau CD, à mon lacet qui contre un scratch s'est fait echanger, à mes savates qui encore quelques temps devront me supporter. [ndt:allegro ma non troppo] Bien, mal, petit ou grand, blanc ou noir, chrétien ou musulman, combien dans tout cela compte la vie dont coule le sang? Sans vouloir conter, combien dans tout cela ont entendu les arbres tomber? Laisser tomber les avertissements fait partie de la vie de l'insouciant. Cependant à être prisonnier dans une liberté antérinée, ne préfereriez vous pas de votre propre main pouvoir décider... Libre de mourir ou mourir libre, la subjectivité et le positionnement prend tout de même un certain emplacement. Dans la position, il faut faire attention, de ne pas sur la tête, se prendre un tronc... lansciac@madchat.org ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ __________________ _ -*2*- `^°*;:,.>Le protocole AOL<.,:;*°^` _____________________________/¯¯¯¯¯ tobozo ¯¯¯¯¯\_______________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, Document original par Gods'Misfit (1999) binary0100@yahoo.com Traduit de l'anglais et adapté par tobozo (2001) tobozo@users.sourceforge.net Ce document est une traduction d'une des premieres traces de partage rencontree chez AOL, il s'agit d'un article qui explique vaguement comment fonctionne le protocole AOL et comment se bricoler un client avec du VB. Il est diffusé sur le site http://aol.necrocosm.com en version anglaise (et avec moins de coquilles) depuis 1999 et par AOL (hee oui, incroyable mais vrai!) depuis aout 2001. Introduction En évoquant "Le protocole AOL", le premier mot qui devrait venir a l'esprit est FDO. Et bien que FDO fasse partie du protocole AOL, il n'en sera que peu question dans ce document. Le terme "Protocole AOL" est utilisé ici en référence a une relation interactive entre un client et un serveur AOL, comment les données sont préparées, envoyées, et comment elles peuvent etre manipulées. Radotage mediatique fallacieux a redondance cyclique Il n'existe actuellement aucune documentation formelle sur le protocole AOL, tout au moins aucune qui soit publiquement disponible. Actuellement il n'y a aucun article qui soit formel au point de decrire le protocole AOL (en tous cas pas publiquement) et dont la disponibilité permette d'en parcourir le contenu. Il n'existe pas pour le moment de documentation disponible publiquement (a part celle ci) qui décrive formellement le protocole AOL. Sommaire 1) Etablissement d'une connexion A. Serveurs B. le "handshake" C. Envoi du Pseudo et du mot de passe D. Completer le login 2) Les paquets A. Le premier octet B. Le premier et troisieme octet(CRC) C. Le quatrieme octet D. Le cinquieme octet E. Le sixieme et septieme octet F. Le huitieme octet G. Le neuvieme et dixieme octet 3) Logguage des Paquets de Données d'AOL 4) Formation des paquets de données 5) Pinger 6) A propos de la décompression FDO 7) Vue d'ensemble 8) Utilisation du sens du jugement 1) Etablissement d'une connexion A. Serveurs - ------------- Le serveurs AOL sont généralement sur le port 5190. Le serveur auquel le client se connexte est séléctionné au hasard par la DNS roulette russe 'AmericaOnline.aol.com'. Il y a des centaines de serveurs AOL liés ensemble (des stades de foot remplis de serveurs !!). Mais comment ils font pour éviter le meme phenomene que les NetSplits d'IRC ? ? Pour se connecter a un serveur AOL, tout ce qu'il faut faire c'est se connecter a 'AmericaOnline.aol.com' sur le port 5190. Rien de bien compliqué jusqu'ici, ca peut meme etre fait par telnet. En general les serveurs sur lesquels on est redirigé lors d'une connexion a un serveur aOL s'appellent "berps" (bruit d'un ROT) ex : 'berp-cr01.dial.aol.com'. B. Le handshake - ------------------ Lors de l'etablissement de la connexion a AOL, le client envoie en premier des paquets d'identification qui incluent le numero de version du client. En cas de succes, le serveur renverra des paquets "encourageants" (SD) et le client enverra alors le Pseudo/Mot de passe. En cas d'echec, le serveur renverra des paquets d'insultes (XS) et le client se verra déconnecté. AOL utilise ca de facon a désactiver les vieilles versions de clients et les forcer a upgrader (ca fait vachement penser a m$ quand meme;-)); Quand le serveur ne donne aucune réponse c'est que le paquet n'etait pas formé correctement... Client: 5A413800347F7FA3036B0100F5000000050F00002152CBCA070A1000080400000000035F00000100 04000300080000000000000000000000020D Client: ZA8Å4£kÅõÅÅÅÅÅ!RËÊÅÅÅÅÅ_ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ Server: 5AB71100037F7F240D5A88E9000B107F20534454D1F68B00000D Server: Z·-Å$ZˆéÅ SDTÑö‹ÅÅ C. Envoi du Pseudo et du Mot de passe - --------------------------------------- Apres que le serveur ait accepté le "handshake", le Pseudo et le mot de passe sont envoyés. Si le Pseudo et le Mot de passe correspondent, le serveur envoie alors l'information de désactivation du Master Tool, et envoie aussi la fenetre de bienvenue FDO. Si le Pseudo et le Mot de passe ne correspondent pas, le serveur demandera le mot de passe une fois de plus, et dans le cas de deux échecs successifs, le serveur enverra des paquets d'insultes (XS) et le client sera déconnecté.. Client: 5A243F00431010A044640015000100010A0400000001010B040000000103010A686F6C797461626C 6520011D00011D00010A0400000002030108736174616E363636011D000002000D Client: Z$?ÅCDdÅÅÅÅÅÅÅÅÅholytable ÅÅÅÅÅsatan666ÅÅÅ D. Compléter le login - ----------------------- Une fois le message de bienvenue FDO, le client envoie le token "ya". Ceci permet a AOL de notifier s'il y a du courrier, d'assigner une adresse IP et, si c'est configuré, d'afficher la Buddy List. Une fois l'IP assignée il devient possible d'envoyer des commandes aux services AOL. Client: 5A4EBA00031018A40D5AC6910008111CA079610701010D5A5C340022121CA0746C00170001000A0F 04007BB5E80A10041DA6DDF20A4504000000070002000D5A6F4A000D131CA0534301500010000020 00D Client: ZNºÅ¤ZÆ‘Å-yaZ\4Å" tlÅÅÅÅ{µè¦ÝòEÅÅÅÅÅZoJÅSCÅÅÅÅÅ Server: 5A419B00351D132079610304AC992E10020102010100040498A3CE86070101050203C00A15313533 2D34362D31362E6970742E616F6C2E636F6D0D5A7E91001E1E132076A007BB5E81DA6DDF20000000 000696D66617274702E627574000D Server: ZA›Å5 ya¬™.Ř£Î†À153-46-16.ipt.aol.comZ~‘Å-- tjÅ{µè¦ÝòÅÅÅÅÅimfartp.butÅ 2) Les paquets - ---------------- La structure de ces paquets est restée mystérieuse pendant longtemps (il parait) et la description qui suit n'est qu'un essai de passage a la loupe... A ne pas prendre pour parole biblique. Voici en gros a quoi un paque ressemble : Z (CRC) (CRC) [NULL] (LENGTH BYTE) (HB 6TH) (HB 7TH) [SPACE] (TOKEN) (TOKEN) Ce sont les premier 10 octets de tous les paquets AOL. Les seuls octets qui ne changent jamais sont le premier -> Z(5A en Hexa) et le quatrieme -> A null (00 en Hexa). Tout ce qui se trouve apres les 10 premiers octets est compressé en FDO ou en ligne de données. Le passage au detail des 10 premiers octets : A. Sur toutes les version AOL, le premier octet est toujours égal a z (5A ne Hexa). C'est l'octet le moins prise de tete (il ne change jamais) mais ca n'est pas une raison pour l'oublier (quoiqu'on aurait plutot tendance a oublier le quatrieme)... B. Le deuxieme et troisieme octet sont des octets 'Hi' et 'Lo' (Haut et Bas) produits par l'algoritme CRC16. CRC veut dire "Cyclic Redundancy Check" (Vérification de Redondance Cyclique). Non il ne s'agit pas d'un gaz qui détruit la couche d'ozone, mais il est quand meme utilisé dans le cadre de la compressions. Par exemple pour s'assurer qu'aucune donnée n'a été corrompue dans un fichier, l'entete CRC doit correspondre aux données du fichier lui meme. Il en est de meme pour la lecture d'un CDROM, d'une disquette, et des paquets AOL. Si le CRC ne correspond pas au paquet, le serveur AOL l'ignore. Le CRC est extrait du paquet duquel ont été supprimés les 5 Octets (le header). Le nombre produit par l'algo est alors utilisé pour produire les bits 'Hi' et 'Lo' qui sont alors placés dans le 2e et le 3e point du header. Le CRC s'applique seulement sur les versions 3.0 du client AOL et versions anterieures. Les versions plus récentes d'AOL envoient simplement '**' en deuxieme et troisiemes Octet. On peut donc tres bien s'en sortir avec ces versions la sans avoir a utiliser ce maudit CRC, mais dans tous les cas il y aura plus de données a envoyer. Si le CRC doit etre utilisé coute que coute, les choses seront beaucoup plus simples si cette utilisation s'applique a des paquets de type ancien ou réduit. Voici la fonction CRC et les subroutines 'Hi' et 'Lo' pour les programmeurs de C++ et Visual Basic (merci a la communauté AOL et a l'auteur anonyme). C++: ---- Function AOLCrc (strng$, lenstr) unsigned short CRC16(byte * buffer, int length) { unsigned short crc = 0; unsigned short ch; int i, j; for (i = 0; i < length; i ++) { ch = (unsigned short) buffer; for (j = 0; j < 8; j ++) { if ((crc ^ ch) & 1) crc = (crc >> 1) ^ 0xa001; Else crc >>= 1; ch >>= 1; } } return (crc); } Visual Basic: ------------- Function AOLCRC(strng$, lenstr) Dim crc As Long Dim ch As Long Dim i As Long Dim j As Long For i = 0 To lenstr - 1 ch = Asc(Mid(strng$, i + 1, 1)) For j = 0 To 7 If ((crc Xor ch) And 1) Then crc = (Int((crc / 2)) Xor 40961) Else crc = Int(crc / 2) End If ch = Int(ch / 2) Next j Next i AOLCRC = crc End Function Function gethibyte(mybyte As Variant) As Variant gethibyte = Int(mybyte / 256) End Function Function getlobyte(mybyte As Variant) As Variant getlobyte = Int((mybyte - (gethibyte(mybyte) * 256))) End Function On va expliquer plus bas comment utiliser ces fonctions. C. Le 4e Octet pour toutes les versions d'aol est de valeur NULL (00 in Hex). Attention : cet Octet ne change jamais mais il est obligatoire. D. Le 5e Octet est l'Octet de longueur, il définit plus ou moins la longueur du paquet moins les 5 premiers octets (header). Plus ou moins car un autre element (qui n'est pas la longueur physique) peut en affecter la valeur. L'octet situé directement avant tout chaine contenue dans le paquet (pseudo, chat, données de formulaires, etc) est aussi un Octet de longueur. Cet Octet représente la longueur de la chaine qui suit. et n'est pas comptabilisé dans la représentation du 5e octet de longueur. Voici un subroutine Visual Basic qui pourra pallier a ce manque et calculer le 5e octet de tout paquet qu'on lui donne : Function give5th(pack As String, inputz as integer) 'La fonction EnHex est necessaire pour cela, voir suite du document. Dim give5th1 As Integer inputz = inputz + 4 give5th1 = Len(DeHex(pack)) - inputz give5th = EnHex(Chr(give5th1)) End Function L'utilisation de cette fonction est simple, il suffit d'inclure le paquet entier en hexa (y compris le header) et le # d'inputs du formulaire pour calculer le 5e octet qui doit etre placé dans le paquet. Exemple: give5th("5AD69400411010A044640015000100010A0400000001010B04000000010301" & screenname$ & "20011D00011D00010A04000000020301" & password$ & "011D000002000D", 2) E. Le 6e et 7e Octet - Ces 2 octets sont au moins aussi gonflants que le 2e et le 3e octet. Il suffit de surveiller les paquets AOL pour comprendre ce qu'on veut dire ici. Ces deux octets changent sans explication apparente et sans indice aidant a comprendre de quoi sera composé la prochaine paire. Ces paquets sont differents pour chaque nouveau paquet. Cette enigme n'est pas résolue dans ce document mais une solution de remplacement y est considérée : En mettant tous les paques dans une boucle on s'apercoit que les paquets de login ont un 6e octet de 10(hex) =16(int) et un 7e octet de 18(hex) = 24(int). Idée : Avant l'envoi de chaque paquet, on peut incrémenter chacun de ces bits de 1. Bien que le client semble se livrer a une distribution completement différente, cette methode marche a merveille ;-)) On ne peut pas incrémenter de 1 a l'infini bien sur ;-) Au bout d'un moment le serveur AOL arrete de repondre et fait couler la connexion. La solution est de restaurer le 6e et 7e Octet a leurs valeurs originales 10(hex)=16 et 18(hex)=24 Partant de ces données, seule l'imagination limite les implémentations, le 6e et 7e octet avec des valeurs de 127 et 135 par exemple (hehehe). Par hypocrisie on va appeler ces octets "octets de comptage". Spéculations mode="parano": ces octets peuvent etre cités en référence comme "battements de coeur". Les paquets "ping-like" de 9 caracteres qui sont envoyés en permanence contiennent probablement des valeurs qui informent le serveur sur la santé/utilisation du client AOL, et qui sait peut etre d'autres informations plus consistantes ?? F. Le 8e octet est simplement un espace. G. Enfin, le 9e et 10e Octet (en ASCII) représentent le token. Les habitués de FDO savent que le token prévient le serveur de ce qu'il attend. Dans le doute on peut chercher les tokens et les comparer avec les fichiers token AOL-Files pour voir de quel paquet il s'agit. 3) Logguer les paquets de données AOL est une compétence tres important quand on veut fricotter avec le protocole AOL et sans laquelle on ne peut aller nulle part. La formation des paquets AOL n'est pas quelque chose qui peut etre réalisé en direct et a la main (a moins d'avoir un implant dans la cervelle;), l'opération (pour former les paquets, pas pour l'implant) équivaudrait a écrire en FDO, compresser le FDO et ajouter le header, le tout en temps réel. Bien que cela ne soit pas completement impossible (les implants c'est pas cher), la meilleure méthode reste encore le recyclage de paquets déja loggués qu'on peut modifier a volonté la ou c'est nécéssaire. Récuperer des paquets AOL est assez simple, il suffit de créér/utiliser un programme qui va ecouter sur le port 5190 pour toutes les connexions entrantes. Ensuite il faut jeter son dévolu sur la version d'AOL a espionner.. La version US d'aol 2.5 reste encore le meilleur choix, d'ailleurs ce document ne traite que de methodes utilisables avec cette version. Il est meme possible entre la création, la diffusion et la traduction de cet article, qu'AOL ai fini d'accepter que les clients 2.5 se connectent a leurs serveur. dans le doute : http://clients.aol-files.com Il faut tripotter le client AOL pour le forcer a se connecter en local plutot que sur 'AmericaOnline.aol.com'. Pour cela il faut ouvrir le fichier 'tcp.ccl' situé dans le repertoire 'ccl' et remplacer l'occurence 'AmericaOnline.aol.com' par 'localhost', puis sauver et fermer le fichier. En ajoutant une regle de filtre au programme qui loggue les paquets (tcpdump?) on fait forwarder les paquets du port 5190 sur 'AmericaOnline.aol.com'. On peut alors lancer le client AOL et vérifier que lors d'une demande de connexion le programme de logging forwarde bien la demande. On peut alors commencer a intercepter les données en séparant les données du serveur des données du client. A partir d'une machine windows cela peut poser des problemes a cause des caracteres "NULL" qui, quand ils sont mis dans une textbox, représentent une fin de ligne et rendent illisible le texte qui suit sur la fin de la ligne. en éditant le caractere NULL d'une chaine on peut rendre lisible le paquet en entier. Voici une routine en Visual Basic qui permet de pallier a ca : Function stripnulls(thedata as String) Dim torem as Integer torem = 1 Do Until crap = 0 torem = InStr(1, thedata, Chr$(0)) If torem > 0 Then Mid(thedata, torem, 1) = "Å" Loop End Function L'edition des paquets en ASCII donne des resultats catastrophiques : le paquet est inutilisable et ne peut etre renvoyé au serveur. L'edition des paquets doit donc etre faite en Hexa dont voici quelques fonctions (toujours en Visual Basic). Public Function EnHex(Data As String) As String Dim iCount As Double Dim sTemp As String For iCount = 1 To Len(Data) sTemp = Hex$(Asc(Mid$(Data, iCount, 1))) If Len(sTemp) < 2 Then sTemp = "0" & sTemp EnHex = EnHex & sTemp Next iCount End Function Public Function DeHex(Data As String) As String Dim iCount As Double For iCount = 1 To Len(Data) Step 2 DeHex = DeHex & Chr$(Val("&H" & Mid$(Data, iCount, 2))) Next iCount End Function Public Function Int2Hex(Data As String) As String Dim sTemp As String sTemp = Hex(Data) If Len(sTemp) < 2 Then sTemp = "0" & sTemp Int2Hex = Int2Hex & sTemp End Function Public Function Hex2Int(Data As String) As String Dim iCount As Double For iCount = 1 To Len(Data) Step 2 Hex2Int = Hex2Int & CInt(Val("&H" & Mid$(Data, iCount, 2))) Next iCount End Function Il faut capturer les paquets en Hexa et a moins d'utiliser AOL Data Edit (plus dur a trouver eh?) ca ne marchera pas... 4) Formation des Paquets de Données On va maintenant essayer d'expliquer comment former un paquet et l'envoyer avec Visual Basic en utilisant les fonctions de ce document. Avant tout il faut un des paquets qui ont été loggués plus haut. Voici un paquet loggué IM : 5A21EF00401422A06953002500010001070400000003010A040000000103010A676F64736D697366 3174011D00010A04000000020301026869011D00011D00011D000002000D Z!ïÅ@"iSÅ%ÅÅÅÅÅÅÅÅgodsmisf1tÅÅÅÅhiÅÅÅÅÅ IM Envoyé au pseudo 'godsmisf1t' avec le message 'hi'. Que changer dans ce paquet ? A premiere vue on peut modifier les chaines "hi" et "godmisf1t". L'hexa pour 'godsmisf1t' est '676F64736D6973666974'. On recherche donc cette valeur dans le paquet Hexa, on rechercha aussi '6869' qui correspond a 'hi'. 5A21EF00401422A06953002500010001070400000003010A040000000103010A676F64736D697366 3174011D00010A04000000020301026869011D00011D00011D000002000D On a donc identifié les données a changer, il ne reste plus qu'a les éditer, et aussi a éditer l'octet situé directement avant les chaines en accord avec la longueur des varaibles modifiées. "5A21EF00401422A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D" Les variables IM$ et screenname$ prennent la valeur du pseudo et du message en hexa et les octets qui les précedent directement sont supprimés et remplacés par la valeur hexa correspondant a leurs longueurs respectives. Voici un exemple en Visual Basic : screenname$ = Int2Hex(Len("godsmisf1t")) & EnHex("godsmisf1t") IM$ = Int2Hex(Len("hello")) & EnHex("hello") Il ne reste plus qu'a mettre le paquet en hex et a le renvoyer pour que ca marche alors ? Perdu ! Il faut aussi changer la valeur du 5e octet (l'octet de longueur) en fonction de la longueur du message et du pseudo. On peut pour ca utiliser la fonction give5th (Visual Basic) : fifth$ = give5th("5A21EF00401422A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D", 2) Cette fonction calcule l'octet de longueur du paquet avec le nombre d'inputs. Un formulaire IM a 2 champs inputs, on en met donc 2 comme valeur. La valeur hexa de l'octet de longueur se trouve stockee dans la variable 'fifth$' pour usage ulterieur. Il faut ensuite s'assurer qu'on a les bonnes valeurs pour le 6e et 7e octet. Juste apres le login on avait remarqué que les valeurs du 6e et 7e octet etaient respectivement 16 et 24 ( 10 et 16 en hexa). Une fois que l'etape du login sera franchie, il faudra s'assurer que les valeurs de ces deux octets soient stockées dans des variables publiques afin de pouvoir les incrémenter et ainsi produire les "battements de coeur". Comme expliqué plus haut ces valeurs doivent etre réinitialisées des qu'elles atteignent respectivement les valeurs 127 et 135. sixth = CInt(sixth) + 1 seventh = CInt(seventh) + 1 Voici comment on les integre avec le 5e octet du paquet. Le paquet actuel est "5A21EF00401422A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D" Le 5e (hex) '40' le 6e (hex)'14', et le 7e (hex) '22' sont les octets qui doivent etre remplacés avec les variables : packet$ = DeHex("00" & fifth$ & Int2Hex(sixth) & Int2Hex(seventh) & "A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D") On met ainsi a jour le 5e, 6e, et 7e octet avec les variables hexa, et on met le nouveau paquet dans la variable 'packet$'. Il ne reste plus qu'a modifier l'octet CRC : crc1 = AOLCRC(packet$, Len(packet$) - 1) thehi$ = Chr(gethibyte(crc1)) thelo$ = Chr(getlobyte(crc1)) packet$ = "5A" & EnHex(thehi$) & EnHex(thelo$) & "00" & fifth$ & Int2Hex(sixth) & Int2Hex(seventh) & "A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D" Le paquet est pret a etre envoyé avec la fonction DeHex qui va l'envoyer au serveur. whatyousend$ = DeHex(packet$) Il suffit d'envoyer whatyousend$ au serveur, et si tout a été fait correctement ca devrait envoyer un IM. En ficelant le tout, on peut construire une fonction qui envoie un IM : Function SendIM(screenname as String, IM as String) screenname1$ = Int2Hex(Len(screenname)) & EnHex(screenname) IM1$ = Int2Hex(Len(IM)) & EnHex(IM) If sixth = "127" Then sixth = "15" 'Backtrack 1 because we are going to add 1 soon seventh = "23" 'THIS IS THE CODE TO RESET THE BYTES End If sixth = CInt(sixth) + 1 seventh = CInt(seventh) + 1 fifth$ = give5th("5A21EF00401422A06953002500010001070400000003010A04000000010301" & screenname1$ & "011D00010A04000000020301" & IM1$ & "011D00011D00011D000002000D", 2) packet$ = DeHex("00" & fifth$ & Int2Hex(sixth) & Int2Hex(seventh) & "A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D") crc1 = AOLCRC(packet$, Len(packet$) - 1) thehi$ = Chr(gethibyte(crc1)) thelo$ = Chr(getlobyte(crc1)) packet$ = "5A" & EnHex(thehi$) & EnHex(thelo$) & "00" & fifth$ & Int2Hex(sixth) & Int2Hex(seventh) & "A06953002500010001070400000003010A04000000010301" & screenname$ & "011D00010A04000000020301" & IM$ & "011D00011D00011D000002000D" whatyousend$ = DeHex(packet$) Form1.Winsock1.SendData whatyousend$ 'On part du principe que le formulaire 'principal s'appelle Form1 et que 'Microsoft Winsock Control est utilisé. End Function 5) Les Ping ----------- Apres avoir réussi a établir une connexion avec AOL (ca peut prendre des années;), on peut constater qu'AOL envoie des petits paquets qui ressemblent a ca : Serveur: 5A647D00032313260D Serveur: Zd}Å#& Ces paquets sont similaires a des ping. Le serveur vérifie si la connexion est toujours en bonne santé. Le fait de ne pas y répondre met la connexion en mode suspendu (aucune autre donnée ne peut circuler jusqu'a ce qu'un ping soit envoyé et/ou répondu). La réponse attendue par le serveur est heureusement simple a produire, on prend le 6e et le 7e octet du paquet ping, on les inverse, et on les renvoie au serveur. Voici a quoi ressemble une reponse d'un client a un ping : Client: 5A0AE900031323A40D Client: Z éÅ#¤ Le paquet ping du serveur a un 6e caractere dont la valeur hexa est 23. Le 7e octet a une valeur de 13 en hexa. Le client inverse les deux valeurs avant de les renvoyer avec la methode suivante : Dans le 'Winsock Data Arrival event' déposer ceci : 'Assuming sData is the incoming server data: If Len(sData) = 9 Then ping6$ = Mid(sData, 6, 1) ping7$ = Mid(sData, 7, 1) packet$ = DeHex("0003" & EnHex(ping7$) & EnHex(ping6$) & "A40D") crc1 = AOLCRC(packet$, Len(packet$) - 1) thehi$ = Chr(gethibyte(crc1)) thelo$ = Chr(getlobyte(crc1)) tosend$= DeHex("5A" & EnHex(thehi$) & EnHex(thelo$) & "0003" & EnHex(ping7$) & EnHex(ping6$) & "A40D") Winsock1.SendData tosend$ End If C'est le client qui le plus souvent envoie les ping, et c'est le serveur qui le plus souvent y repond. Le serveur AOL stoppera toute transmission jusqu'a ce que le ping recoive une reponse ou soit envoye. Pour une utilisation applicative, il est recommandé d'intégrer un timer qui aura pour role d'envoyer constamment des ping au serveur AOL. Note : lors d'une réponse a un ping, il est inutile d'incrémenter le 6e et le 7e octet, ni de chercher un 5e octet. 6) La compression FDO ---------------------- Les paquets traités plus haut ne reseemblent pas vraiment a du FDO, et pourtant il sont bien compressés en FDO. Un rapide coup d'oeil permet de localiser les zones de compression. Il est meme possible d'écrire une subroutine qui va faire le travail : Il faut localiser le fichier 'ada32.dll'. C'est la librairie de ressource qu'AOL utilise pour stocker toutes les fonctions de compression FDO. Pour ceux qui savent déclarer une fonction depuis une DLL (pour les autres faudra lire des docs avant hehe) voici la liste des fonctions qui se trouvent dans le fichier 'ada32.dll' : AdaAssembleAtomStream AdaDisassembleAtomStream AdaDoAtomCallbacks AdaAssembleArgument AdaAssembleAtomStream AdaAssembleFragment AdaDisassembleArgument AdaDisassembleAtom AdaDisassembleAtomState AdaDisassembleAtomStream AdaDisassembleAtomStreamState AdaDoAtomCallbacks AdaEnumAllAtoms AdaFreeState AdaGetAtomByName AdaGetAtomName AdaGetErrorText AdaGetVersion AdaInitialize AdaIsValidProtocol AdaLookupAtomEnum AdaNormalizeAtomStream AdaTerminate Voici les fonctions qui se trouvent dans le fichier ‘ada.dll’ : ?ADAASSEMBLEATOMSTREAM@@ZAJAFVZSTRING@@AEVZBUFFER@@I@Z ?ADADISASSEMBLEATOMSTREAM@@ZAHAFVZBUFFER@@AEVZSTRING@@I@Z ?ADADOATOMCALLBACKS@@ZAHP7AHKGGPFEG@ZKAFVZBUFFER@@I@Z ___EXPORTEDSTUB _ADAASSEMBLEARGUMENT _ADAASSEMBLEATOMSTREAM _ADAASSEMBLEFRAGMENT _ADADISASSEMBLEARGUMENT _ADADISASSEMBLEATOM _ADADISASSEMBLEATOMSTATE _ADADISASSEMBLEATOMSTREAM _ADADISASSEMBLEATOMSTREAMSTATE _ADADOATOMCALLBACKS _ADAENUMALLATOMS _ADAFREESTATE _ADAGETATOMBYNAME _ADAGETATOMNAME _ADAGETERRORTEXT _ADAINITIALIZE _ADAISVALIDPROTOCOL _ADALOOKUPATOMENUM _ADANORMALIZEATOMSTREAM _ADATERMINATE ADA Atomic Disassembler/Assembler WEP 7) Vue d'ensemble ------------------ Le résultat des sujets abordés dans ce document, c'est un client AOL en Visual Basic capable d'envoyer des IM. Ce client utilise les fonctions expliquées plus haut. 1) Démarrer un nouveau projet 2) Ajouter Microsoft Winsock Control au projet 3) Créer un controle sur le formulaire 4) Créer deux boutons de commande (Connect, Send IM) 5) Créer cinq boites texte(Status, Screenname, Password, IMName, IMMsg) Dans 'Declarations' déposer ceci : Dim sixth as String Dim seventh as String Dim packet as String Dans le bouton 'Connect' déposer ceci : Call Winsock1.Connect("AmericaOnline.aol.com", 5190) 'Ouvrir une connexion vers 'le serveur AOL Dans les évenement de 'Connect' du Winsock control, déposer ceci : status.Text = status.Text & "Connected" & vbCrLf packet$ = DeHex("5A413800347F7FA3036B0100F5000000050F00002152CBCA070A1000080400000000035F0 000010004000300080000000000000000000000020D") Winsock1.SendData packet$ ' Envoyer la version du paquet NE RIEN MODIFIER Dans les évenement des 'DataArrival' du Winsock control, déposer ceci: Winsock1.GetData sData, vbString 'Dépose les données envoyées dans 'sData' If Len(sData) = 9 Then ping6$ = Mid(sData, 6, 1) ping7$ = Mid(sData, 7, 1) packet$ = DeHex("0003" & EnHex(ping7$) & EnHex(ping6$) & "A40D") crc1 = AOLCRC(packet$, Len(packet$) - 1) thehi$ = Chr(gethibyte(crc1)) thelo$ = Chr(getlobyte(crc1)) tosend$= DeHex("5A" & EnHex(thehi$) & EnHex(thelo$) & "0003" & EnHex(ping7$) & EnHex(ping6$) & "A40D") Winsock1.SendData tosend$ End If Dim crap as Integer crap = 1 Do Until crap = 0 crap = InStr(1, sData, Chr$(0)) If crap > 0 Then Mid(sData, crap, 1) = "Å" Loop status.Text = status.Text & "Server: " & sData & vbCrLf & vbCrLf If InStr(1, sData, "Invalid password") Then status.Text = status.Text & "Invalid Password" & vbCrLf Call Winsock1.Close End If If InStr(1, sData, "Invalid account") Then status.Text = status.Text & "Invalid account" & vbCrLf Call Winsock1.Close End If If InStr(1, sData, "SD") Then screenname1$ = Int2Hex(Len(screenname.Text) + 1) & EnHex(screenname.Text) password1$ = Int2Hex(Len(password.Text)) & EnHex(password.Text) fifth$ = give5th("5AD69400411010A044640015000100010A0400000001010B04000000010301" & screenname1$ & "20011D00011D00010A04000000020301" & password1$ & "011D000002000D", 2) packet$ = DeHex("00" & fifth$ & "1010A044640015000100010A0400000001010B04000000010301" & screenname1$ & "20011D00011D00010A04000000020301" & password1$ & "011D000002000D") crc1 = AOLCRC(packet$, Len(packet$) - 1) thehi$ = Chr(gethibyte(crc1)) thelo$ = Chr(getlobyte(crc1)) packet$ = DeHex("5A" & EnHex(thehi$) & EnHex(thelo$) & "00" & fifth$ & "1010A044640015000100010A0400000001010B04000000010301" & screenname1$ & "20011D00011D00010A04000000020301" & password1$ & "011D000002000D") Winsock1.SendData packet$ 'Sends the screenname/password. If you don’t 'understand this refer above to 'Forming Packets' packet$ = DeHex("5A3A0A00031018A40D") 'This is a logged ping packet Winsock1.SendData packet$ End If If InStr(1, sData, "Master Tool") Then packet$ = DeHex("5A3A0A00031018A40D5AC6910008111CA079610701010D5A5C340022121CA0746C0017000 1000A0F04007BB5E80A10041DA6DDF20A4504000000070002000D5A6F4A000D131CA053430015000 1000002000D") Winsock1.SendData packet$ 'This sends the ya login packet, 'NO CHANGES HAVE BEEN MADE sixth=Hex2Int("13") seventh=Hex2Int("21") 'This is where you set your sixth and seventh at first. End If Dans le bouton de commande 'Send IM' déposer ceci : screenname1$ = Int2Hex(Len(IMName.Text)) & EnHex(IMName.Text) IM1$ = Int2Hex(Len(IMMsg.Text)) & EnHex(IMMsg.Text) If sixth = "127" Then sixth = "15" 'Backtrack 1 because we are going to add 1 soon seventh = "23" 'THIS IS THE CODE TO RESET THE BYTES End If sixth = CInt(sixth) + 1 seventh = CInt(seventh) + 1 fifth$ = give5th("5A606700001522A06953002500010001070400000003010A04000000010301" & screenname1$ & "011D00010A04000000020301" & IM1$ & "011D00011D00011D000002000D", 2) packet$ = DeHex("00" & fifth$ & Int2Hex(sixth) & Int2Hex(seventh) & "A06953002500010001070400000003010A04000000010301" & screenname1$ & "011D00010A04000000020301" & IM1$ & "011D00011D00011D000002000D") crc1 = AOLCRC(packet$, Len(packet$) - 1) thehi$ = Chr(gethibyte(crc1)) thelo$ = Chr(getlobyte(crc1)) packet$ = DeHex("5A" & EnHex(thehi$) & EnHex(thelo$) & "00" & fifth$ & Int2Hex(sixth) & Int2Hex(seventh) & "A06953002500010001070400000003010A04000000010301" & screenname1$ & "011D00010A04000000020301" & IM1$ & "011D00011D00011D000002000D") Winsock1.SendData packet$ IMMsg.Text="" Dans l'évenement 'SendComplete' du Winsock control déposer ceci : Dim crap as Integer crap = 1 Do Until crap = 0 crap = InStr(1, packet$, Chr$(0)) If crap > 0 Then Mid(packet$, crap, 1) = "Å" Loop status.Text = status.Text & "Client: " & packet$ & vbCrLf & vbCrLf Dans l'évenement 'Change' du status de la boite texte, déposer ceci : status.SelStart = Len(status.Text) 'Auto Scrolls If Len(status.Text) >= 32000 Then status.Text = Right$(status.Text, Len(status.Text) / 2) 'Keeps the length from getting too large Il faut s'assurer que status.Text est défini en multiline=true et qu'il possede bien des barres de scroll. Si tout a été fait correctement, on a maintenant une version fonctionnelle d'un client AOL capable d'envoyer des IM. Bienvenue a Winsuck AOL 8) Sens Commun -------------- La seule raison pour laquelle ce document n'a pas été diffusé plus tot (sa traduction remonte a 1999) est l'abus que certaines personnes et sociétés font avec de tels outils : programmes de spammming, IM bombers, cloners, etc En attendant il plus difficile d'utiliser les sources de ce document que de se procurer les programmes en question (tout ca a cause du word wrap a 80chars ;-), la nouvelle version du protocole AOL y est d'ailleurs pour beaucoup car elle rend la totalité de ce document obsolete, have phun ;-)) tobozo@madchat.org ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ ___________________ _ -*3*- `^°*;:,.> Castor Récursif <.,:;*°^` _____________________________/¯¯¯¯¯¯ Gard ¯¯¯¯¯¯¯\______________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, /------------------------------------------------------\ | La récursivité et l'appel séquentiel des scripts PHP | | ---------------------------------------------------- | | un délire schizophrénisant proposé par GarD - 16/8/1 | \------------------------------------------------------/ Avertissement formel: Cet article est un ensemble de conjectures aboutissant à une théorie, il ne faut donc pas s'attarder à l'aspect illogique de certains points car la théorie finale est en elle même un paradoxe et constitue d'ailleurs le seul but dudit article, concentrez vous seulement à comprendre où on veut en venir et ensuite vous en ferez ce que vous voudrez (des confettis probablement, ou pour les plus cinglés d'entre vous tenterez de la mettre en pratique ou de la déformer en soufflant dans la valve pour en faire un castor héliumisé). Tout est parti de la rupture thermo-nucléaire d'une veine cérébrale, d'une idée rebondissant dans tous les sens, et de cet échange verbal digitalisé: GarD wrote: "j'ai comme un truc au bout de la langue qui va surement sortir en cours de route, j'ai l'impression qu'il y a quelque chose d'interessant a faire ca va surement m'sauter dessus d'taleur - ah je tourne autour et jarrive pas a savoir ce que me susurre mon subconscient, en gros ca tourne autour de ca: Que se passerait t'il si un script php se faisait un fsockopen pr se connecter a lui meme et sexecuter avec des argues en postvar '#!! t'as une idée? - Le paradoxe tient essentiellement ds le fait que ce ne serait plus toi qui executerait le script ms le script qui sexecuterait lui meme, ms l'appel de fsockopen se ferait ds lexecution du script que TU fais, donc tu serais un utilisateur par procuration C assez bizarre comme concept" tobozo wrote: "nobody -> open port xxxx -> script died unexpectedly tu peux faire un DDOS par contre et faker des paquets avec une double ouverture subterfugieuse, il te suffit de calculer la difference de temps a u niveau du client .. entre 10 frames ca doit etre bon et tu peux ensuiter lancer une campagne numerique de vachement grande envergure pendant qu'a vera cruz ils vendent de la moutarde aux herbes mal sechees moi je vais aller bouffer miam miam miam" Les discussions absurdes du 15 aout au soir... Seulement... Seulement voilà. Un script qui s'appelle lui même et un utilisateur par procuration, que ce soit possible ou non le concept est assez intéressant de par le fait que la théorie en éveille d'autres. CONJECTURES 1) Première conjecture: Imaginez d'abord un script qui s'appelle lui même, un script qui exécuterait un script en quelque sorte, alors l'exécution du second script (qu'il soit lui meme ou non) est inhérente à la fonction fsockopen qui mourra en même temps que le premier script décimé par le timeout d'exécution. Aussi nous sommes en présence d'un second script qui bien que n'étant pas exécuté par l'utilisateur lui même est dépendant de celui-ci (et si vous fermez votre browser tout s'arrete). Fin de conjecture. 2) Seconde conjecture: Imaginez désormais un script php qui créerait un fichier, se copierait dedans, et exécuterait le script créé qui lui même créerait un nouveau fichier se créerait dedans et l'exécuterait et caetera et caetera; une fois écarté le tourbillon mental de la récursivité dans les exécutions subalternes et les copies d'entités destinées à l'exécution nous serons en présence d'une chaine d'exécution de scripts dépendante du simple timeout d'exécution du premier maillon de la chaine. Fin de conjecture. 3) Troisième conjecture: Dans un tel shéma nous sommes donc en présence, à un bout éloigné d'une chaine d'exécution, d'un script (d'execution sub^n) dépendant des couches supérieures mais à y regarder de plus près il dépend prioritairement du script qui est derrière lui et qui l'a initié via fsockopen, script qui lui même est exécuté de la même manière. Alors en observant cette portion de la chaîne nous constatons des scripts php qui ne sont apparemment pas d'une exécution dépendante à une action de l'utilisateur. Le paradoxe prend toute son ampleur ici. Car imaginez désormais ce qu'il se passerait à l'instant précis où le premier maillon de la chaine (le script que vous exécutez) mourra de timeout cancérigène; en toute logique le lien fsockopen vers le deuxième maillon sera brisé et l'exécution du deuxième maillon se terminera puis le lien fsockopen vers le troisieme maillon se brisera et le troisieme maillon se cassera etc. Mais imaginez qu'il y ait 200 (ou 200000) maillons et imaginez que la mort séquentielle de chaque maillon ne soit pas "absolument" instantanée, alors... Alors nous serions en présence, pendant un temps x, d'un script, le dernier de la chaine, qui s'executerait sous la tutelle du maillon inférieur qui l'a initié, alors que le script que VOUS avez exécuté est DEJA terminé. Un script PHP qui continuerait a s'executer sans la présence de l'utilisateur. Fin de conjecture. 4) Quatrième conjecture: Reprenons les fondements de la troisième conjecture et développons. Imaginez que le temps de décallage entre la mort du premier maillon et celle du dernier maillon soit quantifiable, et qu'il existe un moyen paliatif à ce délai. Pour cela prenons l'hypothèse d'un script qui au lieu de créer et d'exécuter un nouveau script en créerait 10 et que chacun d'entre eux en créerait 10 autres (histoire de donner dans la logarythmique), nous serions en présence d'un nombre plus conséquent de maillons de chaine à détruire et un délai de destruction x allongé. Prenons désormais l'hypothèse d'une équation possible entre le nombre y de scripts créés et le temps de création de nouveaux scripts à un Temps donné (la mort du premier maillon) qui deviendrait inférieur au temps de destruction des maillons, nous serions en présence d'une exécution infinie de scripts en dehors de la présence de l'utilisateur et donc la conclusion fondamentale de la théorie fracassisante (crénom d'un ours blanc): THEORIE CONCLUSIONNANTE Un script php pourrait s'exécuter sans utilisateur. Paf. La théorie intéressant déjà plusieurs personnes avant même qu'elle soit écrite il est possible (possible disais-je, non plausible) que vous ayez un ou plusieurs développements lors de numéros ultérieurs de ce zagamine electrique. D'ici là, détruisez vous bien le cerveau, Bonsoir. placard... quart d'heure heureux retour tournoi noyé yépresque squesélong longue vue vulnérable érable en sirop iro-shima ima-laya l'aya ca se fume noyé dans la colle écolière écornée corne de brume et de brouillard entre les feux arrière et les warning clignotant tantot ou tard tardivement vivement demain mains aux fesses supposée suppositoire fuite de gaz gaz hillarant larant fabian bian bian ach sehr gut goute moi ca sataniste istambul tamboula labas bataille rangée gérant rentable table à manger genant matforever@hotmail.com ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸ _ _______________________ _ -*4*- `^°*;:,.> IDS/LIDS/NIDS/SNORT <.,:;*°^` _____________________________/¯¯¯¯¯¯¯¯ Hertz ¯¯¯¯¯¯¯¯\___________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸ Introduction à LIDS. hertz@securix.org 23-06-2000 Introduction à LIDS (Linux Intrusion Detection/Defense System). Présentation LIDS signifie en anglais "Linux Intrusion Detection/Defense System", en français cela pourrais donner : "Système Linux de détection et de protection contre l'intrusion. Ce document est en réfèrence du Howto sur Lids-0.8.1pre1. A l'heure actuelle, faute de moyens, seule les architectures i386 sont supportés. Le but du projet est de protèger les systèmes sous Linux contre des intrusions sous root par désactivation des appèles système au niveau même du kernel. Du fait que vous avez besoins d'administrer le système, LIDS peut être bien sur désactivé. La première partie est de protèger LIDS lui même contre des intrusion sous root. Ceci bien sur en admettant deux choses: -Le système est sain (pas de backdoors, ...) jusqu'à la première installation de LIDS. -Vous êtes la seule personne à avoir un accès sur la console de l'ordinateur (de sorte que vous pouvez passer des commandes au kernel à travers lilo, vous pouvez booter sur un noyau de sauvegarde ou vous pouvez booter sur une disquette). Protèger LIDS contre une intrusion sous root signifie: -Interdire les modules -Interdire l'accès à la "raw memory" (/dev/mem, /dev/kmem, /dev/kcore) -Interdire l'accès au "raw disk" (/dev/hdxx, /dev/sdxx) -Protèger les fichiers ayant pour rôle le démarage du système (lilo files, kernel image, daemons, rc scripts, modules) -Interdire "raw access" au ports I/O (/dev/port, ioperm and iopl syscalls) Ensuite, vous pouvez pensez à la détection d'intrusion. Pour cela LIDS fournit: -Journalise quasiment tous les refus d'accès. -Place des flags read-only et append-only sur les programmes ou journaux contre une intrusion sous root. -Cache votre propres détecteurs d'intrusion. Pour la protection de votre système, LIDS fournit: -Bloque contre toute modification vos tables de routage, ainsi que les règles du firewall. -Bloque les opérations de montage. -Protège les daemons contre les signaux. -N'importe quelle chose que vous pouvez interdire avec "linux capabilities bounding" Compilation de lidsadm Pour le compiler, allez dans le répertoire et tapez: make You can have lidsadm display the current lids status (capabilities/flags state). This is mainly for debugging purposes, as without this option and a correctly configured system2.1 nobody can know the current state of LIDS2.2. make VIEW=1 Installer lidsadm make install Vous devez aussi être sur que votre répertoire /etc se trouve sur votre partition racine (/) car LIDS à besoin de pouvoir lire /etc/lids.conf quand il n'y a que / de monté. Obtenir un mot de passe chiffre en RipeMD-160 vmlin1:~# lidsadm -P MAKE PASSWD enter password: Verifying enter password: RipeMD-160 encrypted password : 46a1492cc2d43652409abfdbb047e4ae099a62f3 Patcher un kernel cd /usr/src/linux-linversion patch -p1 < lidshome/lids-version-linversion.patch Configurer the kernel make sure you choose [*] Prompt for development and/or incomplete code/drivers6.1 and [*] Sysctl support6.2 for Linux Intrusion Detection System to appear. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- IDS (Intrusion Detection Systems) hertz@securix.org 14-06-2000 Les systémes de détection d'intrusions. Brouillon de document, commentaires bienvenus. Présentation: Les systèmes de détection d'intrusions (IDS) sont des outils permettants de détecter des activitées suspectes. Il peuvent être mis en place sur une machine pour détecter les attaques effectués sur celle-ci (IDS locaux) et peuvent aussi être configurés pour détecter toutes les attaques effectués sur le réseau; dans ce dernier cas, l'on fera plutôt réfèrence à NIDS (Network Intrusion Detection Systems). L'approche la plus courament utilisé pour la détection d'intrusion est la recherche de signatures (un peu comme les anti-virus). Les systèmes de détection d'intrusion (IDS) Les IDS locaux, sont les systèmes qui ne vont détecter que les intrusions en local. Ce sont des logiciels que l'on installe sur tous les postes que l'on veux surveiller; contrairement au NIDS qui s'installent sur un poste puis surveillent la totalité du segement réseau auquel il appartient. Les IDS locaux et NIDS ont des avantages et des inconvenients chacuns, nous reviendrons plus tard sur ces différences. Il ne vont pas seulement analyser les connexions entrantes et sortantes, mais aussi les logs ainsi que les processus suspects. Il y a deux principaux types d'IDS locaux, les wrappers/firewalls et les agents. L'assemblage des deux est bien plus efficace qu'un NIDS. Wrapper/firewall Les wrapper/firewalls vont permettre l'analyse et la protection face au connexions entrantes et aussi sortantes. Le plus connu des wrapper est TCPWrapper: http://coast.cs.purdue.edu/pub/tools/unix Agents En addition, les agents devront analyser les accès et changement effectués sur les fichiers sensibles du system. Ils pourront par exemple analyser le contenu des fichiers de log pour détecter des messages suspects. Les outils qui fonctionnent de cette manière sont par exemple: - Logcheck --> http://www.psionic.com/abacus/logcheck/ - Swatch ----> ftp://ftp.stanford.edu/general/security-tools/swatch/ Les systèmes de détection d'instrusion réseau (NIDS). Les NIDS sont des détecteurs d'intrusion orientés réseau. C'est à dire qu'ils sont conçues pour détecter les activités suspectes se déroulant sur le réseau et non sur une seule machine. Architecture. Comment les NIDS font leurs détections. Il y a deux techniques principales: Détection d'activité anormale: L'approche la plus courante de la détection d'intrusion est la détection d'activité anormale grace aux statistiques. L'avantage de cette technique est qu'elle ne nécessite pas la connaissance de types d'attaques. Reconnaissance de signature: La plupart des outils commerciaux fonctionnent sous ce principe. En fait cela signifie que tout type d'attaque devant être détecté doit au préalable avoir sa signature ajoutée au system. Par exemple, le NIDS va en permanence rechercher des motifs telles que: "/cgi-bin/phf?" (ceci représente une requette sur une application CGI vulnérable). Les NIDS possèderont souvent une base de donnée de types d'attaque connues. Vous pouvez trouver des informations et récupèrer des fichiers de signatures sur http://www.whitehats.com Comment font-ils la comparaison des signatures avec le traffic entrant: Un NIDS capture les paquets circulants sur le réseau, puis appliques quelques techniques: -Protocol stack verification -Application protocol verification -Creating new loggable events Protocol stack verification: Un certain nombre d'attaques, tels que les "Ping- Of-Death", "TCP Stealth Scanning", effectuent des requettes IP, TCP, UDP, ICMP mal formés pour réaliser l'attaque. Une simple vérification sur chaque paquet permet de détecter de tels attaques. Application protocol verification: Les attaques sont aussi souvent effectués au niveau applicatif. "Winnuke" par exemple, ainsi que les attaques DNS. De ce fait les NIDS doivent comprendre certains protcoles de la couche applicative. Creating new loggable events: Un NIDS peut aussi être conçu pour rapatriller des logs (WinNT Event, UNIX syslog, SNMP TRAPS, etc.). Plus tard il pourra les réassembler/triller sur un machine dédiée. Placer le NIDS dans le réseau: Les NIDS sont plus efficaces en périphèrie du réseau, tel, qu'a côté d'un firewall, serveur d'accès distant, et sur le lien d'un réseau partenaire. Outils / Ressources: Vous pouvez consulter les sites suivants: -http://www.lids.org -->> Linux Intrusion Detection System. -http://www.snort.org -->> Snort is a lightweight network intrusion detection system. -http://www.whitehats.com -->> Base de donnée de règles pour Snort. -http://packetstorm.securify.com/UNIX/IDS/ -->> Archive de divers IDS / NIDS. -http://packetstorm.securify.com/papers/IDS/ -->> Documents sur les IDS (Anglais) -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- CONSTRUIRE UN SYSTEM SECURISE PAR LIDS Xie Huagang (/xhg@ncic.ac.cn,/ http://www.lids.org) Tue Apr 18 00:02:12 CST 2000. LIDS ( Linux Intrusion Detection System) est un patch du kernel de linux servant à augmenter ses capacités. Dans cet article, nous parlons de ce que lids est capable de faire et comment construire avec lui un système Linux sécurisé. Pourquoi LIDS. Avec l'augmentation de la popularité de Linux sur Internet, de plus en plus de bug de sécurité sont trouvés dans le système GNU/Linux. Vous pouvez entendre sur Internet que - Il y a des bugs dans Linux, qui rendront le système facilement attaquable par un hacker. Depuis que Linux est un art de la comunauté open source, les trous de sécurité peuvent être trouvés facilement et peuvent aussi être aussi vite corrigés. Mais quand un bug est publiquement connue, et que l'administrateur est trop fainéant pour corriger ce bug. Il est alors très facile de pénèter le système et parfois plus grave encore, il est possible d'obtenir un shell sous root. Maintenant vous pouvez vous demander quelle est la solution? Qu'est-ce qui ne va pas avec le système GNU/Linux. - superuser (root) peut abuser de ses droits Sous root, il peut faire absoluement ce qu'il veut. Il peut changer les fonctions propres au système. - De nombreux fichiers système peuvent être facilement changés. Il y a de nombreux fichiers importants, tel que /bin/login, dans ce système. Si le hacker entre dans ce système, il peut facilement changer ce programme pour qu'il puisse plus tard se reconnecter avec n'importe quel pseudo/mot de passe. Mais normalement ces même fichiers n'ont pas besoins d'être changés fréquement, sauf si vous faite un update du système. - Les Modules sont facilement utilisable pour s'interfacer au kernel. Le Modules sont un bon design pour le kernel de linux.Il le rendent plus flexible et modulaire. Mais une fois le module insèré dans le kernel, il devient une partie du kernel et peut faire ce que le kernel originel pouvait faire. De cette manière, du code néfaste peut être écrit et insèré dans le kernel à la manière des modules, le code peut même rediriger les appels système et fonctionner de la même manière qu'un virus. - Les processus ne sont pas protègés. Certains processus, tels que les daemon web, qui sont critiques pour le système ne sont pas protègés de manière stricte. De cette manière, ils sont vulnérable à l'attaque de crackers. Avec cette description, comment peut-on construire un système sécurisé? Nous devons premièrement avoir un kernel sécurisé et en suite construire construire une sécurité autour. C'est ce que LIDS fait. Le Fonctions de LIDS. "Linux Intrusion Detection System" est un patch qui augmente la sécurité du kernel de Linux. Quand il est en activite, l'accès à certains fichier, à chaque opération d'administration système/réseau, "raw device", "mem" et "I/O access" peuvent être rendus impossible, même pour root. Il utilise et augmente les capacité du système en placement ces fonctionnalités directement dans le kernel. En résumé, LIDS fournis Protection, Détection et Réponse aux intrusion dans le kernel de Linux. - Protection. LIDS peut protèger les fichiers importants de votre système, peu importe sur quel système de fichier ils se trouvent, personne ne pourra les modifier, même pas le root. LIDS peut aussi portèger les systèmes importants et les empècher de se faire tuer. LIDS peut prévenir contre des opérations de programmes non authorisé sur "RAW IO". Il peut aussi protèger le disque dur, en incluant une protection sur le MBR, etc. - Détection. Quand quelqu'un scan votre machine, LIDS peut le détecter et en informer l'administrateur. LIDS peut aussi détecter des activité annormales se déroulant sur le système. - Réponse. Quand quelqu'un viole les règles, LIDS tiens un journal détaillé en rapport avec cette violation. LIDS peut aussi envoyer un message par mail. Dans ce cas, LIDS peut aussi déconnecter l'utilisateur. Construire un système sécurisé par LIDS. Nous allons vous comment construire ce système, pas à pas. Télécharger le patch LIDS et le kernel correspondant. Vous pouvez télécharger le patch lids depuis http://www.lids.org et ftp://ftp.lids.org, vous pouvez aussi essayer les miroirs répartis mondialement sur http://www.lids.org/mirrors. Le nom du patch sera lids-x.xx-y.y.y.tar.gz, x.xx représente la version de lids et y.y.y représent la version du kernel. Vous devez absolument télécharger le kernel correspondant. Par exemple, si vous télécharger lids-0.9pre4-2.2.14.tar.gz, vous devrez télécharger les sources du kernel 2.2.14. Vous pouvez télécharger les sources du kernel sur ftp://ftp.linux.org 1. décompressez le code source du kernel. # cd linux_install_path # bzip2 -cd linux-2.2.14.tar.bz2 | tar -xvf - 2. décompressez le code source de LIDS.. # cd lids_install_path # tar -zxvf lids-0.9pre4-2.2.14.tar.gz Pacher LIDS sur le kernel de Linux Après avoir télécharger le code source du kernel et lids, décompressez les. Par exemple, si vous télécherger lids-0.9pre4-2.2.14.tar.gz et linux-2.2.14.tar.bz2, alors, 3. patcher lids sur le code source du kernel. # cd linux_install_path # patch -p0 </lids_install_path/lids-0.9pre4-2.2.14.patch # cd linux # make dep clean # make bzImage # make modules # make modules_install 4. copiez bzImage dans /boot/ et éditez /etc/lilo.conf 5 lancez /sbin/lilo pour installer le nouveau kernel. # /sbin/lilo Configurer le kernel linux Maintenant il est temp de configurer le kernel linux, mettez les options suivantes sur "on", [*] Prompt for development and/or incomplete code/drivers [*] Sysctl support 4. configurer le kernel linux # cd linux # make menuconfig ou make xconfig Initialiser le systme lids Maintenant, avant de rebooter, vous devez configurer lids pour opèrer vos besoins en sécurité. Vous pouvez définir les fichiers à protèger, les processus, etc. Dans le chapitre suivant, nous vous montrerons les détails de se sujet. Rebooter le système Après avoir configuré votre système, rebootez le. Quand lilo apparait, sélectionneez le kernel patché par lids. Après cela, vous entrerez dans le monde merveilleux de LIDS. Protèger le kernel. Après avoir rebooter, n'oubliez pas de protèger le kernle grace à lidsadm, vous pouvez placer cette commande à la dernière ligne de /etc/rc.local. # /sbin/lidsadm -I -- -CAP_SYS_RAWIO -CAP_NET_ADMIN Vous pouvez consulter LIDS HOWTO pour savoir ce que signifie chaques options de lidsadm. Online administration Après avoir protègé votre kernel, votre système est maintenant protègé par LIDS. Vous pouvez faire des tests dessus. Si vous souhaitez changer la configuration, vous pouvez changer votre niveau de sécurité en fournissant un mot de passe. # /sbin/lidsadm -S -- -LIDS Configurer LIDS Dans ce chapitre, nous vous montrerons comment configurer lids. Proteger vos fichiers. Premièrement, vous devez déterminer quels sont les fichiers à protèger. Dans la plupart des cas, vous pouvez protèger les fichiers binaires et de configuration tel que /usr/, /sbin/, /etc/, /var/log/. Deuxièmement, vous devez décider la manière pour protèger ces fichiers. LIDS fournis trois types de protection: - Fichiers en lecture seule. Les fichiers marqué en lecture seule, signifie que personne ne peut les changer. Nous pouvons penser que les fichiers suivants font partient de ce type. /etc/passwd, /bin/passwd, etc. USAGE: lidsadm -A -r filename_to_protect example, 1. Pour protèger l'ensemble des fichiers de /sbin/ en les mettant en lecture seule. # /sbin/lidsadm -A -r /sbin/ 2. Pour protèger le fichier /etc/passwd en lecture seule # /sbin/lidsadm -A -r /etc/passwd - Les fichiers en Ajout unique (append only). La plupart des fichiers qui doivent être en ajout unique sont les fichiers de journaux, tels que /var/log/message ,/var/log/secure. Ces fichiers peuvent uniquement être ouverts pour un ajout, et ne peuvent pas être modifiés du contenue précèdement ajouté, elle ne peuvent pas être supprimés non plus. USAGE: lidsadm -A -a filename_to_protect example, 1. Pour protèger les fichiers de journaux du système # /sbin/lidsadm -A -a /var/log/message # /sbin/lidsadm -A -a /var/log/secure 2. Pour portèger les fichiers de log httpd # /sbin/lidsadm -A -a /etc/httpd/logs/ # /sbin/lidsadm -A -a /var/log/httpd/ Voici un exemple provenant de LIDS HOWTO par Philippe Biond, lidsadm -Z lidsadm -A -r /boot lidsadm -A -r /vmlinuz lidsadm -A -r /lib lidsadm -A -r /root lidsadm -A -r /etc lidsadm -A -r /sbin lidsadm -A -r /usr/sbin lidsadm -A -r /bin lidsadm -A -r /usr/bin lidsadm -A -r /usr/lib lidsadm -A -a /var/log Proteger vos processus. LIDS peut protèger les processus qui ont pour père init(pid=1), pour cela, vous devez bloquer le kernel avec les options suivantes. # lidsadm -I -- +INIT_CHILDREN_LOCK Protèger avec les "capability". Les "Capabilities" sont comme des privilèges que vous pouvez donner à un process. Un process root a toutes les "capabilities". Mais il existe des "capabilities bonding set". Dans un kernel normal, quand vous retirez une "capability" d'un "bonding set", personne ne peux plus l'utiliser jusqu'au prochain redémarage. (Voir http://www.netcom.com/~spoon/lcap) LIDS modifie ce comportement pour vous permettre de les démarrer ou de les arrêter a tout moment. Un accès à /proc/sys/kernel/cap_bset est attrapé et lance une allerte de sécurité. lidadm fait tout le travail. Vous pouvez lister toures les capabilities en lançant lidsadm, et vous pouvez aussi voir le sens exacte de chaques capabilities. Nous vous en parllons ici de deux d'entre elles, CAP_SYS_RAWIO Avec cette "capability on", nous pouvons permettre l'accès à ioperm/iopl et /dev/port, permettre l'accès à /dev/mem et /dev/kmem et permettre l'accès à "raw block devices" (/dev/[sh]d??) Quand nous désactivons cette "capability", nous pouvons rendre touts les processus du system sans aucun droits sur la "raw device", tel que lilo. Mais certains processus peuvent avoir besoin de cette capacité pour pouvoir fonctionner, tel que XF86_SVGA. Dans ce cas, nous pouvons placer ce programme dans une liste d'execptions quand nous compilons le kernel. CAP_NET_ADMIN Cette "capability" à les fonctions suivantes, interface configuration administration of IP firewall, masquerading and accounting setting debug option on sockets modification of routing tables setting arbitrary process / process group ownership on sockets binding to any address for transparent proxying setting TOS (type of service) setting promiscuous mode clearing driver statistics multicasting read/write of device-specific registers Pour des raisons de sécurité, nous devons désactiver ceci pour interdire le changement de configuration réseau. Quand ceci est désactivé, les règles du firewall ne pouront être changés. Choisissez les "capability" et scellez le kernel, vous devez chosir quelles "capability" vous devez désactiver au moment de sceller le kernel. Voici un exemple. Vous pouvez placer ce script dans un script de rc/ (rc.local, /etc/init.d/lids, /etc/rc.d/init.d/lids, etc.) cela dépend de votre distribution et de la manière dont vous administrez le système. Cette commande est, par exemple: lidsadm -I -- -CAP_SYS_MODULE -CAP_SYS_RAWIO -CAP_SYS_ADMIN \ -CAP_SYS_PTRACE -CAP_NET_ADMIN \ +LOCK_INIT_CHILDREN NDT: Consultez les infos sur http://www.lwn.net/1999/0408/kernel.phtml, http://www.lwn.net/1999/0415/kernel.phtml et http://www.lwn.net/1999/1202/capabilities.phtml pour comprendre les "capabilities" et leur danger. Sécurité réseau. LIDS fournis des améliorations au niveau sécurité réseau.. Sécurité réseau avec "capbility" Avec les capability, nous pouvons augmenter la sécurité réseau. Nous pouvons faire de l'anti-sniffing, empècher l'ouverture d'un port infèrieur à 1024, empècher la modification des règles du firewall et la table de routage. Donc je vous conseille d'examiner avec attention chaque "capability" pour comprendre son sens. Détecteur de scan au niveau kernel LIDS fournis un détecteur de scan au niveau kernel pour pouvoir détecter qui l'a scanné. Cette fonction peut détecter des scan mi-ouvert, nomaux etc. L'utilisation d'outils tels que nmap, satan peut être détecté Ceci est très utile quand "raw socket" est désactivé. Dans ce cas, des outils fonctionnant de détection basés sur le sniff ne pourront fnctionner. Si vous souhaitez cette fonctionnalité, il vous faudra la sélectionner au moment de la compilation du kernel. Systeme de réponse face à l'intrusion. Quand LIDS détecte quelque chose violant les règle définient, il peut répondre à cette action par les méthodes suivantes. Journalise le message Quand quelqu'un viole les règles, lids_security_log journalisera les messages grace à klogd, la journalisation à aussi les capacités de lutter contre l'inondation "anti_logging_flood". Vous pouvez l'activer lors de la compilation du kernel. Journaliser les messages à travers un serveur de mail. LIDS à une nouvelle fonctionnalité pour envoyer les messages sur votre compte email. Vous pouvez déninir l'adresse IP du serveur de mail, l'adresse email, etc au moment de la compilation du kernel. Extinction de la console Quand un utilisateur viole une règle, le système fermera la session de cet utilisateur. Merci. Première je tiens à remercier mon amie, Kate lee, qui m'encourage à l'écriture de documents de ce type, ceci est une dédicace à elle. Je souhaite aussi remercier Philippe Biond et Christophe Long qui m'a beaucoup aidé sur le projet. Sans eux, ce projet n'aurait pas pu si bien se dévellopper. De nombreux remerciements à tous les utilisateurs de LIDS, sans leurs contributions et discussions, LIDS n'aurait pas eu de si bonnes idées. Traduction Document traduit le 24/06/2000 par hertz@securix.org [ndt: Certains mots ont été laissés tels quels, il est très souvent plus facile d'exprimer une notion technique en anglais, et souvent sa traduction en est impossible, du au fait que un grand nombre de mots n'existent pas en français ou sont encore que peu employés, mieux vaut se référer au jargon file.] -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- Snort hertz@securix.org 18-06-2000 Snort. Début de documentation. Présentation de Snort "Snort est un detecteur d'intrusion, capable d'analyser en temps réel le trafic et les paquets IP. Il peut analyser le protocole, et détecter par rapport à une base de données de DOS et d'attaques diverses et variées (overflows, scans, SMB probes, CGI attacks, OS fingerprinting, et plein d'autres...) les tentatives d'intrusions. De base Snort utilise des régles pour collecter ou laisser passer le trafic, et posède un module de détection. le journal alerte utilise soit syslog ou un fichier personnel, ou encore un winpopup pour les clients smb. http://www.clark.net/~roesch/security.html il existe une petit programme pour convertir le journal d'alerte en page html. Consulter http://www.whitehats.com/ pour avoir la base de donnée d'intrusion. ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ ____________________ _ -*5*- `^°*;:,.> Loutre Vs Castor<.,:;*°^` _____________________________/¯¯¯ Brice Berger ¯¯¯\_____________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, La Loutre Petit mammifère carnivore à pelage brun dense et court, la loutre possède également des pattes palmées et une queue épaisse. Ce qui fait que la loutre est essentiellement un animal aquatique. Se nourrissant donc de poissons, la loutre ne rechigne pas, bien qu'elle soit friande de saumon, devant des batraciens ou des mollusques. Elle ne se montre pas difficile. A vrai dire, la loutre s'en tape joyeusement, pour peu qu'elle puisse s'alimenter. Elle vit aussi bien en eau douce, dans les rivières, que dans l'eau de mer, comme dans le Pacifique nord. Ce n'est pas un peu de sel qui lui fait peur. Nettement plus intelligente que le dauphin ou l'otarie, la loutre, pour se protéger des orques et pour ne pas dériver dans les courants marins, s'amarre dans de grandes algues, et déguste au soleil quelques coquillages qu'elle éclate sur son petit bidon avec des galets. Puis, une fois repue, elle dort tranquillement, laissant aux oiseaux les restes. Ce qui prouve de manière irréfutable sa supériorité intellectuelle, car jamais on ne verra une loutre s'exhiber dans un Aqualand. En rivière, l'ennemi de la loutre est le castor et le trappeur canadien. Il y a une grande inimitié entre la loutre et le castor. Les motifs de querelles entre loutre et castor sont innombrables et remontent à la nuit des temps. On reconnaît le castor à ses dents avants proéminentes, signe d'une grande vulgarité et de perfidie. Ce dernier est prêt à toutes les bassesses et n'hésite pas à dénoncer la loutre au trappeur. Quand ce scélérat, ce fourbe, ne nuit pas à la loutre, il passe le plus clair de son temps à martyriser les arbres, les tordant, les découpant, les rongeant, sectionnant chaque fibre d'un gloussement guttural lugubre. C'est donc tout naturellement que la loutre ne peut pas sacquer ce petit enfoiré de castor, dont la fatuité le pousse à construire (maladroitement) de piètres châteaux, qui ressemblent davantage à des tas de bois superposés. En plaçant des charges de TNT dans les terriers de ce félon, la loutre fait oeuvre de salut public. Elle n'a pas grand chose à craindre des trappeurs, car la loutre se rit des pièges que ces gros nigauds utilisent. Des fois, elle pousse l'insolence jusqu'à désamorcer les pièges avec des hérissons. D'autre part, elle ne redoute pas non plus les coups de carabines, car avec sa queue épaisse, elle joue au jokari avec les balles. Parfois, ingénieuse qu'elle est, elle fabrique de petites catapultes et bombarde le trappeur avec les enfants du castor, qui sont d'excellents projectiles. De plus, le trappeur abandonne souvent la partie. Animal sympathique, qui mérite toute notre estime, la loutre se fout de tout et plus particulièrement des castors. La loutre n'est pas bêcheuse ni aussi rustre que le castor. La loutre vit sa vie, merde ! (quoi, j'veux dire !) Elle l'invente sa vie, au quotidien, contre tous les castors. Elle n'a pas une petite vie réglée, rangée. Elle vit au grand air, la loutre. Elle envoie tout valdinguer, la loutre, elle envoie chier tout le monde, les petits chefs arrogants, pétris de sérieux, les connards de castors ! Mais ouais, elle dit merde aux tabous, la loutre, à toutes ces conneries. Et même, elle TE CHIE DESSUS la loutre ! Mais ouais ! Elle en a rien à foutre de ce que tu penses d'elle, la loutre. Elle vit sa vie, c'est tout. [ndt: suite a des recherches il s'est avere tres difficile de savoir qui a écrit ce texte en premier; il semblerait que ce dernier soit deja un pompage partiel d'un compte rendu sérieux qui était lui meme pompé dans un bouquin. Bref si l'auteur se reconnait, qu'il nous contacte afin qu'on rectifie les crédits associés a cet article] Références : http://www.chez.com/sheular/brice.htm http://perso.wanadoo.fr/doublepictures/loutre.htm [added 19-jan-2002] : Le texte sur les loutres figurant sur mon site n'est pas de moi mais d'un ami: Le Docteur Brice Berger. Le problème que ce dernier est mort dans un accident de moto en septembre 2000. Je te donne l'autorisation de le publier, puisque il m'appartiens, mais je désire que figure son nom et un photo de lui que je t'envoie. Content-Type: image/jpeg; name="CADBRI2.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="CADBRI2.jpg" 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 Q+apgC9a+aWIQ7NUndO2f//Z ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ __________________________ _ -*6*- `^°*;:,.>Vulrérabilités avec PHP <.,:;*°^` _____________________________/¯¯¯¯¯¯¯¯¯ tobozo ¯¯¯¯¯¯¯¯¯\_______________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > Exploitation des vulnérabilités avec les applications PHP < < Inspiré du Document original de Shaun Clowes SecureReality > > Traduction par tobozo@users.sourceforge.net < <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --- < Sommaire > -------------------------------------------------------------- 1. Introduction 2. Tour d'horizon 3. Variables Globales 4. Fichiers distants 5. Upload des fichiers 6. Fichiers de Librairies 7. Fichiers de sessions 8. Codage rapide et tableaux associatifs 9. Fonctions ciblées 10. Protéger PHP 11. Responsabilité - Langage et Programmeur 12. Autre --- < 1. Introduction > ------------------------------------------------------- Ce document est une traduction basée sur un discours lu aux conférences Blackhat de Singapour et Hong Kong en avril 2001. A l'origine le discours était intitulé "Forcer l'entrée par la porte de devant - L'impact des applications web sur des modeles traditionnels de sécurité", et traitait des problemes rencontrés sur des applications ASP, les trous exposés et les méthodes utilisées pour les mettre a jour. Le reste de la conference était consacré a PHP. Pour les néophytes, PHP veut dire "PHP Hypertext Preprocessor" (encore un acronyme récursif ;). C'est un langage de programmation (spécialement concu pour le web) dans lequel le code PHP est inclus avec le code html des pages web. Quand un client envoie une requete pour une page, le serveur web passe la requete a l'interpreteur en vue d'executer le code, le resultat est envoyé au client. Evidemment cette approche est bien plus appropriée pour traiter des problemes rencontrés avec PHP qu'avec des langages comme Perl ou C. PHP (par opposition avec d'autres langages du web) a les caracteristiques suivantes : + Interpreté + Execution rapide - L'interpreteur est inclus dans le serveur web sans fork() ou paramatres de configuration supplementaires. + Riche en possibilités - Des centaines de fonctions tres souples + Syntaxe simple - Déclarations de Variable optionnelles, nommage intuitif des fonctions On va expliquer dans ce document pourquoi les deux dernieres caracteristiques font que les applications écrites en PHP sont faciles a attaquer et difficiles a défendre. On finira par une distribution de palmes et de bonnets d'anes en matiere de sécurité logicielle. --- < 2. Tour d'horizon > ----------------------------------------------------- Presque toutes les observations de ce document se réferent a une installation par défaut de PHP 4.0.4pl1 (avec MySQL, PostgreSQL, IMAP et le support OpenSSL activé) en tant que module avec Apache 1.3.19 sur une machine linux. Evidemment les resultats peuvent varier selon les versions et l'age des installations, ainsi plusieurs versions de PHP peuvent avoir un comportement radicalement différent pour une meme situation. Bien que les fans du PHP défendent ce langage en plaidant l'extreme configurabilité de ce systeme, la plupart d'entre eux ne vont pas modifier les valeurs par défaut du package lors de la mise en place par peur de voir la majorité des applications qu'ils utilisent ne pas fonctionner. Le débat autour du fichier de configuration PHP est cependant nécéssaire pour ceux qui se sentent concernés par la sécurité de telles installations. --- < 3. Variables Globales > ------------------------------------------------ Comment mentionné plus haut, les variables PHP n'ont pas besoin d'etre déclarées, elles sont automatiquement créées lors de leur premiere utilisation. Elle n'ont pas besoin non plus d'etre typées, le typage etant également effectué automatiquement en référence au contexte dans lequel elles sont utilisées. Ces faits rendent les choses tres pratiques d'un point de vue programmation (et présentent des horizons tres larges a ceux qui préferent les langages de développement rapides pour les applications). Aussitot qu'une variable est créée, elle peut etre référencée n'importe ou dans le programme (sauf les fonctions dans lesquelles il faut explicitement les inclure avec la fonction 'global'). Le résultat des ces caractéristiques est que ces variables sont rarement initialisées par le programmeur lui meme, car apres tout la création initiale d'une variable lui voit assigner une valeur nulle (ex : ""). Apparemment la principale fonction d'une application web PHP est de récuperer des données du client (variables de formulaire, fichiers uploadés, cookies, etc), de procéder au traitement de ces données et de renvoyer un résultat basé sur ces memes données. Afin de simplifier au maximum la tache au script PHP lors de l'acces, les données lui sont fournies sous forme de variables globales PHP. Considérons l'exemple suivant basé sur du code HTML :
Ce code affiche une boite texte et un bouton submit. Quand l'utilisateur clique sur le bouton submit, le script test.php sera éxécuté pour procéder au traitement des données envoyées. Au moment de son éxécution, la variable $hello se verra assigner comme valeur le texte contenu dans le champ input du meme nom (), le meme texte que l'utilisateur a tapé dans la boite texte avant de cliquer sur submit. Il est tres important de noter les implications que cela engendre, cela veut dire qu'un petit malin peut créer n'importe quelle variable et la voir déclarée globalement avec les autres variables. Si au lieu d'utiliser le formulaire ci dessus, le petit malin appelle directement l'url comme suit : "http://server/test.php?hello=salut&setup=jambon", non seulement la variable $hello se verra assigner la valeur "salut", mais aussi la variable $setup sera créée et se verra assigner la valeur "jambon", ces deux variables étant globales et utilisables sur tout le script test.php. Ceci peut devenir un réel probleme dans le cas d'un script qui a pour role d'authentifier un utilisateur avant d'afficher des informations importantes, par exemple : Lors d'une utilisation "normale" le code ci-dessus va comparer un mot de passe avec une valeur donnée (hello), puis décider si l'utilisateur distant peut accéder ou pas aux infos importantes en stockant une valeur dans la variable $auth. Le probleme c'est que le code part (a tort) du principe que la variable $auth sera vide jusqu'a ce qu'elle se voit assigner une valeur. Avec la méthode citée plus haut on peut donc facilement construire une URL comme 'http://server/test.php?auth=1' qui permettra de ne pas avoir a fournir de password et d'etre quand meme considéré comme authentifié. Pour résumer, on peut dire qu'un script PHP "ne peut pas faire confiance a N'IMPORTE QUELLE variable qui n'a pas été EXPLICITEMENT assignée". D'ailleurs plus un script traite de variables et plus la tache est ardue pour sécuriser le tout (ndt : heureusement il y a les classes ;0). Une approche plus protective consiste a vérifier qu'une variable ne fait pas partie du tableau HTTP_GET/POST_VARS[] (un choix en fonction de la methode utilisée pour soumettre les formulaires, GET ou POST). Quand PHP est configuré avec 'track_vars' (par défaut), les variables envoyées par l'utilisateur sont disponibles globalement mais aussi sous forme de tableaux associatifs comme mentionné plus haut. Il est quand meme important de noter qu'il existe QUATRE tableaux associatifs differents et qui peuvent etre sujets a des attaques : -HTTP_GET_VARS pour les variables envoyées dans l'url (ou formulaire avec la methode GET). -HTTP_POST_VARS pour les variables postées par formulaire avec la methode POST d'une requete HTTP -HTTP_COOKIE_VARS pour les variables envoyées comme partie du header d'un cookie dans une requete HTTP -HTTP_POST_FILES tableau présent dans la plupart des versions récentes de PHP, correspond aux infos relatives a un fichier uploadé via methode POST C'est l'utilisateur final qui décide quelle méthode utiliser pour soumettre ces variables, une simple requete peut parfaitement placer des variables dans ces quatres différents tableaux, un script qui se veut sécurisé a besoin de les vérifier tous les quatres (a l'exception de HTTP_POST_FILES qui ne devrait pas poser de problemes excepté dans certaines circonstances qu'on pourrait qualifier d'exceptionnelles). --- < 4. Fichiers distants > ------------------------------------------------- Sans vouloir radoter, PHP est un langage extremement riche. Il est livré avec une panoplie tres complete de fonctionnalités et fait de son mieux pour faciliter la tache au codeur (ou web designer comme c'est souvent le cas). D'un point de vue sécurité, plus les fonctionnalités offertes sont riches, moins les possibilités sont intuitives, et plus il est difficile de sécuriser les applications qui y sont écrites (merci m$ pour ce joli theoreme). Un excellent exemple de fonctionnalité est l'utilisaton distante de fichiers avec PHP : La portion de code qui suit est censée ouvrir un fichier : \n"); ?> Ce code va essayer d'ouvrir en lecture le fichier dont le nom est spécifié dans la variable $filename et affiche une erreur si l'ouverture échoue. Certains sites en ont fait les frais, car il est facile de forcer la déclaration de $filename dans l'url et ainsi d'acceder au contenu de fichiers sensibles sur le serveur (ex : /etc/passwd), il est aussi possible de lire des données en provenance de serveurs distants, ftp, etc. Les fonctionnalités distantes d'acces aux fichiers de PHP rendent possible l'utilisation des fonctions fichiers sur des cibles locales comme distantes et ceci en toute transparence. ex : http://cible/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir PHP va effectuer une requete HTTP en direction du serveur "cible" (et tester au passage la faille unicode). Ca devient encore plus intéressant dans le contexte de quatre autres fonctions qui tolerent les fonctionnalités d'acces aux fichiers distants ( *** sauf pour windows ***), include(), require(), include_once() et require_once(). Ces fonctions prennent un nom de fichier, et le lisent comme etant du code PHP, elles sont utilisées typiquement dans un contexte d'inclusion de librairies de code, un cas ou des portions de script réutilisables sont stockées dans des fichiers qui seront inclus quand c'est nécessaire (ex:phplib). Examinons cette portion de code : On peut présumer que $libdir est une variable de configuration a qui on a assigné une valeur égale au répertoire qui contient le fichier langages.php et ou se trouvent d'autres librairies. Si un petit malin peut forcer la déclaration de cette variable il lui devient possible de rediriger la requete vers lui meme et ainsi de substituer son code a celui des librairies en remplacant le chemin d'acces local par un chemin d'acces distant. En final il ne serait possible que d'acceder a un fichier langages.php situé dans un repertoire ou une url de son choix. Par exemple, si le petit malin place un fichier langages.php sur un serveur web distant et y dépose le code suivant : et construire l'url en forcant la declaration de $libdir avec la valeur "http:///", lors de l'execution de l'include, le script va aller chercher le fichier langages.php sur le serveur au lieu d'aller le chercher en local, et ainsi permettre l'execution de code arbitraire (ici le code retournera le contenu du repertoire /etc). A noter que le serveur ou se trouve le fichier langages.php ne doit pas etre un serveur qui interprete le PHP (sans quoi le code ne sera pas envoyé mais interpreté). --- < 5. Upload des fichiers > ------------------------------------------------- Comme si PHP n'avait pas assez de trous, le langage met a disposition un support automatique pour l'upload conformément au RFC 1867. Prenons le formulaire suivant comme exemple :
Ce formulaire va autoriser le browser web a selectionner un fichier local, puis envoyer ce fichier au serveur lorsque l'utilisateur clique sur submit. Cette fonctionnalité est bien sur tres utile, c'est la réponse de PHP qui en fait une situation dangereuse. Au moment ou PHP recoit la requete, et *avant meme* d'avoir commencé a interpreter le fichier php qui la recoit, le fichier sera recu, la taille comparée avec la valeur de la variable $MAX_FILE_SIZE (ici fixée a 10 ko) et cette derniere valeur comparée avec celle spécifiée dans le php.ini. Si ces deux tests sont concluants, le fichier est alors SAUVÉ sur le disque local du serveur, dans un repertoire temporaire. Il ya de quoi sauter au plafond, un utilisateur distant peut tres bien envoyer n'importe quel fichier sur un serveur avec PHP et ceci avant que le script ait commencé a etre executé (ceci ecarte l'option que ce meme script puisse refuser le fichier qui est quand meme SAUVÉ sur le disque local du serveur). Imaginons un script qui *est* concu pour recevoir des uploads de fichier. Comme décrit plus haut le fichier est recu puis sauvé sur le disque local du serveur (dans un répertoire spécifié dans le php.ini ex : /tmp) et se fait assigner un nom de fichier au hasard (ex: "phpxXuoXG"). Le script PHP a besoin d'infos sur ce fichier uploadé pour etre capable de le traiter. Ceci est fourni de deux facons différentes, l'une d'elles est en service depuis les premieres versions de php3, l'autre a été développée suite a des bulletins de sécurité en rapport avec la description fournie dans ce document. Le probleme est néanmoins toujours existant et en bonne santé, a tel point que l'ancienne methode et ses vulnerabilités est toujours en pratique sur pas mal d'applications bien en vogue (ex:phpnuke). PHP ajoute quatre variables pour décrire le fichier uploadé, par exemple : $hello = Nom du fichier sur le serveur (ex: "/tmp/phpxXuoXG") $hello_size = Taille en Octets du fichier (ex: 1024) $hello_name = Le nom original du fichier sur le client (ex:"c:\\hello.txt") $hello_type = Le format Mime du fichier uploadé (ex:"text/plain") Ensuite le script php peut travailler sur le fichier localisé grace a la variable $hello, le probleme c'est qu'il n'est pas forcément évident pour PHP que la variable $hello doive etre déclarée via l'url ou pas, considérons l'url: http://vulnhost/vuln.php?hello=/etc/passwd&hello_size=10240&hello_type=text/ plain&hello_name=hello.txt Le résultat correspondra a peu pres a ces declarations de variables qui se retrouvent globalisées (ca marche egalement avec la methode POST ou avec les cookies) : $hello = "/etc/passwd" $hello_size = 10240 $hello_type = "text/plain" $hello_name = "hello.txt" Ceci produira exactement ce a quoi PHP s'attend lors d'un upload de fichier, excepté que normalement c'est PHP qui les déclare, et qu'ici on se retrouvera avec le contenu du fichier /etc/passwd sur quoi travailler. Cette meme attaque peut etre utilisée pour mettre en évidence toute sorte de fichier sensible (en particulier les fichiers de config ou tiers contenant des infos sur l'assignation des droits sur le serveur). Comme expliqué plus haut, les version plus récentes de PHP peuvent utiliser des methodes différentes pour déterminer quelles sont les infos relatives aux fichiers uploadés (via le tableau HTTP_POST_FILES[]). Plusieurs fonctions sont également fournies dont une permet de comparer si le fichier sur lequel on travaille est bien celui qui a été uploadé. Ces méthodes reglent définitivement le probleme mais ne corrigent pas les scripts qui utilisent encore l'ancienne méthode, et on est loin d'atteindre une pénurie en la matiere. Comme alternative a l'attaque par l'upload, on peut également considérer l'exemple suivant : Si l'attaquant peut controler $theme, il peut evidemment l'utiliser pour lire n'importe que fichier sur le systeme distant (excepté les fichiers qui ont des tags php " --------------------------------------------- On mentionnait plus haut les fonctions include() et require(), elles sont généralement utilisées en respect du concept des librairies de code. Cela implique que des portions de codes communes a plusieurs applications sont mises a disposition dans un repertoire prévu a cet effet (lib, phplib, promotheus-lib) et que ces portions de codes sont incluses directement quand c'est nécessaire. Include() et Require() prendront n'importe quel nom de fichier qu'on leur specifie, liront le fichier et interpreteront son contenu comme du code PHP. Un standard en programmation suggerait de mettre l'extension ".inc" aux fichiers de librairies afin de les distinguer des fichiers de code applicatif. Cela a posé pas mal de problemes sur des serveurs qui se contentaient de lire ces fichiers sans les interpréter comme de vulgaires fichiers textes. Aussi certains de ces fichiers pouvant contenir des infos sensibles (user/pass base de données) se voyaient affichés en mode texte alors qu'ils auraient pu etre facilement protégés. La plus simple des solutions (c'est egalement la plus prisée) est de donner a TOUS les fichiers une extension interpretable (ex : php, php3). Le revers de la medaille est qu'un attaquant peut tres bien s'octroyer les memes privileges d'acces en réutilisant des portions de code qui sont prévues pour etre utilisées dans un autre contexte, ce qui nous ramene aux memes types d'attaques décrites plus haut. ex : Dans main.php (merci phpnuke;0): Dans libdir/loadlangage.php: Quand libdir/loadlangage.php est appelé dans le contexte défini de main.php, le script est parfaitement sécurisé, mais parce que libdir/loadlanguage porte l'extension .php (ce qui n'est pas nécessaire car include() marchera sur toute sorte de fichier) il est possible qu'un attaquant l'execute. Une fois en dehors du contexte, l'attaquant peut forcer les valeurs de $langDir et $userLang avec la methode url citée plus haut. --- < 7. Les fichiers de session > -------------------------------------------- Les versions récentes de PHP(4 et supérieures) offrent un support pour les sessions. Leur utilité basique consiste a pouvoir sauver des infos d'une page a l'autre au sein d'une application PHP. Par exemple quand un utilisateur se loggue sur un site web, le fait qu'il soit loggué (et ce a quoi il est loggué) pourrait etre sauvé dans cette session. Ces informations seront disponibles au autres pages PHP au fur et a mesure de son évolution sur le site. Ce qui se produit quand une session est démarrée (lors du premier chargement de la premiere page si spécifié dans le php.ini) revient a générer aléatoirement un numero unique et l'assigner, la session persiste aussi longtemps que le client distant soumet ce numero avec chacune de ses requetes (compris jericho?). Cela peut etre tres facilement pris en charge avec le cookie mais aussi par un champ de formulaire ou une variable dans l'url. La session est une unité de stockage de variables , une application PHP peut choisir d'enregistrer une variable particuliere avec la session, sa valeur est alors stockée dans le fichier de session a la fin de chaque script PHP et ainsi chargée au départ de chaque script comme dans cet exemple : Tout page visitée ulterieurement aura la variable $session_auth pré-déclarée avec comme valeur "savate". C'est tres pratique et parfois nécessaire pour une utilisation sur un environnement qui ne nécéssite pas d'état défini. Un probleme évident consiste a s'assurer que les variables viennent bien de la session, par exemple si on éxécute le code suivant apres avoir utilisé le script précédent : Ce code part du principe que $session_auth est déclaré lors du démarrage de l'instance de la session et non pas dans l'url. Si un attaquant force la déclaration de $session_auth via l'url ou un formulaire, il peut ainsi gagner l'acces a tout le site. A noter que l'attaquant doit utiliser cette methode avant que la variable soit enregistrée avec la session, car une fois que la variable fait partie de la session, elle viendra écraser toute autre variable du meme nom, qu'elle provienne d'une url ou d'un formulaire. Les données de la session sont sauvées dans un fichiers (configurable dans le php.ini -> habituellement /tmp) appelé 'sess_'. Ce fichier contient les noms des variables de la session, leurs types, leurs valeurs, etc. Sur un systeme de multi hosting cela peut poser des problemes car les fichiers sont sauves en tant que nobody (ou l'utilisateur qui execute le serveur web). Un petit malin peut facilement se créer un fichier de session afin de s'octroyer des droits sur un autre site que le sien ou meme examiner les fichiers de session existants et ainsi avoir acces a des données sensibles. Le mecanisme de la session est tel qu'il est egalement possible de deviner le nom du fichier qui comporte les infos de la session, ainsi que le nom du repertoire dans lequel ils se trouvent 'php' et repertoire /tmp. Enfin un autre probleme auquel il n'a pas été trouvé d'exemple pratique mais qui n'en est pas moins préoccupant est que l'on peut spécifier n'importe quel ID de session (ex:'hello') et ainsi créer un fichier de session avec ce meme ID (ex: '/tmp/sess_hello'). L'ID ne peut contenir que des caracteres alphanumériques mais cela peut quand meme s'averer utile dans certaines situations. --- < 8. Codage rapide et tableaux associatifs > ------------------------------ Petit rappel sur ces facteurs : PHP est un langage de programmation rapide et facile, une des incidences est qu'une variable peut avoir plusieurs valeurs en meme temps, cela dépendant du contexte dans lequel elle est évaluée. Par exemple si la variable $hello est égale a une chaine vide "", elle aura comme valeur 0 si elle est évaluée en tant que nombre. Cela peut parfois conduire a des situations assez peu intuitives (comme pour phpMyAdmin). En revanche si $hello se fait assigner une valeur de "000" ca n'est PAS egal a "0" et la fonction empty() ne renverra pas un resultat 'true'. Les tableaux de PHP sont des tableaux associatifs, l'index du tableau est une chaine (STRING) et peut se faire assigner n'importe quelle valeur, il n'est pas évalué numeriquement. Donc l'entrée du tableau $hello["000"] n'est PAS la meme chose que l'entrée du tableau $hello[0]. On a besoin de faire attention a bien évaluer et valider les entrées utilisateur en tenant compte de ces facteurs si on veut faire une application digne de ce nom. ex : inutile de tester si quelque chose est egal a 0 pour ensuite le valider en utilisant empty() ailleurs. --- < 9. Fonctions ciblées > -------------------------------------------------- Lors de la recherche de trous dans des applications PHP (et quand on a le code source), il est tres utile d'avoir la liste des fonctions qui sont fréquemment mal utilisees ou sont de bonnes cibles si elles sont utilisées d'une maniere vulnérable dans une application ciblée. si un utilisateur distant peut affecter les parametres de ces fonctions, l'exploitation est souvent possible. Voici une liste non exhaustive des failles connues : Execution du code PHP : -require() et include() : Ces deux fonctions lisent un fichier spécifié et interpretent le contenu comme du code PHP -eval() : Interpreter une chaine donnée comme du code PHP -preg_replace() : quand utilisé avec le modificateur /e cette fonction interprete la chaine de remplacement comme du code PHP Execution de commandes : -exec() : Executer une commande specifiée et retourner la derniere ligne résultante de cette commande. -passthru() : Executer une commande spécifiée et retourner tous les resultat directement dans le browser -`` (apostrophes inversées) : Executer la commande spécifiee et retourner tous les résultats directement dans un tableau -system() : un peu la meme chose que passthru() mais ne gere pas les données binaires -popen() : Executer une commande spécifiée et connecter le flux de sortie vers un descripteur de fichier PHP Manipulation de fichiers: -fopen() : Ouvrir un fichier et l'associer avec un descripteur de fichier PHP -readfile() : Lire un fichier et écrire son contenu dans le browser -file() : Lire un fichier et mettre son contenu et ses infos dans un tableau --- < 10. Protéger PHP > ------------------------------------------------------ Toutes les attaques décrites plus haut marchent a la perfection sur une install par défaut de PHP4. En revanche la configurabilité de PHP permet de pouvoir fournir une réponse radicale a chacune de ces situations. La facture a payer (en matiere de sécurité il y a toujours une ardoise ;) peut varier selon la méthode choisie, voici une liste des méthodes classées de la plus douloureuse a la moins couteuse. * = Pratiquement indolore (limite chatouilles) ** = Vaguement douloureux *** = Gravemement douloureux **** = Insoutenable (Torture chinoise) Il ne s'agit evidemment pas de cout monetaire ni de douleur physique ;-) Il faut cependant noter que si l'on utilise toutes ces options en meme temps on se retrouve avec une installation "sécurité maximum" de PHP sur laquelle n'importe quelle application PHP sera sécurisée, et pour cause, aucune ne fonctionnera ;) **** - Set register_globals off Cette option va stopper l'enregistrement des variables pour les entrées utilisateur. A savoir, si un utilisateur essaye de créer une variables $hello via l'url ou un formulaire, PHP ne déclarera pas $hello, mais déclarera $HTTP_GET_VARS['hello'] (ou POST_VARS selon le cas). C'est la mere de toutes les autres options pour la sécurité PHP, l'effet secondaire d'une telle désactivation est la mort de toute tierce application ainsi qu'une difficulté a programmer comparable a celle qu'on a avec java (sorry le dany;) *** - Set safe_mode on On ne décrit pas ici tout ce que le safe_mode propose car ca n'est documenté nulle part au moment ou ce texte est traduit. On peut cependant constater qu'un grand nombre de restrictions sont activées en meme temps que lui, parmi ces restrictions on peut compter : - La possibilité de restreindre les commandes qui peuvent etre executées par exec(), etc) - La possibilité de restreindre les fonctions de PHP (ex : multimania a désactivé fsockopen) - Restreindre l'acces a un script ou un fichier cible sur une base d'appartenance a un groupe ou a un utilisateur. - L'impossibilité d'uploader C'est une excellente option pour les environnements FAI (c'est d'ailleurs pour eux que le safe_mode a été concu) et elle permet d'augmenter considérablement la sécurité d'une environnement PHP normal. Cette option peut egalement etre la cause de violentes migraines. ** - Set open_basedir Cette option permet de restreindre les operations sur les fichiers aux seuls repertoires impliqués lors de l'appel au fichier. Cela peut avoir comme effet d'invalider toute une variété d'include() et aussi d'attaques distantes mais ne protege pas forcement les failles d'upload ou des fichiers de sessions. ** - Set display_errors off, log_errors on Cette option désactive l'affichage vers le browser des messages d'erreur PHP. Elle permet d'eviter qu'un possible attaquant devine la structure du systeme de fichier local mais peut rendre le debugage tres frustrant. * - Set allow_url_fopen off Cette option permet de désactiver toutes les fonctionnalités relatives a la manipulation des fichiers distants, il est recommandé de l'utiliser dans tous les cas de figure, meme si cela ampute pas mal d'applications interessantes. Il y a certainement d'autres options tres pratiques pour la sécurité, et il existe une documentation tres riche sur PHP qui couvre le sujet de facon plus exhaustive, voir http://php.net ... --- < 11. Responsabilités - Langage et Programmeur > -------------------------- Il faut admettre qu'ils est tres difficile d'écrire une application PHP qui soit vraiment sécurisée (en tous cas avec la config par defaut de PHP). Le probleme n'est pas que PHP soit un mauvais langage, au contraire il est tellement accessible et a tellement de possibilités que d'autres langages n'ont pas. Si on observe bien on peut relever ces deux faits : - Les Web Designers et non codeurs finissent toujours par écrire des applications PHP. Ils n'ont pas a la base (a part dans certains cas) une connaissance de ce qu'implique la sécurité du code qu'ils écrivent car leur philosophie de codage n'est pas orientée comme elle devrait. Une application PHP est par définition exectuée dans le type d'environnement qui est le plus exposé aux attaques : une page universellement accessible depuis un serveur web. L'etat d'esprit devrait plutot etre similaire a celui utilisé lors du codage d'un network daemon qui va subir des attaques régulieres, ou d'une application setuid en tant que root. Au lieu de cela on constate que le focus est mis sur le developpement a tout prix d'une application locale sans privileges. Si un serveur web est corruptible, il fournira alors une passerelle potentielle a un tiers, ce qui peut etre tres dangereux meme si l'acces est fait en tant que nobody. - Le comportement du code est impossible a prévoir. Un include() qui utilise une entrée utilisateur avec "image.php" par exemple, normalement devrait etre sans danger pour la sécurité. L'utilisateur ne pouvant influer sur le chemin d'acces, ni créer un fichier image.php sur la machine distante, on peut se persuader que tout va bien. Seulement quand les fonctionnalités de fichiers distants sont activées cette situation peut devenir un vrai cauchemar et PHP n'a pas rendu cette situation tres intuivite. On aurait tendance a blamer le programmeur pour le code qu'il ecrit, mais si un langage rend la tache difficile au programmeur pour écrire du bon code, le langage doit aussi prendre une partie du blame pour cette situation. Il est vrai cependant que la plupart des programmeurs pourraient en savoir plus sur le sujet avant de se lancer dans la diffusion d'applications de production. Dans presque toutes les applications PHP on peut voir que le programmeur a vaguement "essayé" de mettre de la sécurité, mais a laissé tomber quand il s'est retrouvé face aux implications que cela engendre avec le comportement de PHP. Dans sa recherche de l'ultime fonctionnalité, PHP a completement tué chez le programmeur la faculté a pouvoir comprendre le fonctionnement de son code dans toutes les situations possibles. --- < 12. Autres > ------------------------------------------------------------ Cette section rassemble d'autres ressources diverses et variées En francais : - Serial Savate System Advisories http://savate.madchat.org/addons/security/xxxxxxxxxxxx.adv.en => phpNuke trou http://savate.madchat.org/addons/security/xxxxxxxxxxx2.adv.en => phpSlash trou http://savate.madchat.org/addons/security/xxxxxxxxxxx3.adv.en => phplib trou En anglais : - Rain Forest Puppy RFP 2101 - "RFPlutonium to fuel your PHP-Nuke" http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=2 - João Gouveia Quelques posts sur Bugtraq http://www.securityfocus.com/templates/archive.pike?list=1&mid=165519 http://www.securityfocus.com/templates/archive.pike?list=1&mid=147104 - Jouko Pynnonen http://www.securityfocus.com/templates/archive.pike?list=1&mid=169045 SecureReality a posté plusieurs advisories sur les applications PHP qui devraient etre citées en exemple dans ce document : - SRADV00001 - Manipulation arbitraire de fichiers avec l'upload de PHP http://www.securereality.com.au/sradv00001.html - SRADV00003 - Manipulation arbitraire de fichiers avec IMP http://www.securereality.com.au/sradv00003.html - SRADV00006 - Exécution de commandes a distance avec phpGroupWare http://www.securereality.com.au/sradv00006.html - SRADV00008 - Exécution de commandes a distance avec phpMyAdmin et phpPgAdmin http://www.securereality.com.au/sradv00008.txt - SRADV00009 - Exécution de commandes a distance avec phpSecurePages http://www.securereality.com.au/sradv00009.txt - SRADV00010 - Exécution de commandes a distance avec SquirrelMail http://www.securereality.com.au/sradv00010.txt - SRADV00011 - Exécution de commandes a distance avec WebCalendar http://www.securereality.com.au/sradv00011.txt tobozo@users.sourceforge.net ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ ______________________ _ -*7*- `^°*;:,.> Crypto Echelon <.,:;*°^` _____________________________/¯¯¯¯¯ Ulysse31 ¯¯¯¯¯¯¯\___________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, ALGO DE CRYPTAGE A BASE D'ECHELON J'écrivais tranquilement un mail en le finissant par une crise dédiée a echelon, comme cela m'arrive parfois (oui, quelques mots clés à la fin juste pour rire), quand je me suis dit une chose qui peut être intelligente. [Ndcybz : A votre place j'irais pas plus loin la...] Oui, je sais, la plupart d'entre vous ne croiront absolument pas la derniére partie de ma phrase mais passons... Connaissez vous le principe des moteurs de recherche? En fait, ma question est plutot savez vous comment les moteurs (ou index, ce n'est pas le sujet du jour) référencent des sites? Oui, quel est le rapport avec echelon, je sais je sais... Un moteur de recherche, parcourt une page web (pour simplifier) et regarde avec quel mots clés on a soumis cette page web et regarde si ces mots clés sont présent dans cette page et si oui, combien de fois... Ainsi, une page web du genre :" titre inutile
grú
cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent cybz est intelligent " ne trompera aucun moteur de recherche, qui ignorera tout simplement la page qui ne contient que les mots clés "cybz" et "intelligent" (mots clés qui sont d'ailleurs antinomiques mais c'est une autre histoire) pour cause de "spamming" (oui, c'est comme ça qu'ils disent les moteurs de recherche. Ne pensez vous pas qu'il existe une forte probabilité pour qu'echelon ignore lui aussi les densités de mots clés visiblement trop fortes pour être honnétes et donc déstinées à le faire tourner en bourique (echelon, pas le mot clé, suivez nom de diou!). Ainsi, si l'on envoye un mail contenant uniquement les mots: Jihad Aeroplane Virus Anthrax Il est probable qu'echelon s'en contrefoute malgré le fait que ce sont des mots gravement à la mode? Pourtant, si l'on prend la premiére lettre de chacun de ces mots, on obtient un message clair (JAVA) qui est destiné pour les initiés à contenter maddany (ou bien à proposer une pause café à sa charmante voisine de bureau développeur tout comme vous mais c'est une autre histoire). Bien sur, cette forme de "codage" est tout à fait grossiére mais ne pensez vous pas que l'on pourrait faire tourner echelon en vinaigre (oui, y en à marre des bourriques (non cybz, ce n'est pas une attaque personnelle de plus )) en utilisant les mots clés echelon associés à un soft du genre de celui ci: http://www.spammimic.com/index_fr.shtml . A méditer... Ulysse31@madchat.org [Ndcybz : Et dans le prochain episode, Ulysse vous apprendra a parler bizarrement au telephone pour faire criser echelon. Il vous montrera aussi comment draguer votre secretaire et lui proposer un cafe avec un tas de sous-entendus sous une forme vulgaire et sans aucun sens pour tout etre qui n'aura pas lu l'article ! Et pour finir, le grand Ulysse vous montrera a quel point c'est facile de passer a travers echelon au telephone sans s'acheter d'outil de telecommunication cryptographique. Et oui il vous apprendra a dresser votre animal de compagnie a crier "Jihad ! Jihad !" pendant que vous telephonez! Il apprendra donc ainsi a vos habituels interlocuteurs a ne plus vous appeler lorsque vous etes a table... et meme a ne plus vous appeler du tout !] ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ _____________________ _ -*7*- `^°*;:,.> jArg[0]n filE <.,:;*°^` _____________________________/¯ Lansciac & tobozo ¯\____________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, The Jarg[O]n File. ------------------ Un dossier honteusement baclé par tobozo et lansciac. Le jargon file en est deja a la version 4.3, c'est en partie grace a Gutenberg qui a en a beaucoup favorisé l'enrichissement (avec l'aide de la communauté évidement..). Pour les quelques uns qui auraient profités des fêtes pour enrichir leur armoire, sachez que Gutenberg n'a aucun rapport avec Johannes Gensfleisch qui mit au point à Strasbourg le procédé de composition en caractères mobiles fondus en alliage d'imprimerie. Notre Gutenberg ne s'est donc pas associé avec j.fust et ne fut pas le maître d'oeuvre de la bible dite "à quarante deux lignes", que vous ne trouverez pas en français courant anyway. Pour le moment ce dictionnaire open source n'existe sous cette forme qu'en anglais. La seule traduction qui utilise une methode d'indexage qui s'en rapproche est en italien. Malgré les essais hésitants de clonage du jargon file en francais, on a quand meme pu observer une activité contributive suffisante pour se permettre de croire a une évolution autour des memes modeles. Ces modeles vont vous etre représentés en trois volets car ils intéressent et concernent trois couches cyber sociales contextuellement indissociables et associatives : les redacteurs, les hackers et les lecteurs. Premier volet : - presentations - principes - philosophie Deuxieme volet : - description technique - indexage Troisieme volet : - extraction - exemples de code The Jarg[O]n File. Premier volet -------------------------------- Redacteur : =========== Rapport direct sur la pensée dite. Exploiteur officiel : Docteur Eric S. Raymond, maîtrise en science du langage souterrain. Traceur geosatellitaire : esr@snark.thyrsus.com Hacker : ======== Toute personne capable de rédiger, lire ou agir en harmonie avec la définition suivante : hack [Très commun] 1. n. Originellement, un petit job qui produit ce qui est necessaire, sans plus. 2. n. Un extraordinairement bon travail, mais très accaparant, qui produit exactement ce qui est demandé. 3. vt. Supporter emotionellement ou physiquement. "Je ne supporte pas cette chaleur!" 4. vt. Travailler sur quelquechose (typiquement un programme). Dans un sens premier : "Qu'est tu en train de faire?" "Je hack TECO."Dans un sens plus général (extension de temps) : "Qu'est ce que tu fais par là?" "Je hack TECO." Plus généralement, "Je hack 'foo'" est equivalent à "'foo' est mon interet premier (ou projet)". "Je m'introduis dans le coeur du système". Voir Hacking X ou Y. 5. vt. Mettre une niche. Voir sens 2 et hacker (sens 5). 6. vi. Interagir avec un ordinateur dans la gaité et l'exploratoire plutot qu'agir selon une voie pré-tracée. "Whatcha up to?" "Oh, just hacking." 7. n. Diminutif de hacker. 8. Voir nethack. 9. [MIT] v. Explorer les sous-sols, les toits et les tunnels enfumés, les bâtiments institutionnels, à la consternation des ouvriers d'entretien et (puisque cela se produit habituellement dans les établissements de l'éducation nationale) de la police de campus.bCette activité s'est assimilée au fait de jouer à des jeux d'aventure tels que Dungeons & Dragons ou Zork. Voir vadding. On retrouve énormément de constructions sur ce terme. Elles incluent 'bon hacking' (un adieu), 'Comment ca hack?' (une salutation amicale parmis les hackers) et 'hack, hack' (un satisfaction equitable mais aussi un commentaire amical, souvent utilisé comme une adieu temporaire). Pour la plupart de ces termes, référrez vous au terme général "Le sens du Hack". Voir aussi super hack, vrai hack. Lecteur : ========= Ne pas vouloir dire, | ,erid rioluov sap eN ne pas savoir ce qu'on veut dire, | ,erid tuev no'uq ec riovas sap en ne pas pouvoir ce qu'on croit qu'on veut dire, | ,erid tuev no'uq tiorc no'uq ec riovuop sap en et toujours dire ou presque. | .euqserp uo erid sruojuot te Samuel Beckett, Romancier irlandais 1906-1989 Presentation - Principe - Philosophie ===================================== Point : La langue est un ensemble complexe de mots simples. Ces mots forment ou peuvent former des phrases simples ou complexes. C'est phrases completement simples expriment tant bien que mal des idées d'un simplicisme complexe. Ces idées sont elles mêmes formées de mots. La boucle est ainsi formée. L'histoire du serpent qui se mort la queue est donc vérifiée, et tout cela en serait resté à cet endroit putride si un castor affamé n'avait pas décidé de mettre fin à ce jeu stupide et en guise d'avertissement avala le tout, assaisoné d'un chat redonné d'un de ces amis savaté.... Exegi monumemtum aere perennius... C'est en fait seulement cela que vous devriez retenir. Le langage est la faculté propre à l'homme d'exprimer et de communiquer au moyen d'un systeme de signes vocaux. Autrement dit, les signes ici rétribués sont des mots. Ces mots peuvent être chantants, complexes, exigus; mais ils peuvent aussi être vicieux, salaces. Qui de vous ne s'est jamais fait entrainer dans la pendaison d'un oxymore, l'abreviation d'une litote ou le courroux d'une ellipse? Termes barbares ou eclectiques, la personnification du verbe fut surement la plus grande et merveilleuse chose qui arriva a l'homme. Cependant, comme tout fondement dans notre appelation, un ensemble de regles s'appose et s'oppose a notre dilection du liberalisme. En effet, qui a imposé ces règles? Qu'est ce qui vous empeche d'imposer une signification symbiotique à n'importe quel syntagme nominal. Lequel d'entre vous comprendra "c'est un joli chat chien!" si je n'ai pas enonce au prealable une structure signifiante? C'est donc pour cela que sous le joug de la contrainte, nous acceptons comme evidance que l'etymologie est la reine de tous, décriant la primalité de chaque; de meme, le precedent du suffixe préfixe le debut de la fin....ou plutot dans la langue interdite: abadcominsub && alardotoyer. j'abuserai encore quelque peu en argant que la monosémie bien que peu mon fort renforce de par sa présence l'existence de la polysémie et affirme le véritable sens de la réalité. Enfin bref, pour ratifier l'essentiel de notre essai, nous prendrons comme predicat que le jargon est un vocabulaire propre a une discipline. Celle dont nous parlons presentement est bien sur notre raison de hanter les couloirs, etre la terreur des journalistes et la hantise des politiciens, etre des hommes et des femmes receptifs, sans autre jugement que celui de la decision arbitraire du choix. To Point: le paradoxe humain, c que tout est dit et que rien n'est compris. Alain philosophe francais 1868-1951 A l'emminente question que le commun des mortels n'osait pas même esquisser,j'ai promptement accable le tres saint fondateur, afin d'avoir un éclaircissement plus que necessaire: Comment fonctionne la mise a jour du jargon? Il y a t'il un protocole permettant la mise a jour de celui ci ou est ce simplement un modele open source? D'ou la reponse tres eloquente de ce cher maitre: Je reçois les suggestions d'ajouts et de modifications par e-mail. J'édite la plupart d'entre elles, mais pas toutes. Mais la question qui démange les contribuables que vous serez se résume en quelques mots. De manière à ne pas choquer quelques érudits qui comblent nos rang, je formulerai cela de manière simple et coersitive: "Qu'est ce que le Jarg[0]n File?" Bien que n'ayant aucune réponse directe et explicite, il y a un fac simile de la pierre de rosette qui permet de s'approcher d'une explication possible et plausible. Elle ne peut être tenue comme seule vérité, cependant, elle ouvre une voie de compréhesion et d'élaboration vers l'esquisse de ce que l'on pourrait envisager comme une norme communément appelée "réponse à forme coersitive"(1). Translated answer: La 'culture des hackers' est actuellement une vague ramification de collections de sous-culture qui est néanmoins chargée d'important partages au niveau des expériences, de l'administration et des valeurs. Elle a ses propres mythes, héros, traitres, légendes populaires, blagues, tabous et rêves. Parce que les hackers font partie des groupes qui sont formés de créateurs qui définissent eux même d'une part par rejet des valeurs 'normales' et d'autre part les habitudes de travail; Ils ont une culture exceptionnelle, lourdement chargée en tradition et très riche. Le plus étonnant est que cette culture est a peine agée de 40 ans. Ces quelques lignes décrivent la réalité et la philosophie du jargon file. Certains de ces points méritent peut être un éclaircissement. Il est difficile de dater de manière précise la naissance du mouvement des hackers. En effet, celui-ci étant clandestin et souterrain, mais aussi très jeune (la majorité des protagonistes sont encore vivant), il n'y a que très peu de documents attestant ca ou la à propos d'une officialisation. Nous pouvons cependant poser une pierre d'angle en 1961, dans le sacro saint MIT. le TMRC (Tech Model Railroad Club) du MIT créa des outils de programmation, imposa un jargon et toute une culture associée afin de faire vivre leur passion et évoluer leur savoir. Protocol: > Could you explain why do you edit the jargon file? Because I'm fascinated by the hacker culture and its language. > What's the future of this project? I'll continue doing releases as long as the community is interested in them. ....capseur.... (1) Une demande de grâce a été envoyé aux saintes rfc de manière à ce que cette blague d'étudiante ne soit nullement retenue lors de son passage en instance... The Jarg[O]n File. Deuxieme volet --------------------------------- Description technique ===================== -Fichier ASCII de taille croissante. -Les entrées sont formattées comme suit: :T: /T/ 1. [terminologie LISP pour `true' (vrai)] Oui. Utilisé en reponse a une question (plus precisement si la question est posée en respect de {La convention -P}. En LIST, la constante T signifie entre autres `true' (vrai). Certains hackers Lisp utilisent presque par réflexe le `T' et `NIL' au lieu de `Yes' et `No'. Cela peut parfois provoquer certains malentendus. Quand un garcon de café ou un stewart propose un café a un hacker, ce dernier peut répondre de facon absente `T', voulant dire qu'il veut un café; et bien sur il se fera livrer un thé a la place... Heureusement la plupart des hackers (en particulier ceux qui fréquentent les restos chinois) aiment le thé autant que le café -- donc le probleme n'est pas énorme. 2. Voir {moment T} (aussi {depuis que le moment T est egal a moins l'infini}). 3. [techspeak] En cercles d'execution de transactions, une abbreviation du mot `transaction" 4. [Purdue] Autre facon d'épeler thé {tee}. 5. Un dialecte du {LISP} développé a Yale. (C'est une allusion voulue a NIL, "Nouvelle Implémentation du Lisp", un autre dialecte du LISP développé pour le {VAX}) -La convention de formattage est plutot simple, les trois regles suivantes doivent etre respectées : Les mots sont classés par ordre alphabetique, le séparateur de lettre utilise le format suivant : = A = ===== Chaque DEFINITION peut etre localisée en trouvant le MOT qui est précédé et suivi du symbole ":". Dans la DEFINITION, les liens vers d'autres MOTS sont encadrés par les symboles "{" et "}". [concentré] Le pré-indexage etant fait au moment de l'ajout d'un mot dans le jargon, les possibilités d'exploitation sont suffisantes pour permettre une utilisation multi plateformes et multi langages, ce qui ferme la boucle contextuelle entre les trois couches cyber sociales indissociables et associatives. L'indexage peut donc se faire a chaque lecture, a chaque mise a jour, ou par un moteur spécialisé ou dédié au format qui est propre au jargon file, et au niveau du mot ou de la definition selon les criteres recherchés. [/concentré] The Jarg[O]n File. Troisieme volet ---------------------------------- L'extraction peut se faire de plusieurs facons, on peut afficher tout le dictionnaire (assez long), afficher tous les mots d'une lettre (toujours un peu long) sans en afficher la définition, ou encore afficher toutes les lettres de l'alphabet, et enfin afficher une ou plusieurs définitions qui répondent a un critere de recherche sur le mot ou dans les définitions elles-memes. Voici deux exemples d'extraction du jargon file, un en php (orienté page web) et l'autre en C (orienté ligne de commande), pour d'autres exemples, se référer a la bibliographie a la fin de cet article. ******************************************************************************** ******************************************************************************** ******************************************************************************** ******************************************************************************** FICHIER : jarg.php Usage : page web, ligne de commande Requiert : Fichier Jargon file, lecture du code ******************************************************************************** ******************************************************************************** ******************************************************************************** ******************************************************************************** * * You may copy and use this program freely as long as this * notice is left intact. This program is provided "AS IS" * without warranty of any kind. The copyright owner may not * be held liable for any damages, direct or consequential, * which may result from the the use of this program. */ class jargon { var $VER = "1.2.0"; // version of this script var $JARG_FILE = "jarg400.txt"; // jargon file (you know where to get it eh?) var $JARG_IDX = "jarg400.idx"; // the index file (must be chmod 777 when building) var $lock = "no"; // set this to "yes" when index is rebuilt var $showrand = true; // show random word in search Form var $showindex = true; // show list if letters in search Form var $showlinks = true; // show internal hyperlinks for {definitions} var $self = ""; var $rebuild = false; var $index = false; var $jargon = false; var $footer = ""; var $output = ""; var $result = array(); var $op = ""; var $l = ""; var $strict = "exact"; var $definition= ""; var $word = array("Keyword"=>"", // the keyword itself "Def" =>"", // the full text definition "Html" =>"", // the full html definition "Links" =>array("") // the embedded {keywords} ); /* $word["$keyword"] = array ( ["keyword"] = the keyword itself ["def"] = full definition (including :keyword: ) ["html"] = full definition + html links ( including :keyword: ) ["links"] = array( {keyword1}, {keyword2}, {keyword3} ) */ function jargon() { /* main function */ // Logical assignments global $PHP_SELF, $l, $op, $strict; // name of this document if($this->self=="") { $this->self=end(explode("/", $PHP_SELF)); } // clean keyword if($op) { $op=ltrim(chop(stripslashes($op))); $this->op=$op; } // clean letter if($l) { $l=substr(ltrim(chop(strtolower($l))), 0, 1); $this->l=$l; } // search method if(!$strict || $strict=="no") { $this->strict="no"; } // file checking for Jargon file if(!file_exists($this->JARG_FILE)) { $this->output.=" File $this->JARG_FILE does not exist...\n\n". " Try to edit the file '$this->self' (this file) and\n". " modify the value of '\$this->JARG_FILE' to match\n". " the filename of your Jargon File.\n\n". " Aborting ...\n\n
"; echo $this->output; exit; } // file checking for Index file if(!file_exists($this->JARG_IDX) && ($this->op!="RebuildIndex")) { $this->output.=" Index File $this->JARG_IDX does not exist...\n\n". " Try to create a file to store the index and\n". " modify the value of '\$this->JARG_IDX' to match\n". " the name of the created file.\n\n". " Also you may try to edit this script and set the \n". " value of \$lock to 'true', then ". "Rebuild the index \n\n". " Aborting ...\n\n
"; echo $this->output; exit; } // footer and link to search page if($this->showlinks) { // insert html links $this->footer = "\n\nSearch"; } // $this->callMethod($op, $mode, $letter); // if $op has only one letter, display index list for that letter if (strlen($this->op)==1 && !$this->IsInTheIndex($this->op)) { $this->l=strtolower($this->op); $this->op="List"; return; } // $op = "List" are we listing keywords for a specific letter ? if(($this->op=="List") && ($this->l!="")) { return; } // $op = rebuild index ? if(($this->op=="RebuildIndex") && ($this->lock=="no")) { $this->rebuild=true; } else { $this->index=$this->getIndex(); } return; } function extractWord() { /* this function extracts one or several words from the array $this->jargon */ // load the jargon file $op=$this->op; $strict=$this->strict; if($op=="") { return false; } $ary = $this->getJargon(); while ( ($bfr=next($ary)) && !ereg("The Jargon Lexicon",$bfr) ); // passer l'intro while ( ($bfr=next($ary)) /*&& !ereg("(Lexicon Entries End Here)",$bfr)*/ ) { if(substr($bfr,0, 1)==":") { // debut de la definition d'un mot $match = no; $i=1; $keyword=""; $links=0; while(substr($bfr, $i, 1)!=":" && $i<=strlen($bfr)) { // recuperation du mot $keyword.= substr($bfr, $i, 1); $i++; } // fin de la definition d'un mot ou fin de la ligne (peu probable) // build words array $this->word[strtolower($keyword)][Keyword] = $keyword; if($this->rebuild && ($keyword!="(Lexicon Entries End Here)")) { // only terms are stored in the index when rebuilt $this->index.=addslashes($keyword)."\n"; } elseif( ( $strict=="exact" && strtolower($op)==strtolower($keyword) ) // exact search match - lowercase (case insensitive) for both || ( $strict!="exact" && ( ereg(strtolower($op),strtolower($keyword)) || ereg($op, $keyword) ) // no strict search, use ereg match - lowercase for both ) ) { // definition matches searched keyword, activate index bolean $this->result[$rs++]=strtolower($keyword); $match = "yes"; // inside the definition itself AND match keyword } /* else { // we're inside non-matching data (keyword line) // located after the header of the keyword.. eg : // :keyword: \n.\ non matching data }*/ } /* else { // we're inside non matching data (definition lines) // located after the first line of the keyword }*/ // build words array $this->word[strtolower($keyword)][Def] .=$bfr; if($match=="yes") { // buffer is on the searched data, start processing definition data if($this->showlinks) { // insert html links $bfr=str_replace(":$keyword:", ":$keyword:", $bfr); } // get buffer length (variable) $txtlen = strlen($bfr); $mylogicalpointer=0; $def = ""; // process all data in the buffer (80 chars max) while( ($mylogicalpointer<=strlen($bfr))) { // found a link to another keyword ? if((substr($bfr, $mylogicalpointer, 1)=="{") || $inword=="yes") { // we're inside a linked keyword... // it might be wrapped in the text... let's check if we're // not already inside one that started on the previous line if($inword!="yes") { // start of a new keyword, set the start pointers $subword = ""; if($this->showlinks) { // insert html links // build words array $this->word[strtolower($keyword)][Html] .= "{self?op="; $def.="{self?op="; $sim.=" self?op="; } else { // restore the bracket at the beginning of the keyword $def.="{"; // (this can be improved) } $inword="yes"; // set pointer (we're inside a {linked keyword} ) $mylogicalpointer++; } // get the content of the {keyword} (this can be improved) while( ($mylogicalpointer<=strlen($bfr)) && (substr($bfr, $mylogicalpointer, 1)!="}") ) { $subword.= substr($bfr, $mylogicalpointer, 1); $mylogicalpointer++; } if($mylogicalpointershowlinks) { // insert html links // remove double spaces while(ereg(" ", $sublink)) { $sublink=str_replace(" ", " ", $sublink); } // remove and $sublink=str_replace("\r\n", "", $sublink); $def.=urlencode($sublink); // insert keyword inside url $this->word[strtolower($keyword)][Html] .= urlencode($sublink); $sim.=urlencode($sublink); // insert keyword inside url // complete html link for "more like this" $sim.="&strict=no"; $sim.="\" title=\"Recherche sur un terme similaire\">"; $sim.="[?]"; // complete html link for "exact word" $def.="&strict=exact"; $def.="\" title=\"Recherche sur le terme Exact\">"; $def.=$subword; $def.="$sim"; // build words array $this->word[strtolower($keyword)][Html] .= "&strict=exact". "\" title=\"Recherche sur le terme Exact\">". $subword. "$sim"; } else { // just print the word $def.=$sublink; } // build words array $this->word[strtolower($keyword)][Links][$links++] =$sublink; $sim=""; $inword="no"; // end of the word, ready to process definition data } } $def.= substr($bfr, $mylogicalpointer, 1); // build words array $this->word[strtolower($keyword)][Html] .= substr($bfr, $mylogicalpointer, 1); $mylogicalpointer++; } $this->definition.=$def; } } if($this->rebuild) { return $this->rebuildIndex();; } else { return $this->definition; } } function getForm() { /* just builds the form and the index links */ $this->output .= "
". "". "
".
            "/---------------------------------------------------".
            "-------------------------\ \n
". "| Jargon File outil de recherche $this->VER par ". "tobozo@users.sourceforge.net |\n
". "| copyleft (c+) 12-oct-2001 View source". " |\n
". "\-------------------------------------------------". "---------------------------/ \n\n
". "
". "". "
Rechercher : ". " \n
Terme exact : ". "". "
"; /* display list of existing letters in index*/ if($this->showindex) { $this->showLettersFromIndex($this->index); } $this->output.= "
". "
"; /* display random term */ if($this->showrand) { $ary=$this->getIndex(); $max=count($ary); srand((double)microtime()*1000000); $r = rand(0,$max); $this->output.="". "

\nIl y a $max Termes ". "dans le jargon\n\nTerme au hasard : \n\n"; $this->op = $ary[$r]; $this->strict="exact"; $this->output.=$this->extractWord(); $this->output.= "
"; } return $this->output; } function getWordsFrom($l) { /* list words for a specific letter returns false if bad entry or if nothing is found */ $l=substr(ltrim(chop($l)), 0, 1); if($l=="") { return false; } $ary=$this->getIndex(); $w=0; while($w<=count($ary)) { if(strtolower($l)==strtolower(substr($ary[$w],0,1))) { $this->output.="self?op=". urlencode($ary[$w]). "&strict=exact\">". htmlentities($ary[$w]). "\n"; $let++; } $w++; } if($let==0) { $this->output.="Sorry, None of the words in the file ". "$this->JARG_IDX starts with the character '$l'"; return false; } else { return $this->output; } } function showLettersFromIndex() { /* returns all first letters from words in the index file */ $ary=$this->getIndex(); $w=0; while($w<=count($ary)) { $tmp=strtolower(substr($ary[$w],0,1)); $link[$tmp]="$tmp"; $w++; } sort($link); while(list($v, $n)=each($link)) { $output.=$n; } $this->output.=$output; return $this->output; } function loadJargon() { /* Returns the link to the jargon index file */ $fp=@fopen($this->JARG_IDX, "r") or die( "Unable to open $this->JARG_IDX file\n". "You may try edit this script and \n". "set the value of \$lock to 'true', \n". "then Rebuild the index"); return $fp; } function IsInTheIndex($op) { // checks in index file for matching string $op // returns the string or false if nothing found $op=ltrim(chop(strtolower($op))); if(!is_array($this->index)) { $ary=$this->getIndex(); } else { $ary=$this->index; } while($bfr=next($ary)) { $tmp=ltrim(chop($bfr)); if($op==strtolower($tmp)) { return $tmp; } } return false; } function MatchesSimilarTerms($op) { $op=ltrim(chop(strtolower($op))); if(!is_array($this->index)) { $ary=$this->getIndex(); } else { $ary=$this->index; } while($bfr=next($ary)) { $tmp=ltrim(chop($bfr)); if(ereg($op, strtolower($tmp))) { $result[$i++]=$tmp; } } if(!empty($result)) { return true; } return false; } function getIndex() { // reads the index file from filesystem // or from $this->index (if exists) and // return content into an array if(!is_array($this->index)) { $fp=$this->loadJargon(); while(!@feof($fp) && $bfr=@fgets($fp, 255)) { $ary[$i]=stripslashes(ltrim(chop($bfr))); if($ary[$i]!="") { $i++; } } $this->index=$ary; } return $this->index; } function rebuildIndex() { /* Just rebuilds the index file */ $q=@fopen($this->JARG_IDX, "w") or die( "Unable to create $this->JARG_IDX file\n". "You may try to chmod the file as r/w and ". "try again"); @fputs($q, $this->index); @fclose($q); return "Index file rebuilt on file $this->JARG_IDX"; } function getJargon() { /* get the content of the jargon and store it into an array of 80 chars width */ if($this->jargon==false) { $fp=@fopen($this->JARG_FILE, "r") or die ("Impossible d'ouvrir le fichier $this->JARG_FILE"); while(!@feof($fp)) { $index[$i++]=@fgets($fp, 80); } $this->jargon=$index; } return $this->jargon; } function out($mode) { /* Returns the results or writes to stdout */ global $PHP_SELF; switch ($this->op) { case "List": if ($this->l!="") { $this->getWordsFrom($this->l); } break; case "RebuildIndex": $this->output.=$this->extractWord().$this->footer; break; case "show_source": show_source(end(explode("/", $PHP_SELF))); exit; break; default : if($this->op!="") { // $op = "some term" // process this only if not rebuilding the index $this->output.="\n ... Recherche du terme ". "'$this->op' dans le fichier $this->JARG_FILE...\n\n"; $op=$this->op; if(!$this->IsInTheIndex($this->op)) { // empty results? $this->output.="\n ... Désolé aucun terme n'a été trouvé ". "pour la recherche sur '$op'.\n\n"; if($this->MatchesSimilarTerms($this->op)) { if($this->strict=="exact") { $this->output.="\n ... Rechercher dans les ". "termes similaires.\n\n"; $this->op=false; } else { $this->output.="\n ... Recherche automatique dans les termes similaires ..\n\n"; $this->strict="no"; } } } $this->extractWord(); $ar = $this->result; if(count($ar)>1) { // multiple results // $this->output .="\n\n Found multiple results... displaying \n\n"; while($a++word[$ar[$a]]; // echo $ary[Keyword]; if($this->showlinks) $out.=$ary[Html]; else $out.=$ary[Def]; if($this->relatedlinks) { if(is_array($ary[Links])) { while(list($n, $v) = each ($ary[Links])) $out.= $v."\n
"; } } } $this->output.= $out.$this->footer; } else { // single result // $this->output .="\n Found single result... displaying \n\n"; $ary= $this->word[strtolower($this->op)]; ?>showlinks) $out.=$ary[Html]; else $out.=$ary[Def]; if($this->relatedlinks) { if(is_array($ary[Links])) { while(list($n, $v) = each ($ary[Links])) $out.= $v."\n
"; } } $this->output.=$out.$this->footer; } } else { // $op = "" -> display form $this->getForm(); } } if($mode=="out") { echo $this->output; } else { return $this->output; } } }; // end class ?> Jargon File Processor ... Copyleft(c+) 2001 tobozo@users.sourceforge.net
out("out");
?>
******************************************************************************** ******************************************************************************** ******************************************************************************** ******************************************************************************** FICHIER : jarg.c USAGE : ligne de commande REQUIERT : Fichier jargon file, compilateur C, lecture du code ******************************************************************************** ******************************************************************************** ******************************************************************************** ******************************************************************************** /* * Program to process the Jargon File (v 2.9.12.1+) * Gives fortunes, searches for keywords, creates index * still doesn't make coffee... * * Copyright (c) 1992-1999 Kai Risku * 2001 French version by tobozo * * You may copy and use this program freely as long as this * notice is left intact. This program is provided "AS IS" * without warranty of any kind. The copyright owner may not * be held liable for any damages, direct or consequential, * which may result from the the use of this program. */ #include #include #include #include #include #include #ifdef __MSDOS__ #include #else #include #endif #define VER "2.4.1" #define JARG_LIST 1 #define JARG_DISPLAY 2 #define IDX_FILE "/home/users/t/to/tobozo/jargon/jarg.idx" void make_index( char *indexfile, char *textfile ); void get_quote( char *indexfile, char *opt ); void search_word( char *indexfile, char *keyword ); void read_quote( long offset , int length , char *filename ); void disp_entries( char *indexfile, char *string, int mode ); #ifdef __MSDOS__ # define _srand srand # define _rand rand #else char *_fullpath( char *dest, char *src, int maxlen ); char *strlwr( char *str ); # define stricmp strcasecmp # define _srand srand48 # define _rand lrand48 #endif int main( int argc , char *argv[] ) { int i; char indxfile[80], str[80]; #ifdef __MSDOS__ char *p; #endif if (argc==1) { puts("Jargon File outil "VER", "__DATE__" original par Kai Risku - revu par tobozo\n\n" "Usage: jarg [option] [arguments]\n\n" "jarg -i jargonfile - creér un index pour le jargonfile (chemin complet)\n" "jarg -f [nb max lignes] - écrire un mot au hasard\n" "jarg -l truc - lister tous les mots contenant 'truc'\n" "jarg -d machin - afficher les entrées contenant le mot 'machin'\n" "jarg [-] chose - afficher l'entrée pour le mot 'chose'\n" ); exit ( 0 ); } #ifdef __MSDOS__ strcpy( indxfile, argv[0] ); p = strchr ( indxfile, '.' ); if ( p!=NULL ) *p = '\0'; strcat( indxfile, ".idx" ); #else strcpy( indxfile, IDX_FILE ); #endif if ( argv[1][0]=='-' ) { switch ( tolower(argv[1][1]) ) { case 'i': make_index ( indxfile, argv[2] ); break; case 'f': get_quote ( indxfile, argv[2] ); break; case 'l': case 'd': strcpy ( str, "" ); for ( i=2; i=' ') || (p[0]=='=' && p[1]>=' ' && lines>1) ) { if ( isentry ) { fprintf ( idx, ":%s:%ld,%d\n", keyword, filepos, lines ); maxqtes++; isentry = 0; } if ( p[0]==':' ) { filepos = fpos2; lines = 1; isentry = 1; sscanf ( p, ":%[^:]", keyword ); } } else if ( text[0]=='*' && lines==1 ) { isentry = 0; } else { if ( isentry ) lines++; } fpos2 = ftell(fp); } if ( isentry ) { fprintf ( idx, ":%s:%ld,%d\n", keyword, filepos, lines ); maxqtes++; } fclose( idx ); fclose( fp ); printf( "%d mot indexés.\n" , maxqtes ); idx = fopen ( indexfile, "r+" ); _fullpath ( keyword, textfile, 79 ); fprintf ( idx, "%s=%05d\n", keyword, maxqtes ); fclose ( idx ); } void get_quote( char *indexfile, char *opt ) { int qtes, quoteno, lines, maxlines; long quotepos; char text[256], filename[80], *p; FILE *fp; maxlines = 32767; if ( opt!=NULL ) maxlines = atoi ( opt ) + 1; if ( maxlines<2 ) { fprintf ( stderr, "Nb Max lignes doit etre un nombre positif !\n" ); return; } fp = fopen ( indexfile, "r" ); if ( fp==NULL ) { fprintf ( stderr, "Impossible d'ouvrir le fichier index %s\n", indexfile ); return; } fgets ( text, sizeof(text), fp ); sscanf ( text, "%[^=]=%d", filename, &qtes ); if ( qtes<1 ) { fprintf ( stderr, "Erreur dans le fichier index!\n" ); fclose ( fp ); return; } _srand( time(NULL) ); do { rewind ( fp ); quoteno = _rand() % qtes + 2; while ( quoteno>0 ) { fgets ( text, sizeof(text), fp ); quoteno--; } p = strrchr ( text, ':' ); sscanf ( p, ":%ld,%d", "epos, &lines ); } while ( lines>maxlines ); fclose ( fp ); read_quote( quotepos, lines, filename ); } void read_quote( long offset, int length, char *filename ) { FILE *fp; char quote[256]; int i; fp = fopen ( filename, "r" ); if ( fp==NULL ) return; fseek( fp, offset, 0 ); for ( i=0; i Phpnuke Trou <.,:;*°^` _____________________________/¯ Frogm@n ¯\____________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, *********************************** * * * Security Hole in PHPNuke * * Admin.php * * by frog-m@n * * * *********************************** //////////////////////////////////////////////////// / a) TOC / / ******* / / / / a) Table of Content / / b) Introduction / / c) Description d'admin.php / / d) Expliquation et utilisation de la faille/ / e) Précisions/Astuces / / f) Conclusion / //////////////////////////////////////////////////// b) Introduction *************** De nombreuses failles permettent de voir l'arborescence d'un site. Celle que j'ai trouvée permet non seulement de voir l'arborescence du site, mais aussi celle du disque dur. Elle affiche donc non seulement les dossiers, mais tout les fichiers qu'ils contiennent. Elle affecte de nomreux site, puisqu'elle est basée sur un script php proposé par PHP-Nuke. Hé oui, encore une faille sous PHPNuke, qui, bien qu'elle ne soit pas la plus impressionnante, peut s'averer bien utile... Cet article explique comment je l'ai trouvée, et comment l'utiliser (ou du moins comment moi j'ai réussi a l'utiliser). c) Description d'admin.php ************************** Un jour, sur un site ( dont je ne me rapelle pas l'url), j'ai trouvé un demo d'un script offert par PHPNuke : Admin.php . Ce script, après authentification par login et pass de l'administrateur, permet (dans le "File Manager") : - D'uploader un fichier dans le site - De créer un fichier ou un dossier sur le site - De déplacer un fichier ou un dossier déjà sur le site - De renommer un fichier ou un dossier déjà sur le site - De copier un dossier ou un fichier déjà sur le site - De détruire un fichier ou un dossier du site - De visualiser n'importe quel dossier ou fichier du site - D'éditer un fichier se trouvant sur le site. Bref, tout ce qui est utile à un webmaster, ainsi que d'autres options du style: - Ajouter un administrateur de news - Ajouter un utilisateur - Configurer le site - etc... Voici, pour info, la liste des titres proposés (en plus des premiers que j'ai de cité, et dont les 3 derniers) ainsi que leurs urls respectives (ceci est appelé par PHPNuke "Menu D'administration") : Nouvel Article : /admin.php?op=adminStory Affectation des sujets : /admin.php?op=topicsmanager Blocs Gauches : /admin.php?op=lblocks Blocs Droits : /admin.php?op=rblocks Edition Utilisateurs : /admin.php?op=mod_users Editions des Administrateurs : /admin.php?op=mod_authors Bloc Admin : /admin.php?op=ablock Bloc Principal : /admin.php?op=mblock Sondages : /admin.php?op=create HTTP Referants : /admin.php?op=hreferer Sections : /admin.php?op=sections Liens Web : /admin.php?op=links Preferences : /admin.php?op=Configure Ephemerids : /admin.php?op=Ephemerids File Manager (là où se trouve les options qui nous interessent) : /admin.php?op=FileManager Headlines : /admin.php?op=HeadlinesAdmin Sortie : /admin.php?op=logout Pour ceux qui se demande pourquoi ces options, je rappelle que PHPNuke sert (entre autre) à gérer des "news". Voici les urls directement accessible sur la page "File Manager", celle à laquelle on accede grâce à la faille expliquée + tard : Copier, renommer ou déplacer un fichier/dossier : /admin.php?op=move&wdir=/&file=/lefichieroudossier "Touch" : /admin.php?op=touch&wdir=/&touchfile=/lefichieroudossier Supprimer un fichier/dossier : /admin.php?op=del&wdir=/&file=/lefichieroudossier Ouvrir un fichier : /lefichier Editer un fichier : /admin.php?op=edit&wdir=/&file=/lefichier Comme vous l'avez remarqué, je ne donne ici ni l'url pour uploader, ni celle pour créer un dossier ou un fichier, pour la simple et bonne raison que ces options sont dans une
d'action post (on pourra donc en faire des urls par la suite, et c'est là que ça deviendra réellement interessant). On peut donc voir dans les derniers urls 3 valeurs : "op", qui donne la valeur de l'opération à effectuer "wdir", qui a par défaut la valeur /, / signifiant que l'on se trouve dans le dossier de base du site. Cette valeur, toujours pour rester dans le dossier de base, peut être changée par // ou par /./ (remarquez la similitude avec le "." de la commande "CD ." alias "CHDIR ." en DOS, qui nous envoie dans le dossier où on se trouve). et enfin "file", ayant des variantes comme "touchfile", et qui donne le nom du fichier ou dossier sur lequel la commande choisie dans "op" doit être appliquée. On peut aussi voir que tout se passe via admin.php . Voyons maintenant, en affichant la source, les 3 commandes (creer un fichier, créer un dossier et uploader un ficher) dont on a si peu parler jusqu'ici : Créer un dossier :
ce qui donnera, si on appuye sur le button, l'url : /admin.php?mkdirfile=&op=mkdir&wdir=/ On y retrouve donc le fichier admin.php, le "file", avec le nom "mkdirfile", le "op" avec la valeur "mkdir" et le "wdir", toujours avec la valeur /. Créer un fichier :
Ce qui donnera l'url : /admin.php?file=&op=createfile&html=yes&wdir=/ Encore une fois, les "INPUT" file, op et wdir y figurent, ainsi que le admin.php . On y voit aussi un checkbox appelé "html"... vu que cette url ne nous servira a rien, je précise juste que le texte "(html template)" se trouve à côté de ce checkbox. Enfin, la source de l'upload de fichier :
Ce qui nous donnera l'url : /admin.php?wdir=/&userfile= Toujours l'admin.php, le wdir et le file avec la variante "userfile". Vous pouvez taper toutes ces urls à la suite d'un site possedant admin.php, le script vous demandera TOUJOURS un "AdminID" et un Mot de Passe. d) Expliquation et utilisation de la faille ******************************************* Dans la plupart des scripts, qu'ils soient php, asp, jsp, cgi ou autre, la valeur du boutton n'est pas prise en charge dans l'url, si on click dessus. J'ai donc testé sur le site http://site.de.test1/, qui utilise admin.php les urls en rajoutant le "name" et la valeur des buttons, ce qui donnait cela : Pour créer un dossier : http://site.de.test1/admin.php?mkdirfile=&op=mkdir&wdir=/&mkdir=Go! Résultat : rien... on me demande toujours un AdminID et un mot de passe... Pour créer un fichier : http://site.de.test1/admin.php?file=&op=createfile&html=yes&wdir=/&createfile=Go! Résultat : toujours rien :( Pour uploader un fichier : http://site.de.test1/admin.php?wdir=/&userfile=&upload=Go! Résultat : Une page s'affiche... Une erreur... : Warning: Unable to open '' for reading: No such file or directory in /home0/truc/Serveur/htdocs/admin.php on line 1196 Bingoooooo ! =) La page qui s'affiche est le File Manager, avec tout les dossiers et fichiers se trouvant dans le dossier par défaut du site !!! L'erreur nous informe de la place de ce dossier dans le disque dur : /home0/truc/Serveur/htdocs/ Toutes les options vues plus haut sont présentes ! Mais aucune ne fonctionne... Toutes demandent toujours un AdminID et un mot de passe... Tant pis, voyont comment se servir de notre découverte. Je sais que si j'enleve la partie de l'url "&upload=Go!", je reviendrai à la demande d'authentification habituelle... donc je n'y touche pas. Commençons par la fin, changeons la valeur de "userfile", pour donner : http://site.de.test1/admin.php?wdir=/&userfile=test&upload=Go! Rien ne change, à part l'erreur : Warning: Unable to open 'test' for reading: No such file or directory in /home0/truc/Serveur/htdocs/admin.php on line 1196 rien de bien interessant... 2eme test en changeant cette valeur, avec l'url : http://site.de.test1/admin.php?wdir=/&userfile=admin.php&upload=Go! Encore une fois, rien de passionnant, toujours l'erreur : Warning: Unable to create '/home0/truc/Serveur/htdocs/': Is a directory in /home0/truc/Serveur/htdocs/admin.php on line 1196 Bon, décidemment cette partie ne nous apprendra rien, supprimons-la. Il nous reste donc : http://site.de.test1/admin.php?wdir=/&upload=Go! "upload" ne doit pas être changé, "admin.php" non plus (lol)... il reste donc "wdir". Sa valeur est / ... et sur la page File Manager, il y a quelques lignes : File Manager Current Directory is: / [ Back to root | Rafraichir ] Uploaded --> / Je change sa valeur, je n'y met rien : http://site.de.test1/admin.php?wdir=&upload=Go! Rien ne change : "Current Directory" est toujours / . Le Current Directory reste toujours au dossier par défaut du site avec, pour valeur de wdir, / , rien , et comme vu plus haut : /./ et // etc... Je regarde les dossiers qui se trouvent dans /home0/truc/Serveur/htdocs/, il y en a 5 : cache, images, manual, themes, upgrades . Je test donc l'url http://site.de.test1/admin.php?wdir=/images/&upload=Go! Bingo 2 !! =)) Je me trouve bien dans le dossier /home0/truc/Serveur/htdocs/images/, bien que l'erreur n'ait pas changée. Je vois par contre ces lignes changées : File Manager Current Directory is: /images/ [ Back to root | Rafraichir ] Uploaded --> /images/ Autre changement, les urls pour les options propres au File Manager ont changé, elles sont du style : /admin.php?op=move&wdir=/images/&file=/images/[nomdefichieroudedossier] . Logique... Bien ! Nous savons donc comment descendre dans l'arborescence du site ! Pour la suite, changeons d'exemple, prenons le site http://site.de.test2 . http://site.de.test2/admin.php?wdir=/&upload=Go! ... Pas de grands changements, à part l'erreur : Warning: Unable to open '' for reading: No such file or directory in /home/machin/chose/public_html/admin.php on line 532 Encore une fois, rien que de tres logique : ce n'est pas le même HD, ce n'est donc pas la même arborescence =)) Bien, on sait comment descendre dans cette arborescence... maintenant : comment remonter ? C'est le moment de se rappeler ce qui a été dit à propos du DOS : "CD ." permet de rester dans le dossier où on se trouve, wdir=/./ se met dans le dossier par défaut. Hé bien, tantons le coup : "CD.." nous fait remonter au dossier parent... testons l'url : http://site.de.test2/admin.php?wdir=/../&upload=Go! Bingo 3 !! =))) Il suffit donc de rajouter autant de "/../" que désiré pour remonter l'arborescence du disque dur, sans se limiter au site lui-même. Voilà, on peut se promener dans le HD à sa guise... youpi... e) Précisions/Astuces ********************* Attention : Ce n'est pas parce qu'il y a une erreur que la faille est présente. Pour exemple : http://site.secure/admin.php?wdir=/&upload=Go! Warning: Unable to open '' for reading: No such file or directory in /home4/hopla/admin.php on line 226 Warning: SAFE MODE Restriction in effect. The script whose uid is 3780 is not allowed to access /home4/hopla owned by uid 0 in /home4/hopla/admin.php on line 229 Warning: Cannot add header information - headers already sent by (output started at /home4/hopla/admin.php:226) in /home4/hopla/admin.php on line 230 http://site.secure2/admin.php?wdir=/&upload=Go! Warning: Unable to open '' for reading: No such file or directory in /home/pouetpouet/public_html/admin.php on line 226 Warning: Cannot add more header information- the header was already sent header information may be added only before any output is generated from the script - check for text or whitespace outside PHP tags, or calls to functions that output text- in /home/pouetpouet/public_html/admin.php on line 230 http://site.secure3/admin.php?wdir=/&upload=Go! Warning: Unable to open '' for reading: Permission denied in c:\apache\htdocs\admin.php on line 231 Warning: Cannot add header information - headers already sent by (output started at c:\apache\htdocs\admin.php:231) in c:\apache\htdocs\admin.php on line 235 Des bugs de ce genre sont tout de mêmes assez connus, et appelés failles à cause du fait qu'ils donnent une partie de l'arborescence... par exemple /_vti_bin/shtml.dll qui affichera, si on tape www.pauvsite.naz/_vti_bin/shtml.dll/skonveut.html l'erreur : Cannot open "C:\Apache\site\skonveut.html" : no such file or folder. Si on tape n'importe quoi comme valeur de wdir, par exemple /admin.php?wdir=1212&upload=Go! On a une erreur qui nous donne la confirmation (etait-ce vraiment necessaire?) que la commande wdir ressemble fortement à la commande CHDIR (CD) sous DOS : Warning: ChDir: No such file or directory (errno 2) in /home0/truc/Serveur/htdocs/admin.php on line 1024 et la valeur "Size" du tableau de "FileManager" est "b" pour tout les dossiers/fichiers. Bien sûr les URLS des opérations sont maintenant du style : /admin.php?op=edit&wdir=1212&file=1212article.php . Ayant remarqué que les "op" étaient egaux aux noms des buttons dont la valeur est "Go!", j'ai testé des urls genre /admin.php?rblocks=Go! /admin.php?mod_users=Go! /admin.php?hreferer=Go! (le wdir n'est pas indispensable, car il a une valeur par défaut) mais ça n'a rien donné... Voir uniquement le contenu d'un HD peut ne pas paraitre très utile, mais on peut trouver l'accès de dossiers avec des informations sensibles. Exemple : www.pauvsite.com/cache/nuke.sql ou , qui sait, des .pwd, des pass de BD, des editeurs, etc... f) Conclusion ************* Voilà... il y a surement des façons plus pratiques d'utiliser le script admin.php ; comme par exemple pour uploader, envoyer ou créer des fichiers, ou créer des dossier. Mais ceci etant la premiere véritable faille (bug?) que je trouve par moi-même, n'en demandez pas trop :) je sors seulement de la catégorie "script kiddie", et j'ai encore un long chemin à faire dans la sécu informatique. Merci à FLoW, qui a fait un tuto nommé "PHP" et qui m'a inspiré. Si quelqu'un, grâce à ce texte (ou non) arrive à exploiter mieux le script, je lui serais extrêmement reconnaissant de m'en avertir. Thx, bye =) frog-m@n, BAL Team's member. Mailto : leseulfrog@hotmail.com Faille découverte le dimanche 4 novembre 2001 par frog-m@n Article achevé le lundi 5 novembre 2001, toujours par frog-m@n =p ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ _____________________ _ -*A*- `^°*;:,.> Vieille Savate <.,:;*°^` _____________________________/¯ tobozo ¯\____________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, VIEILLE SAVATE J's'rai content quand tu s'ras stone Vieille SAVATE J's'rai content quand tu s'ras stone Vieille SAVATE Tu ne perds rien pour attendre Je sau - rai bien te répandre Tes neurones dedans-dehors Vieux Castor Je t'ai r'çu poumons ouverts Vieill' SAVATE T'avais l'pétard a l'envers Vieill' SAVATE T'as brûlé tous mes tapis Des trous d'boulettes dans mon lit T'as fumé tout mon kashmir Vieux Tapir Puis j't'ai présenté mon dealer Vieille SAVATE Puis j't'ai présenté mon dealer Vieille SAVATE Tu y a parlé de l'euro Maintenant t'es son héros Et moi je paye le prix fort Vieux Castor Puis t'as parlé d'pénurie Vieille SAVATE Puis t'as parlé d'pénurie Vieille SAVATE En squattant tous les bons plans Sans rien m'laisser sous la dent T'as tout fumé sans remords Vieux Castor Mais j'suis sorti a saint denis Vieille SAVATE Mais j'suis sorti a saint denis Vieille SAVATE Et j'ai choppé un gros bout De tchernobyl tout ripou Pour voir tes poumons moisir Vieux Tapir Tu fumeras ca comme une trombe Vieille SAVATE Tu croiras que c'est d'la bombe Vieille SAVATE À p'tites taffes de shit mal cuit Dans ta trachée endolorie T'auras la santé qui s'gate Vieille SAVATE Vieille SAVATE Vieux Castor © Tobozo 09/01/2002 ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, _ _____________________ _ -*B*- `^°*;:,.> Moliere de rien <.,:;*°^` _____________________________/¯ tobozo ¯\____________________________ ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, Les aventures de la Cigall et la Froumi Grosse lameuse ayant floodé tout l'été Se trouva fort dépourvue Quand la plainte fut venue. Plus un seul petit morceau De couche OSI ou de reseau. Elle voulut flamer son admin Depuis l'ordi de sa voisine, La priant de lui prêter Sa connexion pour persister Ses floods en attendant l'ADSL. «Je te paierai, lui dit-elle, Avant logout ou tribunal, Portage de plainte, proces verbal.» La voisine est dénonceuse ; C'est là sa moindre parano. «Qui floodiez vous jusqu'a sitot ? Dit-elle à cette lameuse. Nuit et jour à tout connectant Je spammais, ne vous déplaise. Tu spammais ? J'en suis fort aise. Il faudra plaider maintenant.» © Tobozo 14/06/2001 ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, Et hop -=#~ c'est terminé pour ce numéro 26 du hackoff, bouclé en vitesse avec perte et fracas mais sans odeur de pieds (on a changé de chaussettes pour l'occasion), pour le prochain numéro qui devrait sortit avant la fin de cette année, on ne vous promet rien que l'on ne puisse tenir (ca change), et on vous assure que toute date anticipée n'est que trop en avance sur son temps pour etre fondamentalement applicable sur un tel plan. grú [tbz] ________________________________________________________________________________ ¬­®¯°±²³´µ·¸¹º»¿øØÞþæ¡¢£¤¥ ¦§¨©ª«¬­®¯°±²³´µ·¸¹º»¿øØÞþæ¡¢£¤¥ ¦§¨©ª«¬¡¢£¤¥ ¦§¨©ª«¬ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ -<\________________________/>- ~~ ~~ ~~ ~~°ºØø¦ ¿ H A C K 0 F F ? ¦øغ°~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~--~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ http://come.to/legang ~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~ http://hackoolic.tripod.com ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~ ~ ~~ ~~ ~~ ~~ ...Des commentaires, des questions, des insultes, ecrivez aux membres du gang... ________________________________________________________________________________ ¬­®¯°±²³´µ·¸¹º»¿øØÞþæ¡¢£¤¥ ¦§¨©ª«¬­®¯°±²³´µ·¸¹º»¿øØÞþæ¡¢£¤¥ ¦§¨©ª«¬¡¢£¤¥ ¦§¨©ª«¬ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Greets : Geminal VALLES SOTO (@*64) _____________________________________ ((((((( H@CK-OFF !! )))))))) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~ ¤º°`°º ¤º°`°º ¤º°`°º ~ ~ ~ ~ | SE | - | RI | - | AL | ~ ~ ~ ~ | SA | - | VA | - | TE | ~ ~ ~ ~ | SY | - | ST | - | EM | ~ ~ ~ ~ ø,¸¸,ø ø,¸¸,ø ø,¸¸,ø ~ ~ Cakeii - Tobozo - Yopyop - Silk - Nk Blured - Misto! - hertz - Jericho ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cakeii@usa.net courou@mail.com { \|/ >http://come.to/legang 8 -- * -- >silk@silk.cut { /|\ tobozo@yahoo.com hertz@webmails.com jericho@altranet.fr blured75@hotmail.com ulysse31@madchat.org lansciac@caramail.com matforever@hotmail.com ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø, / O o O o O o \ \ O O O / º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [EOF]