Statische Analyse von Firmware

Gewinnen von Firmware-Eigenschaften

Angenommen, du bist in den Besitz der Firmware-Datei vom LUPFER gekommen, dann kannst du sie statisch analysieren.

Bei der statischen Analyse von Firmware wird sie ohne Ausführung des Systems untersucht. Dabei wird nach potenziellen Sicherheitslücken oder fehlerhaften Konfigurationen gesucht.

Eine Datei der Firmware liegt im aktuellen Arbeitsverzeichnis des Pentestleitfadens, auf das du über das Terminal zugreifen kannst. Als Erstes solltest du herausfinden, um was für einen Dateityp es sich handelt. Nutze dafür den Befehl:

file <file name>

Es handelt sich also um ein tar-Archiv. Um es weiter zu untersuchen, öffnest du das tar-Archiv mit folgendem Befehl:

tar -xf <filename>

Mit der Option -x werden die Dateien aus einem tar-Archiv extrahiert. Mit -f wird der Name der zu extrahierenden Datei angegeben.

Anschließend lässt sich das Firmware-Archiv untersuchen. Dabei werden die Struktur und Dateien im Archiv analysiert, um potenziell interessante Dateien zu identifizieren. Das ist bereits im Abschnitt zur Reconnaissance beim Remote-Zugriff beschrieben, sodass wir darauf nicht weiter eingehen.

Wichtig ist nur noch der Hinweis, dass die Analyse anderer Firmware-Dateitypen ein etwas anderes Vorgehen erfordern:

  • Für die Analyse einer Binärdatei (.bin) bieten sich folgende Tools an:
    • strings extrahiert lesbare Zeichenfolgen (z. B. hardcodierte Passwörter oder API-Schlüssel).
    • binwalk identifiziert und extrahiert eingebettete Dateisysteme, komprimierte Daten und versteckte Dateien innerhalb von Binärdateien.
  • Eine Abbild-Datei (.img) kann in ein Verzeichnis eingehängt werden, das sich anschließend wie ein entpacktes Archiv untersuchen lässt.
  • Für die Analyse einer Hexadzimaldatei (.hex) bietet sich folgendes Tool an:
    • hexdump: Darstellen des Dateiinhalts in hexadezimaler Form oder der entsprechenden ASCII-Zeichen

Wenn das Dateisystem extrahiert werden kann, können auch Tools eingesetzt werden, die es automatisch untersuchen. Beispiele hierfür sind firmwalker und FACT.

Dekompilieren von Binaries

Bis jetzt hast du in der Firmware nach menschenlesbaren Informationen gesucht. Eine weitere wichtige Quelle sind daneben ausführbare Dateien, also Binaries, die Maschinencode enthalten und damit nicht menschenlesbar sind. Damit eine Binary systematisch auf Fehler, Schwachstellen und andere Qualitätsprobleme untersucht werden kann, muss sie dekompiliert werden.

Das Dekompilieren einer Binary ist der Prozess, bei dem die ausführbare Datei zurück in eine menschenlesbare Form umgewandelt wird, um ihren Quellcode und ihre ursprüngliche Struktur zu analysieren.

Das Dekompilieren kehrt also den Prozess des Kompilierens um:

Decompilation of an executable
Dekompilieren eines Programms in Quellcode

Der rückübersetzte Quellcode entspricht in der Regel nicht exakt dem ursprünglichem Quellcode.
Er ist weniger lesbar, weicht in der Struktur vom Original ab und ist unter Umständen auch unvollständig oder fehlerhaft, wenn der Decompiler nicht alle Informationen korrekt wiederherstellen kann. Gründe dafür sind:

  • Beim Kompilieren gehen Kommentare, Variablennamen und andere Metadaten verloren, sodass sie beim Dekompilieren nicht wiederhergestellt werden können.
  • Compiler-Optimierungen können den dekompilierten Code komplexer und schwerer verständlich machen.
  • Entwickler verwenden Techniken zur Code-Verschleierung, um das Dekompilieren zu erschweren und den Code weniger lesbar zu machen.

Aus diesem Grund kann es notwendig sein, den rückübersetzten Quellcode zu refaktorisieren.

Code refaktorisieren bedeutet, den Quellcode eines Programms zu verändern, ohne dessen funktionale Eigenschaften zu ändern, um seine Struktur, Lesbarkeit, Wartbarkeit und Effizienz zu verbessern.

Dazu gehören folgende Schritte:

  • Kommentare hinzufügen, um komplexe oder unklare Teile des Codes zu dokumentieren
  • Funktionen und Variablen umbenennen, damit die Namen aussagekräftig sind

Softwaretools wie Ghidra oder IDA Free dekompilieren Binaries. Sie bieten zusätzlich weitere Funktionen an, die bei der Code-Analyse helfen. Dies sind unter anderem:

  • Datenflussanalyse: Bei der Datenflussanalyse wird untersucht, wie Daten durch ein Programm fließen. Sie zeigt auf, wie und wo Daten möglicherweise in kritische oder unsichere Abschnitte gelangen, etwa wenn Benutzereingaben nicht ordnungsgemäß validiert oder verarbeitet werden.
  • Kontrollflussanalyse: In der Kontrollflussanalyse wird dargestellt, wie der Programmfluss von einer Anweisung zur nächsten verläuft. Dabei werden die verschiedenen Verzweigungspunkte, Schleifen und Entscheidungen im Code visualisiert, um die Logik und Struktur des Programms besser zu verstehen.

Wir verzichten hier auf das Dekompilieren und Analysieren von Binaries, weil es aufwendig ist. Stattdessen konzentrieren wir uns in der Enumeration auf die dynamische Analyse einer Binary.

Zu beachten ist, dass Computerprogramme urheberrechtlich geschützt sind. Unerlaubtes Dekompilieren kann daher rechtliche Konsequenzen haben.