# Pentesting de Impressoras
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**](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 do** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do 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 do github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Por favor, note que **a maior parte do conteúdo de todas as informações relacionadas a \_Pentesting de Impressoras**\_\*\* \*\* foi retirada **de** uma **pesquisa extensa** e **incrível** que você pode encontrar em [**http://hacking-printers.net/**](http://hacking-printers.net). Tentei **resumir** essas informações aqui, mas você sempre pode **ir à fonte para aprender mais sobre o tópico**.
## Fundamentos
Abaixo está um esquema que mostra a relação de encapsulamento das linguagens de impressoras:\\
![Encapsulamento de linguagens de impressoras](http://hacking-printers.net/wiki/images/thumb/1/1d/Protocols.png/500px-Protocols.png)
## Protocolos de impressão em rede
**Enviar dados** para um dispositivo de impressão pode ser feito por **cabo USB/paralelo** ou através de uma **rede**. Este wiki foca na impressão em rede, mas a maioria dos ataques apresentados também pode ser realizada contra impressoras locais. Existem vários protocolos exóticos para impressão em rede como o [_NCP_](https://en.wikipedia.org/wiki/NetWare\_Core\_Protocol) da Novell ou [_AppleTalk_](https://en.wikipedia.org/wiki/AppleTalk). No mundo Windows, compartilhamentos de impressoras _SMB/CIFS_ se tornaram bastante populares. Além disso, alguns dispositivos suportam impressão através de protocolos genéricos como _FTP_ ou _HTTP_ para upload de arquivos. Os **protocolos de impressão mais comuns** suportados diretamente por impressoras **em rede**, no entanto, são _**LPD**_, \_IPP**_\*\* e \*\*_**porta bruta 9100** \_ . **Protocolos de impressão em rede podem ser atacados diretamente**, por exemplo, explorando um estouro de buffer no daemon LPD da impressora. No entanto, em muitos cenários de ataque, eles apenas atuam como um **canal** para **implantar código malicioso de linguagem de impressora**. Note que uma **impressora de rede geralmente suporta múltiplos protocolos para ‘imprimir’** um documento, o que amplia a superfície de ataque.
### **Saiba mais sobre** [**porta bruta 9100 aqui**](../9100-pjl.md)**.**
### **Saiba mais sobre** [**LPD em Pentesting 515 aqui**](../515-pentesting-line-printer-daemon-lpd.md)**.**
### **Saiba mais sobre** [**IPP em Pentesting 631 aqui**](../pentesting-631-internet-printing-protocol-ipp.md)**.**
## Linguagens de Controle de Impressoras
Uma linguagem de controle de trabalhos gerencia configurações como bandejas de saída para o trabalho de impressão atual. Embora geralmente atue como uma camada opcional entre o protocolo de impressão e a linguagem de descrição de página, as funções podem se sobrepor. Exemplos de linguagens de controle de trabalhos específicas de fornecedores são [CPCA](http://www.undocprint.org/formats/printer\_control\_languages/cpca), [XJCL](http://www.undocprint.org/formats/printer\_control\_languages/xjcl), [EJL](http://www.undocprint.org/formats/printer\_control\_languages/ejl) e **PJL** – que é suportado por uma variedade de impressoras e será discutido abaixo. Além disso, **linguagens de controle e gerenciamento de impressoras** são projetadas para **afetar** não apenas um único trabalho de impressão, mas o **dispositivo** como um **todo**. Uma abordagem para definir um padrão comum para essa tarefa foi [NPAP](http://www.undocprint.org/formats/printer\_control\_languages/npap). No entanto, não se estabeleceu e é suportado apenas pela Lexmark. Outros fabricantes de impressoras usam SNMP ou sua metalíngua **baseada em PJL**, **PML**.
### PJL
A Linguagem de Trabalhos de Impressora (PJL) foi originalmente introduzida pela HP, mas logo se tornou um padrão de facto para controle de trabalhos de impressão. 'PJL reside acima de outras linguagens de impressoras' e pode ser usada para alterar configurações como bandeja de papel ou tamanho. No entanto, deve-se ressaltar que **PJL não se limita ao trabalho de impressão atual, pois algumas configurações podem ser tornadas permanentes**. PJL também pode ser usada para **alterar o display da impressora ou ler/escrever arquivos no dispositivo**. Existem muitos dialetos, pois os fornecedores tendem a suportar apenas um subconjunto dos comandos listados na referência PJL e preferem adicionar os próprios proprietários. **PJL é ainda usada para definir o formato do arquivo dos dados de impressão reais a seguir**. Sem tal mudança explícita de linguagem, a impressora tem que identificar a linguagem de descrição de página com base em números mágicos. Comandos típicos de PJL para definir o tamanho do papel e o número de cópias antes de mudar o interpretador para o modo PostScript são mostrados abaixo:
```
@PJL SET PAPER=A4
@PJL SET COPIES=10
@PJL ENTER LANGUAGE=POSTSCRIPT
```
Dentro da [**página sobre a porta 9100 'raw port'**](../9100-pjl.md), você pode encontrar mais informações sobre **como enumerar PJL**.
### PML
A **Printer Management Language** (PML) é uma linguagem proprietária para controlar **impressoras HP**. Ela basicamente **combina** as funcionalidades do **SNMP** **com PJL**. Documentação publicamente disponível não foi lançada, no entanto, partes do padrão foram vazadas pelo projeto [LPRng](https://en.wikipedia.org/wiki/LPRng): o **PJL Passthrough to PML and SNMP User’s Guide** define PML como 'um protocolo de gerenciamento de impressora orientado a objetos de solicitação-resposta' e oferece uma introdução aos fundamentos da sintaxe. PML está embutido dentro do PJL e **pode ser usado para ler e definir valores SNMP em um dispositivo de impressora**. Isso é especialmente **interessante** se um **firewall bloqueia** o acesso aos serviços **SNMP** (161/udp). O uso de PML dentro de um trabalho de impressão para recuperar o valor `hrDeviceDescr` (OID 1.3.6.1.2.1.25.3.2.1.3, descrição textual de um dispositivo) é demonstrado abaixo:
```
> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530
```
A parte final da string respondida pela impressora, `6870204c617365724a65742034323530` é hexadecimal para `hp LaserJet 4250`. Como pode ser visto, é possível **invocar** (um subconjunto de) **comandos SNMP sobre PJL via PML**. Um uso de PML sensível à segurança é [redefinir impressoras HP para as configurações de fábrica](./#factory-defaults) através de trabalhos de impressão comuns, removendo assim mecanismos de proteção como senhas definidas pelo usuário.
### UEL
A Linguagem de Saída Universal (UEL) na verdade **não é uma verdadeira linguagem de controle de trabalhos, mas um único comando usado para terminar o fluxo de dados atual**: o caractere de escape (`\x1b`), seguido por `%-12345X`. Foi originalmente introduzido com o PCL da HP e é **suportado pela maioria das impressoras a laser modernas**. Uma boa prática dos 'drivers de impressora' é invocar o UEL no início e no final de cada trabalho de impressão, para que a interpretação da linguagem da impressora seja interrompida/reiniciada e cada trabalho tenha seu próprio ambiente separado, conforme mostrado abaixo:
```
\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X
```
Caso contrário, por exemplo, configurações de PJL como tamanho de mídia de papel ou definições de PostScript definidas em um trabalho de impressão influenciariam o próximo trabalho. **UEL pode ser útil para concatenar vários trabalhos em um único arquivo/datastream enviado para a impressora**. Isso pode ser usado para enganar **contadores de páginas de hardware** ou para mudar a linguagem de impressão em avançados **ataques de impressão cross-site**.
## Linguagens de Descrição de Página
Uma **linguagem de descrição de página** (PDL) especifica a **aparência do documento real**. No entanto, deve-se ressaltar que algumas PDLs oferecem controle de trabalho limitado, então **uma clara demarcação entre linguagem de descrição de página e linguagem de controle de impressora/trabalho nem sempre é possível**. A função de um 'driver de impressora' é **traduzir** o **arquivo** a ser **impresso** em uma **PDL** que seja **entendida** pelo modelo da impressora. Note que algumas impressoras jato de tinta de baixo custo não suportam nenhuma linguagem de descrição de página de alto nível. Impressoras baseadas em host ou [GDI](https://en.wikipedia.org/wiki/Graphics_Device_Interface#GDI_printers) apenas aceitam datastreams de bitmap simples como [ZJS](http://www.undocprint.org/formats/page_description_languages/zjstream), enquanto a renderização real é feita pelo driver da impressora. Existem várias linguagens proprietárias de descrição de página como [PRESCRIBE](http://www.undocprint.org/formats/page_description_languages/prescribe) da Kyocera, [SPL](http://www.undocprint.org/formats/page_description_languages/spl), [XES](http://www.undocprint.org/formats/page_description_languages/xes), [CaPSL](http://www.undocprint.org/formats/page_description_languages/capsl), [RPCS](http://www.undocprint.org/formats/page_description_languages/rpcs), [ESC/P](https://en.wikipedia.org/wiki/ESC/P) que é mais usado em impressoras matriciais ou [HP-GL](https://en.wikipedia.org/wiki/HPGL) e [HP-GL/2](https://en.wikipedia.org/wiki/HPGL#HP-GL.2F2) que foram projetados para plotters. O suporte para impressão direta de [PDF](https://en.wikipedia.org/wiki/Portable_Document_Format) e [XPS](https://en.wikipedia.org/wiki/Open_XML_Paper_Specification) também é comum em impressoras mais novas. **No entanto, as linguagens de descrição de página 'padrão' mais comuns são PostScript e PCL.**
### PostScript (PS)
O termo 'descrição de página' pode ser enganador, pois **PostScript é capaz de muito mais do que apenas criar gráficos vetoriais**. PostScript é uma linguagem de programação baseada em pilha, **Turing-completa**, consistindo de quase 400 operadores para aritmética, manipulação de pilha e gráficos e vários tipos de dados como arrays ou dicionários e foi criada pela Adobe.\
Tecnicamente falando, o acesso a um interpretador PostScript já pode ser classificado como **execução de código** porque qualquer função algorítmica pode teoricamente ser implementada em PostScript. Certamente, sem acesso à pilha de rede ou bibliotecas adicionais do sistema operacional, as possibilidades são limitadas a cálculos matemáticos arbitrários como mineração de bitcoins. No entanto, PostScript é capaz de I/O básico de sistema de arquivos para armazenar código frequentemente usado, gráficos ou arquivos de fonte.\
Originalmente projetado como um recurso, os perigos de tal funcionalidade **eram limitados** antes das impressoras se interconectarem e os riscos eram principalmente discutidos no contexto de interpretadores PostScript baseados em host. Nesse sentido, Encapsulated PostScript (EPS) também é notável, pois pode ser incluído em outros formatos de arquivo para ser interpretado no host, como documentos [LaTeX](https://en.wikipedia.org/wiki/LaTeX). Como **PJL** e **PCL**, **PostScript** suporta **comunicação bidirecional** entre host e impressora.\
Um exemplo de código PostScript para ecoar Hello world no stdout é dado abaixo:
```
%!
(Hello world) print
```
Brother e Kyocera utilizam seus próprios clones de PostScript: **Br-Script** e **KPDL**. Tais variantes da linguagem PostScript não são 100% compatíveis, especialmente no que diz respeito a recursos de segurança como sair do loop do servidor. PostScript pode ser usado para uma variedade de ataques, como [negação de serviço](http://hacking-printers.net/wiki/index.php/Denial\_of\_service) (por exemplo, através de loops infinitos), manipulação de trabalhos de impressão [manipulação](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation) e [retenção](http://hacking-printers.net/wiki/index.php/Print\_job\_retention), bem como ganhar acesso ao [sistema de arquivos](http://hacking-printers.net/wiki/index.php/File\_system\_access) da impressora.
#### Saindo do loop do servidor
Normalmente, cada trabalho de impressão é encapsulado em seu próprio ambiente separado. Uma característica interessante do **PostScript** é que um programa **pode contornar a encapsulação do trabalho de impressão** e alterar a VM inicial para trabalhos subsequentes. Para fazer isso, ele pode usar startjob, um recurso do Nível 2:
```
true 0 startjob
```
ou exitserver (disponível em todas as implementações que incluem um servidor de trabalhos):
```
serverdict begin 0 exitserver
```
#### Redefinição de operador
Quando um documento **PostScript** **chama** um **operador**, a **primeira versão encontrada** na pilha de dicionários é usada. Os operadores geralmente residem no dicionário systemdict, no entanto, ao colocar uma nova versão no dicionário userdict, os operadores podem ser praticamente sobrescritos porque **a versão definida pelo usuário é a primeira encontrada na pilha de dicionários**. Usando os operadores startjob/exitserver, tais mudanças podem se tornar permanentes – pelo menos até que a impressora seja reiniciada. Um esquema da pilha de dicionários PostScript é fornecido abaixo:
\
[![A pilha de dicionários PostScript](http://hacking-printers.net/wiki/images/thumb/f/ff/Dictstack.png/300px-Dictstack.png)](http://hacking-printers.net/wiki/index.php/File:Dictstack.png)
\
O **impacto potencial da redefinição de operadores** é limitado apenas pela criatividade. Quando documentos legítimos adicionais são impressos e chamam um operador redefinido, a versão do atacante será executada. Isso pode levar a vários ataques, como [negação de serviço](http://hacking-printers.net/wiki/index.php/Document\_processing#Showpage\_redefinition), retenção de trabalho de impressão [retenção](http://hacking-printers.net/wiki/index.php/Print\_job\_retention) e [manipulação](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation). Note, no entanto, que isso não é necessariamente um bug de segurança, mas um recurso de linguagem de 32 anos, disponível em quase qualquer impressora PostScript e [RIP](https://en.wikipedia.org/wiki/Raster\_image\_processor).
### PCL
PCL 3 e PCL 4 adicionaram suporte para fontes e macros que podem ser baixadas permanentemente para o dispositivo – no entanto, apenas referenciadas por um id numérico, não por um nome de arquivo, já que **o acesso direto ao sistema de arquivos não é pretendido**. PCL 1 a 5 consistem em sequências de escape seguidas por um ou mais caracteres ASCII representando um comando a ser interpretado. PCL 6 Enhanced ou ‘PCL XL’ usa um protocolo binário codificado, orientado a objetos. Um **exemplo de documento PCL para imprimir ‘Hello world’ é fornecido abaixo**:
```
Hello world
```
Devido às suas capacidades limitadas, o PCL é **difícil de explorar** do ponto de vista da segurança, a menos que se descubram comandos proprietários interessantes na versão PCL de alguns fabricantes de impressoras. A ferramenta **PRET** implementa um **sistema de arquivos virtual baseado em PCL** que usa macros para **salvar o conteúdo e metadados dos arquivos na memória da impressora**. Este hack mostra que até um dispositivo que suporta apenas linguagens de descrição de página minimalistas como o PCL pode ser usado para armazenar arquivos arbitrários, como material que infringe direitos autorais. Embora transformar uma impressora em um serviço de compartilhamento de arquivos não seja uma vulnerabilidade de segurança per se, pode ser considerado como 'uso indevido do serviço', dependendo da política corporativa.
## Ataques Diversos
### Pendrive ou cabo USB
Dados podem ser enviados e recebidos de uma impressora local por cabos [USB](https://en.wikipedia.org/wiki/USB) ou [paralelos](https://en.wikipedia.org/wiki/IEEE_1284). Ambos os canais são suportados pelo **PRET** para se comunicar com o dispositivo. Além disso, impressoras e MFPs frequentemente vêm com portas USB tipo A, que permitem aos usuários imprimir diretamente de um dispositivo USB.\
Enquanto pendrives conectados não oferecem um canal bidirecional, seu uso em uma sala de cópias movimentada pode parecer menos suspeito. Obviamente, explorar impressoras USB requer que o atacante obtenha acesso físico ao dispositivo. No entanto, isso não é completamente irrealista para a maioria das instituições e empresas. Ganhar acesso físico à impressora geralmente é considerado menos difícil do que para outros componentes de rede, como servidores ou estações de trabalho.
### Impressão entre sites
Abusando de **requisições web do cliente**, um atacante pode **abusar de impressoras arbitrárias** dentro da rede interna do cliente conectado à sua página web maliciosa.\
[**Aprenda como isso é possível aqui.**](cross-site-printing.md)
### Abusando do serviço Spooler no AD
Se você encontrar qualquer **serviço Spooler ouvindo** dentro do domínio, você pode ser capaz de **abusar** dele para **obter novas credenciais** e **escalar privilégios**.\
[**Mais informações sobre como encontrar e abusar de serviços Spooler aqui.**](../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
## Escalação de Privilégios
### Padrões de Fábrica
Existem várias maneiras possíveis de **redefinir** um dispositivo para os padrões de fábrica, e esta é uma funcionalidade crítica de segurança, pois **sobrescreve mecanismos de proteção** como senhas definidas pelo usuário.\
[**Aprenda mais aqui.**](factory-defaults.md)
### **Bypass de Contabilidade**
Você pode ser capaz de **se passar por usuários existentes ou inexistentes** para imprimir páginas usando suas contas ou **manipular** o **contador** de hardware ou software para poder imprimir mais páginas.\
[**Aprenda como fazer isso aqui.**](accounting-bypass.md)
### **Scanner e Fax**
Acessando as funcionalidades de Scanner ou Fax, você pode ser capaz de acessar outras funcionalidades, mas tudo isso depende do fornecedor.\
[**Aprenda mais aqui.**](scanner-and-fax.md)
## **Acesso ao Trabalho de Impressão**
### **Retenção de Trabalho de Impressão**
Trabalhos podem ser **retidos na memória** e ser **impressos** novamente em um **momento posterior a partir do painel de controle**, ou usando **PostScript** você pode até **acessar remotamente todos os trabalhos que vão ser impressos, baixá-los** e imprimi-los.\
[**Aprenda mais aqui.**](print-job-retention.md)
### **Manipulação de Trabalho de Impressão**
Você pode **adicionar novo conteúdo** às páginas que estão sendo impressas, **mudar todo o conteúdo** que vai ser impresso ou até **substituir apenas certas letras ou palavras.**\
[**Aprenda como fazer isso aqui.**](print-job-manipulation.md)
## **Divulgação de Informações**
### **Acesso à Memória**
Você pode ser capaz de **despejar** a memória **NVRAM** e **extrair informações sensíveis** (como senhas) de lá.\
[**Leia como fazer isso aqui.**](memory-access.md)
### **Acesso ao Sistema de Arquivos**
Você pode ser capaz de **acessar o sistema de arquivos** abusando de **PJL** ou **PostScript**.\
[**Leia como fazer isso aqui.**](file-system-access.md)
### **Divulgação/Força Bruta de Credenciais**
Você pode ser capaz de **divulgar a senha** sendo usada abusando de **SNMP** ou das configurações de **LDAP** ou você poderia tentar **força bruta em PJL** ou **PostScript**.\
[**Leia como fazer isso aqui**](credentials-disclosure-brute-force.md)**.**
## **Execução de Código**
### **Buffer Overflows**
Vários **buffer overflows** já foram **encontrados** em **entradas PJL** e no **daemon LPD**, e pode haver mais.\
[**Leia isso para mais informações.**](buffer-overflows.md)
### Atualizações de Firmware
Você pode ser capaz de **fazer a impressora atualizar o driver para um malicioso** especialmente criado por você.\
[**Leia isso para mais informações.**](firmware-updates.md)
### **Pacotes de Software**
Os fabricantes de impressoras começaram a introduzir a **possibilidade de instalar software personalizado em seus dispositivos** mas as informações não estão disponíveis publicamente. A funcionalidade de escrever software personalizado que roda em impressoras foi intencionada e é reservada para revendedores e contratados.\
[**Leia mais sobre isso aqui.**](software-packages.md)
## **Negação de Serviço**
### **Canal de Transmissão**
Ocupar todas as **conexões** e **aumentar** o **tempo de espera** do servidor pode levar a um DoS.\
[**Aprenda mais sobre isso aqui.**](transmission-channel.md)
### **Processamento de Documentos**
Você pode usar **PostScript** e **PJL** para realizar **loops infinitos**, **redefinir comandos** para evitar qualquer impressão, **desligar** qualquer funcionalidade de impressão ou até **colocar a impressora em modo offline**.\
[**Aprenda mais sobre isso aqui.**](document-processing.md)
### **Dano Físico**
Alguém poderia **abusar de PJL** ou **PostScript** para **escrever** na **NVRAM** centenas de milhares de vezes com o objetivo de **quebrar o chip** ou pelo menos fazer com que os **parâmetros sejam congelados** nos padrões de fábrica.\
[**Aprenda mais sobre isso aqui.**](physical-damage.md)
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
* Se você quiser 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 do 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 GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).