hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md
2024-12-12 13:56:11 +01:00

94 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
# **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](https://en.wikipedia.org/wiki/CUPS) ou [LPRng](https://en.wikipedia.org/wiki/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](https://en.wikipedia.org/wiki/Kerberos\_\(protocol\)), [PGP](https://en.wikipedia.org/wiki/Pretty\_Good\_Privacy) para trabalhos de impressão assinados ou autenticação HTTP [básica](https://en.wikipedia.org/wiki/Basic\_access\_authentication)/[digest](https://en.wikipedia.org/wiki/Digest\_access\_authentication). 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](./#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](factory-defaults.md) 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](https://github.com/RUB-NDS/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
```
```markdown
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
```
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>