Das Hacker-Kollektiv «M24b» 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)
1
2
3
4
5
6
7
8
Zeile 6
passwort.encode() – erzeugt aus dem String passwort ein Bytes-Objekt
md5(bytes) – wendet den md5-Hash auf das Bytes-Objekt an
hash.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",
    "7c6a180b36896a0a8c02787eeafb0e4c",
    "b1a6a20d781fde908b1dd9af34deb8ea",
    "dc647eb65e6711e155375218212b3964",
    "d8578edf8458ce06fbc5bb76a58c5ca4",
    "37b4e2d82900d5e94b8da524fbeb33c0",
    "0192023a7bbd73250516f069df18b500",
    "0b4e7a0e5fe84ad35fb5f95b9ceeac79",
    "098f6bcd4621d373cade4e832627b4f6",
    "40be4e59b9a2a2b5dffb918c0e86b3d7",
    "5badcaf789d3d1d09794d8f021f40f0e",
    "7c6a180b36896a0a8c02787eeafb0e4c",
    "008c5926ca861023c1d2a36653fd88e2",
    "4297f44b13955235245b2497399d7a93",
    "d0763edaa9d9bd2a9516280e9044d885",
    "e99a18c428cb38d5f260853678922e03",
    "df0349ce110b69f03b4def8012ae4970",
    "6b1628b016dff46e6fa35684be6acc96",
    "1a1dc91c907325c69271ddf0c944bc72",
    "912ec803b2ce49e4a541068d495ab570",
    "0d107d09f5bbe40cade3de5c71e9e9b7",
    "8afa847f50a716e64932d995c8e7435a",
    "8621ffdbc5698829397d97767ac13db3",
    "da443a0ad979d5530df38ca1a74e4f80",
    "84d961568a65073a3bcf0eb216b2a576",
    "bb7aedfa61007447dd6efaf9f37641e3",
    "e22a63fb76874c99488435f26b117e37",
]

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)
        
1
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
59
60
61
62
Zeilen 34 & 35
alphabet beinhaltet alle Zeichen wovon alle möglichen Kombinationen durchprobiert werden sollen
Zeile 36
length legt fest wie lange die generierten Passwörter sein sollen
Zeile 60
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",
    "7c6a180b36896a0a8c02787eeafb0e4c",
    "b1a6a20d781fde908b1dd9af34deb8ea",
    "dc647eb65e6711e155375218212b3964",
    "d8578edf8458ce06fbc5bb76a58c5ca4",
    "37b4e2d82900d5e94b8da524fbeb33c0",
    "0192023a7bbd73250516f069df18b500",
    "0b4e7a0e5fe84ad35fb5f95b9ceeac79",
    "098f6bcd4621d373cade4e832627b4f6",
    "40be4e59b9a2a2b5dffb918c0e86b3d7",
    "5badcaf789d3d1d09794d8f021f40f0e",
    "7c6a180b36896a0a8c02787eeafb0e4c",
    "008c5926ca861023c1d2a36653fd88e2",
    "4297f44b13955235245b2497399d7a93",
    "d0763edaa9d9bd2a9516280e9044d885",
    "e99a18c428cb38d5f260853678922e03",
    "df0349ce110b69f03b4def8012ae4970",
    "6b1628b016dff46e6fa35684be6acc96",
    "1a1dc91c907325c69271ddf0c944bc72",
    "912ec803b2ce49e4a541068d495ab570",
    "0d107d09f5bbe40cade3de5c71e9e9b7",
    "8afa847f50a716e64932d995c8e7435a",
    "8621ffdbc5698829397d97767ac13db3",
    "da443a0ad979d5530df38ca1a74e4f80",
    "84d961568a65073a3bcf0eb216b2a576",
    "bb7aedfa61007447dd6efaf9f37641e3",
    "e22a63fb76874c99488435f26b117e37",
]

passwords = [
    "test",
    "123"
]

for password in passwords:
    hashed = md5(password.encode()).hexdigest()
    if hashed in hashes:
        print("Passwort gefunden:", password)
1
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
Letzte Änderung: 30. März 2022 09:57