hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md

10 KiB
Raw Blame History

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

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 burlar o sistema de contabilidade. Além disso, ser capaz de 'imprimir' é uma pré-condição 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 com isso diretamente 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 usar LPD, IPP ou outros protocolos de impressão e encaminha os trabalhos para a impressora real. É importante notar que o acesso direto à rede da impressora deve ser restrito, caso contrário, um atacante pode burlar facilmente o servidor de impressão e seus mecanismos de contabilidade. Isso significa filtrar o acesso a 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: personificar outro usuário ou manipular o contador de páginas impressas. A seguir, ambas as opções são discutidas para instalações de 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. Abaixo é apresentada uma comparação das características de segurança de ambos os sistemas.

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

Bypass de autenticação

LPRng e CUPS oferecem criptografia de canal baseada em SSL e esquemas de autenticação seguros como Kerberos, PGP para trabalhos de impressão assinados ou autenticação HTTP básica/digest. Se configurados corretamente e caso o atacante não possa acessar a impressora diretamente, ele não será capaz de personificar 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 que podem ser definidos para valores arbitrários pelo lado do cliente. A razão para isso é uma simples consideração de custo-benefício na maioria das instituições**: Kerberos requer uma configuração especial** em cada cliente e a autenticação HTTP exige que os usuários digitem uma senha sempre que quiserem 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 assim:

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 no contador de páginas variável, colocando a impressora em 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 tem que 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. Observe que redefinir o dispositivo para Configurações de fábrica também redefine o contador de páginas para zero em alguns dos dispositivos testados.
Diminuir o contador de páginas também pode ser usado para vender uma impressora acima do seu preço, pois pode ser comparado ao odômetro ao comprar um carro usado. 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 cara para dispositivos jato de tinta de baixo custo e bloquear kits de recarga de terceiros, recusando-se a imprimir após um determinado número de páginas para lidar com tais práticas antiéticas, é absolutamente legítimo redefinir o contador de páginas.

Em modelos antigos de HP LaserJets, 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

CUPS utiliza contadores de páginas de software que foram implementados para todas as principais linguagens de descrição de páginas. 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 em CUPS/Ghostscript antes de realmente imprimir o documento, conforme mostrado abaixo.

currentsystemparams (PageCount) known {
<@\textit{[...] code which is only executed on a printer device [...]}@>
} if
Dessa forma, o software de contabilidade usado pelo CUPS renderiza um documento diferente do que a 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 fila/opção 'raw' do IPP é obrigatório, caso contrário, o CUPS analisa o código com um filtro de PostScript para PostScript (ps2write do Ghostscript) antes de chegar ao contador de páginas.

**Como testar esse ataque?**

**Embrulhe** um **documento PostScript de várias páginas** arbitrário no **código acima** e imprima. Em seguida, acesse [`http://printserver:631/jobs?which_jobs=all`](http://printserver:631/jobs?which_jobs=all) e verifique o contador de páginas do CUPS para este trabalho de impressão. Observe que você deve estabelecer uma fila raw. Isto é, uma fila onde o sistema de filtragem não está envolvido e o trabalho de impressão vai diretamente para uma impressora. Para o CUPS, isso é feito definindo o tipo de conteúdo para `application/vnd.cups-raw`. Se o seu sistema já estiver configurado para usar o servidor de impressão a ser testado, simplesmente use:
lp -o raw test.ps
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks: