hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md
2023-06-06 18:56:34 +00:00

11 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Você pode fazer um usuário enviar uma solicitação HTTP POST para a porta 9100 de vários IPs tentando alcançar uma porta de impressão bruta aberta. Se encontrada, o cabeçalho HTTP é impresso como texto simples ou descartado com base nas configurações da impressora. No entanto, os dados POST podem conter trabalhos de impressão arbitrários como comandos PostScript ou PJL a serem interpretados.

Impressão avançada entre sites

Você pode usar objetos JavaScript XMLHttpRequest (XHR), conforme definido em para realizar solicitações HTTP POST para impressoras internas. Uma limitação da abordagem de impressão entre sites discutida até agora é que os dados só podem ser enviados para o dispositivo, não recebidos por causa da política de mesma origem. Para contornar as restrições da política de mesma origem, você pode fazer o servidor responder com uma resposta HTTP falsa, mas válida, permitindo solicitações CORS (incluindo Access-Control-Allow-Origin=*). Uma visão esquemática do ataque é apresentada abaixo:

Impressão avançada entre sites com falsificação de CORS

Nessa variante aprimorada de XSP - combinada com falsificação de CORS - um atacante da web tem acesso total à resposta HTTP, o que permite extrair informações arbitrárias, como trabalhos de impressão capturados do dispositivo de impressora. Um trecho de código JavaScript de prova de conceito é mostrado abaixo:

job = "\x1B%-12345X\r\n"
    + "%!\r\n"
    + "(HTTP/1.0 200 OK\\n) print\r\n"
    + "(Server: PostScript HTTPD\\n) print\r\n"
    + "(Access-Control-Allow-Origin: *\\n) print\r\n"
    + "(Connection: close\\n) print\r\n"
    + "(Content-Length: ) print\r\n"
    + "product dup length dup string cvs print\r\n"
    + "(\\n\\n) print\r\n"
    + "print\r\n"
    + "(\\n) print flush\r\n"
    + "\x1B%-12345X\r\n";

var x = new XMLHttpRequest();
x.open("POST", "http://printer:9100");
x.send(job);
x.onreadystatechange = function() {
  if (x.readyState == 4)
    alert(x.responseText);
};

Limitações do cross-site printing

Observe que o PCL como linguagem de descrição de página não é aplicável para spoofing de CORS porque permite apenas um único número ser ecoado. O PJL também não pode ser usado porque infelizmente ele adiciona @PJL ECHO a todas as strings ecoadas, o que torna impossível simular um cabeçalho HTTP válido. Isso, no entanto, não significa que os ataques XSP aprimorados estejam limitados a trabalhos PostScript: o PostScript pode ser usado para responder com um cabeçalho HTTP falsificado e o UEL** pode ser invocado para mudar a linguagem da impressora**. Dessa forma, um atacante da web também pode obter os resultados para comandos PJL. Existem duas armadilhas de implementação que merecem ser mencionadas: primeiro, um Content-Length correto para os dados a serem respondidos precisa ser determinado com PostScript. Se o atacante não puder prever o tamanho geral da resposta e a codificação em blocos também não for uma opção, ela precisará definir um valor muito alto e usar preenchimento. Em segundo lugar, adicionar o campo de cabeçalho Connection: close é importante, caso contrário, as conexões HTTP/1.1 são mantidas vivas até que o cliente da web ou o dispositivo de impressora acione um tempo limite, o que significa que a impressora não estará acessível por algum tempo.

Se o dispositivo de impressora suportar impressão de texto simples, o cabeçalho da solicitação HTTP do XHR é impresso como cópia impressa - incluindo o campo de cabeçalho Origin contendo a URL que invocou o JavaScript malicioso, tornando difícil para um atacante ficar em silêncio. Isso é inevitável, pois não ganhamos controle sobre a impressora - e em algumas circunstâncias podemos desativar a funcionalidade de impressão - até que o corpo HTTP seja processado e o cabeçalho HTTP já tenha sido interpretado como texto simples pelo dispositivo de impressora. Se reduzir o ruído for uma prioridade, o atacante pode, no entanto, tentar desativar a funcionalidade de impressão primeiro com comandos PJL proprietários, conforme proposto em PJL jobmedia usando outros canais XSP potenciais como IPP, LPD, FTP ou o servidor web incorporado da impressora. Embora todos os protocolos possam ser testados com sucesso para implantar trabalhos de impressão usando variantes de script entre protocolos, eles têm algumas desvantagens além de não fornecerem feedback usando cabeçalhos CORS falsificados:

  • O acesso entre protocolos às portas LPD e FTP é bloqueado por vários navegadores da web
  • Os parâmetros para impressão direta no servidor web incorporado são específicos do modelo
  • O padrão IPP requer que o Content-type para solicitações HTTP POST seja definido como application/ipp, o que não pode ser feito com objetos XHR - no entanto, cabe à implementação realmente se importar com tipos incorretos

Uma comparação dos canais de impressão entre sites é apresentada abaixo:

Canal Porta Sem feedback Impressões não solicitadas Padronizado Bloqueado por
Raw 9100 - -
Web 80 - - -
IPP 631 - -
LPD 515 - FF, Ch, Op
FTP 21 - FF, Ch, Op, IE

Um grande problema do XSP é encontrar o endereço correto ou o nome do host da impressora. Nossa abordagem é abusar do WebRTC, que é implementado na maioria dos navegadores modernos e tem a função de enumerar endereços IP para interfaces de rede locais. Dado o endereço IP local, objetos XHR são usados para abrir conexões com a porta 9100/tcp para os 253 endereços restantes para recuperar o nome do produto da impressora usando PostScript e spoofing de CORS, o que leva apenas alguns segundos em nossos testes. Se a impressora estiver na mesma sub-rede que o host da vítima, seu endereço pode ser detectado apenas usando JavaScript. O WebRTC está em desenvolvimento para o Safari e é suportado pelas versões atuais do Firefox, Chrome e Microsoft Edge. O Internet Explorer não tem suporte ao WebRTC, mas o VBScript e o Java também podem ser usados para vazar o endereço IP local. Se o endereço da interface local não puder ser recuperado, aplicamos uma abordagem de força bruta inteligente: tentamos conectar à porta 80 do roteador da vítima usando objetos XHR. Para isso, foi compilada uma lista de 115 endereços de roteador padrão de vários recursos acessíveis pela Internet. Se um roteador estiver acessível, escaneamos a sub-rede em busca de impressoras, conforme descrito anteriormente.

Prova de conceito

Uma implementação de prova de conceito que demonstra que os ataques avançados de impressão entre sites são práticos e uma ameaça real para empresas e instituições está disponível em hacking-printers.net/xsp/

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥