Bruteforcer une authent web avec un script perso

Bruteforcer une authent web avec un script perso
Python 3.4

Bonjour à tous,

Il m’est arrivé quelques fois de tomber sur des applis web (avec authentification forcément, sinon je n’aurai pas écrit ce billet) un peu particulières, avec lesquelles je n’arrive pas à utiliser les outils classiques d’attaque par force brute comme Medusa. Je vais donc vous montrer comment réaliser une attaque par dictionnaire à l’aide d’un script Python sur une appli web, en l’occurence mon propre site (WordPress donc). Le script et le lien vers un des dicos les plus connues se trouvent en annexe en bas de page. Libre à vous de le modifier selon vos besoins, mais rappelez vous que lancer une attaque de ce genre sur une cible non avertie, sans authorisation ou cadre légal est interdit par la loi.

 

Tutoriel

Remarques: il sera toujours plus efficace d’utiliser les outils type Medusa pour du bruteforce, pour différentes raisons. Par exemple, Medusa est capable de multi threader l’attaque, de l’interrompre et de la reprendre plus tard, d’adapter les timeout etc… Egalement, il n’est pas pertinent d’utiliser ce script Python sur du WordPress, mais c’est ce que j’ai sous la main actuellement et je suis assuré de l’échec du script si certains essaient d’attaquer mon authentification en suivant le tuto. Aussi, je pars du principe que vous connaissez déjà le login, vu que les performances en web ne sont pas folles rien qu’avec un champ unique, je n’imagine pas la combinaison de deux champs…

 

I/ Aller sur la page internet désirée. Copier l’URL de la page d’authentification, et la noter quelque part. Ici: http://valou-tweak.com/wp-admin (mon ancien nom de domaine).

II/ Il faut ensuite repérer le champ de login, (ici là où « valentin8709 » est inscrit). Faite un click droit dessus puis « inspect element ». (Désolé pour la transparance, je ne pouvais pas faire autrement…).

Etape 2

III/ Un nouvelle fenêtre apparaît, il faut maintenant retrouver le nom de l’attribut du login dans le code de la page (dans la fenêtre qui vient de s’ouvrir):

Etape 3

IV/ Faire de même avec le champ contenant le mot de passe :

Etape 4

V/ Il va maintenant falloir récupérer le nom de la « form ». Une « form » signifie mot à mot « formulaire », et correspond à l’ensemble des entrées nécessaires pour valider l’authentification (ici ensemble login + mot de passe).

Etape 5

 

VI/ Dernière étape importante ! Il faut récupérer une élément de la page (peut être une nouvelle page internet) lors d’un mauvais mot de passe. Concrètement, tapez à la main un login + mot de passe bidon :

Etape 6

VII/ Cliquer sur « Se Connecter » et essayez de repérer un élément qui aura bougé si la page reste la même (ce qui est le cas ici) ou repérer un élément d’une éventuelle nouvelle page (comme un message d’erreur). Dans notre cas :

Etape 7

VIII/ Si c’est un message d’erreur, notez le. Sinon, de la même manière, récupérer la valeur d’un attribut du nouvel élément:

Etape 8

IX/ Maintenant que vous avez noté tout ça de côté, ouvrez le fichier « bruteforce.py » et modifiez les éléments suivants :

Etape 9

X/ Il ne reste plus qu’à lancer le script. Evidemment, j’ai volontairement rajouté mon mot de passe dans le dico manuellement:

Etape 10

 

Annexes

Dictionnaire “Rockyou” contenant les mots de passe les plus communs

Le script Python:

#!/usr/bin/env python
# encoding: utf-8

import mechanize
import time
br = mechanize.Browser()

br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

i = 0
with open("rockyou.txt") as infile:
    for passw in infile:
        passw = passw.rstrip()
        print("ATTEMPT", i, passw)
        r = br.open('URL')
        html = r.read()
        br.select_form("logonForm")
        br.form['username'] = "admin"
        br.form['password'] = passw
        br.submit()
        resp = br.response().read()
        #print ("ANSWER: %s", resp) # DEBUG
        if resp.find("Error") == -1:
                print ("Found Password: %s", passw)
                exit(0)
        i = i +1
        if i == 100 :
            time.sleep(300)
exit(1)
Tagués avec :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.