Pentest-Werbung einmal anders

Mir ist heute eine Werbung für eine Pentestfirma entgegengeflattert. Darauf stand der schöne Satz:

Speicher dir das. So knacke ich ein Passwort, ohne es je zu raten.

In der Grafik waren – ich kopiere und zeige sie hier bewusst nicht – ungefähr diese drei Befehle zu sehen:

hashcat -m 1000 hash.txt rockyou.txt
hashcat -m 1000 hash.txt rockyou -r best64.rule
hashcat -m 1000 hash.txt -a3 ?u?l?l?l?l?d?d

Das Problem ist nicht Hashcat. Das Problem ist die Behauptung, hier werde ein Passwort geknackt, „ohne es je zu raten“ – gefolgt von drei Varianten des Ratens. Eine RockYou-Wortliste als geheimnisvolle Pentest-Magie zu verkaufen, ist fachlich schon ziemlich dreist.

Dreimal raten, nur unterschiedlich organisiert

  • Befehl 1: Der Passworthash wird gegen eine Wortliste geprüft.
  • Befehl 2: Die Wörter aus der Liste werden zusätzlich nach Regeln verändert – etwa durch angehängte Zahlen oder typische Ersetzungen.
  • Befehl 3: Hashcat probiert alle Kandidaten aus, die zu einem vorgegebenen Muster passen.

Allen drei Befehlen ist gemeinsam: Das ist nicht „nicht raten“. Das ist Raten auf Steroiden, mit GPU-Unterstützung und einer sinnvollen Reihenfolge der Kandidaten. Gerade deshalb funktioniert es oft gut. Magie ist dafür nicht nötig.

Außerdem braucht der Angreifer zunächst einen Hash. Den kann er zum Beispiel aus einer kompromittierten Datenbank, einem erbeuteten NTLM-Hash oder einem verschlüsselten Datenträger bekommen. Ohne geeignetes Ausgangsmaterial gibt es für Hashcat nichts zu prüfen.

Ein Hash ist kein verschlüsseltes Passwort

Eine Hashfunktion erzeugt aus beliebigen Daten einen Wert fester Länge. Bei der Passwortspeicherung wird nicht das Passwort entschlüsselt. Stattdessen berechnet das System beim Login erneut den Hash des eingegebenen Passworts und vergleicht das Ergebnis mit dem gespeicherten Wert.

Für Offline-Angriffe ist entscheidend, wie teuer ein einzelner Versuch ist. NTLM und MD5 sind sehr schnell berechenbar. Das ist bei Prüfsummen praktisch, bei Passwörtern aber fatal: Ein Angreifer kann gigantische Mengen an Kandidaten pro Sekunde testen.

Nehmen wir als bewusst schlechtes Beispiel das Passwort Passwort:

NTLM: 8da74849d984b5fab7021be09355c0bc
MD5:  3e45af4ca27ea2b03fc6183af40ea112

In den hier zugrunde gelegten Messungen erreicht eine GeForce RTX 4090 folgende Werte:

NTLM: etwa 288,5 GH/s
MD5:  etwa 164,1 GH/s

Ein vollständiger Brute-Force-Lauf über alle achtstelligen Kombinationen aus 95 druckbaren ASCII-Zeichen umfasst 958, also rund 6,63 Billiarden Kandidaten. Rein rechnerisch ergibt das:

HashRateWorst CaseDurchschnitt
NTLM288,5 GH/sca. 6,39 Stundenca. 3,19 Stunden
MD5164,1 GH/sca. 11,23 Stundenca. 5,62 Stunden

Das sind idealisierte Rechenwerte. Sie berücksichtigen weder Overhead noch reale Hardwareabweichungen. Die Größenordnung reicht aber für den Punkt: Schnelle Hashfunktionen schützen schwache Passwörter bei einem Offline-Angriff praktisch nicht.

Salt verhindert Vorberechnung, nicht das Raten

Ein Salt ist ein zufälliger, nicht geheimer Wert, der für jedes Passwort neu erzeugt und zusammen mit dem Hash gespeichert wird. Dadurch liefern identische Passwörter unterschiedliche Hashwerte. Vorberechnete Tabellen und simples Nachschlagen bekannter Hashes werden damit weitgehend unbrauchbar.

Ein Salt macht ein schwaches Passwort aber nicht stark. Kennt der Angreifer Salt und Hash aus einer Datenbank, kann er für jeden Kandidaten erneut den passenden Hash berechnen. Genau deshalb braucht Passwortspeicherung neben einem Salt auch eine absichtlich teure Passwort-Hashfunktion.

RockYou: berühmt, schnell und keineswegs harmlos

Die in der Werbung verwendete rockyou.txt stammt aus dem RockYou-Datenleck von 2009 und enthält rund 14,3 Millionen echte Passwörter. Sie ist vermutlich die bekannteste Passwortliste überhaupt.

Bei NTLM oder MD5 ist ein Durchlauf durch diese Liste auf einer modernen GPU praktisch sofort erledigt:

HashRateWorst CaseDurchschnitt
NTLM288,5 GH/sca. 49,7 µsca. 24,9 µs
MD5164,1 GH/sca. 87,4 µsca. 43,7 µs

Die konkreten Mikrosekunden sind eher Rechenillustration als real messbare Laufzeit; Datei- und Programm-Overhead dauert länger. Inhaltlich bleibt: Wenn ein Passwort in RockYou steht, fällt es gegen einen schnellen Hash sofort.

Mit best64.rule werden die Wörter zusätzlich auf typische Weise verändert: Großschreibung, Zahlen und Sonderzeichen davor oder dahinter, Leetspeak und ähnliche Muster. Das vergrößert die Kandidatenmenge, bleibt aber strukturiertes Raten. Gute Passwortfilter können bekannte kompromittierte Passwörter und triviale Varianten abfangen; darauf verlassen, dass jede IT-Abteilung das konsequent tut, würde ich mich allerdings nicht.

Wie eine brauchbare Wortliste wirklich entsteht

Wer bei einem autorisierten Pentest ernsthaft nach schwachen Firmen-, Geräte- oder Initialpasswörtern sucht, nimmt nicht einfach RockYou und hofft auf ein Wunder. Sinnvoller ist eine Wortliste, die zur Zielorganisation passt. Werkzeuge nach Art von CeWL können öffentlich erreichbare Webseiten auswerten und daraus Begriffe, Eigennamen und wiederkehrende Formulierungen extrahieren.

Ergiebige Quellen sind außerdem öffentlich bereitgestellte PDFs und andere Dokumente: Produktnamen, Standorte, Abteilungsnamen, Projektbezeichnungen, interne Kurzformen, Veranstaltungsnamen, Slogans sowie Begriffe aus Anleitungen und Schulungsunterlagen. Dazu kommen öffentlich erkennbare Namensschemata für WLANs, Geräte und Niederlassungen. Metadaten können ebenfalls Hinweise auf verwendete Benennungsmuster liefern.

Aus diesem organisationsspezifischen Vokabular lassen sich anschließend plausible Varianten bilden: unterschiedliche Groß- und Kleinschreibung, Jahreszahlen, Standortkürzel, übliche Trennzeichen und typische Anhänge. Gerade generische WLAN-, Geräte-, Service- und Initialpasswörter entstehen häufig aus solchen vorhersehbaren Kombinationen. Das ist noch immer Raten – aber diesmal auf Basis konkreter Informationen statt mit einer beliebigen Leak-Liste.

Der Maskenangriff aus dem dritten Beispiel setzt voraus, dass Aufbau und Länge bereits sehr konkret bekannt sind. Die Maske beschreibt sieben Zeichen: einen Großbuchstaben, vier Kleinbuchstaben und zwei Ziffern. Für echte Nutzerpasswörter ist eine derart genaue Vorgabe in Unternehmen untypisch. Dort gibt es allenfalls Regeln zu Groß- und Kleinschreibung, Zahlen, Sonderzeichen, Mindestlänge und Mustervermeidung – aber normalerweise keine Policy nach dem Schema „erst ein Großbuchstabe, dann vier Kleinbuchstaben, dann zwei Ziffern“.

Realistisch sind solche Masken eher bei generischen Geräte- oder Initialpasswörtern, die ein Hersteller oder Provisionierungsprozess nach einem festen Schema erzeugt. Wenn dieses Schema bekannt ist, kann ein Maskenangriff den Suchraum drastisch verkleinern. Als allgemeiner Trick gegen Nutzerpasswörter ist das Beispiel dagegen Werbetheater.

Das eigentliche Gegenmittel: einzigartige Passwörter

Der beste Hash schützt nicht vor Credential Stuffing. Wird dasselbe Passwort bei mehreren Anbietern oder in verschiedenen Kontexten verwendet, reicht ein einziges Datenleck: Angreifer probieren die bekannte Kombination aus Benutzername und Passwort anschließend automatisiert bei anderen Diensten aus. Kleine Abwandlungen wie ein anderer Zahlenanhang helfen kaum, weil auch solche Muster vorhersehbar sind.

Deshalb sollte jedes Konto ein eigenes, zufällig erzeugtes Passwort bekommen. Ein Passwortmanager nimmt einem sowohl die Erzeugung als auch die Speicherung dieser Passwörter ab. Viele moderne Passwortmanager erkennen außerdem wiederverwendete, schwache oder bereits in bekannten Leaks aufgetauchte Passwörter und warnen den Nutzer.

Mit Have I Been Pwned lässt sich prüfen, ob eine E-Mail-Adresse in bekannten Datenlecks enthalten ist. Bei Diensten, in die man ein echtes Passwort eingeben soll, wäre ich dagegen grundsätzlich vorsichtig. Have I Been Pwned bietet mit „Pwned Passwords“ zwar eine Prüfung an, bei der das Passwort nach Angaben des Dienstes lokal gehasht und nur ein Teil des Hashes übertragen wird. Das ändert aber nichts am problematischen Lernsignal: Nutzer sollten nicht daran gewöhnt werden, echte Passwörter in fremde Webformulare einzutippen.

Ein Passwort gehört in den Passwortmanager und in das System, für das es bestimmt ist – nicht auf irgendeine Prüfwebseite. Leak-Prüfungen sind sinnvoller als integrierte Funktion eines vertrauenswürdig betriebenen Passwortmanagers oder als lokale beziehungsweise kontrollierte Prüfung gegen bekannte Leak-Daten. Auch dort gilt: Ein nicht gefundener Wert ist kein Beweis für ein gutes Passwort. Ein Treffer bedeutet dagegen, dass es nirgendwo mehr verwendet werden sollte.

Unterm Strich ist die wirksamste Strategie ziemlich unspektakulär: Passwortmanager benutzen, für jeden Dienst und jeden Kontext ein einzigartiges Passwort erzeugen und Leak-Warnungen ernst nehmen. Dann verliert die magische RockYou-Grafik einen erheblichen Teil ihres Schreckens.

Argon2id ändert die Kosten pro Versuch

Moderne Passwort-Hashfunktionen wie Argon2id sind absichtlich langsam und speicherintensiv. Das macht jeden einzelnen Rateversuch teurer – auch für GPUs und spezialisierte Hardware. Ein Argon2id-Hash enthält neben Salt und Ergebnis auch seine Parameter:

$argon2id$v=19$m=65536,t=3,p=1$6O/2/w+4NHTSfU6dP+uK6Q$GNsVqsxsr5D7a+1z5TNmPB3rcDWTTecuyrcIvJkn6t8
  • m: Speicherbedarf in KiB
  • t: Anzahl der Durchläufe
  • p: Grad der Parallelisierung

Der direkte Vergleich zeigt besser als jede Beschreibung, was die Wahl des Hashverfahrens ausmacht. Für den vollständigen Schlüsselraum eines acht Zeichen langen Passworts aus 95 druckbaren ASCII-Zeichen – also 958 Kandidaten – ergibt sich auf Basis realer Messwerte einer einzelnen RTX 4090; nur die beiden harten Argon2id-Konfigurationen sind geschätzt:

Hash-TypGemessene Rate / SchätzungWorst CaseDurchschnitt
NTLM288,5 GH/s6,39 Stunden3,19 Stunden
MD5164,1 GH/s11,2 Stunden5,61 Stunden
Argon2id Default
m=65536, t=3, p=1
1.703 H/sca. 123.000 Jahreca. 61.700 Jahre
Argon2id hart, optimistische Schätzung
m=1048576, t=8, p=4
ca. 39,9 H/sca. 5,27 Mio. Jahreca. 2,63 Mio. Jahre
Argon2id hart, konservative Schätzung
m=1048576, t=8, p=4
ca. 20 H/sca. 10,5 Mio. Jahreca. 5,26 Mio. Jahre

Die Werte für NTLM, MD5 und Argon2id mit m=65536, t=3, p=1 wurden auf einer RTX 4090 gemessen. Nur die beiden Raten für die harte Argon2id-Konfiguration mit 1 GiB Speicher, acht Durchläufen und vier Lanes sind eine optimistische beziehungsweise konservative Schätzung. Die daraus berechneten Laufzeiten bleiben ein Größenordnungsvergleich, keine Garantie für jede Implementierung und Hardware. Genau der fällt brutal aus: Bei NTLM und MD5 reden wir über Stunden, bei Argon2id über geologische Zeiträume.

Man kann Argon2id noch deutlich härter konfigurieren. Das Beispiel mit 1 GiB Speicher, acht Durchläufen und vier Lanes wäre für viele Webanwendungen allerdings unpraktisch. Das ist keine kostenlose Sicherheitsstufe: Dieselbe Arbeit muss auch der legitime Server bei jedem Login leisten.

Daraus folgt aber nicht, dass Argon2id für Web-Logins ungeeignet wäre – im Gegenteil. Es ist genau für Passwortspeicherung gedacht. Die Parameter müssen zur Anwendung und Hardware passen; zusätzlich braucht der Login Rate-Limits und Schutz gegen Ressourcenerschöpfung. „Maximal teuer“ ist keine Konfiguration, sondern eine Einladung zum Denial of Service.

Bei lokaler Festplattenverschlüsselung kann man höhere Kosten eher vertreten. LUKS2 unterstützt Argon2id für seine Keyslots, weil ein legitimer Entsperrvorgang selten stattfindet und eine kurze Verzögerung akzeptabel ist. Die Parameter werden dabei an die verfügbare Hardware angepasst.

Was von der Werbung übrig bleibt

Hashcat ist ein wichtiges Werkzeug für Pentests und Passwort-Audits. Wörterbuch-, Regel- und Maskenangriffe sind reale und sinnvolle Methoden. Aber „So knacke ich eure Passwörter, ohne zu raten“ über drei Rateangriffe zu schreiben und ausgerechnet RockYou als magischen Trick zu inszenieren, ist keine clevere Vereinfachung. Es ist fachlich falsche Werbung für Menschen, von denen Kunden fachliche Präzision erwarten dürfen.

Die ehrliche Werbeaussage wäre weniger spektakulär, aber wenigstens kein Bullshit:

Gib mir einen geeigneten Passworthash, und ich prüfe sehr viele plausible Kandidaten sehr schnell.

Und wie reagiert man auf die ursprüngliche Anzeige? Vielleicht mit einem echten Argon2id-Hash und dem Satz:

Zeig mal, was du kannst. Du darfst diesmal auch gern raten. 😉

In diesem Sinne:

$argon2id$v=19$m=1048576,t=8,p=4$qhHgeXjd31h51LSKcd84Bw$l505lJHa9X/AWFFQ5wnPRkMW9CACMw25Nl2wsJi5SQ8

Finder bekommt ein Eis.