Schwarzladen III: Mit USB zum Profit


Nach den Schwachstellen der NFC-Karten und des OCPP-Protokolls schauen wir nun genauer in die Ladestation selbst. Kurioserweise haben viele Ladestationen einen eingebauten USB-Port, der für den Betreiber die Möglichkeit bietet, Softwareupdates einzuspielen oder Konfigurationen zu ändern. Natürlich macht jeder Hersteller hier etwas anderes — die folgenden Überlegungen sind also nicht allgemeingültig. Das folgende Bild zeigt die USB-Ports einer KEBA P30 (links) und einer Hager WittyPark (rechts):

USB-Ports in Ladestationen

Im Folgenden erläutere ich Angriffe auf die beiden Ladestationen, die einfach durch das Einstecken eines USB-Sticks durchführbar sind. Bei beiden Modellen muss man lediglich ein paar Schrauben lösen und hat so Zugang zu den USB-Ports. Faiererweise muss man allerdings sagen, das es auch Ladestationen gibt, die durch ein brauchbares Schließsystem gesichert sind und so der Zugang zum USB-Port nicht so einfach möglich ist.

Hager WittyPark

Bei den WittyPark-Ladestationen von Hager kann man einfach einen FAT-formatierten USB-Stick in den USB-Port in der Ladestation stecken. Der USB-Port ist, wenn man den Deckel von der Ladestation entfernt hat, frei zugänglich.

USB-Stick in Hager Ladestation

Auf dem Stick wird dann eine Datei angelegt, in der neben z.B. der Firmwarerevision und weiteren Konfigurationseinstellungen auch die Netzwerkkonfiguration inklusive der URL und der Zugangsdaten des OCPP-Backends dokumentiert sind:

Konfiguration von Hager-Ladestationen

Damit könnte man nun einen Man in the Middle-Angriff vorbereiten oder einfach nie stattgefundene Ladevorgänge simulieren. Aber man kann auch die Einstellungen der Ladestation selbst ändern: Einfach die Logdatei nach einem gewissen Schema umbenennen und die Einstellungen wie gewünscht anpassen. Dann den USB-Stick wieder in die Ladestation einstecken — und die Ladestation übernimmt und speichert die neue Konfiguration.

Das ist natürlich für den Wartungstechniker sehr bequem, allerdings leider auch für potentielle Angreifer. Meines Wissens nach ist es bei den Hager-Stationen auch nicht möglich, den USB-Port für derartige Konfigurationsänderungen zu sperren.

Keba P30

Auch die KEBA P30 (x-series) lässt das Ändern von Konfigurationseinstellungen über USB zu, allerdings kann man diese Funktion abschalten. Allerdings kann man bei beiden Ladestationen auch Firmwareupdates über USB einspielen — und bei der KEBA-Station gibt es hierbei erhebliche Lücken. Im folgenden Video zeige ich, wie man die Ladestation über ein Firmwareupdate manipulieren kann:

Man erreicht den USB-Port der Ladestation, nachdem man insgesamt 6 Schrauben gelöst hat. Der USB-Stick enthält im Unterverzeichnis UPD eine Datei namens pwned.keb. Die Dateiendung deutet auf ein Firmwareupdate von KEBA hin. Effektiv handelt es sich dabei aber nur um eine ZIP-Datei. Der Updateprozess der Ladestation funktioniert so:

  1. Die .keb-Datei wird auf das interne Dateisystem der Ladestation kopiert und dort ausgepackt.
  2. Die Datei install.bsh enthält ein Script für die Beanshell, einer Scriptsprache für die Java-Umgebung. Dort wird zunächst etwas Infrastruktur für das Firmwareupdate zusammengebaut.
  3. Danach sucht das Script im Unterverzeichnis firmware nach weiteren .bsh-Dateien und führt diese aus.

Dieser Prozess ist natürlich sehr einfach zu manipulieren, da die ZIP-Datei nicht verifiziert wird. Ich habe also einfach ein eigenes Updatepaket (pwned.keb) mit der gleichen Struktur erstellt. Das Script install.bsh vereinfache ich lediglich etwas, aber die Funktion bleibt im Wesentlichen unverändert.

Struktur von KEBA-Firmwareupdates

In der Datei /firmware/run-reverse-shell.bsh kopiere ich ein einfaches Shellscript via Stringkonkatenation zusammen, speichere es, mache die Datei ausführbar und starte das Skript. Und tatsächlich öffnet sich auf einem angeschlossenen Rechner eine Rootshell:

KEBA-Rootshell

Damit hat man nun die volle Kontrolle über die Ladestation. Man kann z.B. wie im Video gezeigt direkt auf das Display zugreifen:

/home/keba/scripts/pdcDisplayArgs.sh "Heute\$gratis\$laden!" 4 4

Das ist allerdings auch eine Funktion, die man über die UDP-Schnittstelle der Ladestation abrufen kann. Viel interessanter ist natürlich, welche Informationen auf der Ladestation selbst gespeichert sind. Via

# grep "principal" /opt/KemoveCPM/var/logs/kemove.log
  principal: "BAAAAAAD"
  principal: "BAAAAAAD"
    ...

findet man z.B. die Kartennummern der vorangegangenen Nutzer der Ladesäule, hier aus meinen Tests lediglich die Nummer BAAAAAAD.

Fazit

Die von mir untersuchten Ladestationen weisen erhebliche Sicherheitsschwachstellen auf. Da die Systeme bereits in signifikanten Stückzahlen im Feld installiert wurden dürfte es schwierig sein, diese Schwachstellen zeitnah zu beheben. Insbesondere das Auslesen der Ladekartennummern aus KEBA-Stationen ist eine Schwachstelle, bei der mir die sprichwörtlichen Haare zu Berge stehen.

Für einen Angreifer ist es sehr einfach, einen USB-Stick so zu präparieren, das die Kartennummern nach dem Einstecken gesucht und wieder auf den USB-Stick kopiert werden. Die Abdeckungen zu demontieren dauert vielleicht 30 Sekunden, das kopieren nochmal 30 Sekunden, und die abschließende Montage der Abdeckungen weitere 30 Sekunden. Dabei von einem sicheren Ladesystem zu sprechen finde ich absurd.


Mathias Dalheimer

Yours truly.

likes distributed & embedded systems

GPG key: B6501625
fingerprint: E7BA B68E A2D3 9B6A ECEF 4DE4 823E 0DBE B650 1625
github | twitter


Proudly made using vim, jekyll, bootstrap (cosmo theme) & coffee. Last update: 08 Jan 2018