Päckchen sezieren: Das Protokollanalysetool Wireshark mit Lua erweitern

Für die Analyse seltener oder proprietärer Protokolle lässt sich der Funktionsumfang von Wireshark mit wenigen Handgriffen um geeignete Plug-ins ergänzen.

Lesezeit: 4 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 11 Beiträge

(Bild: asharkyu/Shutterstock.com)

Von
Inhaltsverzeichnis

Mit der wachsenden Anzahl von Komponenten aus dem IoT-Umfeld finden sich in IT-Netzwerken immer häufiger individuell angepasste oder proprietäre Protokolle. Auch einige alteingesessene Hersteller wie die Anbieter von IP-Telefonsystemen setzen teilweise noch auf proprietäre Protokolle, statt standardisierte zu verwenden. Konkret betrifft das beispielsweise die VoIP-Signalisierungsprotokolle New Office Environment (NOE-)IP von Alcatel-Lucent oder Hipath Feature Access (HFA) von Unify, die oft noch anstelle des in RFC 3261 grundlegend standardisierten Session Initiation Protocol (SIP) zur Anwendung kommen. Treten in der Kommunikation mit diesen Protokollen Fehler auf, ist eine Analyse nur schwierig möglich.

Da insbesondere aber IoT-Komponenten häufig gar keine Schnittstellen fürs Debugging bieten oder den Zugriff darauf nur unter hohem Aufwand erlauben, greifen Anwender und Entwickler bei Kommunikationsproblemen gerne auf die Open-Source-Paketanalysesoftware Wireshark zurück. Sie eignet sich auch zum Aufdecken von nicht oder nur unzureichend dokumentierten Kommunikationsmustern und stellt dafür eine Reihe mitgelieferter Protokoll-Parser (Dissectors) bereit. Die sogenannten heuristischen Dissektoren untersuchen den aufgezeichneten Netzwerkverkehr auf erkennbare Muster, um darauf basierend das verwendete Kommunikationsprotokoll zuordnen zu können.

Wie lassen sich diese Dissektoren in der Praxis einsetzen und welche Möglichkeiten bieten sie? Um Anwendern die Suche nach der Nadel im Heuhaufen zu ersparen, lassen sich über sogenannte Display-Filter während oder nach Aufzeichnen des Datenverkehrs die gewünschten Protokolle herausfiltern. Die Display-Filter erkennen zum Beispiel Zuordnungen von UDP- oder TCP-Ports zu einem bestimmten Protokoll. Es lässt sich sogar nach spezifischen Attributen im Protokoll filtern, wenn diese im Dissektor definiert sind. Eine Kernaufgabe besteht jedoch darin, den Protokollbaum und die darin enthaltenen Attribut/Wert-Paare korrekt darzustellen.

Mit den standardmäßig integrierten Dissektoren lassen sich die eingesetzten Protokolle in einigen Fällen jedoch nicht korrekt dekodieren. Dafür lässt sich Wireshark mit vertretbarem Aufwand erweitern – was vielen Anwendern aber gar nicht bewusst ist. Um im Dschungel unstrukturierter Daten nicht den Überblick zu verlieren, besteht die Möglichkeit, eigene Dissektoren als Plug-in zu kreieren. Der Entwurf einer Erweiterung ist auf Grundlage vorhandener Herstellerdokumentation des jeweiligen Protokolls oder des Erkennens von Datenmustern möglich.

Zum Entwickeln der Plug-ins für Wireshark können Anwender auf die Programmiersprache C oder die Skriptsprache Lua zurückgreifen. Im Hinblick auf die Geschwindigkeit sind in Lua geschriebene Dissektoren zwar etwas langsamer als die in C verfassten, dafür ist jedoch der Weg über Lua-Skripting der einfachere. Insbesondere für Protokolle, die einen überschaubaren Funktionsumfang haben und daher auch weniger komplexe Funktionen zur Erkennung der Bestandteile benötigen, bietet es sich an, den eigenen Dissektor über ein kleines Lua-Skript zu erstellen. Bei komplexeren Szenarien und bei häufiger Nutzung des Plug-ins empfiehlt sich hingegen C, um von dessen Performancevorteilen zu profitieren. Der Autor beleuchtet im Folgenden den schnelleren Weg über Lua.

Woran lässt sich in Wireshark erkennen, ob ein passender Dissektor für das genutzte Applikationsprotokoll zur Verfügung steht? Wie im Beispiel in Abbildung 1 zu sehen ist, taucht in der fünften Spalte der Paketliste unter „Protocol“ lediglich UDP, also das Protokoll der Transportschicht, auf. In der Baumstruktur des Pakets in der Mitte erscheint unterhalb der User Datagram Protocols lediglich die Anzahl der Daten-Bytes, jedoch keine Interpretation. Um an dieser Stelle strukturierte Daten in Baumform zur Verfügung zu stellen und entsprechende Attribut/Wert-Paare aus den Nutzdaten zu generieren, ist es notwendig, die Rohdaten näher zu analysieren.

Wireshark-Mittschnitt von Discovery-Paketen von Access-Points, die nicht dekodiert werden können (Abb. 1)

Um einen Dissektor korrekt zur Analyse heranzuziehen, ist eine Referenz eines UDP- oder TCP-Ports im Lua-Skript gegen die DissectorTable oder über die Decode As-Kontextmenüs erforderlich. Wireshark übergibt in diesem Fall drei Objekte als Argumente an die Dissector-Funktion: Der Testy Virtual Buffer (TVB) enthält den Paketpuffer. Als Zweites erfolgt die Übergabe des Objekts packet information record (Pinfo). Darin sind Metadaten wie Zeitstempel und Header-Informationen wie MAC-Adressen, IP-Adressinformationen sowie UDP/TCP/SCTP-Portinformationen enthalten. Last, but not least erfolgt die Übergabe des Tree-Root-Objekts, über das der Aufbau des Menübaums zur Protokollbetrachtung im mittleren Bereich stattfindet.