Bruteforce-Script

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
MaximalMax
User
Beiträge: 15
Registriert: Sonntag 3. Mai 2020, 00:51

Donnerstag 1. Oktober 2020, 21:06

Das ist ein Bruteforce-Script, das könnt ihr dann easy umschreiben für ZIP-Archive, o. ä.
Checkt auch gern mal mein GitHub Repo, wo es Hack-Scripts gibt ab: https://github.com/Advanced-Coding/HackPyScripts/
Wichtig: Bitte ließ die README.md Datei im GitHub Repo, damit du informiert bis

Code: Alles auswählen

# Bruteforce-Script zum cracken von Passwörtern

import random

passwords = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
"!", "§", "$", "%", "&", "/", "(", ")", "=", ".", "-", ",", "@", "€", "[", "]"]

user_password = input("Password: ")
guess = ""

while guess != user_password:
    guess = ""
    for letter in range(len(user_password)):
        random_number = random.randint(0, 65)
        guess_letter = passwords[random_number]
        guess = str(guess_letter) + str(guess)
    print(guess)

print("Your password is: ", guess)

input()
Hinweis: Das Ausführen des Scripts auf ein Passwort, was du nicht hacken darfst, ist in Deutschland illegal.
Es werden alle Zeichen die in der Liste mit dem Namen 'passwords' unterstützt
Sirius3
User
Beiträge: 13275
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 1. Oktober 2020, 22:15

@MaximalMax: ›passwords‹ ist der falsche Name für eine Liste mit Zeichen.
Wenn man erst eine Variable mit einem Dummy-Wert belegen muß, damit eine while-Schleife startet, hat man besser eine while-True-Schleife mit break.
`letter` wird nicht benutzt und ist auch der falsche Name für eine Zahl. Besser wäre sowieso direkt über user_password zu iterieren. randint wird mit einer fixen Zahl aufgerufen, die aber der Länge von `passwords` entspricht, oder auch nicht, wenn man sich verzählt.
Besser wäre hier sowieso random.choice.
guess ist schon ein String, ebenso guess_letter. Das also nochmal in einen String zu verwandeln ist also quatsch.
Das `input` am Ende macht keinen Sinn, da der Rückgabewert nicht verwendet wird.

Code: Alles auswählen

import string
import random

characters = string.ascii_letters + string.digits + '!§$%&/()=.-,@€[]'
user_password = input("Password: ")

while True:
    guess = ""
    for _ in user_password:
        character = random.choice(characters)
        guess = character + guess
    print(guess)
    if guess == user_password:
        break
    
print("Your password is: ", guess)
kürzer:

Code: Alles auswählen

while True:
    guess = ''.join(random.choices(characters, k=len(user_password))
    if guess == user_password:
        break
Es ist selten, dass man die Länge eines "unbekannten" Passworts kennt. Wenn eine 0 im Passwort vorkommt, kann man lange suchen. Und wenn man das Passwort schon kennt, ist das Suchen witzlos. Der Zufall macht die Suche nur Langsam und man prüft etliche Passwörter doppelt und dreifach.

PS: Zu hashingWithSalt.py

Code: Alles auswählen

import hashlib
import random

salt = ["khasdASDjkawejdhewdSDsu1263213!$/asDSd", "fhawefSDASDeruqwerkjhewr787§!§bsdfjdjf", "/§DSFJADFJASDBkefhjawehrwensad."]

def hashing():
    password = str(input('password: '))
    print('')
    hashvalue = hashlib.sha512(password.encode() + random.choice(salt).encode()).hexdigest()
    print(hashvalue)
    print('')
    
hashing()
input()
Der Sinn eines Salts ist es ja, dass Rainbow-Tables keinen Sinn mehr ergeben. Dazu muß aber der Salt wirklich zufällig sein und nicht einer von drei. Und damit man auch weiß, welchen Salt man verwenden muß, muß der natürlich auch mit dem Passwort-Hash gespeichert werden.
input liefert schon einen String, das mit str in einen String umzuwandeln ist unsinnig.

Code: Alles auswählen

import hashlib
import random

def hashing():
    password = input('password: ')
    salt = f"{random.getrandbits(128):16x}"
    hashvalue = hashlib.sha512(password.encode() + salt.encode()).hexdigest()
    print(f"{salt}:{hashvalue}")
    
hashing()
Und nochmals als Warnung: das ist keine sichere Methode, um Passwörter zu speichern.
Jankie
User
Beiträge: 547
Registriert: Mittwoch 26. September 2018, 14:06

Dienstag 6. Oktober 2020, 06:20

Habe sowas mal mit itertools.product() gemacht.
Das ganze würde ich aber noch so schreiben, dass man vorher auch explizit eine Länge und Charset angeben kann.

Code: Alles auswählen

import itertools
import string


CHARSET = list(string.printable)
USER_PASSWORD = "TEST"

def main():
    for _ in range(5 , 15):  #Es wird von einer länge von 5 bis 15 Zeichen ausgegangen
        for i in itertools.product(CHARSET,repeat=_):
            if ''.join(i) == USER_PASSWORD:
                print(f"Passwort gefunden: {''.join(i)}")
                break
        
if __name__ == '__main__':
    main()
Zum speichern von Passwörtern würde ich Argon2 benutzen.
Antworten