Knack es selbst

Ein stabiles Vorhängeschloss, das offen hängt, mit einem Haarriss durch den Körper, und daneben eine Lupe.

In allen Kapiteln davor hat alles funktioniert. Du hast auf eine Schaltfläche gedrückt und die Mathematik hat gehalten, was sie versprach. Hier ist alles kaputt. Vier Rätsel, und in jedem steckt ein Fehler, den jemand wirklich gemacht hat — in einer App, in einem WLAN-Standard, in der Datenbank einer Website. Du bist jetzt der Angreifer. Das ist das Spiel und gleichzeitig die Lektion: bei fast jedem Leck, das in die Nachrichten kommt, ist die Mathematik nicht gebrochen. Sie wurde falsch benutzt.

Wörter, die du gleich brauchst

Capture the flag (CTF)
Ein Wettbewerb, bei dem du Rätsel wie diese bekommst. Du kriegst eine Datei, eine Nachricht oder eine Website, die etwas versteckt, und musst selbst hineinbrechen. Weltweit, jedes Wochenende, gratis, und du musst nichts können, um anzufangen.
Flagge
Das kurze Stück Text, das in so einem Rätsel versteckt ist, meistens in der Form flagge{etwas}. Findest du die Flagge, hast du bewiesen, dass du drin warst. In Rätsel 1 hier unten steckt eine.
Schlüsselraum
Die Anzahl der Schlüssel, die es gibt. Bei Caesar sind das 25, bei AES256 sind es 2256. Ist der Schlüsselraum klein genug, muss niemand schlau sein: du probierst einfach alle durch.
Brute Force
Genau das: alles probieren, bis etwas herauskommt. Kein Trick, keine Einsicht, nur Rechenzeit. Es ist der Angriff, den jede Geheimschrift aushalten muss, und der Grund, warum Schlüssel so lang sind.
Wortliste
Eine Datei mit Passwörtern, die Leute wirklich wählen, sortiert danach, wie oft. Die größten, die frei herumliegen, zählen Hunderte Millionen. Ein Angreifer fängt dort an, nicht bei aaaa.

Rätsel 1 — 25 Schlüssel sind kein Schloss

Jemand hat einen Zettel fallen lassen. Darauf steht Unsinn, aber es ist Caesar-Unsinn: jeder Buchstabe eine feste Anzahl Plätze weitergeschoben, wie in Kapitel 4. Du kennst die Anzahl der Plätze nicht. Musst du auch nicht.

Knack den Caesar

Alles passiert in deinem Browser. Es wird nichts an den Server geschickt.

  1. Klick Probier alle 25 Verschiebungen. Die Demo schiebt den Text 25-mal zurück und stellt alle Ergebnisse untereinander.
  2. Geh die Liste durch, bis du Deutsch siehst. Merk dir, bei welcher Verschiebung das war, und lies die Flagge ab.
  3. Klick Lass den Computer wählen. Jetzt liest niemand mit: die Demo zählt pro Zeile, wie deutsch die Buchstaben liegen, und zeigt selbst auf eine. Schau, ob sie dieselbe wählt wie du.
  4. Verschlüssel selbst etwas damit. Tipp normalen Text in das Feld, klick wieder alle 25 und nimm die Zeile, die du willst. Verschiebung 9 hin ist Verschiebung 17 zurück, denn zusammen sind sie 26.

Was hier schiefging: ein Schlüsselraum von 25

Caesar hat keine schwache Mathematik. Das Addieren stimmt perfekt. Es gibt nur 25 mögliche Schlüssel, und ein Computer probiert 25 davon in weniger Zeit, als du brauchst, um sie zu zählen. Das heißt Brute Force, und es ist kein Angriff auf die Geheimschrift, sondern auf ihre Größe. AES256 aus Kapitel 4 macht genau dieselbe Art Arbeit wie Caesar, mit genau derselben Offenheit darüber, wie es funktioniert — nur gibt es 2256 Schlüssel statt 25, und daran zerschellt Brute Force.

Rätsel 2 — die Datenbank des Sportvereins

Die Website eines Sportvereins ist gehackt worden. Die Mitgliederliste steht online: Name und Passwort-Hash, mehr nicht. Der Verein hat es „richtig“ gemacht — es stehen keine Passwörter drin, nur SHA-256 aus Kapitel 2. Vier Mitglieder.

sam:9970626666560a32465d4ce10d28f3233365af833e15eed59884d9477862c379
noor:89ebdcadc16b41410b4a4e9a5e023d2dda67b2cf9a2a75f8c8231140acfe173a
jules:51aa8f7f35a1d0a8da0f6f3479d68363ee8577b64b98760a4da3b175520def29
kaya:658109e4458300a7b43ec96e0d7dfd919a97e4ec54cc74f39796459638698ee6

Lass eine Wortliste auf das Leck los

Alles passiert in deinem Browser. Es wird nichts an den Server geschickt. Die Demo liest die Hashes hier oben direkt von dieser Seite.

  1. Klick Knack das Leck. Die Demo hasht jedes Wort aus einer Liste von ein paar Dutzend und vergleicht es mit den vier Hashes.
  2. Schau, wie viele Millisekunden das gekostet hat. Rechne aus, was eine Liste von hundert Millionen Wörtern auf einer Maschine kosten würde, die tausendmal schneller ist als deine.
  3. Ein Mitglied überlebt es. Schau dir seinen Hash an: daran ist nichts zu sehen. Was es anders gemacht hat, steht nicht in der Datenbank, sondern in seinem Kopf.
  4. Knack es trotzdem. Sein Passwort steht wörtlich als Beispiel in Kapitel 3. Hol es dir, setz es in das Feld Eigene Wörter und klick noch einmal.

Was hier schiefging: ein Hash ohne Salt

Der Verein hat nichts verschlüsselt und du hast nichts entschlüsselt. Du hast vorwärts gerechnet: von jedem Wort den Hash genommen und geschaut, ob er in der Liste stand. Das klappt, weil dieselbe Eingabe immer denselben Hash gibt — und genau das ist die Eigenschaft, die einen Hash nützlich macht. Es gibt eine Sache, die diesen Angriff bricht, und das ist Salt: dann hasht die Seite nicht dein Passwort, sondern ein zufälliges Stück Text plus dein Passwort, für jedes Mitglied ein anderes. Eine Liste reicht dann nicht mehr; der Angreifer muss für jedes Mitglied ganz von vorne anfangen. Wie das funktioniert, steht in Kapitel 3.

Das ist kein ausgedachtes Szenario. Im Juni 2012 tauchte von LinkedIn eine Datei mit 6,5 Millionen Passwort-Hashes im Internet auf: SHA-1, ohne Salt. Innerhalb weniger Tage war der größte Teil geknackt, genau auf die Art, die du hier oben selbst durchgeführt hast. Später stellte sich heraus, dass das Leck viel größer war als diese 6,5 Millionen.

Noch drei Wörter

Schlüsselstrom
Der lange Schwall zufällig aussehender Bits, den eine Geheimschrift aus dem Schlüssel und dem IV macht. Deine Nachricht wird mit XOR dazugezählt, und die Empfängerin zieht denselben Schwall wieder ab. Du hast ihn schon unten in Kapitel 4 gesehen.
Crib
Ein Stück Text, von dem du vermutest, dass es in der Nachricht steht: Hey, der, der Name der Empfängerin. Eine Vermutung also, aber eine gute. Crib dragging heißt, diese Vermutung über jede Stelle in der Nachricht zu schieben und zu schauen, wo sie passt.
Token
Der kleine Beleg, den eine Website in deinem Browser hinterlässt, nachdem du eingeloggt bist. Bei jedem weiteren Klick schickt dein Browser ihn mit, und daran erkennt die Seite, wer du bist. Darin steht, wer du bist und was du darfst.

Rätsel 3 — zwei Nachrichten, ein Schlüsselstrom

Eine Chat-App verschlüsselt jede Nachricht mit XOR: Nachricht ⊕ Schlüsselstrom. An sich prima — so funktioniert AES auch. Aber der Programmierer hat den IV einmal aufgeschrieben und stehen lassen. Gleicher Schlüssel, gleicher IV, also bei jeder Nachricht exakt derselbe Schlüsselstrom. Hier sind zwei Nachrichten, die die App verschickt hat, in Hex, so wie du sie von der Leitung pflückst:

Nachricht 1: f0517a06404087f83e0a2845488538f0e6bf55bdd952491c94fe961b0e42c4fc6a35236528363f273a17483fb705c3
Nachricht 2: f0517a06404087f83e072e5f48a832fceefa13acd94e1a7ea7ecde1c1103f6e66c2f3b6f376569213b431b6ee45a81

Schau dir den Anfang an: f0517a06404087f83e steht zweimal da. Achtzehn Hex-Zeichen, neun Bytes, Buchstabe für Buchstabe dasselbe. Das geht nur, wenn die Nachrichten dort gleich anfangen und der Schlüsselstrom dort derselbe ist. Eine einzige Zeile der App hat dir das verraten.

Nimm den Schlüsselstrom weg

Alles passiert in deinem Browser. Es wird nichts an den Server geschickt. Die zwei Geheimtexte werden von dieser Seite gelesen; die Klartexte stehen nirgends im Code — die kommen nur heraus, wenn deine Vermutung stimmt.

  1. Klick XOR sie aufeinander. Weil beide Nachrichten mit demselben Schlüsselstrom verschlüsselt sind, fällt dieser Strom weg. Übrig bleibt Nachricht 1 ⊕ Nachricht 2.
  2. Zähl die Nullen vorne. Wo zwei Nachrichten dasselbe Zeichen haben, gibt XOR null. Neun Nullen bedeutet: neun Zeichen gleich.
  3. Tipp eine Vermutung für Nachricht 1 und klick Leg meine Vermutung daneben. Was du zurückbekommst, ist Nachricht 2 — wenn deine Vermutung stimmt. Fang mit Hey Sam, an und tipp jedes Mal ein Wort dazu. Liest sich die andere Seite als Deutsch, dann bist du richtig; kommt Müll heraus, dann liegst du falsch.
  4. Festgefahren? Klick Crib dragging. Die Demo schiebt eine Liste alltäglicher Wörter über jede Stelle im XOR und stellt nach oben, was am meisten wie Deutsch aussieht.

Was hier schiefging: derselbe IV zweimal

Der Schlüssel wurde nirgends geraten und nirgends gebrochen. Er ist weggefallen, weil er zweimal auf dieselbe Art benutzt wurde. In Kapitel 4 steht, dass der IV nicht geheim sein muss, nur neu. Das ist der Grund. Ein IV zu wenig, und du hast keine zwei verschlüsselten Nachrichten mehr, sondern zwei Klartexte, die aufeinander liegen.

Bei AES-GCM, dem Modus, den deine Nachrichten-App wirklich benutzt, ist es noch schlimmer. Dort bringt die Wiederverwendung des IV nicht nur das hier: ein Angreifer kann damit auch das Siegel fälschen und also unbemerkt an deinen Nachrichten herumbasteln. Und AES warnt dich nicht. Alles sieht weiter normal aus.

Im Oktober 2017 zeigten Mathy Vanhoef und Frank Piessens von der KU Leuven, dass man ein WLAN-Gerät zwingen kann, seinen Schlüssel neu zu installieren, wodurch der Zähler, der den IV liefert, auf null zurückspringt und derselbe Schlüsselstrom wieder von vorne anfängt. Dieser Angriff heißt KRACK, und er funktionierte gegen WPA2 — das Sicherheitsprotokoll von so ziemlich jedem WLAN-Netz der Welt zu diesem Zeitpunkt. Der Titel ihres Papers sagt genau, worum es geht: Forcing Nonce Reuse in WPA2.

Rätsel 4 — die Signatur, die niemand prüft

Eine Schulplattform gibt dir beim Einloggen ein Token mit. Darin steht, wer du bist und welche Rolle du hast: Schüler oder Administrator. Der Server signiert dieses Token mit seinem privaten Schlüssel, wie in Kapitel 7.1, damit niemand es fälschen kann. Die Mathematik stimmt, das Schlüsselpaar ist echt, die Signatur ist echt. Es gibt nur ein Problem: der Server schaut sie nicht an.

Werde Administrator

Alles passiert in deinem Browser. Es wird nichts an den Server geschickt. Das Schlüsselpaar wird bei jedem Klick neu gemacht und verschwindet, wenn du den Tab schließt.

  1. Klick Als Schüler einloggen. Die Demo macht ein Schlüsselpaar (ECDSA auf P-256, die Kurve aus Kapitel 6.2) und signiert ein Token. Es erscheint im Feld: drei Stücke in base64url, getrennt durch Punkte. Kennst du aus Kapitel 1.
  2. Klick Prüf, wie es sein sollte. Der öffentliche Schlüssel sagt: in Ordnung, das kommt vom Server.
  3. Klick Pfusch: mach mich zum Administrator. Das Mittelstück wird angepasst und in den Kopf kommt alg: none — „es gibt keine Signatur“. Das dritte Stück wird geleert.
  4. Klick Prüf wie der löchrige Server. Du bist drin als Administrator.
  5. Klick wieder Prüf, wie es sein sollte. Abgelehnt. Gleiches Token, gleiche Mathematik, andere Antwort — der Unterschied steckt vollständig darin, was der Server mit dem macht, was er bekommt.

Was hier schiefging: alg: none

Eine Signatur, die du nicht prüfst, ist keine Signatur, sondern eine Verzierung. Schlimmer noch: dieser Server lässt den Angreifer selbst in den Kopf des Tokens schreiben, wie geprüft werden soll, und akzeptiert dort die Antwort „gar nicht“. Das ist, als hängtest du den Schlüsselbund an die Türklinke, mit einem Zettel daneben.

Am 31. März 2015 veröffentlichte Tim McLean, dass eine ganze Reihe vielbenutzter Bibliotheken für solche Token genau das taten: alg: none als gültige Wahl durchlassen. In Kapitel 6 steht, warum das so wehtut — der ganze Sinn eines öffentlichen Schlüssels ist, dass jeder prüfen kann. Hier hätte es jeder gekonnt, und niemand hat es getan.

Das ist Mathematik: warum ein Schlüssel zweimal benutzt alles zertrümmert

Nimm Rätsel 3 in Symbolen. Nachricht a und Nachricht b gehen beide durch denselben Schlüsselstrom k:

c1 = a ⊕ k

c2 = b ⊕ k

c1 ⊕ c2 = (a ⊕ k) ⊕ (b ⊕ k) = a ⊕ b

Diese letzte Zeile ist das ganze Rätsel. XOR darfst du in beliebiger Reihenfolge machen, und kk = 0 — das ist die Regel aus Kapitel 4, hier zweimal angewendet. Der Schlüssel fällt weg. Was übrig bleibt, enthält kein einziges geheimes Bit mehr: es sind zwei Nachrichten, die einander zudecken, und Deutsch deckt Deutsch schlecht zu.

Das Verrückte ist, dass XOR mit einem Schlüsselstrom mathematisch perfekt ist, solange du ihn einmal benutzt. Claude Shannon hat das 1949 bewiesen: ist der Schlüssel genauso lang wie die Nachricht, echt zufällig und einmalig, dann ist aus dem Geheimtext nichts herauszuholen. Nicht „schwierig“ — nichts. Das heißt ein One-Time-Pad, und es ist die einzige Geheimschrift, von der bewiesen ist, dass sie unknackbar ist. Das Wort one-time macht die ganze Arbeit.

Das ist keine Theorie geblieben. 1942 machte die sowjetische Druckerei unter Kriegsdruck rund 35.000 doppelte Seiten solcher Schlüsselheftchen. Amerikanische Codeknacker merkten das und konnten dadurch jahrelang Nachrichten mitlesen — das VENONA-Projekt, das am 20. Dezember 1946 seinen ersten Durchbruch hatte. Von Hunderttausenden abgefangenen Nachrichten sind noch keine 3.000 ganz oder teilweise gelesen worden, und das reichte, um Spionagenetze aufzudecken. Eine wiederverwendete Seite nach der anderen.

Das ist Informationstheorie: das Fach, das misst, wie viel Information wirklich in einer Nachricht steckt, ebenfalls von Shannon gegründet. Es erklärt, warum ab zu lesen ist und ak nicht — nicht weil die eine Summe schwerer wäre, sondern weil deutscher Text vorhersehbar ist und Zufall nicht.

Wo das aufhört. Was du hier gemacht hast, machst du an deinen eigenen Sachen oder in einer Umgebung, die dafür gebaut ist. Diese Umgebungen gibt es: die CTF-Wettbewerbe aus Über diese Seite sind genau das, aber ein ganzes Wochenende lang und mit Hunderten anderen. Auf einem System, das nicht dir gehört, ist es strafbar — in Belgien Artikel 550bis des Strafgesetzbuchs, eingeführt durch das Gesetz vom 28. November 2000. Du musst dafür nichts kaputt machen und nichts stehlen: eindringen, wo du nicht darfst, reicht schon. Der Unterschied zwischen beidem ist keine Frage des Könnens, sondern der Erlaubnis.