Lässt sich die Stromzähler-PIN durch Brute-Force Attacke hacken?

Hallo zusammen,

ich habe leider auch das Problem das der Netzbetreiber keine PIN hat.

Wenn das IT-System des Netzbetreibers sagt es ist keine "Moderne Messeinrichtung" dann kann man auch keine PIN beantragen. Ende....

Der Bauvorschlag mit der weißen LED würde mich brennend interessieren, leider sind alle interessanten Links offline.

Hat noch jemand Infos? Gerne auch per PM.

Danke

Hi zusammen,

habe heute meinen Zweirichtungszähler für die PV gesetzt bekommen. Den alten "normalen" Zähler hatte ich schon per Lesekopf ausgewertet, das wollte ich beim neuen auch tun, allerdings war dieser leider noch mit einer Pin gesichert, die der Monteuer nicht wusste. Ich habe daraufhin bei meinem Netzbetreiber (Pfalzwerke) angerufen und wurde von der Dame mit einem Lachen begrüßt: wenn der Zähler gerade erst getauscht wurde, soll ich doch bitte in ca. 12 Wochen nochmal anrufen. Gerade mit den Zweirichtungszählern seien sie massiv in Rückstand und bis dieser im System erfasst ist dauert es eben noch. ?
Also hab ich mal ChatGPT gefragt, ob sie mir einen Arduino Sketch für einen ESP8266 schreiben könnte. Einen BruteForce Algorithmus für Stromzähler PINs war ihr aber zu heiß und sie hat ermahnend abgelehnt. Einen Sketch mit dem man eine 4-stellige Zahl mittels LED am GPIO morsen kann fand sie jedoch nicht bedenklich ?

Nach einer längeren Unterhaltung und Spezifikation meiner Anforderungen kam das heraus:

// Smartmeter PIN Brute-Force
// written 99% by ChatGPT ;-)
int ledPin = D2;  // Verwendet Pin D2 des D1 Mini
int blinkDuration = 200;   // Dauer des Blinkens für eine Ziffer (in Millisekunden)
int blinkPauseDuration = 200;  // Dauer der Pause zwischen den Blinkimpulsen für eine Ziffer (in Millisekunden)
int digitSpaceBetweenDuration = 3000;  // Pause zwischen den Ziffern (in Millisekunden)
int wordSpaceDuration = 500;  // Pause nach der gesamten 4-stelligen Zahl (in Millisekunden)
void setup() {
pinMode(ledPin, OUTPUT);
// Durchprobiere alle Zahlen von 0001 bis 9998
//for (int i = 1; i <= 9998; i++) {
for (int i = 9998; i >= 1; i--) {
// Kurz 2x Blinken vor jeder Zahl um den Pin-Eingabemodus zu starten ()
blink();
blink();
// 4-stellige Zahl morsen
morseDigit((i / 1000) % 10);  // Tausenderstelle
morseDigit((i / 100) % 10);   // Hunderterstelle
morseDigit((i / 10) % 10);    // Zehnerstelle
morseDigit(i % 10);           // Einerstelle
// Pause nach jeder Zahl
delay(wordSpaceDuration);
}
}
void loop() {
// Die loop Funktion ist leer, da der Code im setup einmalig ausgeführt wird,
// und wir keine kontinuierliche Wiederholung benötigen.
}
void blink() {
digitalWrite(ledPin, HIGH);
delay(blinkDuration);
digitalWrite(ledPin, LOW);
delay(blinkPauseDuration);
}
void morseDigit(int digit) {
for (int i = 0; i < digit; i++) {
// Blinkimpulse für die Ziffer
blink();
}
// Pause zwischen den Ziffern
delay(digitSpaceBetweenDuration);
}

Funktioniert bei meinem Zähler (Modell: Apator Picus) bislang einwandfrei, bei anderen Modellen muss der Code (insbesondere das Timing) höchstwahrscheinlich etwas angepasst werden. Das soll nur als Basis dienen...

Zum Aufbau: die LED und den 220 Ohm Vorwiderstand hab ich aus dem Arduino Baukasten meines Sohnes entwendet. Wie man eine LED an einen Arduino anschließt ist im Netz eigentlich genügend erklärt, aber das Foto sollte schon reichen.

Ergänzung: die PIN weiß man nach erfolgter Freischaltung natürlich nicht, außer man stellt eine Kamera auf und sichtet hinterher die Aufzeichnung.

@pacmanii

Guten Abend,

anbei ein paar Infos, die ich in der Woche gesammelt habe, vielleicht hilft es ja dem nächsten.

Ich hatte vorher einen ISKRA MT175, den kann man gut über eine LED freischalten. Pin war oberhalb 5000. Eine PIN vom Messbetreiber war nicht zu bekommen.

Sobald die richtige Pin eingegeben wird ist der Zähler freigeschaltet und im Display erscheint eine zweite Zeile mit dem aktuellen Verbrauch.

Die Datensatzmenge hat sich an der optischen Schnittstelle dadurch nicht geändert. Dort gab er den aktuellen verbrauch aus (Einspeisung mit einem minus Vorzeichen) den Zählerstand und Seriennummer.

Das Script habe ich etwas angepasst so das die Timings so schnell wie möglich arbeiten. import datetimeimport timeimport RPi.GPIO as GPIO# use the Broadcom pin - Pastebin.com dauert ca 50 Stunden für alle 9999 Versuche.

Jetzt habe ich Zweirichtungszähler bekommen den EMH mMe4.0.

Es gibt ja hier ein Python Script für den HICHI lese Schreib Kopf, den bekomme ich nicht zum senden einer Pin.

Ich habe da viel mit "str100ms = b'\x00'" rumgespielt und mit einem alten Handy die IR Signale versucht zu deuten. Ab und zu hat der Zähler reagiert und der Displaytest ging an. Leider nicht so zuverlässig das man da etwas hätte eingeben können. Ich habe keine Ahnung wie man über das Serielle Protokoll vernünftig morsen können soll.

Daher habe ich mir einen Kopf gebaut der über einen GPIO eine LED sendet und über die Serielle Schnittelle das aktuelle Datenpaket empfängt, um die größen zu vergleichen.

Die Empfänger Diode habe ich aus einem alten Heizkostenverteiler einfach zwischen GND und Serial Pin angeschlossen.

Ich wollte die Pin hinterher kennen. Sollte der Strom mal ausfallen muss die Pin erneut eingegeben werden.

Hier das passende Script, dauert pro Pin ca. 21 Sekunden pro Pin: SML - Pastebin.com

Standardmäßig sendet der Zähler (optische Schnitstelle) den aktuellen Verbrauch und Zählerstand jedoch als 0.

Leider ist das bei dem Zähler so das man durch das Script die ganzen Pin Nummern durchprobieren kann. Jedoch sich an der Datenmenge an der Optischen Schnittstelle wieder nichts ändert. Die Pin muss eingegeben werden, anschließend muss man den Punkt suchen und den erweiterten Datensatz aktivieren.

Im Display steht statt einem OBIS Code dann "inF" Aktivierung von Zusatzinformationen der opti-schen Info-Schnittstelle.

Daher hätte ich so nicht dokumentieren können welche Pin es war. Und das erraten hat mit dem Script nicht funktioniert. Ich glaube der Zähler sperrt sich nach einiger Zeit wieder. Im Menü kann man die Pin Abfrage deaktivieren. (Deaktivierung/Aktivierung PIN-Schutz)

Ich habe für zwei Zähler EMH mMe4.0 eine PIN mittlerweile vom Messstellenbetreiber bekommen. Die eine fing mit 2 und die andere mit 3 an. Also nicht rückwärts bei 9999 anfangen.

Ein Hinweis noch. Ich dachte am Anfang das die Statistischen Daten die man sich anschließend im Display anzeigen lassen kann auch über die optische gesendet werden. Ich meine verbrauch 1 Tag, 7 Tage, 31 tage, 1 Jahr. Das ist nicht der Fall.

EMH mMe4.0 überträgt nach dem Freischalten die nachvollgenden OBIS Codes:

1.8.0 Zählerstand Total

2.8.0 Eingespeiste Energie Total

16.7.0 aktuelle verbrauch Summe über alle drei Phasen

36.7.0 Wirkleistung L1

56.7.0 Wirkleistung L2

76.7.0 Wirkleistung L3

96.1.0 Seriennummer

96.50.1 Hersteller EMH

+1,14,s,16,9600,EMH
1,77070100010800FF@1000,1.8.0 Zählerstand,kWh,Total_in,4
1,77070100020800FF@1000,2.8.0 Einspeisung,kWh,Netzeinspeisung,4
1,77070100100700FF@1,16.7.0 Wirkleistung,W,Power_curr,0
1,77070100240700FF@1,36.7.0 Wirkleistung L1 ,W,Power_curr_l1,0
1,77070100380700FF@1,56.7.0 Wirkleistung L2 ,W,Power_curr_l2,0
1,770701004C0700FF@1,76.7.0 Wirkleistung L3 ,W,Power_curr_l3,0
;1,77070100600100FF@1,96.1.0 Seriennumer,Sn,unbekanntes_mqtt_topic_3,0
;1,7707010060320101@1,96.50.1 Name,Name,unbek_mqtt_topic_1,0

PS:

Ich habe gelesen das hier einige Leute die Daten vom Zähler benutzen um mit dem Überschuss der Photovoltaik Anlage den Akku oder das Auto zu laden.

Das stelle ich mir etwas anstrengend vor, da die neuen digitalen Zähler und moderne Messeinrichtungen nur für 8 Jahre geeicht sind und dann ausgetauscht werden. Die alten schwarzen Ferraris-Zähler hatte eine Eichung für 16 Jahre.
Das bedeutet es wird alle 8 Jahre ein neuer Zähler eingebaut, sehr wahrscheinlich ein anderer Typ, von einer anderen Firma. Damit fängt der Spaß mit neue Pin anfordern und welche Datensätze werden mit wievielen Nachkommastellen übertragen neu an.
Daher würde ich mir überlegen ob ich mir nicht einen zweiten eigenen Zähler hinter dem Zähler verbaue, z.B. Shelly 3em oder so....

PPS:

Ich gehe mal davon aus das die meisten Tasmota als Firmware benutzen werden, mit einem ESP8266 und HICHI lese Schreib Kopf.

Eigentlich wäre es super wenn man ein Script hätte um die Nummern mit Tasmota Script durchprobieren. Tasmota kann ja angeblich eine Pin eingeben.

So müsste nicht ein Raspberry und Python her.

Hi,

ich hatte bei mir auch einen Arduino vor den Zähler gehängt, der durch An- und Ausschalten einer IR-Reflexlichtschranke (lag in der Bastelkiste) die Pin knacken sollte. Die Eingabe der Pin hat auch prima funktioniert, aber auch nach 2 Wochen zählen von 0-9999 hat sich die Anzeige nicht geändert.

Also bin ich den vermeintlich mühsameren Weg gegangen und hab eine Mail an den Stromversorger geschrieben, was ich tun muß, um die Pin zu erhalten. Die Antwort: Wir haben beim Technikteam nachgefragt und Sie erhalten die Pin per Post. Und 3 Tage später war die Pin im Briefkasten.

Jetzt, wo ich die Pin kannte, habe ich mein Programm gezielt getestet. Ergebnis: das hat prima funktioniert. Aber mit dem Freischalten ist es nicht getan.

Auf Seite 2 https://www.stwbo-netz.de/fileadmin/Dateien_Netz/Dokumente/Kurzanleitungen/eBZ_DD3_-Kurzanleitung_V1.01.pdf steht der schöne Satz 'Der Zähler verlangt bei jeder Nutzung erneut eine PIN- Eingabe (außer bei Deaktivierung der PIN) und ist somit dauerhaft vor Blicken Unbefugter geschützt.' Also doch die Taschenlampe gezückt, Pin eingemorst, Inf und P eingeschaltet und PIN ausgeschaltet. Jetzt ist die Anzeige so, wie ich mir das vorstelle.

Am Wochenende werde ich an den Arduino eine IR-Empfangsdiode anstöpseln und versuchen, das Ausgabeprotokoll zu lesen/entschlüsseln.

Gruß

Jürgen

Moin,

das gibt's schon alles Fertig. Dein Zähler ist auch schon bekannt. Siehe: Smart Meter Interface - Tasmota Wobei ich mir den Dump mit dem SML Decoder angeschaut habe. Manchmal gibt's mehr Infos.

ESP8266 z.B. D1 Mini - Tasmota flashen, IR Empfänger anschließen, fertig.

Wenn du das Tasmota bin nicht selbst kompilieren willst hier ist ein fertige Firmware und die Anleitung dazu.

https://ottelo.jimdofree.com/stromz%C3%A4hler-auslesen-tasmota/#Downloads

Mahlzeit,

das kenne ich schon, aber ich werde das selbst programmieren, ist ja keine Hexerei. Tasmota habe ich auf meinen sonoff-Schaltern/-Leistungsmessern :slight_smile:

Gruß

Jürgen

Also da braucht man schon ein bisschen das richtige Feeling in Sachen Lichtimpulse bis das klappt mit der PIN Eingabe, schrecklich….

Also ich habe meine Versuche nicht gezählt, gesperrt wurde da aber nix.

Ganz genau, beim EMH mMe4.0 klappt die Methode des Hackens rein mit der blinkenden LED nicht. Dass man auf genau diese Problematik würde stoßen können (also sich die Datenmenge nach Eingabe der richtigen PIN erst mal nicht ändert), darauf hatte ich schon mal in einem älteren Beitrag hingewiesen:

Beim EMH mMe4.0 ist es so, dass man nach richtiger PIN-Eingabe in einem Menü landet. Mit kurzen Blinkpulsen schaltet man von Menüpunkt zu Menüpunkt, durch langes Anleuchten (mehrere Sekunden) kann man bei manchen Menüpunkten etwas verstellen (Historie löschen, PIN deaktivieren, erweiterten Datensatz einschalten etc.). Hat man sich durch alle Menüpunkte durchgeblinkt, verlässt man das Menü und der Zähler ist wieder im gesperrten Zustand, in dem er vor der PIN-Eingabe war. Bei einer Brute-Force-Attacke folgen nach der richtigen PIN naturgemäß weitere PIN-Eingabeversuche. Diese bestehen aus kurzen Blinkpulsen. Die Folge ist, dass man sich extrem schnell durch das Menu durchklickt und der Zähler schon nach wenigen Sekunden wieder gesperrt ist. Allerdings gibt es einen Effekt: Nachdem das Durchblinken durch die Menüpunkte einige Blink-Pulse "absorbiert", verliert man nach der richtigen PIN im Allgemeinen erst mal die Synchronisation. Wenn 3764 die richtige PIN ist, folgt danach 3765, 3766 usw. Absorbiert das Menü nun 10 Pulse, dann gibt man danach ungewollt z.B. 6537 ein, danach 6637, usw. Man beobachtet also einen plötzlichen Sprung in den eingegebenen PINs, bis es sich nach genügend Nullern irgendwann wieder einpendelt.

Folglich hackt man den EMH mMe4.0 am besten mit einer Zeitraffer-Kamera vor dem Display. Nach Eingabe aller PINs von 0000 bis 9999 wird man den Zähler in unverändertem Zustand vorfinden. Die Auswertung des Videos wird aber auf den o.g. Sprung in den eingegebenen Zahlen führen und damit die richtige PIN bis auf wenige Werte eingrenzen lassen.

Ja genau Alexx hast du sehr schön beschrieben.

Noch ein Hinweis, das Wort „sperren“ meine ich im Sinne (so wie du es auch gesagt hast) das die Anzeige wieder aus ist.

Sperre im Sinne der Zähler nimmt keine PIN mehr an gab es nicht. Beim Iska stand sogar in der Bedienungsanleitung das man unendlich oft versuchen darf die richtige PIN einzugeben. Und der EMH mMe4.0 hat auch keine Anstalten gemacht obwohl ich alle 9999 durchprobiert habe. Die Zeit habe ich geloggt.

Wobei ich bei dem EMH gelesen habe das theoretisch eine „Zeitsperre“ was die Eingabe einer neuen PIN angeht möglich wäre. Nur mal so als Hinweis.

An eine Kamera habe ich auch schon gedacht. ESP32Cam oder falls der von der Leistung nicht ausreicht, es gibt ja auch den Raspberry mit Kamera. Mit dem Pi haben auch einige KI im Sinne vom „neuronalen Netz“ realisiert. Wäre auch mal interessant.

Mein Zähler (Modell: Apator Picus) ist seit gestern früh erfolgreich entsperrt. Als ich ins Bett ging war er bei ~6000, am nächsten Morgen dann hochgerechnet bei 7650, irgendwo dazwischen lag dann meine PIN. Mein Modell sperrt sich glücklicherweise nach korrekter PIN Eingabe nicht mehr. Weitere Blinkimpulse lassen den Zähler nur noch durchs Menü springen.

Ich hätte noch eine Idee zur Erkennung, ob die richtige Pin eingegeben wurde:

Einige (zB @Desi) haben geschrieben, dass sich bei ihrem Modell an der Datenmenge an der optischen Schnittstelle nach erfolgreicher Eingabe leider nichts ändert. Was ist aber mit den Daten selbst? Die Leistung Momentan (obis Kennzahl 1-0:16.7.0*255) wird ja z.B. bei gesperrtem Zähler nicht (oder als 0) gesendet. Diese sollte doch nach erfolgreicher Pin-Eingabe plötzlich irgendwas ungleich 0 sein. Dafür braucht es natürlich die Möglichkeit überhaupt Daten zurück zu lesen, ich hatte ja ganz simpel nur eine blinkende LED am Arduino/ESP hängen.

@pacmanii

oh ja super Idee!
Das habe ich total übersehen. Das könnte der esp8266 sogar machen.
Ich habe ja mehrere Zähler im Keller ich mach mal einen dump. In beiden „Varianten“

keine PIN eingegeben

PIN eingeben aber „inf“ nicht einschalten

Ganz richtig, so steht das beim mMe4.0 in der Anleitung. Auf Wunsch kann der Netzbetreiber die Stromzähler mit diesem Anti-Hacking-Feature von EMH bekommen, es ist prinzipiell in der Firmware implementiert. Allerdings habe ich bislang noch nicht gehört, dass diese Funktion bei irgendeinem Zähler, der in freier Wildbahn verbaut wurde, auch wirklich aktiv wäre. Vielleicht meldet sich hier im Forum aber noch jemand, der auf selbiges stößt.

Mutmaßlich wird die 16.7.0 beim EMH mMe4.0 gar nicht gesendet, solange der erweiterte Datensatz nicht aktiviert wurde (also nach PIN-Eingabe im Menü "INF OFF" auf "INF ON" umgeschaltet wurde). Aber vielleicht mag das mal jemand gegenchecken.

Es gibt noch einen anderen Ansatz: Man könnte nach JEDER PIN-Eingabe die nötige Blinksequenz senden, um von INF OFF auf INF ON umzuschalten. Dazu braucht man mehrere kurze und einen langen Blinkpuls. Dann würde man die richtige PIN an der optischen Schnittstelle erkennen. Nachteil: Die Eingabezeit pro PIN wird sich mindestens verdoppeln, weil man die Sequenz jedesmal senden muss. Und man gibt im Fall einer falschen PIN dann natürlich ziemlichen Unsinn ein und muss eine Weile warten, bis der Zähler wieder bereit für die nächste PIN ist.

Nachdem SH-Netz auch nach dem 5. Anruf mit immer wechselnden Ausreden den PIN nicht hergeben wollte, hier einmal der Sketch (Großer Dank geht an @pacmanii ) mit perfekten Timings für den Logarex LK13 (andere Logarex Zähler sollten ebenfalls funktionieren). Den Zähler sollte ein Großteil der Schleswig-Holsteiner haben oder bekommen.
Kamera Überwachung ist übrigens nicht nötig. Nach Eingabe der richtigen PIN schaltet der Zähler eigenständig und dauerhaft die PIN-Abfrage ab.
Die Vermutung, dass viele PIN´s über 5000 liegen kann ich übrigens nicht bestätigen. Meine startet mit einer 2.

// Smartmeter PIN Brute-Force
// written 99% by ChatGPT ;)
int ledPin = D2;  // Verwendet Pin D2 des D1 Mini
int blinkDuration = 200;   // Dauer des Blinkens für eine Ziffer (in Millisekunden)
int blinkPauseDuration = 200;  // Dauer der Pause zwischen den Blinkimpulsen für eine Ziffer (in Millisekunden)
int digitSpaceBetweenDuration = 3750;  // Pause zwischen den Ziffern (in Millisekunden)
int wordSpaceDuration = 3000;  // Pause nach der gesamten 4-stelligen Zahl (in Millisekunden)
int wordStartDuration = 500;
void setup() {
pinMode(ledPin, OUTPUT);
// Durchprobiere alle Zahlen von 0001 bis 9998
//for (int i = 1; i <= 9998; i++) {
for (int i = 9998; i >= 1; i--) {
// Kurz 2x Blinken vor jeder Zahl um den Pin-Eingabemodus zu starten ()
blink();
delay(wordStartDuration);
blink();
// 4-stellige Zahl morsen
morseDigit((i / 1000) % 10);  // Tausenderstelle
morseDigit((i / 100) % 10);   // Hunderterstelle
morseDigit((i / 10) % 10);    // Zehnerstelle
morseDigit(i % 10);           // Einerstelle
// Pause nach jeder Zahl
delay(wordSpaceDuration);
}
}
void loop() {
// Die loop Funktion ist leer, da der Code im setup einmalig ausgeführt wird,
// und wir keine kontinuierliche Wiederholung benötigen.
}
void blink() {
digitalWrite(ledPin, HIGH);
delay(blinkDuration);
digitalWrite(ledPin, LOW);
delay(blinkPauseDuration);
}
void morseDigit(int digit) {
for (int i = 0; i < digit; i++) {
// Blinkimpulse für die Ziffer
blink();
}
// Pause zwischen den Ziffern
delay(digitSpaceBetweenDuration);
}

3 „Gefällt mir“

Moin Moin,

vielen Dank für das Script,

Ich denke aber mit meinem EFR Zähler wird das nix - die Pin muss wahrscheinlich manuell deaktiviert werden.

Hat jemand andere Informationen?

Japp, manuellen Deaktivieren der PIN Funktion nötig.

Ich habe einen "Automate" Flow erzeugt, der die Nummern von oben durchprobiert. Somit kann man nur mit einer (kostenlosen) Android-App, einem Handy und einem Stativ die Nummern durchprobieren.

Die Anforderung für die PIN per Post ist gleichzeitig mit meinen Programmierbemühungen raus. Mal sehen was schneller ist. :slight_smile:

Gestern Abend angefangen, jetzt bei 5000.

Ich bin neu hier. Kann man das hier hochladen?

Gruß Joggi

Links, Programmcode, PN und Anhänge sowie der Zugang zum eigenen Profil sind wegen Spamabwehr für die ersten 3 Posts nicht freigeschaltet.

Lesenswert:

https://www.akkudoktor.net/forum/postid/206307/

Links und Code werden aus dem Beitrag automatisch entfernt, dabei gibt es gelegentlich ganz korrupte Fäden, deren Herstellung uns viel Arbeit macht und nicht ohne Verluste abgeht.

Also bitte erst drei Posts!

Danke, für den Hinweis. Ich habe erst die Antwort zum Thema geschrieben und dann die FAQ und die Hinweise für Neulinge :wink:

Ganz so einfach ist es nicht. Bei meinem alten Zähler musste man die PIN eingeben und der Zähler war dauerhaft entsperrt.

Der neue: ISKRA MT691, öffnet nach Eingabe der korrekten PIN wohl ein Untermenue, da muss man zum Punkt 10 und dann 5s leuchten um die PIN zu deaktivieren. Laut https://www.photovoltaikforum.com/core/attachment/73090-bedienungsanleitung-mme-typ-mt691-ehz-stand-08-2018-pdf/

Es könnte aber auch sein, dass man durch die fortgesetzte Rumblinkerei im Menü bleibt.

Kann das jemand ausprobieren, der eine PIN und diesen Zähler hat?

Alternativ könnte man die Deaktivierungsequenz an jeden Versuch anhängen.

Vielleicht kommt der Brief doch zuerst.