Seite 1 von 1

Passwordlist abfragen bis der login klappt (Bruteforce) - Hilfe beim Code

Verfasst: Montag 24. Februar 2020, 16:47
von melonehier
Ich kann mich normal einloggen, aber das mit dem Brute Forcen bekomme ich nicht hin..
Mein Fehler liegt in diesem Bereich irgendwo: "for password in passwordlist:"

Kann mir jemand helfen? :ugeek:

Das ist mein Code:

Code: Alles auswählen

from __future__ import print_function
import argparse
import socket
import mcrcon


# python 2 compatibility
try:
    input = raw_input
except NameError:
    pass



def main():
		# Parse arguments
		parser = argparse.ArgumentParser()
		parser.add_argument("host")
		parser.add_argument("port", type=int)
		parser.add_argument("passwordlist")
		args = parser.parse_args()	
	
		# Connect
		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		sock.connect((args.host, args.port))
	
		# read password file
		passwordlist = open(args.passwordlist, "r")
	
		for password in passwordlist:
			try:
				# Log in
				result = mcrcon.login(sock, password)
				if result:
					print("Correct Password is %s" % password)
				if not result:
					print("Incorrect rcon password")
			
				# Start looping
				while True:
					request = input()
					response = mcrcon.command(sock, request)
					print(response)
			finally:
				sock.close()

if __name__ == '__main__':
    main()

Re: Passwordlist abfragen bis der login klappt (Bruteforce) - Hilfe beim Code

Verfasst: Montag 24. Februar 2020, 17:05
von __deets__
Was heisst 'liegt irgendwo'? Hast du eine konkrete Fehlermeldung? Wenn ja, wie lautet die? Wenn nicht, was passiert oder passiert nicht?

Re: Passwordlist abfragen bis der login klappt (Bruteforce) - Hilfe beim Code

Verfasst: Montag 24. Februar 2020, 17:11
von Sirius3
@melonehier: Kompatibilität zu Python2 sollte man eigentlich nicht mehr brauchen. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 1-2 Tabs.
Wenn man eine if-Bedingung (result) hat und danach ein if mit der exakt gegenteiligen Bedingung (not result), dann benutzt man else.
Wenn diese rcon-Passwort falsch ist, sollte man ja nicht in den request-response-Loop einsteigen.
`passwordlist` wird nie geschlossen, daher sollte man das with-Statement benutzen. Der Socket sock ist nach dem ersten Versuch geschlossen, da wird dann ein zweiter auch definitiv fehlschlagen.
Was ist denn dieses mcrcon?

Re: Passwordlist abfragen bis der login klappt (Bruteforce) - Hilfe beim Code

Verfasst: Montag 24. Februar 2020, 17:35
von /me
`password` ist vermutlich nicht der Text den du dir vorstellst. Oder erwartest du einen Zeilenumbruch (\n) am Ende des Passworts?

Re: Passwordlist abfragen bis der login klappt (Bruteforce) - Hilfe beim Code

Verfasst: Donnerstag 27. Februar 2020, 01:23
von __blackjack__
@melonehier: Weitere Anmerkungen: Die Kommentare bieten dem Leser keinen Mehrwert. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da ja bereits als Code, sondern warum er das so macht, sofern das nicht offensichtlich ist.

Das ``try``/``finally`` für das Socket-Objekt kommt zu spät, das sollte ab dem erstellen des Objekts greifen. Und Socket-Objekte sind genau wie Dateiobjekte Kontextmanager, also mit ``with`` verwendbar.

Textdateien sollte man immer explizit mit einer Kodierungsangabe öffnen.

`passwordlist` ist irreführend weil das gar keine Liste ist sondern ein Dateiobjekt, oder ganz allgemein ein iterierbares Objekt das Textzeilen liefert. `passwords` wäre also ausreichend und passender.

Den ``%``-Operator zur Zeichenkettenformatierung würde ich nicht mehr verwenden. Es gibt die `format()`-Methode und ab Python 3.6 f-Zeichenkettenliterale.

Wenn das passende Passwort gefunden wurde kann man die Schleife die das Passwort sucht abbrechen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import argparse
import socket

import mcrcon


def main():
    try:
        parser = argparse.ArgumentParser()
        parser.add_argument("host")
        parser.add_argument("port", type=int)
        parser.add_argument("passwords_filename")
        options = parser.parse_args()
        with socket.socket() as sock:
            sock.connect((options.host, options.port))
            with open(
                options.passwords_filename, "r", encoding="ascii"
            ) as passwords:
                for password in passwords:
                    if mcrcon.login(sock, password.strip()):
                        print(f"Correct Password is {password}")
                        break
                else:
                    print("No password worked.")
                    return

            while True:
                print(mcrcon.command(sock, input()))
    except KeyboardInterrupt:
        pass  # Ctrl+C


if __name__ == "__main__":
    main()
Das recht versteckte `main()`-beendende ``return`` wäre für sich schon ein Grund die `main()` sinnvoll auf Funktionen aufzuteilen.