9.6 KiB
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.
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:
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 comoapplication/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:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o merchandising oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud no github.