Deutschlands Bester Hacker - Langzeit (Forensics) - Das Writeup

Disclaimer: Im August 2026 fand die Qualifikation für das Finale von Deutschlands Bester Hacker statt, welches ich auf Platz 1 abschließen konnte. Nur zwei Teilnehmer waren in der Lage, alle Challenges zu lösen. Dieses Writeup wurde mit KI auf Basis meiner Notizen erstellt und kann Fehler enthalten, bei Fragen bitte direkt an mich wenden im DBH-Discord.

Wettbewerb Deutschlands Bester Hacker 2026 — Qualifikation
Kategorie Forensics
Punkte 50
Angriffsklasse Temporale SteganografieSteganografieVerbergen von Informationen in unauffälligen Trägerdaten, sodass ihre Existenz nicht erkennbar ist. / Aggregation über Frames
Flag DBH{N1CHT_1M_B1LD_SOND3RN_1N_D3R_SUMM3}

Die Challenge

Ein Videomitschnitt der Kamera Nord, und eine Beschreibung, die fast schon die Lösung ist:

  • sechs Sekunden Dunkelheit
  • Sensorrauschen
  • Zeitstempel im Bild
  • Ermittler haben sich alles Bild für Bild angesehen und nichts gefunden
  • trotzdem gibt es genau für dieses Zeitfenster einen Protokolleintrag

Die Folgerung daraus liegt auf der Hand: Wenn Bild für Bild nichts zu sehen ist, steckt die Information sehr wahrscheinlich nicht in einem einzelnen Frame. Dann muss man die Frames gemeinsam oder über die Zeit auswerten.

Aufklärung

Zuerst die Datei technisch einordnen:

file kamera_nord.mkv
strings -a kamera_nord.mkv | head -200
xxd -l 512 kamera_nord.mkv

Ergebnis: Matroska/MKV, offenbar mit FFV1 kodiert, ungefähr 6 Sekunden Länge. Passt zur Aufgabenbeschreibung.

Der stärkste Hinweis war nicht technisch, sondern textlich:

„Die Ermittler haben sich das Material angesehen, Bild für Bild und nichts gefunden.“

Wenn eine Challenge das so explizit sagt, ist das eine direkte Aufforderung, gerade nicht bei Einzelbildern stehenzubleiben. Dazu kamen „Sensorrauschen“ als offensichtliche Tarnung, „genau dieses Fenster“ im Protokoll als Hinweis auf ein zeitbasiertes Signal, und nur 6 Sekunden Laufzeit — klein genug für eine Vollanalyse aller Frames.

Arbeitshypothese also früh: Die Information steckt in der Veränderung über mehrere Frames. Zu betrachten sind Mittelwert, Differenzen, Summen oder Varianz.

Die Schwachstelle

Erst musste ein Decoder her. Nicht verfügbar waren ffmpeg, ffprobe, mediainfo, mkvinfo und mkvextract; ein Versuch über AVFoundation scheiterte, weil der lokale Stack das FFV1-MKV nicht dekodieren konnte.

VLC war installiert und exportiert im Dummy-Modus pro Frame ein Bild:

'/Applications/VLC.app/Contents/MacOS/VLC' \
  -I dummy \
  --play-and-exit \
  --video-filter scene \
  --vout dummy \
  --aout dummy \
  --scene-format=png \
  --scene-ratio=1 \
  --scene-path=./vlc_frames \
  kamera_nord.mkv \
  vlc://quit

Ergebnis: rund 145 exportierte Frames. Stichproben zeigten genau das, was angekündigt war — dunkles Bild, Rauschen, Zeitstempel oben links. Frameweise kommt man hier nicht weiter.

Der Angriff

Die exportierten Frames habe ich per Python eingelesen und drei Aggregatbilder berechnet:

  • Mittelwertbild
  • Range-Bild (max - min)
  • Standardabweichungsbild

Die drei Karten wurden als PGM erzeugt und danach mit sips in PNG umgewandelt.

Der Treffer war das Standardabweichungsbild. Dort erschien ein schwacher, aber klar lesbarer Schriftzug — die Flag. Das passte auch perfekt zum Stil der Challenge: nicht im einzelnen Bild, sondern in der Summe.

Nicht funktioniert haben dagegen: ffmpeg/ffprobe (nicht verfügbar), mediainfo und mkvinfo (nicht verfügbar), AVFoundation (kann FFV1-MKV nicht öffnen), ein QuickLook-Ansatz und die reine Einzelbildanalyse — letztere war absichtlich eine Sackgasse. VLC war in der Ausgabe nicht ganz sauber und produzierte eine Reihe von Blend-Warnungen, hat die Frames aber korrekt exportiert. Ein guter Hinweis, sich nicht von Tool-Ausgaben irritieren zu lassen, solange das eigentliche Ergebnis stimmt.

Die Flag

DBH{N1CHT_1M_B1LD_SOND3RN_1N_D3R_SUMM3}

Was ich mitnehme

Der Durchbruch war weniger „ein Tool finden“ als „die richtige Frage stellen“:

  • Nicht: „Welcher einzelne Frame ist verdächtig?“
  • Sondern: „Was bleibt sichtbar, wenn ich alle Frames statistisch zusammenfasse?“

Ein sehr schönes Beispiel für zeitbasierte Bildverarbeitung: Die Daten lagen nicht als klassischer versteckter Frame vor, sondern als schwache Struktur im Rauschen, verteilt über die gesamte Sequenz. Der Hinweis „Bild für Bild nichts gefunden“ war im Rückblick fast schon die Lösung selbst.