martedì 30 dicembre 2014

Come Creare Un Bruteforce in Python - Parte 4

Ecco la quarta parte della serie: "Come Creare Un Bruteforce In Python". In questo articolo vedremo come creare un bruteforce per siti web (via HTTP). Nella scorsa parte abbiamo memorizzato il messaggio di avvenuto login che nel nostro esempio era: "Login effettuato!", in questa parte vedremo come modificare la funzione testaPassword() in modo da testare la password via http.

Come Creare Un Bruteforce in Python
Innanzitutto bisogna importare il modulo (o libreria) urllib:
import urllib
Poi settiamo la variabile username che è l'username di cui si vuole scovare la password (ad esempio admin). Oltre all'username settiamo anche la variabile paginaLogin che è l'url della pagina di action (nel caso nostro è http://www.miosito.it/login.php, leggi la parte 3 di questa serie di articoli se ancora non l'hai letta).
username = "admin"
paginaLogin = "http://www.miosito.it/login.php"
Creiamo anche un'altra variabile (messaggioDiAvvenutoLogin) che conterrà il messaggio di avvenuto login che nel nostro caso è "Login effettuato!".
messaggioDiAvvenutoLogin = "Login effettuato!"
Il codice che testa la password è essenzialmente il seguente:
parametriDaTestare = { "username" : username, "password" : password, "submit" : "1" }
p= urllib.urlencode(parametriDaTestare)
paginaDiAction = urllib.urlopen(paginaLogin, p)
risultato = paginaDiAction.read()
if messaggioDiAvvenutoLogin in risultato:
    print "Password trovata: ", password
    exit()
else:
    return
Nei parametri da testare l'username è fisso e l'abbiamo settato all'inizio, è uguale a "admin" nel nostro caso. La password da testare cambia ogni volta, ovvero viene testata ogni combinazione di caratteri. Il parametro submit sarà sempre uguale a "1". Con la seconda istruzione vengono codificati i parametri (non ci soffermeremo su questa istruzione). La terza istruzione invia il form alla pagina di login (http://www.miosito.it/login.php) con i parametri da testare. Con la quarta riga viene memorizzato il risultato in una variabile apposita, ovvero viene memorizzato ciò che la pagina ha restituito. Con il blocco if si controlla se il messaggio di avvenuto login è contenuto nel risultato, ovvero se i parametri sono corretti e di conseguenza il risultato contiene il messaggio di avvenuto login. Se esso lo contiene allora significa che la password è corretta (e che quindi è stata trovata) e il programma si chiude altrimenti continuerebbe a testare password inutilmente. Se esso non lo contiene allora si prosegue con l'esecuzione del bruteforce testando la prossima combinazione di caratteri.

Il codice finale che ne risulterà sarà: BruteForce.py - HTTP.

Conclusioni

Spero di essere stato abbastanza chiaro. C'è da dire, inoltre, che questo bruteforce via HTTP non funziona con tutti i siti web, soprattutto con siti importanti come Google o Hotmail ma per utilizzare bruteforce per tali siti occorre creare un bruteforce per email che magari vedremo come crearlo nella prossima parte. Se riscontri problemi con il codice o ti è piaciuta questa guida e vuoi che continui a scrivere articoli su come creare un bruteforce in Python non esitare a commentare.

44 commenti:

  1. ciao
    quando lo eseguo mi dice :

    AttribureError: 'module' object has not attribute 'urlencode'

    RispondiElimina
    Risposte
    1. di piu preciso dice:

      Testando la password: AAAA
      Traceback (most recent call last):
      File "C:\Users\Marius\Desktop\bruteforce.py", line 47, in
      testaPassword(psw)
      File "C:\Users\Marius\Desktop\bruteforce.py", line 23, in testaPassword
      p= urllib.urlencode(parametriDaTestare)
      AttributeError: 'module' object has no attribute 'urlencode'

      Elimina
    2. La prima riga di codice deve essere "import urllib" ovvero devi importare il modulo urllib.

      Elimina
    3. l'ho fatto
      ho esattamente come te

      Elimina
    4. Forse stai utilizzando la versione 3.3 di Python, per una questione di compatibilità ti consiglio di usare una versione 2.7.

      Elimina
    5. Grazie mille
      Adesso funziona!!!

      Elimina
  2. Fate un video tutorial, sarebbe molto più comodo e facile da comprendere. Così magari anche le persone un po' meno esperte e con meno conoscenze potranno capire le vostre guide. Comunque Complimenti!

    RispondiElimina
    Risposte
    1. Certo, grazie dell'idea che mi hai dato.

      Elimina
  3. Fa una guida su come rubare wifi la tua guida NON FA :( Per favore

    RispondiElimina
    Risposte
    1. Sì, purtroppo la guida sul WiFi non funziona più ma non ti preoccupare, ne arriverà una nuova che funzionerà.

      Elimina
  4. import urllib va' digitato nell' IDLE? (non so se mi sono spiegato)

    RispondiElimina
    Risposte
    1. Non devi inserirlo nella Shell ma in un nuovo file vuoto su cui devi iniziare a scrivere il codice. Spero di essermi spiegato.

      Elimina
  5. ma se non si conosce l'username come si fa?

    RispondiElimina
  6. Ho seguito le istruzioni e il programma parte, quindi per vedere se funzionava realmente ho provato a entrare in un mio account con il bruteforce ma quando arriva alla mia password la supera senza dirmi che ha loggato. Puoi dirmi come mai? grazie

    RispondiElimina
    Risposte
    1. stesso problema

      Elimina
    2. stesso problema, soluzioni??

      Elimina
    3. Captcha! Ci sono siti, su cui probabilmente state provando questa tecnica con uno script molto ma molto BASILARE, che dopo un numero di login falliti chiede il captcha. Proprio per evitare che dei bot possano provare delle tecniche di Bruteforce.

      Ripeto: questo script è basilare. Provarlo in locale con un semplice login creato da sè è ottimo e funziona. Provarlo su Gmail è l'orrore e rischiate anche di beccarvi una bella denuncia.

      Elimina
  7. Ho aperto la shell di python ho messo il codice,ho cliccato debug ma ci sono solo campi vuotii e non so come avviare il programma

    RispondiElimina
  8. Quando vado a provarlo la passwor viene formata da a e poi alla fine tutti i caratteri

    RispondiElimina
  9. Ciao complimenti per l'articolo, ho provato ad usare lo script su un vecchio account facebook ma ottengo solo questo errore:

    SyntaxError: Non-ASCII character '\xe2' in file /Users/Lorenzo/Downloads/bruteforce.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    se puoi aiutarmi..

    Grazie comunque

    RispondiElimina
    Risposte
    1. L'errore sta nella codifica dei caratteri.

      Prova a non copia-incollare il codice ma a riscriverlo.

      Se il problema persiste non esitare a commentare o a contattarmi ed insieme risolviamo il problema.

      Inoltre, dimmi qual è il codice della linea 5.

      Elimina
    2. Ciao grazie per la risposta, alla fine grazie al tuo suggerimento sono riuscito a risolvere, almeno in parte.. adesso diciamo che gira ma ad un cero punto esce, e dice cosi':

      raceback (most recent call last):
      File "/Users/me/PycharmProjects/Brute_01/Brute_01", line 55, in
      testaPassword(psw)
      File "/Users/me/PycharmProjects/Brute_01/Brute_01", line 18, in testaPassword
      paginaDiAction = urllib.urlopen(paginaLogin, p)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 89, in urlopen
      return opener.open(url, data)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 215, in open
      return getattr(self, name)(url, data)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 357, in open_http
      'got a bad status line', None)
      IOError: ('http protocol error', 0, 'got a bad status line', None)

      Process finished with exit code 1

      Elimina
  10. ciao, posso usare il tuo script per recuperare la pasword di facebook? avevo trovato questo http://lgogua.blogspot.com/2013/11/how-to-brute-force-hacking-facebook-in.html

    ma funziona con una lista di password mentre visto che sono abbastanza sicuro di ricordarmi come la mia password e' composta ma non mi ricordo i dettagli (spazzi maiuscole e numeri al posto delle lettere) vorrei tipo dare allo script dei suggerimenti, delle parole chiave su cui girare inorno per ritrovare la password... E' possibile fare questo?

    spero di essere stato abbastanza chiaro :)
    grazie

    RispondiElimina
    Risposte
    1. Certo che è possibile, ma non è semplice.

      Se ho capito bene vuoi un algoritmo che ottimizzi la ricerca delle password in una lista, attraverso dei suggerimenti, in modo da velocizzare il processo di ritrovamento della password.

      Putroppo, lo script del link non supporta questa funzionalità.

      Per recuperare la password di Facebook puoi semplicemente cliccare su "Password dimenticata" e ricevere una nuova password via mail o rispondere alle domande di sicurezza.

      Elimina
  11. Ciao, ho provato a farlo girare su un mio account facebook e adesso da casa mia non riesco piu' ad accedere a nessun account facebook perche dice che il mio dal mio ip ci sono stati comportamenti scorretti.. che succede? che devo fare? era un mio account qual'e' il problema?

    RispondiElimina
  12. Sono finito per caso su questo blog mentre cercavo qualche esempio per loggare un sito con python. Apro una parentesi il bruteforce dovrebbe essere l'ultima spiaggia chiudo la parentesi. Io non sono un programmatore, ma solo uno che lo fa per obby, la mia non vuole essere un'offesa però per quanto sia funzionante quei12 for annidati sono davvero inguardabili. Oltre i tre cicli secondo me è meglio abbandonare la strada dell'iterazione e ricorrere alla ricorsione. Io mi ripeto sempre ma perchè devo inventare l'acqua calda quando questa esiste già?
    Dovresti dare un'occhiata agli Iteratori ed ai Generatori sono delle autentiche chicche, poi c'è un modulo chiamato itertools con diverse funzioni tra cui una che si chiama product:

    import string
    import itertools

    def main():
    pw_list = []
    for pw in itertools.product(string.ascii_lowercase, repeat=2):
    pw_list.append(''.join(pw))
    print('Number password generate:{0}'.format(len(pw_list)))
    print(pw_list[:10])

    if __name__ == '__main__':
    main()

    E l'output è
    Number password generate:676
    ['aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'aj']

    Con un unico ciclo solo generi tutte le combinazioni che vuoi. Poi bisognerebbe implementare un bel socket tor ....

    RispondiElimina
    Risposte
    1. Innanzitutto ti ringrazio per il commento.

      Perché tutti quei cicli "for" annidati? Per il semplice motivo che il lettore medio di questo blog non è un programmatore esperto ma un appassionato, alle prime armi, che sta cercando di migliorare. Iteratori e Generatori da te consigliati, quindi, sono fuori discussione. Ho, purtroppo, scelto la strada dei "for" annidati ma almeno si capisce il concetto, il senso della guida.

      Per quanto riguarda il "come loggare un sito con Python" dai un'occhiata alla libreria mechanize oppure selenium ma per il tuo scopo ti consiglio la prima.

      Grazie ancora del commento.

      Elimina
  13. BurningThought26 ottobre 2015 21:02

    Davvero fantastico complimenti però in questo modo all'inizio fa
    testando password: AAAA
    testando password: AAAAA
    testando password: AAAAAA
    e così via fino ad arrivare a 12 caratteri però poi continua con dodici caratteri esempio:
    testando password: AAAAAAAAAAAB
    testando password: AAAAAAAAAAAC
    testando password: AAAAAAAAAAAD
    quindi se la password: è per esempio di 8 caratteri non può trovarla perche all'inizio fino a dodici fa solo con carattere A...
    c'è un modo che non sia cambiare manualmente la lunghezza dei caratteri massimi ogni volta?

    RispondiElimina
    Risposte
    1. Se la password è di 8 caratteri può trovarla (i cicli for sono "annidati", questo è il termine tecnico). Se la password è: AAAAAAAB (8 caratteri) allora devi aspettare prima che completa tutte le combinazioni con le A come primi caratteri quindi come scrivevi tu deve provare prima:
      testando password: AAAAAAAAAAAB
      testando password: AAAAAAAAAAAC
      testando password: AAAAAAAAAAAD
      Quando arriva ad AAAAAAAAAAAz (supponendo che z sia l'ultimo carattere della lista dei caratteri) allora passa alle combinazioni successive cioè:
      AAAB
      AAAAB
      AAAAAB
      AAAAAAB
      AAAAAAAB (la tua password)

      Spero di essere stato chiaro. Ovviamente tutti quei cicli for annidati sono orripilanti dal punto di vista dell'efficienza e della leggibilità del codice ma questo è soltanto una guida basilare ed elementare.

      Elimina
  14. Mi da errore
    Testando la password: AAAA

    Traceback (most recent call last):
    File "C:\Users\simon\Desktop\bruteforce.py", line 32, in
    testaPassword(psw)
    File "C:\Users\simon\Desktop\bruteforce.py", line 17, in testaPassword
    paginaDiAction = urllib.urlopen(paginaLogin, p)
    File "C:\Python27\lib\urllib.py", line 86, in urlopen
    return opener.open(url, data)
    File "C:\Python27\lib\urllib.py", line 207, in open
    return getattr(self, name)(url, data)
    File "C:\Python27\lib\urllib.py", line 318, in open_http
    if not host: raise IOError, ('http error', 'no host given')
    IOError: [Errno http error] no host given
    >>>


    Mi puoi aiutare?

    RispondiElimina
  15. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  16. Ma il problema dei Captcha come può essere superato?

    RispondiElimina
    Risposte
    1. È un po' complicato bypassare i captcha soprattutto se sono "moderni" (tipo caratteri ruotati e e non facilmente leggibili anche dagli umani, oppure i captcha che fanno i test del tipo "Clicca sulle immagini che contengono un cane").

      Se il captcha è un po' datato, può essere bypassato senza troppa difficoltà con un buon OCR (Optical Character Recognizer). Ad esempio, Tesseract OCR.

      Elimina
  17. Ehi ciao, vorrei innanzitutto chiederti se è possibile contattarti via mail perchè mi piacerebbe farti diverse domande.
    Ma il motivo principale per cui ti scrivo è che ho provato a mettere una password basilare al mio account facebook, per far prima, ho segnato come pagina di login la mia pagina profilo, e ho avviato il bruteforce, ma va avanti anche se sorpassa la password che avevo segnato. Come mai non si ferma?

    RispondiElimina
  18. ciao, volevo sapere una cosa...il programma è chiaro così come le sue parti ma non riesco a capire una volta che io ho il mio bel codice sul pc come lanciarlo sul sito che voglio hackerare...me lo spieghi per favore?
    grazie mille e continua così!

    RispondiElimina
    Risposte
    1. Ciao, ti chiarisco un po' le idee:

      Il programma devi lanciarlo sul tuo PC. Il sito che vuoi attaccare lo dichiari quando imposti la variabile:

      paginaLogin = "http://www.miosito.it/login.php"

      Nell'esempio, la pagina di login del sito da attaccare è http://www.miosito.it/login.php, tu puoi impostare il sito da attaccare.

      Attenzione: Tutto il materiale su questo blog è a solo scopo informativo, quindi la tecnica Bruteforce va testa su un server locale o un sito di tua proprietà. Attaccare altri siti è illegale.

      Elimina
  19. Ciao!!! E se si aggiungesse una lista proxy al codice in modo che il pc ad ogni tentativo si connetta con un proxy diverso? Dovrebbe essere bypassato il problema del captcha in questo modo no?

    RispondiElimina
    Risposte
    1. Questo è un modo artificioso (anche se creativo, anche io lo testai in passato) per bypassare un problema creandone un altro.

      Quello che dici tu è fattibile e funziona anche (testato) ma immagina quanto tempo ci vuole per:
      1. Connetterti ad un proxy
      2. Inviare la richiesta dal proxy
      Moltiplica questo tempo per tutte le richieste che dovrai fare per trovare una password.

      Dire che dovrai aspettare 10-11 reincarnazioni per poter trovare la password non è esagerato (e dico sul serio, facendo un calcolo spannometrico).

      Elimina
  20. Ciao
    Sono nuovo a questo tipo di cose, pero ho letto tutte le tue pagine fino a questa, che mi ha interessato particolarmente, il punto è che non sono in grado di risolverla, anche se continuassi a rileggere le pagine precedenti, vorrei riuscire a parlarti un po piu direttamente per poter capire un po meglio alcune cose...magari in qualche chat privata o robe simili...
    comunque complimenti per tutte le operazioni sono davvero interessanti e a volte complesse immagino tutto lo studio che c'è dietro��

    RispondiElimina
    Risposte
    1. Ciao, puoi contattarmi tramite email all'indirizzo diventarehackerblog@gmail.com.

      Elimina
  21. Ciao, innanzitutto complimenti per la guida :) Potresti spiegare come inserire un socket tor? Vorrei testare il mio sito, ma non vorrei che mi bannassero l'IP... oppure se hai altre soluzioni per avere l'anonimato oltre a tor sono tutto orecchi :)

    RispondiElimina
  22. Ciao, nonostante esegua il brute force sud un sito senza captcha, quando il programma arriva alla password corretta non si ferma.

    RispondiElimina
  23. allora io sono il classico lettore totalmente ignorante e inesperto ed ho seguito tutte le tue istruzioni alla fine pero non ho capito delle cose e cioe parli di shell che non ho idea di cosa sia tutto cio che ho letto lo ricopiato su idle di python ma purtroppo non funziona cosa sbaglio capisco di essere ignorante in materia ma vorrei davvero imparare qualcosa e di perse il brute force non mi interessa un gran che mi serve soltanto provarci e cominciare a capire qualcosa

    RispondiElimina