9.3 KiB
Introdução
Imprimir sem permissão pode ser um risco de segurança ou violação da política da empresa. Em ambientes onde os trabalhos de impressão são cobrados, um atacante interno tem motivação para contornar o sistema de contabilidade. Além disso, ser capaz de "imprimir" é uma condição prévia para a maioria dos ataques contra impressoras de rede.
Existem duas abordagens principais quando se trata de contabilidade de trabalhos de impressão: deixar a impressora lidar diretamente com isso ou usar um servidor de impressão intermediário. A primeira abordagem é específica do fornecedor, geralmente envolve algum tipo de "driver de impressora" especial e não é discutida aqui. A outra abordagem envolve um servidor de impressão separado - geralmente uma implementação de software como CUPS ou LPRng - para lidar com a contabilidade e é bastante comum em empresas e instituições. O servidor de impressão pode falar LPD, IPP ou outros protocolos de impressão e encaminha trabalhos para a impressora real. É importante observar que o acesso direto à rede da impressora deve ser restrito, caso contrário, um atacante pode facilmente contornar o servidor de impressão e seus mecanismos de contabilidade. Isso significa filtrar o acesso às portas típicas e atípicas (LPD, IPP, raw, HTTP, SMB, FTP, SNMP).
Basicamente, existem duas abordagens para contornar os sistemas de contabilidade de trabalhos de impressão: fingir ser outro usuário ou manipular o contador de páginas impressas. A seguir, ambas as opções são discutidas para instalações LPRng (v3.8.B) e CUPS (v2.1.4), que são sistemas de impressão de código aberto populares usados em ambientes acadêmicos e corporativos. Uma comparação das características de segurança de ambos os sistemas é apresentada abaixo.
Sistema de impressão | Protocolo | Criptografia | Autenticação | Contador de páginas |
---|---|---|---|---|
LPRng | LPD | SSL/TLS | Kerberos, PGP | hardware |
CUPS | IPP | SSL/TLS | Kerberos, HTTP | software |
Bypasses de autenticação
LPRng e CUPS oferecem ambos criptografia de canal baseada em SSL e esquemas de autenticação seguros como Kerberos, trabalhos de impressão assinados com PGP ou autenticação HTTP básica/digest. Se configurados corretamente e no caso em que o atacante não possa acessar a impressora diretamente, ela não será capaz de fingir ser outros usuários. No entanto, esses recursos de segurança são opcionais e raramente aplicados nos servidores de impressão do mundo real. Em vez disso, os nomes de usuário fornecidos como parâmetros LPD (LPRng) ou IPP (CUPS) são registrados e contabilizados - o que pode ser definido como valores arbitrários pelo lado do cliente. As razões para isso são uma consideração simples de custo-benefício na maioria das instituições: o Kerberos precisa de uma configuração especial em cada cliente e a autenticação HTTP requer que os usuários digitem uma senha sempre que desejarem imprimir algo, enquanto os custos de algumas impressões não contabilizadas são suportáveis.
Você pode verificar a autenticação adequada tentando imprimir com um nome de usuário personalizado como este:
lp -U nobody test.ps
Manipulação do contador de páginas
Contadores de páginas de hardware
Para uma contabilidade correta, o número de páginas impressas deve ser determinado pelo sistema de impressão, o que não é uma tarefa trivial. Os autores do LPRng assumem que a impressora possui algum tipo de mecanismo de contador de páginas não volátil que é confiável e imune a ciclos de ligar/desligar. Tais contadores de páginas de hardware são suportados pela maioria das impressoras e lidos pelo LPRng usando PJL após cada trabalho de impressão. A HP até documentou um recurso para escrever na variável do contador de páginas definindo a impressora no modo de serviço. Dessa forma, o contador de páginas da HP LaserJet 1200, HP LaserJet 4200N e HP LaserJet 4250N pode ser manipulado dentro de um trabalho de impressão. No final do documento a ser impresso e separado pelo UEL, o contador simplesmente precisa ser redefinido para o seu valor original (por exemplo, 2342
):
\x1b%-12345X@PJL JOB
This page was printed for free
\x1b%-12345X@PJL EOJ
\x1b%-12345X@PJL JOB
@PJL SET SERVICEMODE=HPBOISEID
@PJL SET PAGES=2342
\x1b%-12345X@PJL EOJ
Um atacante pode definir um número negativo de páginas impressas. Note que redefinir o dispositivo para os padrões de fábrica também redefine o contador de páginas para zero em alguns dos dispositivos testados.
A redução do contador de páginas também pode ser usada para vender uma impressora acima do seu preço já que pode ser comparada ao hodômetro ao comprar um carro de segunda mão. No entanto, vale ressaltar que redefinir o contador de páginas não é necessariamente para fins maliciosos: é um modelo de negócios bem conhecido vender tinta com preços elevados para dispositivos jato de tinta de baixo custo e bloquear kits de recarga de terceiros, recusando-se a imprimir após um certo número de páginas - para lidar com tais práticas antiéticas, é absolutamente legítimo redefinir o contador de páginas.
Em impressoras HP laserjet mais antigas, o comando pagecount
do PRET pode ser usado para definir facilmente contadores de páginas de hardware:
./pret.py -q printer pjl
Connection to printer established
Welcome to the pret shell. Type help or ? to list commands.
printer:/> pagecount 10
Old pagecounter: 53214
New pagecounter: 10
Contadores de páginas de software
O CUPS usa contadores de páginas de software que foram implementados para todas as principais linguagens de descrição de página. Para PostScript, uma maneira fácil de contornar a contabilidade é verificar se o parâmetro do sistema PageCount existe - o que retornará falso quando interpretado no CUPS / Ghostscript - antes de imprimir o documento, como mostrado abaixo.
currentsystemparams (PageCount) known {
<@\textit{[...] code which is only executed on a printer device [...]}@>
} if
Desta forma, o software de contabilidade usado pelo CUPS renderiza um documento diferente do que o da impressora. O CUPS só contabiliza uma página - o que parece ser um mínimo codificado - enquanto o trabalho de impressão real pode conter centenas de páginas. Observe que o uso da opção/fila IPP 'raw' é obrigatório, caso contrário, o CUPS analisa o código com um filtro PostScript-to-PostScript (ps2write do Ghostscript) antes que ele chegue ao contador de páginas.
Como testar esse ataque?
Envolver um documento PostScript de várias páginas arbitrário no código acima e imprimir. Em seguida, vá para http://printserver:631/jobs?which_jobs=all
e verifique o contador de páginas do CUPS para este trabalho de impressão. Observe que é necessário estabelecer uma fila bruta. Ou seja, uma fila em que o sistema de filtragem não esteja envolvido e o trabalho de impressão vá diretamente para uma impressora. Para o CUPS, isso é feito definindo o tipo de conteúdo como application/vnd.cups-raw
. Se o seu sistema já estiver configurado para usar o servidor de impressão a ser testado, basta usar:
lp -o raw test.ps
☁️ 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!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.