11 KiB
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
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:
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 comoapplication/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 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.