mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-27 13:33:37 +00:00
79 lines
9.3 KiB
Markdown
79 lines
9.3 KiB
Markdown
# **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](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 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](https://en.wikipedia.org/wiki/Kerberos\_\(protocol\)), trabalhos de impressão assinados com PGP 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 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](./#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](factory-defaults.md) 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](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
|
|
|
|
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`](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
|
|
```
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
- 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**](https://github.com/sponsors/carlospolop)!
|
|
|
|
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
|
|
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
|
|
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
|
|
- **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|