Wireshark Plugin für S7-Protokoll

Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang2 Wireshark Aufzeichnung zu DS-Read

Das Hochladen mit dem Plugin ist ja ganz schön eigenartig.

@Thomas_v2.1,
So wie es aussieht müsste ich die Bereichskennung 0x01 an der Position, an der bei einer normalen S7-Adresse z.B. 0x84 für den Bereich Datenbausteine steht, ergänzen. Dort dürfte momentan "unknown area" angezeigt werden.

Ja, Thomas, genau da steht unknown Area.
Diese Kennung 0x01 kommt einfach statt der Kennung 0b10000zzz im Bereichsübergreifenden zeiger. Damit wird dieser Zeiger zu einem "Zeiger" auf einen datensatz. Anzahl Bytes (bzw. Char) und Datensatznummer stehen weiter oben.

Fortsetzung folgt gleich.

mfG. klaly
 

Anhänge

  • Wireshark_Aufzeichnung.zip
    3,1 KB · Aufrufe: 30
@Thomas_v2.1,

eine Anwendung zum DS-Schreiben ist u.a. Firmwareupdate für z.B. den CP341.
Dafür brauchst du die Projektiersoftware CP341 und eine passente Firmware.

Mitschnitt folgt.

Auch Firmwareupdate für Profibus und Profinet koppler erfolgen über DS-schreiben/lesen.
Allerdings macht es Step7 anders, wenn das PG direkt am Profinet hängt, dann werden direkt "Profinet Telegramme" zu den Devices geschickt.
Wenn es aber über MPI, oder über einen TCP/IP CP geht, dann gehts es auch über Datensatz lesen/schreiben.

In wie weit diese s7comm Erweiterung für andere nützlich ist kann ich dir nicht sagen.
Ich jedenfalls treffe hin und wieder darauf.

Wenn noch Fragen sind, einfach melden.

mfg. klaly
 

Anhänge

  • CP341_FW-Update_Anfang.zip
    3,3 KB · Aufrufe: 4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es jetzt mit der Bezeichnung "Dataset" für den Bereich eingebaut, siehe Screenshot.
Aber wenn es auch möglich ist darüber ein Firmwareupdate aufzuspielen, entspricht es vlt. eher dem Bereich "Systemdaten"?

Naja, exotisch ist es schon etwas. Aber wenn die Funktion bekannt ist kann man es auch einbauen.
 

Anhänge

  • wireshark-s7comm-dataset.png
    wireshark-s7comm-dataset.png
    80,6 KB · Aufrufe: 37
@Thomas_v2.1,

schön, aber ich denke die Bezeichnungen sind so noch nicht ganz stimmig.
Da muss ich morgen auf der Arbeit mal schaun, wie die Bezeichnungen bei Profibus u. Profinet dafür sind.
So solltest du es dann auch bezeichnen.

Die Sache mit Firmwareupdate ist eher ein Sonderfall.
Mit den Datensätzen kannst du Diagnose machen und auch Module, z.B. Analogmodule zur laufzeit umparametrieren.
Dies geschieht normalerweise aus dem SPS-Programm heraus.
Aber es geht auch über die PG-Kommunikation.

mfg. klaly
 
Hallo,

ich bin auch gerade damit beschäfigt, das s7comm-plus Protokoll zu entwirren. Was hat Siemens da nur verbrochen...

Erst mal allen voran: Vielen Dank für eure hervorragende Leistung was das bisherige Reverse Engineering und den Dissector angeht! Ich bin sehr verwundert, wie fürchterlich Siemens dieses Protokoll designed hat, aber noch mehr überrascht es mich daher was ihr bisher rausfinden konntet.

Nun zu dem, was ich noch rausfinden konnte:

* Ich habe captures, welche _immer_ vor dem Trailer 32 Byte zufällige Wustdaten enthalten (unabhängig von der Funktion, und unabhängig davon, ob es Request/Response/Cyclic ist). Es deutet einiges darauf hin, dass es sich dabei um eine Art Integritätsblock oder Signatur handelt, um Replay Attacken oder unauthorisierte Pakete zu verhindern. Grund für meine Annahme: diese Daten ändern sich selbst dann, wenn der Rest des Pakets - welcher ja im Klartext übertragen wird - gleich bleibt.

Habt ihr solche Pakete auch schon mal beobachten können? Gibt es für die "neuen" S7er wohl eine Art "secure mode"?

Mein erster Ansatz war, über alle möglichen Permutationen eines Pakets Prüfsummen mit verschiedensten (auch sehr exotischen) Prüfsummenverfahren zu bilden, aber keines hat gematcht. Vielleicht verwenden sie noch eine Art geheimen Salt um eine Art HMAC zur Authentisierung der Pakete zu verwenden? Mein nächster Ansatz wird sein, zu versuchen, ob eben diese 32 Byte einer Normalverteilung entsprechen oder nicht - eventuell gibt das ja einen Anhaltspunkt, was sich da drin verbirgt....

* Thomas, du kommentierst in deinem Code, bei zyklischen Paketen käme bei den Feldern unknown1:unknown2 immer nur 0x1000:0x0400 vor. Eben diese captures, welche die 32-Byte Garbage am Ende enthalten, haben 0x7000:0x0400 im unknown1:unknown2 field. Es scheint mir also so, als würde es sich bei unknown1 und unknown2 um eine Art Bitmaske handeln. Handelt es sich aber um Requests / Reads, so bleibt unknown1:unknown2 auf 0x0000:0x0000.

* Ich konnte glaub ich (aber noch nicht wirklich sicher) eine Funktionen identifizieren: 0x04f2. Das kommt bei mir immer kurz vor einer Endsession, wenn cyclic packets subscribed sind. Nach dem 0x04f2 Request+Respone stoppt die PLC mit dem senden ihrer cyclic packets. Also vielleicht eine Art Cyclic Unsubscribe?

* In dem Dissector wird der Trailer genauso gehandelt wie der Header. Aber das DataLength field im Trailer ist _immer_ 0x0000. Ist es dann logisch, das datalength zu nennen? Was wollte Siemens eigentlich mit dem Trailer bezwecken?

* Was haben sie sich nur mit den variable length quantities gedacht? Das ist so tierisch gefährlich. Warum nicht einfach ein Byte Länge und dann die sagen wir Integer-Daten in Big Endian übertragen? Bei fixen Längen, wie z.B. der Symbolic-CRC ist es doch total idiotisch, Variable length quantities zu verwenden?! Noch idiotischer is es, das ganze nicht einmal konsequent durchzuziehen, wenn man es schon macht.

Es ist also echt gefährlich, wie Siemens das Protokoll aufbaut. Wegen der Variable-length Quantities braucht man keine Längenfelder, was das ganze meiner Ansicht nach zu einer hochexplosiven Mischung macht: Ein kleinster Parserfehler, und das ganze fliegt einem um die Ohren. Selbst wenn der Parser passt, und man stellt sich vor, man möchte ein fragmentiertes Telegramm übermittelt und dummerweise ist genau das viertletzte Byte eine 0x72.
- Hmm, haben wir jetzt einen Trailer oder gehört es noch zu den Nutzdaten?
Sehr gefährlich.

So far, so good.

Investigative Grüße :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
* Ich habe captures, welche _immer_ vor dem Trailer 32 Byte zufällige Wustdaten enthalten (unabhängig von der Funktion, und unabhängig davon, ob es Request/Response/Cyclic ist). Es deutet einiges

darauf hin, dass es sich dabei um eine Art Integritätsblock oder Signatur handelt, um Replay Attacken oder unauthorisierte Pakete zu verhindern. Grund für meine Annahme: diese Daten ändern sich

selbst dann, wenn der Rest des Pakets - welcher ja im Klartext übertragen wird - gleich bleibt.

Habt ihr solche Pakete auch schon mal beobachten können? Gibt es für die "neuen" S7er wohl eine Art "secure mode"?

Das habe ich bisher nur bei der 1500er gesehen. Alleine von den Werten her sieht es mir auch nach einer Signatur oder sowas in der Art aus.
Kritik an möglichen Replay-Angriffen beim alten S7-Protokoll gab es zu genüge, da würde ich davon ausgehen dass Siemens da etwas eingebaut hat.
Die Session-Id alleine ist aufgrund des begrenzten Wertebereiches von einem Byte (das andere ist ja immer 0x03) dafür nur bedingt tauglich. Die hat man schnell durchprobiert.

Mein erster Ansatz war, über alle möglichen Permutationen eines Pakets Prüfsummen mit verschiedensten (auch sehr exotischen) Prüfsummenverfahren zu bilden, aber keines hat gematcht. Vielleicht

verwenden sie noch eine Art geheimen Salt um eine Art HMAC zur Authentisierung der Pakete zu verwenden? Mein nächster Ansatz wird sein, zu versuchen, ob eben diese 32 Byte einer Normalverteilung

entsprechen oder nicht - eventuell gibt das ja einen Anhaltspunkt, was sich da drin verbirgt....

In sowas habe ich selber keine Erfahrung. Ich habe aber mit Interesse verfolgt, wie ein paar Leute das Meteo-Time-Protokoll in DCF77 auseinandergenommen haben. Da war der erste Ansatz, eine größe Menge an Logfiles zu sammeln.
Sinnvoll wäre es, bei sowas zumindest die ersten beiden Telegramme (StartSession und das erste Write) mitzuprotokollieren. Denn erst danach werden die Bytes ergänzt. Und für irgendetwas müssen die ganzen Strings die an die SPS geschickt werden ja gut sein.

* Thomas, du kommentierst in deinem Code, bei zyklischen Paketen käme bei den Feldern unknown1:unknown2 immer nur 0x1000:0x0400 vor. Eben diese captures, welche die 32-Byte Garbage am Ende

enthalten, haben 0x7000:0x0400 im unknown1:unknown2 field. Es scheint mir also so, als würde es sich bei unknown1 und unknown2 um eine Art Bitmaske handeln. Handelt es sich aber um Requests / Reads,

so bleibt unknown1:unknown2 auf 0x0000:0x0000.

Ich teste immer noch nur mit einer 1200, und bei der fehlt der "Garbage" / die "Signatur" auch bei den zyklischen Daten. Daher kommen die Werte im Kommentar.

* Ich konnte glaub ich (aber noch nicht wirklich sicher) eine Funktionen identifizieren: 0x04f2. Das kommt bei mir immer kurz vor einer Endsession, wenn cyclic packets subscribed sind. Nach dem

0x04f2 Request+Respone stoppt die PLC mit dem senden ihrer cyclic packets. Also vielleicht eine Art Cyclic Unsubscribe?

Das sieht so aus. Zumindest findet sich dort die Referenznummer wieder. Das Anmelden der Variablen geschieht so wie es aussieht über die Funktion 0x04ca-Block, welche auch beim Upload von Bausteinen verwendet wird.
Da bin ich aber gerade dabei, ich denke mal das wird noch rauszufinden sein.

* In dem Dissector wird der Trailer genauso gehandelt wie der Header. Aber das DataLength field im Trailer ist _immer_ 0x0000. Ist es dann logisch, das datalength zu nennen? Was wollte Siemens

eigentlich mit dem Trailer bezwecken?

Das habe ich erstmal so benannt, weil der Aufbau dann identisch mit dem Header ist. Warum sollte man unnütze 4 Bytes anhängen? Ich verstehe es auch nicht.
Wenn du einen großen Baustein hochlädst lässt sich damit eine Fragmentierung der PDU erkennen - zumindest bei der ersten. Den Trailer gibt es dann nur im letzten Teil der Serie. Dann liest der Partner so lange die Daten ein,
bis er einen Trailer sieht. Ob das zuverlässig ist weiß ich auch nicht. Eigentlich müsste man die 0x72 dann im Bytestrom entsprechend escapen. In Wireshark selber lässt sich die Erkennung glaube ich nicht zuverlässig realisieren, bzw. kann die Erkennung auch fehlschlagen, falls in den Fragmenten das erste Byte im Data-Teil einen bekanntem Code entspricht.

* Was haben sie sich nur mit den variable length quantities gedacht? Das ist so tierisch gefährlich. Warum nicht einfach ein Byte Länge und dann die sagen wir Integer-Daten in Big Endian übertragen?

Bei fixen Längen, wie z.B. der Symbolic-CRC ist es doch total idiotisch, Variable length quantities zu verwenden?! Noch idiotischer is es, das ganze nicht einmal konsequent durchzuziehen, wenn man

es schon macht.
Ich sehe darin auch keinen Sinn, die Ersparnis an Bandbreite dürfte in niedrigen einstelligen Prozentbereich liegen.
Wenn es wenigstens einheitlich wäre, sodass alles >=32 Bit als variable Länge übertragen wird. Aber nicht mal das.

Das "mal so mal so" nervt vor allem Dingen beim Reverse-Engineeren, weil man erst erkennen kann ob es eine variable Länge ist wenn die Werte entsprechend groß werden.

Dagegen hatte das alte S7-Protokoll eine glasklare Struktur.
 
Ich hab hier leider kein Testsystem, sondern bekomme lediglich die captures. Das ist mein großes Problem, denn ich weis nur grob, was während den captures vor sich geht. Sonst könnte ich da selbst etwas mehr rumspielen und Testpakete erzeugen.

Hab mir heute die letzten 32 Byte genauer angesehen: Es ist wohl diskret gleichverteilt. Und gleiche Pakete erhalten unterschiedliche Signaturen, was das ganze schwer macht. Es gibt mir aber auch gewisse weitere Information, dass vermutlich alte Paketinformationen in irgendeiner Art und Weise einfließen. Weist du zufälligerweise ob man die (ich nenns einfach mal so ab jetzt, weil alles darauf hindeutet) Integrität abschalten kann, sprich, ist es optional? Ich bin mal gespannt, ob ich da noch dahinter komm...

Interessant wäre zu wissen, ob zwei StartConnections von einer 1500er die gleiche "initiale" Integrität hätten, dann könnte man versuchen weiter drauf loszugehen.

Bei dem Trailer bin ich auch absolut bei dir - ergibt keinen Sinn.

Auch mit dem Varint erst am >32 Bit bin ich voll bei dir! Evtl. ist es aber absicht. Security by obscurity und so, um eben Reverse Engineering hart (aber nicht unmöglich) zu machen. Selbst wenn es eine Ersparnis bringt, hebt sich die durch die (wenn auch geringe) Rechenlast beim Umrechnen wieder auf... und wie gesagt - ich finds gefährlich...

Auch die Struktur der Read/Write Req/Res geht mir noch nicht ganz ein, bei meinen captures wird da im Moment noch relativ viel fehlinterpretiert, muss da mal genauer schauen, was da los ist.

Schönen Abend!
 
Auch die Struktur der Read/Write Req/Res geht mir noch nicht ganz ein, bei meinen captures wird da im Moment noch relativ viel fehlinterpretiert, muss da mal genauer schauen, was da los ist.

Du meinst mit Anzeige als "malformed packet"? Bei den Telegrammen bei denen wirklich Variablenwerte gelesen / geschrieben werden sollte das eigentlich passen. Bis auf die Erkennung der Fehlercodes wenn z.B. die CRC oder die LID nicht mit dem SPS-Programm übereinstimmen.
Es gibt noch andere Read/Write Telegramme die ein mir bis jetzt unbekanntes Datenformat nutzen, dann schlägt die Erkennung fehl und es wird sozusagen "Schrott" erkannt und ggf. übers Paketende hinaus eingelesen, das würgt Wireshark dann mit "malformed packet" ab.

Ich kann ja noch ein paar Telegramme mit zyklischen Daten einer 1200 ins Repository hochladen, für eine 1500 habe ich aber auch nicht mehr.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also falls Interesse besteht mit einer 1500er rumzuexperimentieren, Ich kann eine an mein Netz hängen und dir übers Internet zugänglich machen... Ich komm im Moment einfach nicht dazu mich näher mit der 1500er zu beschäftigen, sonst würde Ich gern auch in die Protokollanalyse mit einsteigen...
 
Das habe ich erstmal so benannt, weil der Aufbau dann identisch mit dem Header ist. Warum sollte man unnütze 4 Bytes anhängen? Ich verstehe es auch nicht.
Wenn du einen großen Baustein hochlädst lässt sich damit eine Fragmentierung der PDU erkennen - zumindest bei der ersten. Den Trailer gibt es dann nur im letzten Teil der Serie. Dann liest der Partner so lange die Daten ein,
bis er einen Trailer sieht. Ob das zuverlässig ist weiß ich auch nicht. Eigentlich müsste man die 0x72 dann im Bytestrom entsprechend escapen. In Wireshark selber lässt sich die Erkennung glaube ich nicht zuverlässig realisieren, bzw. kann die Erkennung auch fehlschlagen, falls in den Fragmenten das erste Byte im Data-Teil einen bekanntem Code entspricht.

Die 0x72 braucht man nicht zu Escapen, da im Header bereits die Länge bis zum Trailer steht. Somit ist klar, dass jeder Wert 0x72 innerhalb dieser Länge zur Payload gehört.
Evtl. ist der "Trailer" als zukünftige Erweiterung gedacht, um direkt an ein Telegramm ein weiteres Anhängen zu können.

Gruß
Jürgi
 
Die 0x72 braucht man nicht zu Escapen, da im Header bereits die Länge bis zum Trailer steht. Somit ist klar, dass jeder Wert 0x72 innerhalb dieser Länge zur Payload gehört.
Evtl. ist der "Trailer" als zukünftige Erweiterung gedacht, um direkt an ein Telegramm ein weiteres Anhängen zu können.

Gruß
Jürgi

Oh, das ist ein verdammt guter Ansatz! Vielleicht wollten die das tatsächlich damit bezwecken. Das wäre nämlich dann auch konsistent mit der aktuelen 0x0000 im length field des Trailers.

@Jochen: Vielen lieben Dank für dein Angebot. Ich hab bisher noch keine Erfahrung mit dem Programmieren der S7er. Mir mangelt es auch an nötiger (vermutlich teurer...) Software dafür... Aber danke für das tolle Angebot. Ich komm auf dich zurück, sollte es mich weiterbringen!

@Thomas: Doch genau das meine ich, ich hab Write Requests, die z.B. falsch interpretiert werden. Bin gerade noch am herausfinden, woran das liegt. :)

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@juergi: Oh, das ist eine verdammt gute Idee! Vielleicht wollten die das tatsächlich damit bezwecken. Das wäre nämlich dann auch konsistent mit der aktuellen 0x0000 im length field des Trailers, und würde diese Zahl auch erklären.

@Jochen: Vielen lieben Dank für dein Angebot. Ich hab bisher noch keine Erfahrung mit dem Programmieren der S7er. Mir mangelt es auch an nötiger (vermutlich teurer...) Software dafür... Aber danke für das tolle Angebot. Ich komm auf dich zurück, sollte es die Entwirrung des Protokolls weiterbringen!

@Thomas: Doch genau das meine ich, ich hab Write Requests, die z.B. falsch interpretiert werden. Bin gerade noch am herausfinden, woran das liegt.

Viele Grüße
 
Ich habe eine neue Erkenntnis zur Session-Id. Diese muss nicht anhand des Wertes der von der SPS zurückkommt berechnet werden (+ 0x380), sondern kommt direkt aus der SPS zurück. Nur im Format varuint32, also als Wert mit variabler Länge. In den folgenden Telegrammen wird die Id dann als Wert mit 32 Bit fixer Länge verwendet. Die verschiedenen Datentypen machen die Erkennung natürlich schwer nur durch ansehen der Werte erkennbar. Zumindest fallen damit auch zwei unbekannte Bytes raus.

Eine Session wird ebenfalls aufgebaut um diverse andere Dienste zu nutzen, wie zyklische Variablendienste, die Abfrage des Baugruppenzustands, und auch der Bausteinupload scheint über eine Session eingeleitet zu werden.
Bei Sitzungsaufbau sieht es auch so aus, als ob angegeben werden kann wie lange diese gültig ist. Bei den Variablendiensten konnte ich die zugehörige ID schon lokalisieren, genauso wie auch die ID um das Aktualisierungsintervall festzustellen.

Ganz verkehrt scheint die Interpretation zumindest nicht zu sein.
 
Ohje, mit der Session ID hast du vollkommen Recht, hatte da wohl auch Tomaten auf den Augen...

Ich hab gesehen, dass du am WE auch an den cyclic packets weiter gemacht hast.
Bist du dir bei der Cyclic Session ID sicher, dass sich die immer über 4 Byte erstreckt?

Dieses Feld ist ja an und für sich bei anderen Funktionen (z.B. Data Req/Res, StartConn Req/Res) auch vorhanden, und da ist es immer 0x0000.

Wie ich oben schon mal erwähnt hab, glaub ich, dass es nicht Teil der Session ID ist, sondern eher eine Art Bitmaske (Ich konnte in dem Feld 0x1000 und 0x7000 beobachten, daher meine Vermutung auf ne Bitmaske).

Eventuell könnte man sogar Pakete immer konsequent in vier statt in drei Teile aufteilen:

Header -> Data Header -> Data -> Trailer

Über alle Pakete ist der Data Header im Prinzip immer der gleiche (Type of Data, Funktionsnummer (bzw. Cyclic Reference), bisschen was unbekanntes, Sequence Number).
Der Data Header bestimmt quasi, um welchen expliziten Typen es sich bei Data handelt.

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bist du dir bei der Cyclic Session ID sicher, dass sich die immer über 4 Byte erstreckt?
Ja. Weil die Id bei den zyklischen Daten glücklicherweise einen Wert hat der alle 32 Bit benötigt, wie 0x1000006a. Und die Id kommt bei Start-Session von der SPS zurück, und wird auch beim Beenden der Session so verwendet. Darum bin ich überhaupt drauf gekommen dass es varuint32 ist, denn so eine Zahl hat in diesem Format verdächtig viele 8en in den Bytes ;-)

Wie ich oben schon mal erwähnt hab, glaub ich, dass es nicht Teil der Session ID ist, sondern eher eine Art Bitmaske (Ich konnte in dem Feld 0x1000 und 0x7000 beobachten, daher meine Vermutung auf ne Bitmaske).

Eventuell könnte man sogar Pakete immer konsequent in vier statt in drei Teile aufteilen:

Header -> Data Header -> Data -> Trailer

Über alle Pakete ist der Data Header im Prinzip immer der gleiche (Type of Data, Funktionsnummer (bzw. Cyclic Reference), bisschen was unbekanntes, Sequence Number).
Der Data Header bestimmt quasi, um welchen expliziten Typen es sich bei Data handelt.

Ich habe schon einiges vereinheitlichen können. Bei dem was ich am WE gemacht habe, ist die Anzahl der Zeilen zumindest weniger geworden.
Es fallen nur die Telegramme mit den zyklischen Daten aus dem Rahmen. Ich glaube nicht dass sich die in das andere Schema pressen lassen, dazu sieht es mit der Referenz-Id an der Stelle zu gut aus.

Die Angabe einer Variablenadresse bei den zyklischen Daten unterscheidet sich auch von dem Format, welches bei einem 'normalen' Zugriff verwendet wird. Sieht mir so aus als ob das verschiedene Abteilungen bearbeitet haben, und jeder den Teil so gestalten kann wie es ihm gerade gefällt.
 
Hihi,

aah, jetzt seh ich das gerade auch mit der Cyclic Reference, dass die auch bei Antworten genau so wiedergegeben wird, du hast recht...
Ach verdammt, dann muss ich meine Idee mit dem gemeinsamen Data Header wieder verwerfen.

Hmm, jetzt wissen wir also, dass das UNKNOWN1 Field bei Cyclic Daten zu der Cyclic Reference gehört.
Wir wissen auch, dass UNKNOWN1 bei nicht zyklischen Daten IMMER 0x0000 ist. Zumindestens hab ich noch nie was anderes gesehen.

Vielleicht lässt sich ja fest halten, dass es bei nicht zyklischen Daten einfach nur ein Reserved field ist, mit dem etwas rumgepadded wird, damit der (ich nenns jetzt einfach mal so) "Data Header" bei zyklischen genauso groß ist wie bei nicht zyklischen Daten.

VG
 
Das mit den zyklischen Daten müsste eigentlich noch eine andere Bezeichnung bekommen, mir ist dafür nur noch nichts besseres eingefallen.

Nach Aufbau einer Session ist es möglich, dass sich die Teilnehmer Daten ohne Quittungstelegramme zuschicken. Das wird benutzt bei den zyklischen Variablendiensten eines HMIs, oder auch wenn der Baugruppenzustand beobachtet wird.
Beim Bausteinupload kann das PG in Folge dieser Session mehrere PDUs mit dem Bausteindaten ohne Quittung (auf S7commp Ebene) an die SPS schicken.

Da muss ich mal vergleichen, ob diese Telegramme an der von dir erwähnten Stelle auch immer die gleichen Werte haben, und ob das bei einer 1500 auch so ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Huhu,

nochmal zurück zu dem "Integritätsteil" bei den 1500er. Das hab ich heut gefunden:

http://de.slideshare.net/AlexanderTimorin/industrial-protocols-for-pentesters
http://de.slideshare.net/AlexanderTimorin/scada-deep-inside-protocols-and-security-mechanisms
https://github.com/atimorin/scada-tools

Der Kerl hat scheinbar rausgefunden, dass es sich bei der Authentifizierung (ich nehme an, das ist ein Teil der Kommunikation, welcher sich unter den ersten paar Paketen befinden muss) um ein Challenge Response System handelt, mit HMAC und SHA1 als Prüfsummenalgo.
Es liegt also nahe, dass auch für den Rest SHA1 verwendet wurde. (Warum sollte man zig verschiedene Prüfsummenverfahren implementieren)
SHA1 hat als Output 160 Bit, sprich 20 Byte. Wir haben aber 32 Byte Integritätspart am Ende. Stellt sich die Frage, wofür der Rest verwendet werden könnte.

Ich hab meine Captures mal durchgekuckt, solche Authentication Pakete, von denen er spricht aber nicht gefunden.
Hat jemand von euch vielleicht solche Caps?

VG
 
Was in dem Dokument beschrieben wird, geht von einer 1200er aus. Bei einer 1200 (zumindest mit meinem FW-Stand) ist der Passwortschutz nur für PG-Funktionen relevant. HMI-Kommunikation ist immer möglich.
Ich habe mal bei meiner 1200er ein Passwort gesetzt und einen Baustein hochgeladen (siehe Anhang).
Das im Dokument beschriebene "7202000f32" findet man auch wieder. Die Erkennung anhand dieses Wertes ist natürlich nur zufällig richtig, weil es nur die Längenangaben des Datenteile abfragt.

Zumindest weiß ich jetzt, dass die Funktion "0x04f2" nicht "Modify cyclic", sondern "Modify session" heißen sollte, weil damit wohl ganz allgemein der Zustand einer Session bearbeitet werden kann.

Ob das was mit dem Anhängsel der 1500er bei der HMI-Kommunikation gemein hat weiß ich nicht, da ich bei den 1500er Logfiles die mir vorliegen nicht weiß ob dort eine und welche Schutzstufe / Login verwendet wurde.
 

Anhänge

  • V12_1200_Upload-OB1-mit-Passwort-test.zip
    10,5 KB · Aufrufe: 33
Ah cool super, danke dir!

Deine Challenge/Response ist:
e8c952612362b63222c725c400c6b6c47b6204e5 // 5501bdf9a628dc618f00f9e48836ae8e8313d3be

Und dein Passwort lautete test :)

Danke für die Pakete!
 
Zurück
Oben