Technologische Neuigkeiten, Bewertungen und Tipps!

So verwenden Sie Lua Dissector in Wireshark

Wireshark ist eines der weltweit besten Tools zur Erfassung von Netzwerkpaketen und ermöglicht Ihnen, bestimmte Datenpakete abzurufen, damit Sie diese sowohl offline als auch in Echtzeit analysieren können. Betrachten Sie die App als eine Möglichkeit, die durch Ihr Netzwerk fließenden Daten genau zu untersuchen und so Probleme und Unregelmäßigkeiten zu erkennen.

Sie können Dissektoren verwenden, wenn Sie einen bestimmten Teil der Daten eines Pakets analysieren möchten. Wie der Name schon sagt, „zerlegt“ dieser Prozess den Code, sodass Sie bestimmte Aspekte ausblenden können, die Ihre Aufmerksamkeit erfordern. In diesem Tutorial wird erklärt, wie Sie Dissektoren in Wireshark mit der Skriptsprache Lua erstellen und verwenden.

Bevor Sie beginnen – Was Sie über Dissektoren wissen müssen

Obwohl Dissektoren eine schnelle Möglichkeit bieten, Teile eines Datenpakets in Wireshark zu analysieren, müssen sie bestimmte Protokolle befolgen, um effektiv zu funktionieren. Zu diesen Protokollen gehören die folgenden:

  • Jeder Dissektor, den Sie erstellen, muss registriert werden, um einen festgelegten Nutzlasttyp aus einem anderen Protokoll verarbeiten zu können. Um diese Registrierung abzuschließen, müssen Sie Ihrem Dissektor ein „Proto“-Objekt zuweisen, das Sie unten sehen.
  • Wenn Sie einen Dissektor über Wireshark aufrufen, erhält er drei Dinge von der App:
    • TVB-Objekt – Ein TVB-Puffer aus dem Datenpaket.
    • TreeItem-Objekt – Eine Baumwurzel, die einen einzelnen Knoten in einem Datenbaum darstellt.
    • Pinfo-Objekt – Ein Paketinformationsdatensatz.
  • Sie können einen Dissektor nur aufrufen, wenn Ihr Datenpaket mit der DissectorTable übereinstimmt, die Sie für Ihr „Proto“-Objekt festgelegt haben.
    • Sie können diese Anforderung umgehen, indem Sie die Verwendung eines Dissektors über die Funktion „Decode As“ erzwingen. Aber selbst dann können Sie den Dissektor nur erzwingen, wenn die DissectorTable, die Sie für Ihr „Proto“-Objekt festgelegt haben, vom richtigen Typ ist.

Einrichten Ihres Dissektors mit LUA

Da Wireshark in der Programmiersprache C geschrieben ist und diese auch verwendet, sind die meisten Dissektoren ebenfalls in C geschrieben. Sie können jedoch auch Lua verwenden. Diese Skriptsprache ist einfacher als C und daher für Programmieranfänger oder diejenigen, die einfach einen Dissektor mit einer leichteren Sprache erstellen möchten, leichter zugänglich.

Obwohl Ihr Code dadurch einfacher wird, ist der Dissektor, den Sie mit Lua erhalten, normalerweise langsamer als der, den Sie mit C erstellen würden. Dennoch sind dies die Schritte, die Sie befolgen müssen, wenn Sie mit Lua einen Wireshark-Dissektor erstellen möchten.

Schritt 1 – Lua in Wireshark einrichten

Sie müssen Lua einrichten, wenn Sie es noch nicht in Wireshark verwendet haben:

  1. Klicken Sie auf „Hilfe“ und dann auf „Über Wireshark“.
  2. Klicken Sie auf „Ordner“.
  3. Wählen Sie eine der folgenden Optionen, um ein aktives Lua-Skript zu erstellen:
    • Globale Lua-Plugins
    • Persönliche Lua-Plugins
    • Persönlich

Nach der Aktivierung ist Ihr Skript immer verfügbar, wenn Sie Wireshark starten. Jedes Mal, wenn Sie eine Änderung an diesem Skript vornehmen, müssen Sie Wireshark entweder neu starten, um die Änderung zu registrieren, oder „Strg + Umschalt + L“ drücken, um alle Ihre Lua-Skripte neu zu laden und Ihre Änderungen zu aktivieren.

Schritt 2 – Die grundlegenden Schritte zum Erstellen Ihres Dissektors

Wenn Sie bereits mit Lua vertraut sind, können Sie mit den folgenden Schritten Ihr eigenes Dissektor-Skript erstellen, das in Wireshark funktioniert:

  • Deklarieren Sie das Protokoll für Ihren Dissektor. Dazu müssen Sie sowohl einen langen Namen zur Verwendung im Protokollbaum als auch einen Kurznamen festlegen, der als Anzeigefiltername des Dissektors dient.
    • Erstellen Sie die folgenden drei Felder mit den entsprechenden Typen:
    • Frage – Zeigt den Fragetyp.
    • Antwort – Zeigt den Antworttyp an.
  • MessageType – Zeigt an, ob Ihr Paket eine Frage oder eine Antwort anfordert.
  • Registrieren Sie Ihre Felder, damit Wireshark weiß, wie sie angezeigt werden. Ohne registrierte Felder erhalten Sie eine „Lua-Fehler“-Meldung, die normalerweise besagt, dass Ihr Tree Item ProtoField ungültig ist.
  • Erstellen Sie eine Dissektionsfunktion, die die zuvor erwähnten Pinfo (mit Daten zu Ihrem Paket) und Tree Item (erstellt den Baum, den Sie an einen Unterbaum anhängen) enthält. Sie müssen auch einen „Puffer“ erstellen, der über Ihrem TCP sitzt.
  • Geben Sie sowohl das Protokoll als auch den Port an, für die Wireshark den Dissektor verwenden muss. Sie können beispielsweise das Protokoll auf „TCP“ und die Portnummer auf die gewünschte Nummer festlegen.

Schritt 3 – Fügen Sie Ihren Dissektor zu Wireshark hinzu

Im Moment ist Ihr Dissektor wie eine Glühbirne ohne Strom. Er existiert, ist aber nutzlos, bis Sie ihn mit Strom versorgen können. Mit anderen Worten: Ihr Dissektor ist noch nicht zu Wireshark hinzugefügt, Sie müssen ihn also manuell hinzufügen, um ihn mit diesen Schritten zum Laufen zu bringen:

  1. Klicken Sie auf „Hilfe“ und gehen Sie zum Menü „Über Wireshark“.
  2. Wählen Sie die Registerkarte „Ordner“, um eine Liste mit Pfaden für Ihre Lua-Datei zu finden.
  3. Wählen Sie „Persönliche Lua-Plugins“. Erstellen Sie bei Bedarf ein Verzeichnis.
  4. Kopieren Sie die erstellte Lua-Datei und fügen Sie sie in das Verzeichnis „Personal Lua Plugins“ ein. Laden Sie Wireshark neu, um den Dissektor einzuschalten.

Es empfiehlt sich, einen Test Ihres neuen Dissektors durchzuführen, indem Sie einige der erfassten Pakete öffnen. Wireshark sollte eine Nachricht liefern, die den langen Namen anzeigt, den Sie für Ihren Dissektor gewählt haben, zusammen mit Informationen zum Nachrichtentyp (Frage oder Antwort) und dem Ergebnis Ihrer Prüfung.

Einige Beispielcodes

Wenn Sie noch nie einen Dissektor erstellt haben (oder neu bei Lua sind), Wireshark bietet einen praktischen Beispiel-Dissektor zum Ausprobieren:

local p_multi = Proto("multi", "MultiProto");
local vs_protos = {
[2] = "mtp2",
[3] = "mtp3",
[4] = "alcap",
[5] = "h248",
[6] = "ranap",
[7] = "rnsap",
[8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = {
[2] = Dissector.get("mtp2"),
[3] = Dissector.get("mtp3"),
[4] = Dissector.get("alcap"),
[5] = Dissector.get("h248"),
[6] = Dissector.get("ranap"),
[7] = Dissector.get("rnsap"),
[8] = Dissector.get("nbap"),
[9] = Dissector.get("rrc"),
[10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
[11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}
function p_multi.dissector(buf, pkt, tree)
local subtree = tree:add(p_multi, buf(0,2))
subtree:add(f_proto, buf(0,1))
subtree:add(f_dir, buf(1,1))
local proto_id = buf(0,1):uint()
local dissector = protos[proto_id]
if dissector ~= nil then
-- Dissector was found, invoke subdissector with a new Tvb,
-- created from the current buffer (skipping first two bytes).
dissector:call(buf(2):tvb(), pkt, tree)
elseif proto_id

Postdissektoren und verkettete Dissektoren

Wenn Sie die Erstellung von Dissektoren in Lua beherrschen, möchten Sie vielleicht etwas tiefer in die Materie einsteigen. Wireshark bietet zwei weitere Dissektortypen – Postdissektoren und verkettete Dissektoren – die mehr Funktionalität bieten.

Ein Postdissektor ist so etwas wie eine letzte Überprüfung aller Dissektoren, die Sie für ein Paket ausgeführt haben. Sie registrieren ihn, um benachrichtigt zu werden, sobald Wireshark alle anderen Dissektoren aufgerufen hat, die er verwenden soll, und Sie können ihn verwenden, um die Spalten „Protokoll“ und „Info“ zu filtern. Diese Funktion ist besonders nützlich, wenn Sie mehrere Pakete in einer Sitzung herausfiltern möchten, bei der eine lange Lücke zwischen den Datensätzen besteht und Sie nicht jedes Paket einzeln abrufen können.

Das Verketten von Dissektoren erfüllt eine ähnliche Funktion (zumindest in Bezug auf das Filtern durch zuvor verwendete Dissektoren), indem es Ihnen Zugriff auf die Daten eines einzelnen Dissektors gibt. Der Hauptvorteil hierbei ist, dass der verkettete Dissektor nicht jedes Paket erneut durchlaufen muss, sodass Sie ein Ergebnis erhalten, ohne warten zu müssen, bis der ursprüngliche Dissektor erneut ausgeführt wird.

Sezieren in Lua

Da Wireshark bereits die Möglichkeit bietet, Dissektoren in C (seiner natürlichen Sprache) zu erstellen, sehen Sie möglicherweise nicht die Notwendigkeit, sie auch in Lua zu erstellen. Dennoch werden diejenigen, die mit C nicht vertraut sind, sowie diejenigen, die Lua bereits beherrschen, feststellen, dass die leichte Skripterstellung von Lua das Erstellen ihrer Dissektoren erleichtert. Zugegeben, Sie müssen beim Ausführen des Prozesses im Vergleich zu C-basierten Dissektoren eine längere Ladezeit in Kauf nehmen, aber es ist trotzdem hilfreich, diese Option zu haben.

Nun möchten wir von Ihnen hören. Wie oft verwenden Sie Dissektoren in Wireshark? Haben Sie schon einmal versucht, sie in C zu erstellen, und welche Vorteile bietet Ihrer Meinung nach die Erstellung von Dissektoren in Lua? Lassen Sie es uns im Kommentarbereich unten wissen.

Your Header Sidebar area is currently empty. Hurry up and add some widgets.