Neue Features
Im Rahmen dieser Arbeit wurde der Wireshark Display-Filter für das ADS-Protokoll anhand eines Lua-Dissectors erweitert, um ebenfalls die Discovery-Phase sowie den Routenaufbau zwischen zwei
Kommunikationsteilnehmern zu unterstutzen.
Das Skript ads_dissector.lua analysiert alle ADS-Datenpakete die Port 48899 als Quell- oder Zielport haben und das UDP-Protokoll nutzen.
Die Erweiterung des Display-Filters bringt folgende Vorteile mit sich:
Abbildung: Ansicht eines ADS-Datenpakets des Routenaufbaus in Wireshark
Die Abbildung zeigt ein ADS-Datenpaket, welches von einer Engineering Workstation an eine PLC geschickt wurde. Es handelt sich bei der Nachricht um einen Routenaufbau mit verschlüsselten Benutzerdaten (TwinCAT Encryption Byte: 0x0f). Des Weiteren wird angezeigt, welche AmsNetId der Absender nutzt und wie der Name der aufzubauenden Route lautet. Sind die Benutzerdaten verschlüsselt, so werden diese als Hashwerte angezeigt. Für alle null-terminierten Strings, die in der Nachricht genutzt werden, wird ebenfalls die Anzahl der Zeichen als Zusatz-information angegeben.
Der Dissector erweitert den ADS-Display-Filter um folgende Felder:
Gibt den Namen der aufzubauenden Route an.
ads.is_encrypted { (nur Routenaufbau)
Gibt an, ob die Benutzerdaten verschlüsselt (0x0f) oder unverschlüsselt (0x0d) sind.
ads.username { (nur Routenaufbau)
Gibt den Benutzernamen eines Anmeldeversuchs an.
Sind die Benutzerdaten verschlüsselt, so wird ein Hashwert angegeben. Ansonsten erscheint der Benutzername als null-terminierter String im Klartext.
ads.password (nur Routenaufbau)
Gibt das Kennwort eines Anmeldeversuchs an.
Sind die Benutzerdaten verschlüsselt, so wird ein Hashwert angegeben. Ansonsten erscheint das Kennwort als null-terminierter String im Klartext.
ads.loginok { (nur Routenaufbau)
Gibt an, ob ein Anmeldeversuch erfolgreich war (0x0000) oder ob ein Fehler aufgetreten ist (z.B. 0x04007 als Fehlermeldung für falsche Anmeldedaten).
Die Tabelle unten zeigt eine Liste moglicher Fehlercodes.
Einige der angegebenen Felder werden nur in verschiedenen Phasen der Kommunikation genutzt (z.B. ads.hostname während der Discovery-Phase), während andere Felder spezifisch für Anfragen (z.B. ads.is_encrypted) oder Antworten (z.B. ads.loginok) sind.