hacktricks/network-services-pentesting/pentesting-printers/README.md
2023-06-06 18:56:34 +00:00

24 KiB

Pentesting de Impressoras

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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/. 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

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 da Novell ou o 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.

Saiba mais sobre LPD em Pentesting 515 aqui.

Saiba mais sobre IPP em Pentesting 631 aqui.

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, XJCL, 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. 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', 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: 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 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 aceitam apenas fluxos de dados de bitmap simples como ZJS, 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 da Kyocera, SPL, XES, CaPSL, RPCS, ESC/P, que é usado principalmente em impressoras matriciais ou HP-GL e HP-GL/2, que foram projetados para plotadoras. O suporte para impressão direta em PDF e XPS 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. 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 (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 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


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, 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.

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:

<Esc>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 ou paralelos. 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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥