hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md
2024-12-12 13:56:11 +01:00

9.6 KiB
Raw Blame History

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

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

Impressão cross-site aprimorada

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

Impressão cross-site avançada com spoofing de CORS

Nessa variante aprimorada de XSP combinada com spoofing de CORS um atacante web tem acesso total à resposta HTTP, o que lhe permite extrair informações arbitrárias como trabalhos de impressão capturados do dispositivo de impressão. Um exemplo 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 da impressão cross-site

Note que PCL como linguagem de descrição de página não é aplicável para spoofing de CORS porque só permite que um único número seja ecoado. PJL também não pode ser usado porque, infelizmente, ele antepõe @PJL ECHO a todas as strings ecoadas, o que torna impossível simular um cabeçalho HTTP válido. No entanto, isso não significa que ataques XSP aprimorados estão limitados a trabalhos PostScript: PostScript pode ser usado para responder com um cabeçalho HTTP falsificado e o UEL pode ser invocado para mudar a linguagem da impressora. Desta forma, um atacante 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 pode prever o tamanho total da resposta e a codificação em partes também não é uma opção, ele precisa definir um valor muito alto e usar preenchimento. Segundo, adicionar o campo de cabeçalho Connection: close é importante, caso contrário, conexões HTTP/1.1 são mantidas ativas até que o cliente web ou o dispositivo da impressora acione um tempo limite, o que significa que a impressora não estará acessível por algum tempo.

Se o dispositivo da impressora suporta impressão de texto simples, o cabeçalho da solicitação HTTP do XHR é impresso como cópia física incluindo o campo de cabeçalho Origin contendo a URL que invocou o JavaScript malicioso, tornando difícil para um atacante permanecer silencioso. Isso é inevitável, pois não ganhamos controle sobre a impressora e sob 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 da impressora. Se reduzir o ruído é uma prioridade, o atacante pode, no entanto, tentar desativar primeiro a funcionalidade de impressão com comandos PJL proprietários conforme proposto em PJL jobmedia usando outros canais XSP potenciais como IPP, LPD, FTP ou o servidor web embutido da impressora. Embora todos os protocolos pudessem ser testados com sucesso para implantar trabalhos de impressão usando variantes de scripting entre protocolos, eles têm algumas desvantagens além de não fornecer feedback usando cabeçalhos CORS falsificados:

  • O acesso cross-protocol a portas LPD e FTP é bloqueado por vários navegadores web
  • Parâmetros para impressão direta pelo servidor web embutido são específicos do modelo
  • O padrão IPP exige 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 preocupar com tipos incorretos

Uma comparação dos canais de impressão cross-site é dada 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 nome do host da impressora. Nossa abordagem é abusar do WebRTC que é implementado na maioria dos navegadores modernos e tem o recurso 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 todos os 253 endereços restantes para recuperar o nome do produto da impressora usando PostScript e spoofing de CORS, o que leva apenas segundos em nossos testes. Se a impressora estiver na mesma sub-rede que o host da vítima, seu endereço pode ser detectado usando apenas 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 para WebRTC, mas VBScript e 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 nos conectar à porta 80 do roteador da vítima usando objetos XHR. Para isso, uma lista de 115 endereços padrão de roteadores de vários recursos acessíveis pela Internet foi compilada. Se um roteador for acessível, escaneamos a sub-rede em busca de impressoras como descrito anteriormente.

Prova de conceito

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

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks: