# Pentesting de Impressoras
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma **empresa de cibersegurança**? 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**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
Por favor, note que **a maior parte do conteúdo de todas as informações relacionadas ao Pentesting de Impressoras** foi retirada **da pesquisa enorme e incrível** que você pode encontrar em [**http://hacking-printers.net/**](http://hacking-printers.net). Tentei **resumir** essa informação aqui, mas você sempre pode **ir à fonte para aprender mais sobre o assunto**.
## Fundamentos
A relação esquemática em relação à encapsulação de linguagens de impressora é dada abaixo:\\
![Encapsulamento de linguagens de impressora](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 impressora pode ser feito por meio de um cabo **USB/paralelo** ou por meio de uma **rede**. Este wiki se concentra 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 o [_AppleTalk_](https://en.wikipedia.org/wiki/AppleTalk). No mundo do Windows, as compartilhamentos de impressoras _SMB/CIFS_ se tornaram bastante populares. Além disso, alguns dispositivos suportam a impressão por meio de protocolos genéricos, como o envio de arquivos _FTP_ ou _HTTP_. No entanto, os **protocolos de impressão mais comuns** suportados diretamente por **impressoras de rede** são _**LPD**_**, \_IPP**_\*\*, e \*\*_**porta bruta 9100** \_ printing. **Os protocolos de impressão em rede podem ser atacados diretamente**, por exemplo, explorando um estouro de buffer no daemon LPD da impressora. Em muitos cenários de ataque, no entanto, eles atuam apenas como um **canal/carregador** para **implantar código malicioso de linguagem de impressora**. Observe que uma **impressora de rede geralmente suporta vários 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 impressora
Uma linguagem de controle de trabalho gerencia configurações como bandejas de saída para o trabalho de impressão atual. Embora geralmente fique 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 trabalho específicas do fornecedor 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, as **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 metalinguagem baseada em **PJL**, **PML**.
### PJL
A Linguagem de Trabalho de Impressora (PJL) foi originalmente introduzida pela HP, mas logo se tornou um padrão de fato para o controle de trabalhos de impressão. 'PJL reside acima de outras linguagens de impressora' e pode ser usado para alterar configurações como bandeja ou tamanho de papel. No entanto, deve-se observar que **PJL não se limita ao trabalho de impressão atual, pois algumas configurações podem ser permanentes**. PJL também pode ser usado para **alterar a exibição da impressora ou ler/escrever arquivos no dispositivo**. Existem muitos dialetos, já que os fornecedores tendem a suportar apenas um subconjunto dos comandos listados na referência PJL e preferem adicionar comandos proprietários. **PJL também é usado para definir o formato de arquivo dos dados de impressão reais a seguir**. Sem essa troca explícita de linguagem, a impressora tem que identificar a linguagem de descrição de página com base em números mágicos. Os comandos PJL típicos 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 **Linguagem de Gerenciamento de Impressoras** (PML) é uma linguagem proprietária para controlar **impressoras HP**. Basicamente, **combina** as características do **SNMP** **com PJL**. A documentação disponível publicamente não foi divulgada, no entanto, partes do padrão foram vazadas pelo projeto [LPRng](https://en.wikipedia.org/wiki/LPRng): o **Guia do Usuário do PJL Passthrough para PML e SNMP** define PML como "um protocolo de gerenciamento de impressora de solicitação-resposta orientado a objetos" e dá uma introdução aos conceitos básicos da sintaxe. PML é incorporado dentro de 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 que recupera 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 traseira 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 sensível à segurança do PML é [redefinir as impressoras HP para os padrões de fábrica](./#factory-defaults) por meio de trabalhos de impressão comuns, removendo assim mecanismos de proteção como senhas definidas pelo usuário.
### UEL
A Linguagem Universal de Saída (UEL) na verdade **não é uma 'linguagem' real de controle de trabalhos, mas um único comando usado para encerrar 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, como mostrado abaixo:
```
\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X
```
Caso contrário, por exemplo, as configurações PJL, como o tamanho do papel ou as definições 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 alternar o idioma de impressão em **ataques de impressão entre sites**.
## 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 destacar que algumas PDLs oferecem controle limitado de trabalhos, então **uma demarcação clara entre a descrição da página e a 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 é **compreendida** pelo modelo de impressora. Observe que algumas impressoras jato de tinta de baixo custo não suportam nenhuma linguagem de descrição de página de alto nível. As impressoras chamadas baseadas em host ou [GDI](https://en.wikipedia.org/wiki/Graphics\_Device\_Interface#GDI\_printers) aceitam apenas fluxos de dados 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 de descrição de página proprietárias, como a [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 é usado principalmente 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 plotadoras. O suporte para impressão direta em [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. **As linguagens de descrição de página mais comuns, no entanto, são o PostScript e o PCL.**
### PostScript (PS)
O termo "descrição de página" pode ser enganoso, pois **o PostScript é capaz de muito mais do que apenas criar gráficos vetoriais**. O PostScript é uma linguagem de programação baseada em pilha, **completa de Turing**, composta por quase 400 operadores para aritmética, manipulação de pilha e gráficos e vários tipos de dados, como matrizes 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, o PostScript é capaz de I/O básico do sistema de arquivos para armazenar arquivos de código, gráficos ou fontes frequentemente usados.\
Originalmente projetado como um recurso, os perigos de tal funcionalidade **eram limitados** antes que as impressoras fossem interconectadas e os riscos fossem discutidos principalmente no contexto de interpretadores PostScript baseados em host. Nesse sentido, o PostScript encapsulado (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.\
O código PostScript de exemplo para ecoar Hello world para stdout é dado abaixo:
```
%!
(Hello world) print
```
Brother e Kyocera usam seus próprios clones do PostScript: **Br-Script** e **KPDL**. Esses sabores da linguagem PostScript não são 100% compatíveis, especialmente em relação a recursos de segurança, como sair do loop do servidor. O 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, por meio de loops infinitos), manipulação de trabalhos de impressão e retenção de trabalhos de impressão, bem como 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. Um recurso interessante do **PostScript** é que um programa **pode contornar a encapsulação do trabalho de impressão** e alterar o VM inicial para trabalhos subsequentes. Para fazer isso, ele pode usar o startjob, um recurso do Nível 2:
```
true 0 startjob
```
ou exitserver (disponível em todas as implementações que incluem um servidor de trabalho):
```
serverdict begin 0 exitserver
```
Essa capacidade é controlada pelo StartJobPassword, que tem como padrão `0` (compare a divulgação de credenciais). Como o loop do servidor de trabalho é geralmente responsável por limpar o estado do interpretador entre trabalhos, **quaisquer alterações feitas fora do loop do servidor permanecerão como parte do estado permanente do interpretador para todos os trabalhos subsequentes**. Em outras palavras, um trabalho de impressão pode acessar e alterar trabalhos futuros. Bingo!
#### 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, colocando 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 alterações podem ser tornadas permanentes - pelo menos até que a impressora seja reiniciada. Um esquema da pilha de dicionários PostScript é dado 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 outros documentos legítimos 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 trabalhos de impressão e manipulação de trabalhos de impressão. 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 todas as impressoras PostScript e [RIP](https://en.wikipedia.org/wiki/Raster\_image\_processor).
### PCL
PCL 3 e PCL 4 adicionaram suporte para fontes e macros que ambos podem ser baixados permanentemente no dispositivo - no entanto, apenas referenciados 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 orientado a objetos codificado em binário. Um **exemplo de documento PCL para imprimir 'Olá, mundo' é dado 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 do arquivo e os metadados na memória da impressora. Este hack mostra que mesmo 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 infrator de direitos autorais. Embora transformar uma impressora em um serviço de compartilhamento de arquivos não seja uma vulnerabilidade de segurança em si, pode ser considerado como "uso indevido do serviço", dependendo da política corporativa.
## Ataques diversos
### Pen drive ou cabo
Dados podem ser enviados para e recebidos de uma impressora local por meio de 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 muitas vezes são enviados com portas USB Tipo-A que permitem aos usuários imprimir diretamente de um dispositivo USB. Embora as unidades USB conectadas não ofereçam um canal bidirecional, seu uso em uma sala de cópia lotada 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. Obter acesso físico à impressora geralmente pode ser considerado menos difícil do que para outros componentes de rede, como servidores ou estações de trabalho.
### Impressão entre sites
Aproveitando a solicitação da web do cliente, um invasor pode abusar de impressoras arbitrárias dentro da rede interna do cliente conectado à sua página da web maliciosa. [**Saiba como isso é possível aqui.**](cross-site-printing.md)
### Abuso do serviço Spooler no AD
Se você encontrar algum serviço Spool ouvindo dentro do domínio, poderá 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 essa é uma funcionalidade crítica de segurança, pois sobrescreve mecanismos de proteção como senhas definidas pelo usuário. [**Saiba 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. [**Saiba 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. [**Saiba mais aqui.**](scanner-and-fax.md)
## Acesso ao trabalho de impressão
### Retenção de trabalho de impressão
Os trabalhos podem ser retidos na memória e serem impressos novamente em um momento posterior a partir do painel de controle, ou usando o PostScript, você pode até mesmo acessar remotamente todos os trabalhos que serão impressos, baixá-los e imprimi-los. [**Saiba mais aqui.**](print-job-retention.md)
### Manipulação de trabalho de impressão
Você pode adicionar novo conteúdo às páginas que serão impressas, alterar todo o conteúdo que será impresso ou até mesmo substituir apenas certas letras ou palavras. [**Saiba como fazer isso aqui.**](print-job-manipulation.md)
## Divulgação de informações
### Acesso à memória
Você pode 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 do PJL ou PostScript. [**Leia como fazer isso aqui.**](file-system-access.md)
### Divulgação de credenciais/força bruta
Você pode ser capaz de divulgar a senha sendo usada abusando das configurações SNMP ou LDAP ou pode tentar forçar PJL ou PostScript. [**Leia como fazer isso aqui.**](credentials-disclosure-brute-force.md)
## Execução de código
### Estouro de buffer
Vários estouros de buffer já foram encontrados na entrada PJL e no daemon LPD, e pode haver mais. [**Leia mais informações aqui.**](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 mais informações aqui.**](firmware-updates.md)
### Pacotes de software
Os fornecedores 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 é executado em impressoras foi destinada 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 limite do servidor pode levar a um DoS. [**Saiba mais sobre isso aqui.**](transmission-channel.md)
### Processamento de documentos
Você pode usar o PostScript e o PJL para executar loops infinitos, redefinir comandos para evitar qualquer impressão, desativar qualquer funcionalidade de impressão ou até mesmo colocar a impressora em modo offline. [**Saiba mais sobre isso aqui.**](document-processing.md)
### Danos físicos
Alguém pode abusar do 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 nas configurações padrão de fábrica. [**Saiba mais sobre isso aqui.**](physical-damage.md)
☁️ 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**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me no** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas dicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.