23 KiB
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo do 💬 Discord ou ao grupo do telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do github HackTricks e 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/. 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:\
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 da Novell ou 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.
Saiba mais sobre LPD em Pentesting 515 aqui.
Saiba mais sobre IPP em Pentesting 631 aqui.
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, XJCL, 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. 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', 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: 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 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 apenas aceitam datastreams de bitmap simples como ZJS, enquanto a renderização real é feita pelo driver da impressora. Existem várias linguagens proprietárias de descrição de página como PRESCRIBE da Kyocera, SPL, XES, CaPSL, RPCS, ESC/P que é mais usado em impressoras matriciais ou HP-GL e HP-GL/2 que foram projetados para plotters. O suporte para impressão direta de PDF e XPS 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. 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 (por exemplo, através de loops infinitos), manipulação de trabalhos de impressão manipulação e retenção, bem como ganhar 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. 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:
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, retenção de trabalho de impressão retenção e manipulaçã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 qualquer impressora PostScript e RIP.
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:
<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 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 ou paralelos. 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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!
- 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 do telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para os repositórios do GitHub HackTricks e HackTricks Cloud.