Passwort knacken

Diskutiere Passwort knacken im Security-Zone - Sicherheitslücken, Virenschutz Forum im Bereich Hardware & Software Forum; Hi Leute, Ich habe ein kleines Problem: Ich habe mein Passwort vergessen. Glücklicherweise hab ich aber jedoch einen Hash von diesem Passwort...
  • Passwort knacken Beitrag #1
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
Hi Leute,

Ich habe ein kleines Problem: Ich habe mein Passwort vergessen. Glücklicherweise hab ich aber jedoch einen Hash von diesem Passwort (4ab02bf4174ed15d4fa73755bbc113ba) und ich weiss, wie der Hash berechnet wurde:
Code:
#!/bin/python

import hashlib
import sys

def calcHash(data, algo="md5"):
        h = hashlib.new(algo)
        h.update(data)
        return h.hexdigest()

Wie komm ich jetzt wieder an mein Passwort?

Ok, mir geht es jetzt nicht um das Passwort, sondern eher um die Technik, wie man diese Aufgabe lösen kann. Mir geht es jetzt hier auch nicht darum fertige Progamme zu benutzen, sondern eher darum ein wenig selber zu programmieren, bzw. Ideeen und Algorithmen hier im Forum zu sammeln um die Technik zu verstehen.

Ich schmeiss also mal als 1. mal BruteForce in den Thread, welches z.B. so ausschauen könnte:
Code:
def hackIt2(length,hash,tmp=""):
        if length == 0:
                h = calcHash(tmp)
                print "%s -> %s"%(tmp,h)
                if h==hash:
                        print "found: %s -> '%s'"%(hash,tmp)
                        exit(0)
        else:
                for x in range(32,127):
                        tmp2 = tmp + chr(x)
                        hackIt2(length-1,hash,tmp2)

def hackIt(hash):
        for x in range(4):
                hackIt2(x,hash)

def main():
        if len(sys.argv)<2:
                print "usage: %s <hash>"%(sys.argv[0])
                exit(1)

        hash = sys.argv[1]
        hackIt(hash)

if __name__=="__main__":
        main()
Der Nachteil hier ist, das es sehr Langsam ist, da es immer von Anfang an alle möglichen Variationen durchtestet.
Vorteil: Der Speicherverbrauch ist sehr gering.
Was könnte man jetzt machen, damit wir eine höhere Geschwindigkeit bekommen?
 
  • Passwort knacken Beitrag #2
thewho

thewho

Bekanntes Mitglied
Dabei seit
08.02.2005
Beiträge
59
Reaktionspunkte
0
Passwort: foX
 
  • Passwort knacken Beitrag #3
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
Danke für das Passwort, jetzt kann ich mich endlich in *** einloggen :D . Wobei mir jetzt ein wenig das WIE des knackens zu kurz gekommen ist.
 
  • Passwort knacken Beitrag #4
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Die gängigste Methode für sowas sind wohl Rainbow-Tables; damit arbeiten auch die Online-Recovery-Tools. Das Prinzip ist dabei jedoch auch nicht intelligenter als BruteForce; die holen das Ergebnis einfach aus einer vorberechneten Tabelle. Ansonsten lässt sich BruteForce noch durch Einschränkungen beschleunigen, die aber eine gewisse Kenntnis über das Passwort erfordern; z.B. bekannte Länge, keine Sonderzeichen, nur Buchstaben, ... Schneller wirds natürlich auch mit mehr Rechenleistung ;) Also verteilt rechnen oder spezielle Hardware verwenden.
Achja, der Code bei BruteForce sollte natürlich möglichst effizient sein. Also z.B. Rekursionen vermeiden. Eine Implementierung in Assembler könnte auch helfen, wenn man es gut macht.

Was anderes ist es natürlich, wenn man Schwachstellen im Hash-Verfahren kennt.
 
  • Passwort knacken Beitrag #5
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
Die gängigste Methode für sowas sind wohl Rainbow-Tables; damit arbeiten auch die Online-Recovery-Tools. Das Prinzip ist dabei jedoch auch nicht intelligenter als BruteForce; die holen das Ergebnis einfach aus einer vorberechneten Tabelle.

Was aber schon mal besser ist, als wenn man für jedes Passwort alles von neuem zu berechnen. Man muss nur einmal die Tabelle erstellen und hat dann beim Suchen sehr viel weniger Aufwand:
Code:
#!/bin/python

import hashlib
import sys

table = {}

def calcHash(data, algo="md5"):
        h = hashlib.new(algo)
        h.update(data)
        return h.hexdigest()

def createTable2(length,tmp=""):
        global table

        if length == 0:
                # in tmp ist das komplette passwort -> hash davon erzeugen und in tabelle eintragen
                h = calcHash(tmp)
                print "%s -> %s"%(tmp,h)
                table[h]= tmp
        else:
                for x in range(32,127):
                        tmp2 = tmp + chr(x)
                        createTable2(length-1,tmp2)

def createTable():
        global table
        for x in range(4):
                createTable2(x)
        print "%s eintraege in der tabelle"%(len(table))

def main():
        createTable()

        while True:
                hash = raw_input("hash:")
                print "%s -> %s"%(hash,table.get(hash))

if __name__=="__main__":
        main()
Vorteil: Hashes werden nur einmal berechnet, schnelle Suche.
Nachteil: Tabelle wird nicht gespeichert, hoher Speicherverbrauch, erstellen der Tabelle dauert lange, da nur Singlethread.

Na wer bekommts raus?
Code:
4ab02bf4174ed15d4fa73755bbc113ba
c4ca4238a0b923820dcc509a6f75849b
c20ad4d76fe97759aa27a0c99bff6710
202cb962ac59075b964b07152d234b70
efa5a70bae7fa254543fd1635c0bbd23

Ansonsten lässt sich BruteForce noch durch Einschränkungen beschleunigen, die aber eine gewisse Kenntnis über das Passwort erfordern; z.B. bekannte Länge, keine Sonderzeichen, nur Buchstaben, ... Schneller wirds natürlich auch mit mehr Rechenleistung ;) Also verteilt rechnen oder spezielle Hardware verwenden.

Verteiles rechnen klingt gut. Wir sollten mal schauen, wie wir den anderen Kernen meines Multicoresystems was zu tun geben :D .

Achja, der Code bei BruteForce sollte natürlich möglichst effizient sein. Also z.B. Rekursionen vermeiden. Eine Implementierung in Assembler könnte auch helfen, wenn man es gut macht.

Was anderes ist es natürlich, wenn man Schwachstellen im Hash-Verfahren kennt.
Bei der Generierung des Passwortes hab ich eine Rekursion drin. Wie könnte es ohne ausschauen?

Nativer Code ist interpretiertem Bytecode sicher vorzuziehen, aber selber optimierten Assemblercode zu schrieben dürfte recht schwer werden. Ausserdem legt man sich bei Assembler recht schnell auf eine bestimmte Architektur fest. Ich halte daher eine Hochsprache, deren Compiler nativen Code erzeugt für besser. Wobei ich eine Diskussion um die Programmiersprache hier eher raushalten möchte.
 
  • Passwort knacken Beitrag #6
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Das Problem bei den Tabellen ist nur, dass die wirklich groß werden, wenn man viele Einträge hat; hab da vorhin was von 4TB(!) gelesen. Wirklich Sinn hat das demnach natürlich nur, wenn man die Tabellen abspeichert und für schnelles Suchen (zumindest mal sortiert) optimiert.
Für Multithreading eignet sich so eine Aufgabe natürlich perfekt, da man einfach den zu bearbeitenden Bereich aufteilen kann; die Ergebnisse hängen ja nicht voneinander ab. Aber nicht nur das; es wäre auch kein Problem, mehrere Rechner parallel arbeiten zu lassen; man müsste dem Programm einfach beim Start den zu bearbeitenden Bereich als Parameter geben und anschließend die Tabellen zusammensetzen.

Was ich vorhin noch vergessen habe ist die Verwendung eines Dictionarys. Also eine Liste mit Worten zu testen, bevor man einfach stur die ganzen ASCII-Codes durchgeht. Dann lässt sich natürlich noch die Statistik vorteilhaft einsetzen, besonders wenn man die verwendete Sprache erraten kann. Dann kann man nämlich zuerst ein Dictionary mit Worten in der passenden Sprache verwenden. Dann deckt man sicher noch einen großen Bereich ab, wenn man bei jedem der Worte noch hinten dran alle ein- und zweistelligen Zahlen durchprobiert (und evtl. noch vierstellig mit 19 und 20 als ersten Stellen). Schließlich fällt den meisten Leuten, wenn wo ein Passwort mit Zahlen drin gefordert wird, nichts besseres ein, als hinten eine 1 oder das Geburtsjahr dranzuhängen.
Wenn man damit nicht erfolgreich ist, kann man bei Bruteforce noch die zu testenden Buchstaben entsprechend ihrer Verwendungshäufigkeit in der jeweiligen Sprache ordnen. Das sollte im Schnitt die Laufzeit ebenfalls deutlich verkürzen.

Rekursionen lassen sich prinzipiell immer durch Schleifen ersetzen; wenn ich mich recht entsinne gibts dafür sogar ein allgemeingültiges Schema. Allerdings dürfte das ohnehin nicht wirklich kompliziert sein.
Assembler ist keineswegs so kompliziert, wie es klingt. Noch dazu, da bei solchen Algorithmen nur mit Integers gerechnet wird. Allerdings muss man die Architektur kennen, um zu wissen, welche Befehle und Code-Konstrukte schnell ausgeführt werden. Wobei ich die Einschränkung auf die x86-Architektur (oder auch auf x64) jetzt nicht so problematisch finde.
Wobei allerdings auch hier der generelle Merksatz gilt: Bevor man am Code herumoptimiert sollte man das Problem genau analysieren und eventuelle Vereinfachungen finden. Z.B. alleine die Umsortierung der Buchstaben bei einer reinen BruteForce-Suche bringt mit Sicherheit um Größenordnungen mehr, als das Programm hochoptimiert in Assembler zu implementieren.
 
  • Passwort knacken Beitrag #7
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
Das Problem bei den Tabellen ist nur, dass die wirklich groß werden, wenn man viele Einträge hat; hab da vorhin was von 4TB(!) gelesen. Wirklich Sinn hat das demnach natürlich nur, wenn man die Tabellen abspeichert und für schnelles Suchen (zumindest mal sortiert) optimiert.
je mehr zeichen in einem passwort verwende und je länger die passwörter werden, desto größer wird unsere passwortdatei. wenn ich an meine passwortdatei folgende anforderungen stelle:
  • passwörter haben eine feste länge
  • die passwörter sind sortiert nach hashwert
so bekomme ich folgende dateilängen:
pwlänge|dateigröße (96 zeichen)| dateigröße (26 zeichen)
1| 96 | 26
2| 18432 (18 kb) | 1352 (1 kb)
3| 2654208 (2 mb) | 52728 (51 kb)
4| 339738624 (324 mb) | 1827904 (1 mb)
5| 40768634880 (37 gb) | 59406880 (56 mb)
6| 4696546738176 (4 tb) | 1853494656 (1 gb)
7| 526013234675712 (478 tb) | 56222671232 (56 gb)

bei einer passwortlänge von 6 und 96 möglichen zeichen hast du die 4tb schon geknackt.

Für Multithreading eignet sich so eine Aufgabe natürlich perfekt, da man einfach den zu bearbeitenden Bereich aufteilen kann; die Ergebnisse hängen ja nicht voneinander ab. Aber nicht nur das; es wäre auch kein Problem, mehrere Rechner parallel arbeiten zu lassen; man müsste dem Programm einfach beim Start den zu bearbeitenden Bereich als Parameter geben und anschließend die Tabellen zusammensetzen.
teile parallel zu berechnen sollte kein problem sein. aber wie willst du die tabellen speichern und zusammensetzen?
Was ich vorhin noch vergessen habe ist die Verwendung eines Dictionarys. Also eine Liste mit Worten zu testen, bevor man einfach stur die ganzen ASCII-Codes durchgeht. Dann lässt sich natürlich noch die Statistik vorteilhaft einsetzen, besonders wenn man die verwendete Sprache erraten kann. Dann kann man nämlich zuerst ein Dictionary mit Worten in der passenden Sprache verwenden. Dann deckt man sicher noch einen großen Bereich ab, wenn man bei jedem der Worte noch hinten dran alle ein- und zweistelligen Zahlen durchprobiert (und evtl. noch vierstellig mit 19 und 20 als ersten Stellen). Schließlich fällt den meisten Leuten, wenn wo ein Passwort mit Zahlen drin gefordert wird, nichts besseres ein, als hinten eine 1 oder das Geburtsjahr dranzuhängen.
Wenn man damit nicht erfolgreich ist, kann man bei Bruteforce noch die zu testenden Buchstaben entsprechend ihrer Verwendungshäufigkeit in der jeweiligen Sprache ordnen. Das sollte im Schnitt die Laufzeit ebenfalls deutlich verkürzen.
macht sinn. je wahrscheinlicher ein passwort ist, desto eher brauchen wir es in unserer rainbowtable. das erhöht unsere chance es zu finden.

Rekursionen lassen sich prinzipiell immer durch Schleifen ersetzen; wenn ich mich recht entsinne gibts dafür sogar ein allgemeingültiges Schema. Allerdings dürfte das ohnehin nicht wirklich kompliziert sein.
bei unserem problem dürfte es auch wichtig sein, das man die berechnungen abbrechen kann und zu einem späteren zeitpunkt an der stelle weiterführen kann, ohne große verluste zu haben. bei einer rekursiven funktioen wüsste ich auch gerade nicht, wie man das da machen könnte. bei dem code kann man dagegen sehr leicht an einer stelle weitermachen:
Code:
class pwgen():
	def __init__(self,startpw=''):
		self.pw = map(ord,startpw)
		self.ug = 32
		self.og = 127
	def __iter__(self):
		return self
	def next(self):
		ret = "".join(map(chr,self.pw))
		for x in range(len(self.pw)-1,-1,-1):
			if not self.inc(x):
				break
		else:
			self.pw.insert(0,self.ug)
		return ret
	def inc(self,pos):
		x = self.pw[pos]+1
		if x >= self.og:
			self.pw[pos] = self.ug
			return True
		else:
			self.pw[pos] = x

for x in pwgen():
	print ">%s<"%(x)

Assembler ist keineswegs so kompliziert, wie es klingt. Noch dazu, da bei solchen Algorithmen nur mit Integers gerechnet wird. Allerdings muss man die Architektur kennen, um zu wissen, welche Befehle und Code-Konstrukte schnell ausgeführt werden. Wobei ich die Einschränkung auf die x86-Architektur (oder auch auf x64) jetzt nicht so problematisch finde.
hängt auch ein wenig von den zielen ab, die man verfolgt. wenn man z.b. seinen router auch zum berechnen der rainbowtable verwenden will, weil der eh an ist, weiss ich nicht, ob man da einen x86 vorfindet.
 
  • Passwort knacken Beitrag #8
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
das ist alles python-code. mit dev-c++ kannste da nichts werden.
 
  • Passwort knacken Beitrag #9
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
kein plan ob das geht. ich hab eigendlich immer den python-interpreter (um genau zu sein cpython 2.6.x) auf der shell benutzt, und das noch nichtmal unter windows.
 
Zuletzt bearbeitet:
  • Passwort knacken Beitrag #10
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
hab das nie in eine exe kompiliert, sondern immer dem python-interpreter so vorgeworfen. aber kannst ja mal compilieren und schauen, was passiert.
 
Thema:

Passwort knacken

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.171
Mitglieder
55.876
Neuestes Mitglied
RamiroGarn
Oben