Das Hacker-Kollektiv «M23c» ist durch einen anonymen Kontakt in den Besitz einer Liste von Passwort-Hashes aus einem Data-Leak gekommen.
# Wettbewerb
Das Hacker-Kollektiv bildet nun mehrere Hacker-Teams. Diese treten in einem Wettbewerb gegeneinander an. Der Wettbewerb hat folgende Ziele:
- Wer knackt am meisten Passwörter?
- Wie viele schaffen wir zusammen?
Aufgabe «Wettbewerb»
- Bildet Hacker-Teams
- Lest die beiden möglichen Angriffe durch
- übernehmt die Beispiele und passt dies an
- Jedes gefundene Passwort sollte notiert werden!
Die Spielregeln lauten
- selber Programmieren, nicht fertige Programme aus dem Internet anwenden
- alles in Python
- Beispiele auf dieser Seite dürfen und sollen verwendet werden
# Prinzip
Das Prinzip ist einfach: wir erraten ein Passwort, z.B. «test». Von diesem erzeugen wir den Hash. Den erzeugten Hash vergleichen wir mit dem Hash des Benutzers: Stimmen diese überein, so haben wir das Passwort erraten!
from hashlib import md5
zu_findender_hash = "098f6bcd4621d373cade4e832627b4f6"
passwort = "test"
gehashtes_password = md5(passwort.encode()).hexdigest()
if gehashtes_password == zu_findender_hash:
print("Passwort gefunden:", passwort)
2
3
4
5
6
7
8
- Zeile 6
passwort.encode()
– erzeugt aus dem Stringpasswort
ein Bytes-Objektmd5(bytes)
– wendet den md5-Hash auf das Bytes-Objekt anhash.hexdigest()
– stellt den Hash in der Hexadezimaldarstellung dar
# Brute-Force
In cryptography, a brute-force attack consists of an attacker submitting many passwords or passphrases with the hope of eventually guessing a combination correctly. The attacker systematically checks all possible passwords and passphrases until the correct one is found.
Wikipedia
from hashlib import md5
hashes = [
"e10adc3949ba59abbe56e057f20f883e",
"5f4dcc3b5aa765d61d8327deb882cf99",
"d8578edf8458ce06fbc5bb76a58c5ca4",
"37b4e2d82900d5e94b8da524fbeb33c0",
"0192023a7bbd73250516f069df18b500",
"0b4e7a0e5fe84ad35fb5f95b9ceeac79",
"098f6bcd4621d373cade4e832627b4f6",
"40be4e59b9a2a2b5dffb918c0e86b3d7",
"5badcaf789d3d1d09794d8f021f40f0e",
"7c6a180b36896a0a8c02787eeafb0e4c",
"008c5926ca861023c1d2a36653fd88e2",
"4297f44b13955235245b2497399d7a93",
"d0763edaa9d9bd2a9516280e9044d885",
"e99a18c428cb38d5f260853678922e03",
"df0349ce110b69f03b4def8012ae4970",
"6b1628b016dff46e6fa35684be6acc96",
"1a1dc91c907325c69271ddf0c944bc72",
"912ec803b2ce49e4a541068d495ab570",
"0d107d09f5bbe40cade3de5c71e9e9b7",
"8afa847f50a716e64932d995c8e7435a",
"8621ffdbc5698829397d97767ac13db3",
"da443a0ad979d5530df38ca1a74e4f80",
"84d961568a65073a3bcf0eb216b2a576",
"bb7aedfa61007447dd6efaf9f37641e3"
]
alphabet = "123456789"
#alphabet = "abcdefhijklmnopqrstuvwxyz"
length = 4
passwort = length * alphabet[0]
letztes_passwort = length * alphabet[-1]
hashed = md5(passwort.encode()).hexdigest()
if hashed in hashes:
print("Passwort gefunden:", passwort)
while passwort != letztes_passwort:
index = length-1
uebertrag = True
while uebertrag:
altesZeichen = passwort[index]
if altesZeichen == alphabet[-1]:
uebertrag = True
passwort = passwort[:index] + alphabet[0] + passwort[index + 1:]
index = index - 1
else:
uebertrag = False
naechstesZeichen = alphabet[alphabet.index(altesZeichen) + 1]
passwort = passwort[:index] + naechstesZeichen + passwort[index + 1:]
hashed = md5(passwort.encode()).hexdigest()
#print(passwort)
if hashed in hashes:
print("Passwort gefunden:", passwort)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
- Zeilen 30 & 31
alphabet
beinhaltet alle Zeichen wovon alle möglichen Kombinationen durchprobiert werden sollen- Zeile 32
length
legt fest wie lange die generierten Passwörter sein sollen- Zeile 56
- man kann den Kommentar entfernen, um jeden Versuch auszugeben. Dies bremst allerdings das Programm stark!
# Dictionary-Attack
In cryptanalysis and computer security, a dictionary attack is a form of brute force attack technique for defeating a cipher or authentication mechanism by trying to determine its decryption key or passphrase by trying thousands or millions of likely possibilities, such as words in a dictionary or previously used passwords, often from lists obtained from past security breaches.
Wikipedia
from hashlib import md5
hashes = [
"e10adc3949ba59abbe56e057f20f883e",
"5f4dcc3b5aa765d61d8327deb882cf99",
"d8578edf8458ce06fbc5bb76a58c5ca4",
"37b4e2d82900d5e94b8da524fbeb33c0",
"0192023a7bbd73250516f069df18b500",
"0b4e7a0e5fe84ad35fb5f95b9ceeac79",
"098f6bcd4621d373cade4e832627b4f6",
"40be4e59b9a2a2b5dffb918c0e86b3d7",
"5badcaf789d3d1d09794d8f021f40f0e",
"7c6a180b36896a0a8c02787eeafb0e4c",
"008c5926ca861023c1d2a36653fd88e2",
"4297f44b13955235245b2497399d7a93",
"d0763edaa9d9bd2a9516280e9044d885",
"e99a18c428cb38d5f260853678922e03",
"df0349ce110b69f03b4def8012ae4970",
"6b1628b016dff46e6fa35684be6acc96",
"1a1dc91c907325c69271ddf0c944bc72",
"912ec803b2ce49e4a541068d495ab570",
"0d107d09f5bbe40cade3de5c71e9e9b7",
"8afa847f50a716e64932d995c8e7435a",
"8621ffdbc5698829397d97767ac13db3",
"da443a0ad979d5530df38ca1a74e4f80",
"84d961568a65073a3bcf0eb216b2a576",
"bb7aedfa61007447dd6efaf9f37641e3"
]
passwords = [
"test",
"123"
]
for password in passwords:
hashed = md5(password.encode()).hexdigest()
if hashed in hashes:
print("Passwort gefunden:", password)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38