
PoC for DoS vulnerability CVE-2021-37740 in firmware v3.0.3 of SCN-IP100.03 and SCN-IP000.03 by MDT. The bug has been fixed in firmware v3.0.4.
CVE-2021-37740 ist eine Denial-of-Service-Schwachstelle (DoS), die die Firmware v3.0.3 des KNXnet/IP Secure Routers SCN-IP100.03 und des Interfaces SCN-IP000.03 von MDT betrifft. Ein speziell präparierter KNXnet/IP Secure Frame führt zu einem Gerät, das auf weitere Anfragen nicht reagiert und einen Neustart erfordert, um den normalen Betrieb wiederherzustellen. Dieses Repository enthält einen Proof of Concept, der zeigt, wie der Fehler ausgelöst werden kann, und der ursprünglich für die koordinierte Offenlegung der Schwachstelle entwickelt wurde.
Ein Angreifer kann die Schwachstelle ausnutzen, indem er eine TCP-Verbindung mit dem Zielgerät herstellt und dann einen SESSION_REQUEST-Frame mit einem modifizierten Gesamtlängenfeld sendet, das einen Wert von 0x0259 oder höher enthält. Von der Schwachstelle betroffene Geräte reagieren in keiner Verbindung mehr auf KNXnet/IP Secure Frames. Der SESSION_REQUEST ist der erste Frame, der während des Handshakes des KNXnet/IP Secure Unicast-Protokolls gemäß ISO 22510:2019 gesendet wird. Er soll eine feste Länge von 46 Bytes haben. Der Standard verlangt, dass Frames mit abweichender Länge verworfen werden.
Für die in diesem Repository bereitgestellten Skripte ist Python 3 erforderlich. Das Skript healthcheck.py dient zum Testen, ob das Gerät noch reagiert. Es stellt eine TCP-Verbindung mit dem Zielgerät her und versucht, den KNXnet/IP Secure Unicast-Handshake zu starten. Wenn das Gerät eine Antwort sendet, wird diese als Hexadezimalwert auf stdout ausgegeben. Das Skript poc.py versucht, die DoS-Schwachstelle auszulösen, indem es den ungültigen SESSION_REQUEST-Frame sendet. Wenn ein Gerät anfällig ist, werden nachfolgende Ausführungen von healthcheck.py keine Antwort liefern, es sei denn, das Zielgerät wird neu gestartet.
Die Skripte können mit den folgenden Befehlen ausgeführt werden, wobei <insert IP address> durch die tatsächliche IP-Adresse ersetzt werden muss (z. B. 192.168.2.137).
python3 healthcheck.py -t <insert IP address>
python3 poc.py -t <insert IP address>
Unter Windows muss der Alias für Python möglicherweise von python3 auf python geändert werden. Wenn das Zielgerät den Kontrollendpunkt auf einem anderen Port als 3671 implementiert, muss der Port im Skript entsprechend angepasst werden.
Die Schwachstelle wurde in Firmware v3.0.4 behoben, wie im Änderungsprotokoll für die MDT-Firmware dokumentiert. Die Installation der aktuellsten Firmware behebt das Problem. Anleitungen für das Firmware-Update und die .hex-Datei werden auf der MDT-Website bereitgestellt.
Der Proof of Concept wird unter der MIT-Lizenz vertrieben.
Download:
Änderungen: