hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md

86 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
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](http://hacking-printers.net/wiki/images/thumb/c/ce/Cross-site-printing.png/900px-Cross-site-printing.png)
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:
```javascript
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**](./#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](http://hacking-printers.net/wiki/index.php/Document_processing#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/](http://hacking-printers.net/xsp/)
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
</details>